170 likes | 332 Views
4IZ 229 – CLIPS. Základy CLIPSu. CLIPS pracuje jako klasický expertní systém – obsahuje: Pracovní paměť aktuálních faktů Bázi pravidel Inferenční mechanismus
E N D
4IZ 229 - CLIPS Základy CLIPSu • CLIPS pracuje jako klasický expertní systém – obsahuje: • Pracovní paměť aktuálních faktů • Bázi pravidel • Inferenční mechanismus • Inferenční mechanismus prohledává bázi pravidel a snaží se najít aplikovatelné pravidlo (pravidlo, jehož předpoklady jsou platné v pracovní paměti)
4IZ 229 - CLIPS Základy CLIPSu • CLIPS vychází z PROLOGu, ale: • PROLOG implementuje zpětné řetězení (výpočet řízen dotazem) • CLIPS implementuje přímé řetězení (co vše je pravdivé za předpokladu určitých faktů)
4IZ 229 - CLIPS Znalosti v CLIPSu • Znalosti jsou tvořeny • Fakty • Pravidly
4IZ 229 - CLIPS Fakta • Faktum může být jednoduché, uspořádané či strukturované • Vložení fakta do pracovní paměti: (assert (princ)) (assert (princ ano)) • Odebrání fakta z pracovní paměti: (retract číslo_faktu) • Hromadné vkládání faktů pomocí konstruktu: (deffacts rodina „základní údaje o rodině“ (otec Pepa) (matka Anička)) • Vyčištění pracovní paměti: (clear)
4IZ 229 - CLIPS Pravidla • Základní syntaxe pravidla: (defrule jmeno_pravidla „volitelný komentař (předpoklad_pravidla) => (závěr_pravidla)) • (defrule princ (noha mala) (rodina slechticka) => (assert (princ ano)))
4IZ 229 - CLIPS „ovládací“ příkazy • Ukončení programu – (exit) • Výpis faktů, pravidel – (facts), (rules) • Vyčištění paměti (včetně báze pravidel) – (clear) • Vyčištění pracovní paměti aktuální faktů – (reset) – zároveň vloží (initial-fact) • Spuštění odvozování – (run) • Výpis na obrazovku – (printout t „text“ crlf) – t: standardní výstup = monitor, crlf: zalomení řádku po výpisu
4IZ 229 - CLIPS Salience • Vlastnost Salience odpovídá prioritě • Aktivovaná pravidla (tzn. pravidla s platným předpokladem) budou aplikována podle hodnoty saliance (od nejvyšší) • (defrule pravidlo1 (declare (salience 10)) (predpoklad) => (zaver)
4IZ 229 - CLIPS Proměnné • ?jmeno_proměnné • (defrule pravidlo1 (princ ?x) => (assert (uchazec_je_princ ?X))) • Adresa faktu (defrule pravidlo1 ?adr <- (princ ?) => (retract ?adr))
4IZ 229 - CLIPS Načítání vstupu od uživatele • (bind ?vstup (read)) – do proměnné vstup načte hodnotu zadanou uživatelem • Použití: (defrule Nacteni_krve (initial-fact) => (printout t "Ma rodina adepta modrou krev? (ano, ne)" crlf) (bind ?string (read)) (assert (modra_krev ?string)))
4IZ 229 - CLIPS Jak přerušit konzultaci • Úvodní pravidlo: (defrule Spust_Pokracovani (initial-fact) => (assert (pokracovat))) • Všechna pravidla obsahující dotaz na uživatele v předpokladu (pokracovat) (defrule pravidlo (pokracovat) … => …) • Závěrečné pravidlo: (defrule Nepokracovat (cil ?) ?adr <- (pokracovat) => (retract ?adr))
4IZ 229 - CLIPS Funkce pro načtení odpovědi (deffunction ask-question (?question $?allowed-values) (printout t ?question) (bind ?answer (read)) (if (lexemep ?answer) then (bind ?answer (lowcase ?answer))) (while (not (member ?answer ?allowed-values)) do (printout t ?question) (bind ?answer (read)) (if (lexemep ?answer) then (bind ?answer (lowcase ?answer)))) ?answer) • $?allowed-values – „pole“, nebo-li proměnná, která může obsahovat libovolné množství hodnot • Lexemep vyraz – kontroluje, zda je vyraz symbol nebo string • Lowcase vyraz – převede vyraz na malá písmena • Member vyraz1 vyraz2 – kontroluje, zda vyraz1 je ve vyraz2
4IZ 229 - CLIPS Volání funkce pro načtení odpovědi (defrule Nacteni_nohy (pokracovat) => (bind ?string (ask-question "Jakou ma adept velikost nohy? (mala, velka) " mala velka)) (assert (noha ?string)))
4IZ 229 - CLIPS Funkce pro načítání ano/ne • Využívá předchozí funkci „ask-qustion“ (deffunction ano-ne (?question) (bind ?response (ask-question ?question ano ne a n)) (if (or (eq ?response ano) (eq ?response a)) then TRUE else FALSE))
4IZ 229 - CLIPS Volání funkce pro načítání ano/ne (defrule Nacteni_krve (pokracovat) => (if (ano-ne "Ma rodina adepta modrou krev? (ano, ne) ") then (assert (modra_krev ano)) else (assert (modra_krev ne)) ))
4IZ 229 - CLIPS Načítání čísel (deffunction ask-question-numeric (?question) (printout t ?question) (bind ?answer (read)) (while (not (numberp ?answer)) do (printout t ?question) (bind ?answer (read))) ?answer)
4IZ 229 - CLIPS Práce s načteným číslem (defrule Nacteni_nohy (pokracovat) => (bind ?vel (ask-question-numeric "Jakou ma adept velikost nohy? (zadejte cislo) ")) (if (> ?vel 41) then (assert (noha velka)) else (assert (noha mala)) ))