CLIPS (C Language Integrated Production System) I. ALAPVETŐ TULAJDONSÁGAI − szakértői rendszer fejlesztő eszköz (shell) − 80-as évek közepe, NASA – 1. prototípus 1985-ben (~ 2 hónap alatt), fejlesztések, bővítések − tudásreprezentáció o szabály-alapú rendszer szabály: szituáció → akció, heurisztikák, ökölszabályok produkciós rendszer, előrefelé haladó következtetés, RETE algoritmus o procedurális elemek függvények, generikus függvények integrálás más rendszerekkel, nyelvekkel (C, Java, Fortran, Ada, …) o objektum-orientált programozás komplex rendszerek modellezése, moduláris elemek CLIPS Object Oriented Language (COOL) − hordozhatóság (C alapú, számos operációs rendszeren tesztelték: Windows, Macintosh, Unix) − interaktív fejlesztés o interaktív szöveg-orientált fejlesztői környezet o nyomkövetési lehetőségek o on-line help o integrált editor − verifikálás, validálás o moduláris tervezés o TB particionálása o függvény argumentumok, tulajdonság-értékek statikus/dinamikus ellenőrzése (megszorítások) o szabályok szemantikai ellenőrzése − dokumentáció (user’s guide, manual, … : szabadon letölthető) − alacsony ár
II. SZAKÉRTŐ RENDSZEREK ALAPVETŐ ELEMEI / CLIPS − tudásbázis / szabálybázis − következtető gép / szabályok alkalmazása, végrehajtása − munkamemória / tények (facts), objektum példányok (instances), globális változók CLISP: adatvezérelt következtetést tartalmaz (adatok szükségesek a szabályok tüzeléséhez) CLIPS>
CLIPS prompt-ja (parancs bevitelére vár) top-level (közvetlen parancs bevitele, kiértékelés/végrehajtás, visszatérési érték kiírása)
CLIPS>(+ 3 4) 7 parancs lehet: − függvényhívás → függvény értékének meghatározása − TB-hoz komponens hozzáadása → új elem létrehozása − globális változó → értékének kiírása − konstans → konstans kiírása III. CLIPS ALAPVETŐ ELEMEI 1. egyszerű adattípusok 2. függvények 3. konstruktorok (constructs) 1. Egyszerű adattípusok float, integer → numerikus információ symbol, string → szimbolikus információ external-address → függvény által visszaadott külső adatszerkezet címe
fact-address → tény címe instance-name → példány neve [p-1] instance-address → példány címe egy egyszerű adattípus tárolása → mező (field) → single-field value 0 vagy több single-field value sorozata → multifield value (), (x), (1 2 a b) 2. Függvények prefix jelölés (függvény-név + argumentumok) (+ (* 2 3) (- 5 2)) argumentumok: egyszerű adattípusok, változók, egyéb függvényhívások visszatérési érték (mellékhatások) − beépített függvények − felhasználó által definiált függvények (deffunction, defgeneric konstruktorral)
3. Konstruktorok TB komponenseinek létrehozásához nincs visszatérési értékük hatás: TB bővítése defmodule defrule deffacts deftemplate defglobal defclass definstances defmessage-handler defgeneric defmethod ; komment (új sorig) közvetlenül a konstruktorba (a konstruktor-név után) is lehet komment IV. INFORMÁCIÓ REPREZENTÁLÁSA CLIPS-BEN (MUNKAMEMÓRIA) 1. tények (facts) – csak ezekkel foglalkozunk 2. globális változók 3. objektumok 1. Tények Tény: információ-darab → tények listájára (fact list) helyezve szabályok által használt alapvető információ-egység tények hozzáadása a tény listához: (assert ) CLIPS>(assert (kutya)) tény-cím (egyszerű adattípus) automatikus számozás 1,2,… → tény-index tények megtekintése (facts) CLIPS>(facts) f-0 (initial-fact) f-1 (kutya) For a total of 2 facts. f-0 → tény azonosító („f-„ tény-index)
tények törlése (retract *) (retract *) CLIPS>(retract 1) CLIPS>(facts) f-0 (initial-fact) For a total of 1 fact. több tény egyidejű definiálása: CLIPS>(assert (macska) (lo) (nyul)) Tény: 1 vagy több mező (field) zárójelek között, space-szel elválasztva mezőn: egyszerű adattípusok (float, integer, symbol, string) (kutya Bodri) (szamok 15 13 12.5) tények egymásba ágyazása nem lehetséges! általában: tény 1. mezőjén → relációnév ha egy mezőnek nincs értéke : nil (üres mező) CLIPS> (assert (macska nil)) Tények lehetnek: − rendezett tények (mezők sorrendje adja a rendezést) (kutya Bodri) (Bodri kutya) – 2 különböző tény! − nem-rendezett tények (rekordokhoz hasonlítanak, a mezőknek nevük van) deftemplate konstruktorral létrehozott tények Nem-rendezett tények definiálása (deftemplate [<modul név>] [„<megjegyzés>”] *) CLIPS>(deftemplate kutya CLIPS>(deftemplate MAIN:: kutya „kutya” (slot nev) (slot nev) (multislot gazdi)) (multislot gazdi)) [CSTRCPSR4] Cannot redefine deftemplate kutya while it is in use TB elemeinek törlése (clear) konstruktorok, tények, példányok törlése CLIPS>(clear) törlés + (initial-fact) + INITIAL-OBJECT CLIPS>(deftemplate kutya (slot nev) (multislot gazdi))
CLIPS> (assert (kutya) CLIPS> (facts) f-0 (initial-fact) f-1 (kutya (nev nil) (gazdi)) For a total of 2 facts default érték definiálása: (default ?NONE) → az értéket ki kell jelölni a tény létrehozásakor (default ?DERIVE …) → a lehetséges értékek közül az első vagy nil (default ) → érték/kifejezés értéke megszorítások definiálása: (allowed-values …) (type INTEGER/SYMBOL/STRING/FLOAT/..) CLIPS>(clear) CLIPS>(deftemplate kutya (slot nev (default ?NONE)) (slot kor (type INTEGER)) (multislot gazdi (default Kis Pista))) CLIPS>(assert (kutya)) [TMPLTRHS1] Slot nev requires a value because of its (default ?NONE) attribute. CLIPS>(assert (kutya (nev Bodri))) CLIPS>(facts) f-0 (initial-fact) f-1 (kutya (nev Bodri) (kor 0) (gazdi Kis Pista)) For a total of 2 fact A deffacts konstruktor (deffacts [<modul név>] [„<megjegyzés>”] *) a tények a (reset) paranccsal jönnek létre, használatuk azonos a korábbi tényekkel (reset) tudáselemek törlése + konstruktorok által definiált tudáselemek létrehozása CLIPS>(deffacts kutyak "falka" (kutya (nev Bodri)) (kutya (nev Foltos) (gazdi Kis Janos))) CLIPS>(reset) CLIPS>(facts) CLIPS> (facts) f-0 (initial-fact) f-1 (kutya (nev Bodri) (kor 0) (gazdi Kis Pista)) f-2 (kutya (nev Foltos) (kor 0) (gazdi Kis Janos)) For a total of 3 facts.
tények módosítása (csak deftemplate tények) (modify *) <- CLIPS>(modify 1 (kor 1)) pl. szabályban: ?f <- (kutya (nev Bodri) (kor 0)) … (modify ?f (kor 1)) V. TUDÁSREPREZENTÁCIÓ (TUDÁSBÁZIS) 1. heurisztikus ismeretek (szabályok) – csak ezekkel foglalkozunk 2. procedurális ismeretek (függvények, modulok) 3. objektum-orientált programozás 1. Heurisztikus ismeretek (szabályok) feltételi rész / következmény rész if … / then … LHS / RHS szabály definiálása (defrule [<modul név>] [„<megjegyzés>”] [<deklaráció>] } LHS, implicit „and” a feltételek között * => *) } RHS, implicit „and” az akciók között
CLIPS>(defrule pelda (reaktor homerseklet magas) => (assert (hutoviz betaplalas nagy))) CLIPS>(assert (reaktor homerseklet magas)) Agenda: szabály-példány (tüzelőképes) szabályok működtetése (következtetés) (run)
CLIPS>(deftemplate kutya (slot nev (default ?NONE)) (slot kor (type INTEGER)) (multislot gazdi (default Kis Pista))) CLIPS>(deffacts kutyak "falka" (kutya (nev Bodri)) (kutya (nev Foltos) (gazdi Kis Janos))) CLIPS>(reset) CLIPS>(defrule pelda2 (kutya (nev ?x) (kor 0)) => (printout t "Nev: " ?x crlf)) CLIPS>(run) FIRE 1 pelda2: f-2 Nev: Foltos FIRE 2 pelda2: f-1 Nev: Bodri szabály feltételi része tartalmazhat: − minta CE (CE: conditional elements) (reaktor homerseklet magas) (kutya (nev Bodri) (kor 0)) (kutya (nev ?x) (kor ?)) ?.. egy mező tetszőleges értékkel (single-field-wildcard) $?.. 0 vagy több mező tetszőleges értékkel (multifield-wildcard) CLIPS>(assert (adat) (adat x) (adat 1 x) (adat 1 2) (adat 1 2 x) (adat 1 2 x y) (x)) CLIPS>(defrule pelda3 (adat $? x $?) => ) CLIPS>(defrule pelda4 (adat ?x ?y ?z) => (printout t ?x " " ?y " " ?z crlf)) CLIPS>(defrule pelda5 (adat ?x $?y) => (printout t ?x " " ?y crlf))
CLIPS>(defrule pelda6 (adat $?x $?y) => (printout t ?x " " ?y crlf)) CLIPS>(defrule pelda7 (adat ~1&~2 $?) => ) CLIPS>(defrule pelda8 (adat 1|2 $?) => ) CLIPS>(defrule pelda9 (adat ?x&:(numberp ?x) $?) => (printout t ?x crlf)) CLIPS>(defrule pelda10 (adat $?x&:(> (length$ ?x) 2)) => (printout t ?x crlf)) CLIPS>(defrule pelda11 (adat ?x ?y&=(* 2 ?x)) => (printout t ?x " " ?y crlf)) (defrule pelda16 ?f <- (adat $?) => (retract ?f)) − teszt CE (test ) CLIPS>(defrule pelda18 (adat ?x ?y) (test (numberp ?x)) (test (numberp ?y)) => (printout t (+ ?x ?y) crlf))
;tény címe ;tény törlése
− or CE (or (homerseklet magas) (szelep zarva))
;több szabállyal helyettesíthető
− and CE implicit „and” a CE-k között, az „and CE” az AND/OR/NOT kombinálására szolgál (or (and (homerseklet magas) (szelep zarva)) (and (homerseklet alacsony) (szelep nyitva))) − not CE CLIPS>(defrule pelda19 (not (adat $? 3 $?)) => ) CLIPS>(defrule pelda20 (not (adat $? 2 $?)) => ) − szabály LHS CE nélkül (defrule ures => )
(defrule ures (initial-fact) => )
szabály következmény része tartalmazhat: − új tény létrehozása (assert …) − tény törlése, módosítása (retract …) (modify …) CLIPS>(deftemplate kutya (slot nev (default ?NONE)) (slot kor (type INTEGER)) (multislot gazdi (default Kis Pista))) CLIPS>(deffacts kutyak "falka" (kutya (nev Bodri)) (kutya (nev Foltos) (gazdi Kis Janos))) CLIPS>(defrule pelda21 ?f <- (kutya (kor 0)) => (modify ?f (kor 1)))
− változó megkötése CLIPS>(defrule pelda22 (kutya (nev ?x)) => (bind ?nev ?x) (printout t ?nev crlf)) − input/ output (read) (printout …) CLIPS>(defrule pelda23 => (bind ?x (read)) (printout t ?x crlf)) − függvények CLIPS>(defrule pelda24 => (if (< (read) 10) then (assert (kis_szam)) else (assert (nagy_szam)))) deklaráció: (declare <szabály-tulajdonság>+) (salience ) (auto-focus )
;-10.000…+10.000, alapértelmezés: 0 ;TRUE/FALSE, modul-váltás