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 <Pointer-XXX> fact-address tény címe <Fact-XXX> instance-name példány neve [p-1] instance-address példány címe <Instance-XXX> 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 <tény>) CLIPS>(assert (kutya)) <Fact-1> 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 <tény-index>*) (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>] <név> [ <megjegyzés> ] <rés definíció>*) 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) <Fact-1> 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 <konkrét érték/kifejezés>) é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))) <Fact-1> 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>] <név> [ <megjegyzés> ] <RHS pattern>*) 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 <tény címe vagy tény címét tartalmazó változó> <RHS-slot>*) <változó> <- <tény> CLIPS>(modify 1 (kor 1)) <Fact-3> 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>] <név> [ <megjegyzés> ] [<deklaráció>] <feltétel>* } LHS, implicit and a feltételek között <következmény>*) } 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 $?) ;tény címe (retract?f)) ;tény törlése teszt CE (test <függvényhívás>) CLIPS>(defrule pelda18 (adat?x?y) (test (numberp?x)) (test (numberp?y)) (printout t (+?x?y) crlf))
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 <integer kifejezés>) ;-10.000 +10.000, alapértelmezés: 0 (auto-focus <boole kifejezés>) ;TRUE/FALSE, modul-váltás