Szakértő redszerek készítése CLIPS-ben
Miért pont CLIPS? C Language Intergrated Production System LISP szerű leíró nyelv, deklaratív Ver. 1.0 (’85) – csak NASA Ver. 3.0 (’86) – NASA-n kívül is Ver. 5.0 (’91) – imperatív paradigma (procedurális és OO nyelvek) COOL – CLIPS Object Oriented Language Ver. 6.3 Beta (‘08) – jelenleg szabályalapú, adatvezérelt keretrendszer produkciós rendszer: A tényekből kiindulva a következtetési szabályok alapján meghatározott műveleteket végez, pl. új tényeket szúrnak be az adatbázisba, vagy tényeket törölnek. Előrefelé haladó következtetést végeznek. LISP szerű, deklaratív paradigma(csak problémát fogalmazunk meg, a megoldást megkeresése a rendszer feladata) sok szakértő rendszer prototípus, de csak kevés általánosan használt alkalmazás LISP: 1958, funkcionális programozási nyelv, a programkód nem más, mint függvényhívások sorozata és egymásba ágyazása. A LISP esetében a függvényhívások listák formájában jelentek meg, LISt Processing. LISP problémák: alacsony rendelkezésre állás(nem elég elterjedt), magas ár, gyenge integráció más nyelvekkel problémák megoldása szokványosabb nyelv használatával(pl.: C) meglévő eszközök C-re átültetése idő és költségigényes új, C alapú eszköz fejlesztése szakértő rendszerekhez 1985: prototípus, NASA csoportokon belül használható, alapkoncepció ismertetésére felismerés: ideális eszköz lenne a szakértő rendszerek fejlesztéséhez, alacsony költségű > NASA-n kívüli csoportoknak is elérhető Ver. 4.0, 4.1(‘87), 4.2(‘88), 4.3(‘89) > újabb funkciók, teljesítmény növelés, integráció megkönnyítése (C és Java programból is hívható, ill. CLIPS-ben is definiálható más nyelven írt kód külső függvényként) Ver. 5.0 (‘91) > procedurális (C és ADA mintára) és OO (Common Lisp Object System és Smalltalk minta) Ver. 5.1 (‘91) > MS-DOS és Mac felület Ver. 6.0 (‘93), 6.1(‘98), 6.2(‘02) > Windows és Mac felületek fejlesztése, elavult C fordítók lecserélése Ver. 6.3 Beta for Windows Release 3 > jelenlegi legfrissebb verzió
CLIPS, mint keretrendszer CLIPS shell alapelemei: Munkamemória (fact-list, instance-list) Következtetőgép (inference engine) Tudásbázis (knowledge-base) CLIPS használata: CLI GUI Beágyazott alkalmazásként memória: fact-list, instance-list köv.gép: végrehajtás szabályzása TB: szabályok halmaza (adatvezérelt rendszerek, adatok nélkül nincs végrehajtás) ezeken kívül: User Interface (CLI vagy GUI), magyarázó alrendszer(tájékoztatás az aktuális állapotról, indoklás)
CLIPS, mint keretrendszer Parancssori argumentumok: clips -f <fájl> clips -l <fájl> -f > CLIPS parancsokat tartalmazó fájl, a fájl tartalma végrehajtódik, az eredmény pedig kiíródik, interaktív mód batch parancsával ekvivalens -l > load, a fájl a tudásbázist leíró szerkezeteket tartalmazzon, interaktív mód load parancsával ekvivalens
Command prompt - top-level mode
Alapparancsok Formája: (parancs) (exit) (clear) (reset) (run) - GUI-ból is elérhetőek - clear: teljes munkamemória(tények, szabályok) törlése, restart-tal ekvivalens reset: csak tények törlése, a szabályok megmaradnak run: a megírt programunk futtatása parancs lehet: fv. hívás, konstruktor, lokális vagy globális változó, konstans fv. hívás: a fv. meghívásra kerül, végrehajtódik, a visszatérési értéke kiíródik. A fv. paraméterei mindig a fv. neve után jelennek meg. konstruktor: a definíciójának megfelelő típus létrejön globális változók és konstansok esetén kiíratódik azok értéke lokális változók értéke a bind fv.-nyel állítható be, az érték a következő reset vagy clear parancsig marad meg, létrehozás után ennek is kiíratódik az értéke
CLIPS> (+ 3 4) 7 CLIPS> (defglobal ?*x* = 3) CLIPS> ?*x* 3 CLIPS> red red CLIPS> (bind ?a 5) 5 CLIPS> (+ ?a 3) 8 CLIPS> (reset) CLIPS> ?a [EVALUATN1] Variable a is unbound FALSE CLIPS>
Nyelvi alapelemek primitív típusok függvények konstruktor adatok reprezentálására fv. amivel az adatainkat módosíthatjuk a tudásbázist bővítő szerkezetek
Primitív típusok integer: 111 -32 +45 float: 34e4 +77.21 -23.98e-11 symbol: Hello 456-93-039 @+=-% string: ”” ”as\”df” ”\\a\\b\\c” external-address: <Pointer-XXXXXX> fact-address: <Fact-XXX> instance-name: [asdf] [12-34] [+++] instance-address: <Instance-XXX> single-field values multifield values: (x 3.0 "red" 567) szám tartalmazhat: 0-9, előjel opcionális, tizedespont, e > exponens a megfelelő előjellel int: csak 0-9 és előjel lehet benne, minden más szám float-ként tárolódik ami nem szám az szimbólum symbol: csak nyomtatható ASCII karaktert tartalmazhat a szimbólum végét elhatároló karakter jelzi, ez lehet: bármilyen nem nyomtatható karakter (space, tab, carriage return, line feed), ”, (, ), &, |, <(de első karakter lehet), ~, ; (comment a sor végéig) nem kezdődhet, de tartalmazhatja: ?, $? (változóknak van fenntartva) string: ”-lel kezdődik és záródik, melyek közt 0 vagy több karakter külső cím: egy olyan adatszerkezet címe amit egy más programnyelven (pl.: C, Ada) írt fv. adott vissza, integráció, XXXXXX > a külső cím tény címe: egy tényt hivatkozhatunk az indexével, vagy a címével, XXX > a fact indexe példány neve: [ és ] közt egy szimbólum példány címe: XXX > a példány neve, ha fontos a sebesség akkor haszn. primitív típus > egy field(mező) primitív típusokra mint single-field values hivatkozunk multifield values ezek^ sorozata
Függvények nevével azonosítható, végrehajtható kód visszatérési érték vagy hasznos mellékhatás típusai: beépített felhasználó által definiált (deffunction) generikus (defgeneric, defmethod) (name args) (+ 3 5 2) (+ 3 (* 8 9) 4) tudásreprezentáció procedurális eszközei is: segítségével újabb végrehajtható elemeket hozhatunk létre a CLIPS-ben, melyek vagy valamilyen hasznos mellékhatással vagy visszatérési értékkel rendelkeznek mellékhatás pl.: információk kiírása beépített és felhasználói: lehet külső nyelven írt (C, Ada), de a CLIPS-be integrált si, beépített > implicit módon definiált, felhasználói > explicit módon definiált deffunction szerkezet: felhaszn.-i fv., CLIPS szintaxissal definiálható, előző verziókban csak más programnyelven megírt külső fv.-ekre lehetett hivatkozni, visszatérési értéke a fv. törzsében utoljára kiértékelt kifejezés értéke, ha a törzs üres > FALSE szimbólum (nincs logikai típus) generikus: defgeneric, defmethod szerkezet, fv. neve így túlterhelhető, az argumentumok száma és típusa alapján más és más feladatot hajthat végre, visszatérési érték u.a. mint deffunction alakja: fv. neve, majd az argumentumok szóközzel elválasztva, argumetnum lehet: primitív típus, változó vagy fv. hívás
Beépített eljárások és függvények (numberp <kifejezés>) (integerp <kifejezés>) (floatp <kifejezés>) (stringp <kifejezés>) (symbolp <kifejezés>) (lexemep <kifejezés>) (evenp <egész_kifejezés>) (oddp <egész_kifejezés>) (multifieldp <kifejezés>) (pointerp <kifejezés>) TRUE szimbólum, ha: (numberp <kifejezés>): float vagy int - (lexemep <kifejezés>): string vagy symbol - (multifieldp <kifejezés>): többmezőből álló érték - (pointerp <kifejezés>): külső cím
Beépített eljárások és függvények (eq <kifejezés1> <kifejezés_lista>) (neq <kifejezés1> <kifejezés_lista>) (= <numerikus_kif1> <numerikus_kif_lista>) (<> <numerikus_kif1> <numerikus_kif_lista>) (> <numerikus_kif1> <numerikus_kif_lista>) (>= <numerikus_kif1> <numerikus_kif_lista>) (< <numerikus_kif1> <numerikus_kif_lista>) (<= <numerikus_kif1> <numerikus_kif_lista>) (eq kéz kéz kép) > FALSE (>= 5 5 4 4 3) > TRUE (< 5 9 3 5) > FALSE - a kif_lista legalább 1 elemű TRUE, ha: - (eq <kifejezés1> <kifejezés_lista>): kif1 egyenlő a kif_lista minden elemével - (neq <kifejezés1> <kifejezés_lista>): kif1 nem egyenlő a kif_lista egyetlen elemével sem - (= <numerikus_kif1> <numerikus_kif_lista>): u.a. mint ”eq” csak számokra (int to float konverzió) - (<> <numerikus_kif1> <numerikus_kif_lista>): u.a mint ”neq” csak számokra (int to float konverzió) - (> <numerikus_kif1> <numerikus_kif_lista>): n-1. argumentum > mint n. argumentum - (>= <numerikus_kif1> <numerikus_kif_lista>): u.a. mint > (< <numerikus_kif1> <numerikus_kif_lista>): u.a. mint > (>= <numerikus_kif1> <numerikus_kif_lista>): u.a. mint >
Beépített eljárások és függvények (and <kifejezés_lista>) (or <kifejezés_lista>) (not <kifejezés>) - a kif_lista legalább 1 elemű - (and <kifejezés_lista>): rövidzár kiértékelés - (or <kifejezés_lista>): rövidzár kiértékelés
Függvények (deffunction <név> [<megjegyzés>] (<paraméter_lsita> [<jelző_paraméter>]) <törzs>) 5 elemből áll: név, opcionális megjegyzés, paraméterlista (0 elemű is lehet), egy opcionális jelző_paraméter mely jelzi ha változó param. számú fv.-ről van szó, fv. törzs (tevékenységek, kifejezések, melyek híváskor hajtódnak végre) névnek egyedinek kell lennie a definíció még a függvény első hívása előtt kell hogy elhelyezkedjen, kivéve a rekurzív fv.-eket paraméterlista: egymezős értékek szóközzel elválasztva, kevesebb paraméterrel nem hívható, csak többel ha változó param. számú a fv.
(deffunction factorial (?a) (if (or (not (integerp ?a)) (< ?a 0)) then (printout t "Factorial Error!" crlf) else (if (= ?a 0) 1 (* ?a (factorial (- ?a 1))) ) rekurzív fv. túl sok rekurzió stackoverflow-ot eredményezhet integerp: returns > FALSE, ha az argumentum nem int printout: t > stdout logikai neve, crlf > carriage-return, line-feed
(deffunction foo () ) (deffunction bar () (foo) (bar) kölcsönösen rekurzív fv.-ek: az egyiket előre kell deklarálni üres törzzsel
Konstruktorok defmodule defrule deffacts deftemplate defglobal deffunction defclass definstances defmessage-handler defgeneric defmethod mindig ( és ) között vannak fv. hívástól különböznek, mivel egy fv. hívás tipikusan nem változtatja meg a CLIPS környezetet míg ezen szerkezetek mindig hozzáadnak valamit a TB-hoz, emellett nincs visszatérési értékük
Munkamemória Információt reprezentálhatunk: tényekkel (facts) objektumokkal (objects) globális változókkal (global variables) Szabályok(rules): tapasztalatokon alapuló heurisztikus ismereteket ábrázolására Függvények(deffunctions, generic functions): procedurális ismereteket adhatunk meg Objektumok(objects): ez is procedurális ismeretek, CLIPS által ismert OO fogalmak (osztály, üzenetkezelés, absztrakció, beágyazás, (többszörös)öröklődés, polimorfizmus) A szabályok illeszkedhetnek tényekre és objektumokra is. Szabályhalmaz ami a tények listáján operál.
Facts információ reprezentálás legkisebb egysége listát alkotnak (fact-list) műveletek: assert, retract, modify, duplicate azonosításuk: cím vagy index tárolható rendezett vagy rendezetlen formátumban alapvető információs egység tények listájában helyezzük el őket, itt tárolódnak, a lista méretének csak a RAM mérete szab határt műveletek: hozzáadás, eltávolítás, módosítás, duplikálás fact-address, fact-index (0-tól indexelünk, hozzáadáskor kap indexet)
Ordered facts egy tény állhat több mezőből is (napok hétfő kedd szerda) rendezett tények: (tulajdonos Péter Volvo) (bevásárló_lista tej kenyér tojás) a mezők primitív típusok az első mező a kapcsolatot definiálja rendezett: a mezők szerint rendezett (alma körte) <> (körte alma) rendezetlen
Non-ordered facts deftemplate konstruktor azonos nem rendezett tények (class (teacher "Martha Jones") (#- students 30) (Room "37A")) (class (#-students 30) (teacher "Martha Jones") (Room "37A")) (class (Room "37A") (#-students 30) (teacher "Martha Jones")) nevek azonosítják a mezőket deftemplate konstruktorral hozható létre
Facts listázás (facts) létrehozás (assert (alma)) törlés (retract <fact-index>) (retract *) - listázás: „fact-index fact” formátumban assert: válasz a fact címe <Fact-0> törlés: adott index vagy az összes
Facts létrehozás konstruktorral (deffacts [modul_név] <név> [”<megjegyzés>”] <tények_listája>) (deffacts startup "Refrigerator Status„ (refrigerator light on) (refrigerator door open) (refrigerator temp (get-temp))) - reset után a tények törlődnek és a konstruktorral rendelkezők létrejönnek
Objects Két kategória: primitív típus felhasználó által definiált osztály példánya primitív típusok példányai: értékükkel hivatkozzuk őket, implicit módon a CLIPS kezeli őket (létrehozás - törlés), nincs nevük, ritkán használjuk ezen típusokat objektumként, az osztályok jelenléte a generikus függvények miatt indokolt, leginkább ott használjuk őket saját osztályok példányai: nevükkel vagy címükkel hivatkozzuk, explicit módon a programozó kezeli őket, speciális függvényekkel hozhatjuk létre ill. törölhetjük
Objects Object Class Rolls-Royce SYMBOL ”Rolls-Royce” STRING 8.0 FLOAT INTEGER (8.0 Rolls-Royce 8 ”Rolls-Royce”) MULTIFIELD <Pointer-00CF61AB> EXTERNAL-ADDRESS [Rolls-Royce] CAR
Global variables CLIPS környezeten belül bárhol elérhető megegyezik a C globális változójával defglobal konstruktorral hozható létre: (defglobal [<modul_név>] ?*<szimbólum>* = <kifejezés>) (defglobal ?*x* = 3 ?*y* = ?*x* ?*z* = (+ ?*x* ?*y*)) egy konstruktorban több változó is definiálható ha nincs modul_név > aktuális modulban definiál ha volt már ilyen nevű > felülíródik
Global variables törlés (undefglobal <szimbólum>) clear listázás (list-defglobals [<modul_név>]) listázás értékkel együtt (show-defglobals [<modul_név>]) undefglobal: nem kellenek a ? és * karakterek clear: minden változó törlődik ha nincs modul_név: összes listázása
Tudásbázis heurisztikus tudás (rules) procedurális tudás (deffunction, generic function, object message-passing defmodule)
Rules alapvető eszköz a tudás-reprezentálásra alapszabály, ökölszabály feltétel (if) – következtetés (then) minta, mintaillesztés – következtetőgép konfliktuskezelés egy adott szituációban milyen műveleteket hajthatunk végre if: bal oldal, feltételek halmaza, melyek teljesülése esetén alkalmazhatóvá válik a szabály jobb oldala, egy feltétel teljesül ha bizonyos tények elemei a tények-listájának feltétel: egyik típusa a minta (pattern), megszorítások összessége, melyekkel meghatározhatóak azok a tények vagy objektumok melyek kielégítik a minta által meghatározott feltételeket, mintaillesztés(pattern-matching) amit a köv.gép végez automatikusan következtetés: műveletek, tevékenységek halmaza, amik végrehajtandóak, ha az adott szabály alkalmazható, ezek akkor hajtódnak végre ha a CLIPS rendszert utasítjuk az alkalmazható szabályok végrehajtására ha több mint 1 szabály alkalmazható, akkor a CLIPS egy konfliktus kezelő stratégiát követ, hogy eldöntse mely szabályt alkalmazza a szabály alkalmazásával módosulhat az alkalmazható szabályok halmaza, ezután a köv.gép újabb szabályt választ és így tovább amíg az alkalmazható szabályok el nem fogynak ezen szabályok az eljárás orientált nyelvek IF-THEN szerkezeteihez hasonlóak, de amíg ott csak egyszer értékelődik ki a feltétel, addig a CLIPS-ben minden egyes szabály-alkalmazás után újra megvizsgálja ezeket a köv.gép
Rules (defrule <név> [<megjegyzés>] [<deklaráció>] <feltétel(ek)> => <tevékenység(ek)>) (defrule pelda „Egy egyszerű példa" (hűtő lámpa világít) (hűtő ajtó nyitva) => (assert hűtő étel megromlott)) ) ha már létezett ilyen nevű > felülíródik LHS és RHS: implicit and van a feltételek közt, számukra nincs megszorítás a tevékenységek szekvenciálisan hajtódnak végre, de csak akkor ha az összes feltétel teljesül ha az LHS üres, a szabály mindig alkalmazható, ha az RHS üres, akkor pedig nem történik semmi ha alkalmazzuk LHS: (test fv.hívás), and, or, not
Object message-passing objektumok közti kommunikáció üzenet-kezelők, üzenet-átadás objektumok viselkedését befolyásolhatjuk szabályozhatjuk, hogy az adott objektum az egyes üzenetekre, milyen választ adjon pl.: send függvény send fv.: üzenet küldése az objektumnak, az üzenet hatása ugyan az mint a fv.-eknél, vagy egy hasznos mellékhatás vagy egy visszatérési érték
Defmodules a tudásbázis particionálását szolgálja minden konstruktorral létrehozott eszköz valamely modul tagja láthatóság szabályozása szabályok végrehajtásának szabályozása
Irodalomjegyzék http://clipsrules.sourceforge.net/documentation/v6 30/bpg.pdf http://iweb.tntech.edu/bhuguenard/ds6530/ClipsT utorial/tableOfContents.htm http://clipsrules.sourceforge.net/OnlineDocs.html