Tudásalapú rendszerek Gyakorlat - CLIPS
Tartalom Szabályalapú leírás A CLIPS rendszer Ki Csipike? Születésnap Rendezett és nem rendezett tények Feladatok Keretrendszer Források
Szabályalapú leírás Szabályalapú leírás esetén Ha . . . akkor . . . alakú szabályok segítségével írhatjuk le az ismereteket. HA feltétel AKKOR művelet A hétköznapi nyelvben a szabályokat rendszerint a következő formában fogalmazzuk meg (pl): Minden veréb madár. Ezt a szabályt úgy fogalmazhatjuk át, hogy ha egy élőlény veréb, akkor az az élőlény madár is.
Legyenek adottak a következő tények (1-3.) és szabályok (4-9): Ká kígyó. Szilvia elefánt. Csipike veréb. Minden veréb madár. Minden hüllő állat. Minden madár állat. Minden pingvin madár. Minden madár tojással szaporodik. Minden kígyó hüllő.
Előreláncolásos következtetés A felsorolt szabályokat és tényeket két módon is felhasználhatjuk. Első esetben az itt megadott tényekből indulunk ki, és a szabályokat felhasználva újabb és újabb tényeket generálunk. Ezt a módszert előreláncolásos következtetésnek nevezzük.
Lássuk, hogyan működik ez a módszer az itt megadott tényekkel és szabályokkal! A „Minden veréb madár.” érvényes Csipikére is, azaz Ha Csipike veréb akkor Csipike madár is. Mivel Csipike veréb, így Csipike madár. A „Minden madár állat.” érvényes Csipikére is, azaz Ha Csipike madár akkor Csipike állat is. Mivel Csipike madár az előzőek alapján, így Csipike állat.
Cél Az előreláncolásos következtetés feladata a tények, szabályok következményeinek megkeresése. Mivel a folyamat során újabb és újabb tények keletkeznek, és ezek határozzák meg a soron következő alkalmazandó szabályt, így a módszer adattal irányított.
A másik módszer a visszafele láncolás. Lásd később.
A CLIPS rendszer Neve a C Language Integrated Production System kifejezés rövidítése. Már a névből is több dologra következtethetünk: a production system utal a ha-akkor szabályokra, tehát ez a rendszer nem más mint egy szabályokon alapuló szakértő rendszer; a C nyelv pedig arra utal, hogy a rendszert a NASA valamikor C-ben kezdte el fejleszteni, s jelenleg többek között ebben a formában is hozzáférhetünk a programhoz. Ennek megfelelően ezt az ingyenes rendszert szinte minden operációs rendszeren futtathatjuk. Épp ezért ez az általános program a mai Windowsos programokhoz képest kicsit fapadosnak tűnik, de azért igen jól használható.
Ki Csipike? Azt, hogy Csipike veréb azt úgy is írhatjuk, hogy (Csipike vereb) (vereb Csipike) (Csipike egy vereb) Megj: A program szövegében nem érdemes ékezetes betűket használni. Ugorjunk egyből mindennek a közepébe! A korábban már szereplő feladatot oldassuk meg ezzel a rendszerrel. Természetesen ehhez a feladatot át kell alakítani a program szájíze szerint. Nem véletlenül rímel a CLIPS a LISP-re: a LISP-re jellemző írásmódban kell a tényeinket, szabályainkat megfogalmazni. Ez azt is jelenti, hogy rengeteg zárójelet kell használnunk. A CLIPS bizonyos korlátai miatt én most a második variánst fogom használni. (Elvileg ilyen esetekben, amikor egy relációt, vagy egy tulajdonságot kell leírni, akkor a reláció vagy tulajdonság elnevezése kerül az első helyre, s ezt követik az objektumok elnevezései.)
Csipike veréb Ezt a tényt a rendszer tudomására kell hozni. A Prologhoz hasonlóan a rendszer adatbázisához az assert utasítással tudunk új dolgokat hozzáadni, s a retract utasítással tudunk onnan valamit törölni. Hozzáadás assert Törlés retract
Csipike veréb Tehát a CLIPS programját elindítva az (assert (vereb Csipike)) hatására veszi tudomásul ezt a tényt a rendszer. A rendszer által ismert tények lekérdezése: (facts) utasítással. A tények előtt álló számok azért lényegesek, mert egy tévesen megadott tényt az azonosítási száma segítségével lehet törölni. Például (retract 0) törli az elsőként megadott tényt.
Új tények generálása, törlése A program működése során az általunk megadott tények és szabályok alapján újabb tényeket generál. Új programfuttatás esetén rendszerint ki kell törölnünk a gép által generált tényeket. Több száz tény esetén reménytelen feladat egyenként kitörölni ezeket a tényeket. Épp ezért létrehozhatjuk a kiinduló tények csoportját a deffacts kulcsszóval, melyet a tények elnevezése követ, s majd a tények maguk.
Betöltés Ezek a csoportok begépelhetők az előbbi módon, vagy akár egy külső fájlból is beolvashatóak. (Ez utóbbi természetesen sokkal kényelmesebb.) A Csipikére és a többiekre jellemző tények a csipike.clp fáljban találhatóak, ezeket a (load "csipike.clp") paranccsal lehet betölteni.
Mentés Ha valaki a rendszeren belül definiálja a kiinduló tényeket vagy szabályokat, akkor a save paranccsal mentheti ki. Ez nem menti a generált tényeket. Azokat a save-facts segítségével menthetjük, és a load-facts segítségével tölthetjük vissza.
(reset) A szabályok betöltése még nem elegendő ahhoz, hogy egyből használatba vegyük a tényeket. Ehhez előbb ki kell adni a (reset) parancsot, amely aktivizálja a kiinduló tényeinket, illetve még létrehoz egy (initial-fact) tényt is.
Hello world! Ez utóbbi tényt felhasználva bemutatjuk a Hello world! programot, mellyel sok programnyelv ismertetése elkezdődik. Ez a program a CLIPS-ben a következőképpen néz ki: (defrule hello "Hello world" (initial-fact) => (printout t "Hello" crlf) ) Ez a program nem más mint egy szabály. Első látásra csak a nyíl tűnik ismerősnek. Az előtte és a mögötte álló sor alkotja a magát a szabályt. Előttük a szabályt definiáló kulcsszó, a szabály elnevezése (hello), s idézőjelek között egy rövidebb megjegyzés található, amely emlékeztetni hivatott a program íróját, vagy felhasználóját arra, hogy mi is volt a szabály célja. A nyíl előtt a feltétel, vagy a feltételek szerepelnek. Ha ez vagy ezek mind igazak lesznek, akkor végrehajtódik a nyíl mögötti műveletlista. Ez most egyetlen műveletből áll, s abban pedig egy kiírás szerepel. A t arra szolgál, hogy a képernyőre írjon a rendszer, a crlf pedig a soremelésről gondoskodik.
„Minden veréb madár.” ∀x(v(x) ⊃ m(x)) A szabályok a Prologban sem tartalmazták kiírva a kvantorokat, de oda kellett volna gondolni azokat. Itt szintén ugyanaz a helyzet. A Minden veréb madár. szabály formalizáltja a ∀x(v(x) ⊃ m(x)) volt. Innen első lépésben el kell hagyni a kvantort, a másodikban a ⊃ jel helyett a => jeleket kell írni, harmadikként a változók a CLIPS-ben kérdőjellel kezdődnek.
(vereb ?x) => (madar ?x) „Minden veréb madár.” Ezzel eljutottunk a (vereb ?x) => (madar ?x) alakhoz, ami már majdnem jó, csak meg kell mondani, hogy mit szeretnénk csinálni a következményben szereplő ténnyel. Esetünkben a rendszer tudomására hozni, azaz alkalmazni rá az assert parancsot.
defrule vereb-madar Ezzel kész a szabály, csak adni kell neki egy nevet (pl. vereb-madar), és esetleg egy kis magyarázó szöveget (Minden veréb madár). Összességében a parancs a következőképpen néz ki: (defrule vereb-madar "Minden veréb madár" (vereb ?x) => (assert (madar ?x)) ) Az eredeti feladatban szereplő összes szabály hasonlóképpen írható fel. Érdemes ezt a tagozást megtartani, mert így a későbbiekben is jól olvashatóak lesznek a szabályaink. Ha egy másik szabály is ugyanezt a nevet kapja, akkor az majd felülírja ezt.
(run) Ha már adott az összes szabály meg a tények, akkor a (run) paranccsal indítható el a következtetés. Megj: Ha nem akarjuk indítani, csak látni, hogy hogyan indulna el az egész, akkor az agenda parancsot kell használni. Mindebből persze nem látunk semmit.
(run)+ facts A facts parancs kiadásával láthatjuk, hogy miről bizonyíthatjuk be a tények és szabályok alapján, hogy valóban állat. Persze ezt is lehet automatizálni. Készíthetünk egy olyan szabályt, amely kiírja az állatok neveit: (defrule allathirdetes "Kiirjuk az állatok neveit" (allat ?x) => (printout t ?x " állat." crlf) )
Feladatok Adjuk hozzá az adatbázishoz (ezután adjuk ki a run parancsot)! Vilit, aki veréb Palit, aki madár Listázzuk ki a tényeket! Töröljük ki a 7-dik tényt! Töröljük a tényeket 3-tól 6-ig! Mit tapasztalunk a sorszámokra vonatkozóan?
Feladatok Töröljük az adatbázist (clear)! Adjuk hozzá a következő tényeket az adatbázishoz! …
Feladatok Autójavítás Rendőrségi nyilvántartás Sör Házasságközvetítő
Források http://www.inf.unideb.hu/~aszalos/diak/mik/mik_clips.htm http://www.inf.unideb.hu/~aszalos/diak/mik/mik.pdf