210 likes | 319 Views
CLIPS – ljuska ekspertnog sustava. NASA, 1984 Temeljne značajke: LISP C, potpora za Objektno usmjerenje, moguća ugradnja u C programe, RETE algoritam, postoje nadogradnje (CORBA, FuzzyCLIPS, …) CLIPS: http://clipsrules.sourceforge.net/ Najpopularnija knjiga:
E N D
CLIPS – ljuska ekspertnog sustava NASA, 1984 Temeljne značajke: LISP C, potpora za Objektno usmjerenje, moguća ugradnja u C programe, RETE algoritam, postoje nadogradnje (CORBA, FuzzyCLIPS, …) CLIPS: http://clipsrules.sourceforge.net/ Najpopularnija knjiga: J. C. Giarratano, G. D. Riley, Expert Systems: Principles and Programming, Course Technology; 3 edition (1998).
CLIPS Struktura: Data memory: činjenice (Facts, Objects) Rule-base: pravila Inference Engine: Data driven - forward chaining Case-sensitive !!! Izvođenje: CLIPS> (naredba) Facts: (assert (field1 field2 … fieldN)) - upis činj. s više polja Upisom činjenica CLIPS pridružuje id: Fact-0, Fact-1, … . GSP (good software practice): field1 = relacijski ili predikatni simbol. field - tip podataka (int, float, symbol string, varijabla, …) CLIPS> (assert (kosara sir kruh mlijeko)) <Fact-0>
CLIPS Tipične naredbe (upisi u zagradama), ; komentar (assert …) ; upis pojedinog fact (facts) ; ispis cijele WM (clear) ; brisanje cijele WM (reset) ; ostaje inicijalni fact koji se koristi za ; poklapanje s pravilom koje nema ; specificiranu AKO stranu (retract 0 … N) ; briše specificirani fact (watch facts) ; ==> <== , t.j. ulazi i izlazi iz WM (watch … ) ; praćenje raznih objekata (unwatch … ) ; prestanak praćenja (deffacts … ) ; upis više facts, drže se u posebnoj datoteci, ; a upisuju sa (reset)
CLIPS Pravila: (defrule rule-name "opt. comment" (uzorak_1) ; početak IF dijela, (uzorak_2) ; konjunkcijom povezani … ; uzorci, (uzorak-M) ; završetak IF dijela => (akcija_1) ; početak THEN dijela (akcija_2) … (akcija_P)) ; završetakj THEN dijela
CLIPS Aktiviranje ulančavanja: CLIPS> (run <int>) ; <int> opcija, broj ciklusa Ukoliko postoji slaganje činjenica s IF stranom bilo kojeg pravila, pravilo ide na listu: AGENDA. Razrješavanje konflikata u AGENDI: Def. eksplicitan prioritet - SALIENCE (-10000 do +10000). Ako salience nije definiran, pridružuje se prioritet = 0. Pravila s jednakim prioritetom: novo pravilo upisuje se u agendu ISPRED starog (postupak LIFO – “last in first out” ). Temeljna strategija: Izvodi se pravilo s najvećim prioritetom i izbriše iz AGENDA liste (postoje i druge ugrađene strategije). Ponovno aktiviranje s istom činjenicom se ne izvodi - trivijalna petlja. Izvođenje dok se ne iscrpi AGENDA ili opcija <int> broj izvođenja.
CLIPS Neke uobičajene naredbe za pravila: (declare (salience 10)) ; na početku IF dijela pravila (ppdefrule rule_name) ; ispis pravila (pretty print) (clear) ; briši sve Varijable: ?<var_simbol> Npr.: ?ventil_21 ?zadatak Slaganje s činjenicama povezuje varijablu na IF strani, a povezivanje se prenosi na cijelo pravilo (THEN stranu).
CLIPS “Wild-card” varijabla: Ne povezuje se vrijednost nego se samo detektira jedno ili više polja kako bi se pravilo moglo aktivirati Npr. postoji činjenica: (lijecnik srce <ime> <prezime>) Ako nas ne zanima ime i prezime, već samo tražimo slaganje, s IF stranom pravila, stavljamo ? na mjesta dvaju polja: (liječnik srce ? ?) Još jednostavnije: $? - sva polja (multifield match) Npr. za činjenicu: (djeca ivan ana marko) postoji slaganje s: (djeca $?djeca)
CLIPS Činjenice kao relacijske strukture podataka: (deftemplate <t_name> "<comment>" ; relacija (slot-1) (slot-2) … (slot-N)) __________________________________ za svaki slot: (slot <ime_slota> (type <type>) (default <value>)) Polja (fields) u slotu: ime_slota: atribut u relacijskoj tablici type: NUMBER, STRING, SYMBOL, … value: vrijednost atributa u relacijskoj tablici Slot može imati i više polja: (multislot <ime_slota> <> <> …) ; više tip-vrijednost polja U memoriju se struktura upisuje kao činjenica s: (assert (<t_name>))
CLIPS Jednostavan primjer: (samo jedna činjenica i jedno pravilo) CLIPS> (reset) ; priprema CLIPS> (assert (patka se glasa kvak)) ; upis činjenice CLIPS> (defrule patka "" ; upis pravila (patka se glasa ?kako) ; IF strana => (printf t "Patka se glasa " ?kako crlf)) ; THEN strana CLIPS> (run) ; pokretanje Patka se glasa kvak ; rezultat supstitucije u varijablu?kako CLIPS> (reset): briše postojeće činjenice iz liste postavlja početnu (initial-fact) činjenicu kreira instancije u objektno usmjerenom dijelu
CLIPS Funkcije: Ugrađene funkcije +,-, /, * (prefiks notacija), i mnoge druge. Definiranje novih funkcija: (deffunction <f-name> [opt.comment] (?arg1 … ?argM) (<action1>) … (actionK)) CLIPS> (deffunction hypotenuse (?a ?b) (sqrt (+ (* ?a ?a) (* ?b ?b)))) CLIPS> (defrule calc-hyp "" (stranice ?jedna ?druga) => (printout t "Hypot = " (hypotenuse ?jedna ?druga) crlf)) CLIPS> (assert (stranice 3 4)) <Fact-0> CLIPS> (run) Hypot = 5.0
CLIPS Upis sa terminala (read): CLIPS> (defrule upisi"" : pravilo “upisi” (initial-fact) ; bezuvjetno izvedi ; THEN stranu => (printout t "Upisi nesto !" crlf) ; poruka (assert (upis (read)))) ; čekaj na upis i ; pohrani kao fact (upis …) CLIPS> (defrule ispisi "" (upis ?nesto) ; ako postoji fact (upis …) => (printout t "Upisao si: " ?nesto crlf)) ; ispiši
CLIPS Dinamičko povlačenje (retract) činjenice pravilom: Potrebno zbog promjene stanja svijeta i održanja konzistencije. Povlačenje preko ID činjenice ili Adresa pohranjene činjenice upisuje se u pomoćnu varijablu preko koje se dohvaća činjenica. Nije potrebno znati ID. CLIPS> (assert (cin_1)) ; činjenica cin_1 upisana <Fact-0> CLIPS>(retract 0) ; povlačenje preko ID-a CLIPS>(defrule r1 "“ ; povlačenje varijablom ?var1 <- (cin_1) ; nađi adresu činjenice i stavi u varijablu => (retract ?var1)) ; sad se može povući činjenica cin_1
CLIPS – Objektno usmjereni dodaci Razred (Class) i podrazred: “is-a” značenje (ne dio nečega nego pripadnost). (defclass <class> (is-a <direct_superclass>) Npr.: (defclass UPPIE (is-a USER)) Svaki razred ima svoje “slots”, koji se nasljeđuju (moguće je imati i multislots). Jednako tako se nasljeđuju procedure (“message handlers”) pridružene pojedinim slotovima. Razredi i podrazredi navode se velikim slovima (USER, UPPIE, …)
CLIPS – Objektno usmjereni dodaci Neke ugrađene funkcije za manipulaciju razredima: ppdefclass ; ispiši internu strukturu undefclass ; eliminiraj razred describe-class ; ispiši dodatna obilježja class-abstractp ; Booleova funkcija, vraća TRUE ako je razred ; apstraktan (t.j. još nema instancija) Iz razreda nastaju instancije (objekti koje žive u memoriji): (make-instance [<instance-name>] of <class> <slot-override>) Dvije funkcije omogućuju konverziju između simbola i instancije razreda kako bi se mogle primijeniti funkcije iz standardnog dijela CLIPS-a (iz ne objektnog usmjerenja): (symbol-to-instance-name … ) (instance-name-to-symbol … )
CLIPS – Objektno usmjereni dodaci Komunikacija u objektno usmjerenom okruženju: Instancijama se mogu poslati poruke. Instancije mogu slati poruke drugim instancijama i samoj sebi.. (send [<instance-name>] <message>) Procedura za rukovanje porukama se definira s: (defmessage-handler) CLIPS> (instances); nabroji kreirane instancije [initial-object] of INITIAL-OBJECT; uvijek postoji [Dorky] of DUCK; još dvije instancije od [Dorky_Duck] of DUCK; klase DUCK For a total of 3 instances. CLIPS> (send [Dorky_Duck] delete); pošalji poruku, t.j. TRUE; izbriši instanciju CLIPS> (instances) [initial-object] of INITIAL-OBJECT [Dorky] of DUCK For a total of 2 instances.; nema izbrisane
CLIPS – Objektno usmjereni dodaci Primjer: CLIPS> (clear) CLIPS> (defclass DUCK (is-a USER) (role concrete) ; razred DUCK (slot sound (create-accessor read-write)) ; dva slota s (slot age (create-accessor read-write))) ; funkcijama pristupa CLIPS> (make-instances [Dorky_Duck] of DUCK)) ; stvori instanciju [Dorky_Duck] CLIPS> (reset) CLIPS> (send [Dorky_Duck] print) ; opiši instanciju [Dorky_Duck] of DUCK (sound nil) (age nil) CLIPS> (send [Dorky_Duck] put-sound quack) ; upiši u slot quack CLIPS> (send [Dorky_Duck] print) ; opiši instanciju [Dorky_Duck] of DUCK (sound quack) (age nil) CLIPS>
CLIPS – Ekspertni sustav za dijagnostiku auta CLIPS (V6.10 07/01/98) CLIPS> (LOAD AUTO.TXT) Defining function: ask-question . . . Defining defrule: normal-engine-state-conclusions . . . TRUE CLIPS> (reset) CLIPS> (run) The Engine Diagnosis Expert System Does the engine start (yes/no)? yes Does the engine run normally (yes/no)? no Is the engine sluggish (yes/no)? no Does the engine misfire (yes/no)? no Does the engine knock (yes/no) no Is the output of the engine low (yes/no)? no Suggested Repair: Take your car to a mechanic. CLIPS> (exit)
CLIPS – Ekspertni sustav za dijagnostiku auta ;;;**************************** ;;;* STARTUP AND REPAIR RULES * ;;;**************************** (defrule system-banner "“; nema uvjeta, izvodi se (declare (salience 10)) => (printout t crlf crlf) (printout t "The Engine Diagnosis Expert System") (printout t crlf crlf)) (defrule print-repair "“; Pravilo se u počrtku (declare (salience 10)); ne aktivira (repair ?item) ; jer još nema uvjeta, t.j. =>; činjenice (repair ?). (printout t crlf crlf); Odgovori korisnika će dovesti (printout t "Suggested Repair:"); do upisa te činjenice i (printout t crlf crlf); aktivaciju, te ispis (format t " %s%n%n%n" ?item)); preporučenog popravka
CLIPS – Ekspertni sustav za dijagnostiku auta ; jedno pravilo za popravak (defrule determine-sluggishness "“; Ako je stanje auta - činjenica (working-state engine unsatisfactory); nezadovoljvajuće (not (repair ?)) ; i (repair ?) ne postoji => ; pozovi funkciju yes-or-no-p s upitom i ako je TRUE (if (yes-or-no-p "Is the engine sluggish (yes/no)? ") then (assert (repair "Clean the fuel line.")))); upiši (repair … ) ; ako FALSE idi na drugo pravilo ;; pomoćna funkcija yes-or-no-pkoja dalje poziva funkciju ask-question (deffunction yes-or-no-p (?question) (bind ?response (ask-question ?question yes no y n)) (if (or (eq ?response yes) (eq ?response y)) then TRUE ; mogući odziv funkcije else FALSE)); mogući odziv funkcije Allowed: yes no y n
CLIPS – Ekspertni sustav za dijagnostiku auta Allowed: yes no y n Funkcija ask-question: (deffunction ask-question (?question $?allowed-values) (printout t ?question) (bind ?answer (read)); poveži ?answer s odgovorom (if (lexemep ?answer) then (bind ?answer (lowcase ?answer))); preslikaj u mala slova (while (not (member ?answer ?allowed-values)) do (printout t ?question); ako odgovor nije u skupu dozvoljenih (bind ?answer (read)); ponavljaj pitanje (if (lexemep ?answer) then (bind ?answer (lowcase ?answer)))) ?answer)