Aszalós László
Mesterséges intelligencia közgazdászoknak
mobiDIÁK könyvtár
Aszalós László
Mesterséges intelligencia közgazdászoknak
mobiDIÁK könyvtár ˝ SOROZATSZERKESZTO Fazekas István
Aszalós László
Mesterséges intelligencia közgazdászoknak Egyetemi jegyzet közgazdászok részére els˝o kiadás
mobiDIÁK könyvtár Debreceni Egyetem Informatikai Kar
Lektor Dr. Bognár Katalin Debreceni Egyetem Informatikai Kar
c Aszalós László, 2005 Copyright c elektronikus közlés mobiDIÁK könyvtár, 2005 Copyright mobiDIÁK könyvtár Debreceni Egyetem Informatikai Kar 4010 Debrecen, Pf. 12 http://mobidiak.inf.unideb.hu
A m˝u egyéni tanulmányozás céljára szabadon letölthet˝o. Minden egyéb felhasználás csak a szerz˝o el˝ozetes írásbeli engedélyével történhet. A m˝u A mobiDIÁK önszervez˝o mobil portál (IKTA, OMFB-00373/2003) és a GNU Iterátor, a legújabb generációs portál szoftver (ITEM, 50/2003) projektek keretében készült.
Tartalomjegyzék I. El˝oszó . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
II. Mesterséges intelligenciáról általában . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1. Mi az MI? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Szakért˝o rendszer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. A tudás leírása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11 11 13 14
III. Logikai alapok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1. A logika definíciója . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Kijelentéslogika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Els˝orend˝u logika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Gyakorlatok következtetésekre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5. El˝ore- és visszafele láncolásos következtetések . . . . . . . . . . . . . . . . . . . . . .
23 23 24 25 26 27
IV. Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 1. Prolog alapok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2. Egyszer˝u szakért˝o rendszerek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 V. CLIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1. Ki Csipike? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Születésnap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Rendezett és nem rendezett tények . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5. Keretrendszer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41 41 43 45 49 50
VI. Szakért˝o rendszerek fejlesztése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1. A projekt kezdete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. A rendszer analízise és tervezése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Gyors prototípus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Rendszerfejlesztés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5. Alkalmazás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55 55 58 58 59 59
7
8
TARTALOMJEGYZÉK
6. Utómunkálatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
I. fejezet
El˝oszó Ez a jegyzet A mesterséges intelligencia közgazdászoknak el˝oadás anyagát tartalmazza. Miután a közgazdász hallgatóknak rendszerint nincsenek el˝ozetes ismerteik matematikai logikából, mesterséges intelligenciából, és programozási nyelveket sem ismernek, így az alapokkal kezdünk. Röviden ismertetjük a mesterséges intelligencia alapfogalmait, alapvet˝o kérdéseit. Majd ezután a tananyag központi részét jelent˝o szakért˝o rendszerek alapjait ismertetjük vázlatosan. Ezután azt részletezzük, hogyan ábrázolható a tudás. Ennek keretében matematikai eszközökkel leírunk több szórakoztató rejtvényt. A harmadik fejezetben szerepelnek a logikai alapfogalmak, s a következmény fogalma. Mind a nullad- mind az els˝orend˝u logika jelölésrendszerét áttekintjük, s megvizsgálunk több következtetéssel kapcsolatos feladatot. Ezt az automatikus következtetési módszerek ismertetése követi. A negyedik fejezetben Prolog programnyelv alapjait nézzük át. Megismerjük az egyszer˝ubb definíciókat, majd azt, hogy hogyan ábrázolhatóak ebben a nyelvben a szemantikus hálók és a keretek. Végül a visszafele következtetés jellemz˝o feladatainak lehetséges programjaival ismerkedünk meg. Az ötödik fejezetben a CLIPS programnyelv vázlatos ismertetése szerepel. Mivel többszáz oldalas a felhasználói leírás, a félév során a nyelv lehet˝oségeinek csak töredékét mutathatjuk be. Viszont utalunk azokra az utasításokra, melyekkel akár önállóan is tovább lehet lépni a továbbiakban. Végül azt vázoljuk fel, hogyan néz ki egy vállalati szakért˝o rendszer kifejlesztése és üzembe állítása.
9
II. fejezet
Mesterséges intelligenciáról általában 1. Mi az MI? A mesterséges intelligencia (röviden MI) kifejezés John McCarthytól származik, még 1956-ból. Maga a kifejezés nem igazán nem szerencsés, de elterjedt, így ezt fogjuk használni.
1.1. Definíció Sajnos nem csak az elnevezéssel van baj, a fogalom definíciója is hiányzik. Az egyik elképzelés szerint az MI célja olyan rendszerek létrehozása, amely Az emberhez hasonlóan gondolkodnak: Ennek megfelel˝oen felgyorsult a kognitív tudomány kutatása. Ez az emberi megismerés, gondolkodás modelljeivel foglalkozik. Ha sikerülne az emberi gondolkodás egy megfelel˝oen pontos elméletét megfogalmazni, elvileg azt számítógépes programmal is lehetne utánozni. Az emberhez hasonlóan cselekednek: Mikor intelligens egy program? Alan Turing megfogalmazott egy tesztet, mely szerint egy számítógépes program intelligensnek tekinthet˝o, ha a kérdez˝o, amely egy terminálon keresztül teszi fel kérdéseit, nem tudja eldönteni, hogy számítógép, vagy ember válaszol a kérdéseire. A programnak a következ˝okre van szüksége: – természetes nyelvi megértés — „emberi” nyelven kommunikáljon a gép, – tudásreprezentáció — a beszélgetés alatt szerzett ismereteket tárolja, – automatikus következtetés — a tárolt ismeretek felhasználása, – gépi tanulás — alkalmazkodni tudjon a körülményekhez. Az Eliza (1966) rendszer egyszer˝u mintaillesztésen alapul, a Turing-tesztet talán teljesítené, ám nem intelligens. Racionálisan gondolkodnak: Kulcskérdés a helyes következtetés. Arisztotelész már szillogizmusokat (következtetési szabályokat) fogalmazott meg, de csak kétezer év múlva születtek meg a következtetések formális 11
12
II. MESTERSÉGES INTELLIGENCIÁRÓL ÁLTALÁBAN
axiómarendszerei. A hetvenes években készültek el a megfelel˝o szint˝u következtet˝o programok, viszont nehéz az egész világot formális szabályokkal leírni, és id˝oigényes a következtetés, ezért túln˝ohet a feladat megoldása a számítógép határain. Racionálisan cselekednek: Ágens — érzékelni és cselekedni képes program vagy szerkezet. Napjaink egyik divatos kutatási területe. Nézzük, hogy mi valósult meg mindezekb˝ol eddig: – természetes nyelvi elemz˝ok: játékok, adatbázisok felhasználói felületei, fordítók, – szakért˝o rendszerek, ágensek, – önállóan m˝uköd˝o érzékel˝ok, robotok, melyek el˝ore terveznek különféle feladatokat, – felismer˝o rendszerek (gépelt szöveg, kézírás).
1.2. Határos tudományok Már az el˝obbiekb˝ol is látható, hogy az MI nem elkülönült tudomány, sok más tudományterülethez kapcsolódik. Egy nem teljes lista a határos tudományokról a következ˝o: – – – – –
kognitív pszichológia, pszicholingvisztika logika, nyelvfilozófia, gondolkodás filozófiája számítógépes nyelvészet, pszicho- és szociolingvisztika robotika adaptív rendszerek elmélete
1.3. Intelligens rendszerek jellemz˝oi Az MI eredeti kutatási célja az volt, hogy bizonyos feladatokat számítógéppel oldjanak meg. Viszont az MI-ben használatos algoritmusok, módszerek igen eltérnek az ötvenes-hatvanas években a számítógéppel megoldott feladatok algoritmusaitól, amelyek f˝oleg számolásra, adatok rendezésére, kezelésére alapult. Lássuk melyek az intelligens rendszerek jellemz˝oi! – Els˝osorban nem numerikus szimbólumokkal dolgoznak. – A feladatokat nem pontos algoritmusok alapján oldják meg, hanem heurisztikus módszereket alkalmaznak. Heurisztika: tapasztalaton alapuló módszer (pl. egyszer˝usít˝o feltevés), amely korlátozza vagy egyszer˝usíti a megoldás keresését bonyolult, nagyméret˝u illetve kevésbé megértett problémák feladatterében. Az algoritmusoktól eltér˝oen a heurisztikák nem biztosítják az általuk szolgáltatott megoldás hibátlanságát.
˝ RENDSZER 2. SZAKÉRTO
13
– Olyan tudáskészlettel rendelkeznek — a valóság adott szeletének modelljével —, amely az ember számára érthet˝o, a tudásbázis világosan el van választva a feladat megoldását szolgáltató következtet˝o gépt˝ol. A rendszer képes megoldást találni olyan esetekben is, amikor a feladat megoldásához szükséges adatok hiányosak, vagy pontatlanok. (Természetesen ekkor a megoldás, a következtetés pontatlan, vagy akár téves is lehet.) – A rendszer képes megoldani olyan feladatokat is, amelyekben az adatok egymásnak ellentmondanak. Ilyenkor az emberhez hasonlóan azt választja, amely leginkább összhangban van az ismereteivel. – A rendszernek rendelkeznie kell a tanulás képességeivel.
2. Szakért˝o rendszer A sok különféle mesterséges intelligenciához tartozó terület közül mi a szakért˝o rendszerekkel fogunk foglalkozni, ezért nézzük meg, mi is ez valójában! A szakért˝o rendszer a tudással, adatokkal, információkkal dolgozik, számunkra ez a kövezkez˝oket jelenti: az adat a feldolgozatlan input (bemen˝o értékek), a információ a feldolgozott adat, a tudás az információ-elemek és a köztük fennálló kapcsolat együttesét jelenti. Az információ-elem lehet objektum, fogalom, annak valamilyen tulajdonsága. A kapcsolat pedig lehet hiearchius, tartalmazás, hasonlóság, stb. Hogy is néz ki els˝o közelítésben egy szakért˝o rendszer? El˝oször is a tervez˝oje (illetve extrém esetben a felhasználó) feltölti a rendszert megfelel˝o információval. Ezután a felhasználó kérdéseket tehet fel, melyre a rendszer választ ad vagy tanácsokkal látja el a felhasználót. Például egy vasúti menetrendet tartalmazó rendszernél a felhasználó bármely két állomás közti útvonalra kérhet javaslatokat, amelyek különféle feltételeknek is eleget tesznek. Természetesen egy ilyen rendszer képessége korlátos, a vasúti menetrend nem tartalmazza a kompok vagy a hajók menetrendjét. Az 1. ábrán látható a szakért˝o rendszer vázlatos felépítése. A rendszer lelke a következtet˝o rendszer, mellyel a következ˝o fejezetben részletesen foglalkozunk. Az aktuálisan vizsgált világ leírása a memóriában található. A világ leírása egyszer˝u formában történik meg, például erre használhatunk (o, t, e) hármasokat, ahol az o az adott objektum neve, t a tulajdonság elnevezése, az e pedig a megfelel˝o érték. A barátkesely˝u esetén felírhatjuk a következ˝oket: (barátkesely˝ u, méret, nagy) (barátkesely˝ u, fej, kopasz) (barátkesely˝ u, szín, barna)
14
II. MESTERSÉGES INTELLIGENCIÁRÓL ÁLTALÁBAN
Tudásbázis
Következtet˝o rendszer
Magyarázat
Memória)
Információlekérdezés
Felhasználói felület
1. ábra. A szakért˝o rendszer felépítése
Az egyszer˝uség kedvéért ezt érdemes a következ˝o formában rövidíteni: (barátkesely˝ u (méret, nagy) (fej, kopasz) (szín, barna)) Ezek az állítások, ezek a tények tartalmazzák mindazokat az ismereteket, melyeket a kérdés megválaszolásakor a rendszer felhasználhat. De azt, hogy hogyan használhatja fel ezeket, azt a tudásbázis határozza meg. A tudásbázisban a tudást különféleképpen reprezentálhatjuk. Például a szabály alapú ismeretreprezentáció esetén az ismeretek leírásának a formája a következ˝o: Ha feltétel, akkor m˝uvelet. Például „Ha x sz˝orös, akkor töröljük az x-et az adatbázisból!” vagy „Ha x repül és x tojást rak, akkor vegyük fel az adatainhoz azt, hogy x madár. A gyakorlatban használt szakért˝o rendszerek fontos eleme, hogy a kérdésre adott válasz esetén megtudhassuk, hogy mi úton-módon jutott az adott válaszhoz a rendszer, milyen következtetéseket használt fel ehhez. Mi a félév során ezzel nem foglalkozunk.
3. A tudás leírása Ebben a részben arról lesz szó, hogy milyen formalizmussal írhatóak le az információ-elemek és azok kapcsolatai. Miel˝ott ezt bemutatnánk, soroljuk fel, hogy milyen kérdések merülhetnek fel ezzel a formalizmussal kapcsolatban: adekvált: a lényeges információ-elemekkel foglalkozunk-e? megérthet˝o: a leírt tudás megérthet˝o-e? átadható: a tudás közölhet˝o-e? összetett: a komponensek összekapcsolhatók-e? hatékony: takarékosan használjuk-e fel a memóriát, illetve könnyedén végrehajthatók-e az egyes m˝uveletek?
3. A TUDÁS LEÍRÁSA
15
3.1. Állapottér leírás A világ minden pillanatban valamilyen állapotban van. Ezt az állapotot természetesen valamilyen egyszer˝usített formában ábrázolhatjuk. A világ valamely állapotát célállapotnak nevezzük, ezt szeretnénk elérni. Ha a világ már ebben az állapotban van, akkor nem kell az állapotot megváltoztatni. Ha nem ebben az állapotban van, akkor valamilyen változtatások, lépések, m˝uveletek sorozatával lehet az állapotát megváltoztatni. Ám ez még nem garantálja, hogy ilyen lépéssorozattal a célállapot elérhet˝o. Formálisan a probléma a következ˝o négyessel írható le: P = hS, O, s0 , Ci, ahol S az állapotok halmaza (állapottér), O az S → S típusú operátorok halmaza, s0 a kezd˝oállapot és C a célállapotok halmaza. Az s állapotból a t állapot közvetlenül elérhet˝o, ha van egy olyan o ∈ O, hogy o(s) = t. Az s állapotból a t állapot elérhet˝o, ha létezik olyan s1 ,. . . sn sorozat, hogy s = s1 , t = sn és si -b˝ol si+1 közvetlenül elérhet˝o. Egy P probléma megoldása egy olyan ho1 , . . . , on i, ahol oi ∈ O, ok (ok−1 (. . . o1 (s0 ) . . .)) = t és t ∈ C. A soron következ˝o példákban az alábbi kérdésekre keressük a választ: – Miképp ábrázolunk egy állapotot? – Milyen m˝uveletek segítségével tudunk egy állapotból egy másikba eljutni? – Mi a kezd˝oállapot? – Mi a terminális feltétel? 3.1.1. Nyolcas játék. A közismert 15-ös játék egyszer˝usített változata. Egy 3 × 3-as táblára tesszük fel a 8 darab számozott figurát. Egy-egy lépésben egy figurát lehet a vele szomszédos mez˝ore tolni. Az állapotot a 3 × 3-as táblázatba írt 8 szám ad meg. Az operátorok: üres mez˝o fel, üres mez˝o le, üres mez˝o balra, üres mez˝o jobbra. Ennek megfelel˝oen legfeljebb négy, legalább két lépés lehetséges. Kiinduló állapot: 1
2
4
6
3
7
5
8
1
2
3
4
5
6
7
8
Célállapot:
16
II. MESTERSÉGES INTELLIGENCIÁRÓL ÁLTALÁBAN
3.1.2. n királyn˝o. Az n × n-es táblára sorban egymás után n vezért teszünk fel, hogy azok ne üssék egymást. (Két vezér akkor üti egymást, ha azonos sorban, azonos oszlopban, vagy azonos átlóban találhatóak.) Egy állopot ábrázolható lenne az n × n-es táblázattal is, de mivel egy oszlopban csak egy vezér állhat, elegend˝o egy n méret˝o vektor, s a vektor elemei azt adják meg, hogy az adott oszlopban található vezér hanyadik sorban áll. Egy-egy operátor egy-egy vezér hozzáadását jelenti. Célállapot n = 4 esetén: ? ? ? ? Ennek a végállapotnak a 2, 4, 1, 3 vektor felel meg. 3.1.3. Három kancsó. Adott három kancsó, egy 8, egy 5 és egy 3 literes. A nyolcliteres tele van borral, a másik kett˝o üres. Hogyan tudunk négy liter bort kimérni? Ebben az esetben egy állapotot egy számhármassal adhatunk meg, a számok sorra azt jelentik, hogy hány liter bor található a 8, az 5, a 3 literes kancsóban. Természetesen a 8 literes kancsóban minimum 0, s maximum 8 liter bor lehet, s hasonló állítások igazak a többi kancsóra is. Mivel bor nem vész el, s nem is teremt˝odik, a három szám összegének nyolcat kell adnia. Ezeknek a feltételeknek még végtelen sok állapot megfelelne, de az operátoroknak megfelel˝oen nem lesz olyan sok. Mivel a három kancsó mindegyikéb˝ol elvileg lehet önteni a másik kett˝obe, hat operátorral számolhatunk. Ha a kiinduló kancsóban kevesebb bor van, mint a célkancsóban üres hely, akkor az egész tartalmat átöntjük. Ellenkez˝o esetben a célkancsót teletöltjük a kiinduló kancsóból. A 3.1.3 táblázatban látható, hogy a kiinduló állapotból mely állapotokba juthatunk el. Ugyanez más módszerrel is ábrázolható. Mivel bor nem vész el, ha tudjuk, hogy mennyi van bel˝ole az 5 literes és a 3 literes kancsókban, akkor kiszámolható a 8 literes kancsó tartalma is. Ennek megfelel˝oen készítünk egy rajzot, melyen a vízszintes irány a háromliteres kancsó, a ferde irány pedig az ötliteres kancsó tartalmának felel meg. Így a zöld nyilak azt jelzik, amikor a nyolcliteres és háromliteres között öntjük a bort, a piros az öt- és nyolcliteresnek, a kék pedig a három- és ötliteresnek. A rajzon elegend˝o elindulni az egyik irányban, elkerülni a sarkokat, s hamarosan adott a megoldás.
3.2. Logikai leírás Az els˝orend˝u predikátumkalkulus (klasszikus logika) függvények és predikátumok (tulajdonságok és relációk) alkalmazásával írja le egyedek kapcsolatait:
3. A TUDÁS LEÍRÁSA db 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
állapot 800 350 503 053 323 530 620 233 602 251 152 701 143 710 440 413
8→5 2 4 4 2 2 4 11 10 4 2 2 4
8→3 3 4 8 5 3 4 4 3 16 13 -
5→8 1 3 3 1 1 3 12 9 3 1 1 3
5→3 5 3 9 8 13 12 16 -
17 3→8 1 2 7 6 1 2 2 1 15 14
3→5 6 2 10 7 14 11 15
1. táblázat. Áttöltögetések eredménye
2
10
11
4
r r r -r
J J ]J ] ]J
J
J
J
J
JJ
JJ
^
r
r
13 15
J
JJ
J
JJ ]
J
J
J
J J
JJ
^
J
r 8 r
6
J
J
J
] J
J
J
J
J
J
^
J J
r r
5 7
J
J
]J
J
J
J
J
J
JJ
JJ ^
r
J
16 r 14
J
J
J
J
]
J
J
JJ
J
JJ JJ JJ
r
^ r
^
^ r
- r
1
12
9
3
2. ábra. Boröntögetés grafikus ábrázolása
testvér(anyja(Péter),Lajos), azaz Péter anyja és Lajos testvérek. Általános esetben egy nagyobb rendszernél rengeteg predikátumra van szükségünk. Hátránya továbbá még ennek a módszernek az, hogy hiányos vagy gyorsan változó adatokat nehezen kezel (erre megoldás a default logic) és akkor is problematikus a használata, ha az állításaink igazságértéke különbözik az igaz és hamis értékekt˝ol (erre a fuzzy logika szolgál megoldással). Ez utóbbira jellemz˝o példa következ˝o: Ha vasárnap elég meleg lesz, és nem fúj nagyon a szél, nagyot fogok sétálni.
18
II. MESTERSÉGES INTELLIGENCIÁRÓL ÁLTALÁBAN
3.3. 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. A Ha mögött egy feltétel, az akkor mögött egy m˝uvelet szerepel. A hétköznapi nyelvben a szabályokat rendszerint a következ˝o formában fogalmazzuk meg: Minden veréb madár. Ezt a szabályt úgy fogalmazhatjuk át, hogy ha egy él˝olény veréb, akkor az az él˝olény madár is. Legyenek adottak a következ˝o tények (1-3.) és szabályok (4-9): 1. 2. 3. 4. 5. 6. 7. 8. 9.
Ká kígyó. Szilvia elefánt. Csipike veréb. Minden veréb madár. Minden hüll˝o állat. Minden madár állat. Minden pingvin madár. Minden madár tojással szaporodik. Minden kígyó hüll˝o.
A felsorolt szabályokat és tényeket két módon is felhasználhatjuk. Els˝o esetben az itt megadott tényekb˝ol indulunk ki, és a szabályokat felhasználva újabb és újabb tényeket generálunk. Ezt a módszert el˝oreláncolásos következtetésnek nevezzük. Lássuk, hogyan m˝ukö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˝oz˝oek alapján, így Csipike állat. A másik módszer esetén egy kérdést teszünk fel, s azt szeretnénk megválaszolni. A szabályok segítségévél újabb, gyakran egyszer˝ubb kérdéseket teszünk fel, s ezt folytatjuk mindaddig, amíg a olyan kérdésekhez nem jutunk, amelyeket a megadott tények megválaszolnak. Ennek megfelel˝oen mivel a kérdést˝ol visszafele haladunk a tények felé, a módszer a visszafele láncolás nevet kapta. Be tudjuk-e látni azt, hogy Csipike állat? Találjuk meg a hipotézist megalapozó tényeket, szabályokat! A feltételeink alapján ahhoz, hogy Csipike állat legyen azt kell belátni, hogy Csipike hüll˝o, vagy azt, hogy Csipike madár. Ez utóbbihoz elegend˝o azt belátni, hogy Csipike veréb. Ez a tény szerepel a feltételek között, így kész vagyunk. Az el˝orelá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˝o alkalmazandó szabályt, így a módszer adattal irányított. A visszafele láncolásos következtetés esetén a kérdéshez, azaz
3. A TUDÁS LEÍRÁSA
anyaga -
állaga -
hóember 6
egy Elek
anyaga -
19
anyaga víz
puha
színe hó
-
fehér színe átlátszó
h˝omérséklete h˝omérséklete - hideg jég állaga kemény
3. ábra. Elek szematikai hálója
a következményhez keressük meg a megfelel˝o feltételeket. Ennek megfelel˝oen a kérdések, azaz a cél irányítja a keresés folyamatát. Míg az el˝oreláncolásos következtetés módszerét tervezésre, kontrollra , a viszszafele láncolás módszerét diagnózisra érdemes használni.
3.4. Szemantikus háló A Quillian által 1967-ben bevezetett szemantikus háló egy gráfot jelent. A fogalmak, objektumok a gráf csúcsai, a relációk pedig a köztük lév˝o élek. A 3 ábrán a hó csúcsból a h˝omérséklet elnevezés˝u él a hideg csúcshoz vezet, s ez azt jelenti, hogy a hó (objektum) h˝omérséklete (tulajdonság) hideg (érték). A szemantikus hálókról nem csak ez az egyszer˝u kapcsolat olvasható le, hanem bizonyos tulajdonságok örökl˝odhetnek is. A 4 ábráról a kanári tulajdonságát olvashatjuk le. Például azt, hogy a kanári sárga, a kanári tud repülni, a kanárinak van b˝ore. A Quillian és Collins kisérletei azt mutatták, minél messzebb helyezkedik el a két csomópont a gráfban, a kísérleti alanyok annál lassabban válaszolták meg a kérdést. A szemantikus hálóban lehet˝oség van kivételkezelésre, magyarán a tagadás kifejezésére is, például a pingvin nem tud repülni. Ezek után a pingvin hiába madár, a madarakra jellemz˝o tud repülni tulajdonság már nem örökl˝odik a pingvinekre.
20
II. MESTERSÉGES INTELLIGENCIÁRÓL ÁLTALÁBAN
egy
hal
állat
-
van-
egy
madár egy színe ?
sárga
tud- mozogni
6
kanári
tud
- repülni
van
-
van
- szárnya
b˝ore
tud- lélegezni
tolla
tud ?
énekelni 4. ábra. Kanári szemantikus hálója
A kanári szemantikus hálója kiegészíthet˝o lenne a Cs˝orike csúccsal, ami egy kanári. Viszont itt az egy szót két különböz˝o értelemben használjuk. A két jelentést élesen el kell választani! Az ábrán szerepl˝o alakok matematikában a részhalmaznak feleltethet˝oek meg, például a kanárik halmaza részhalmaza a madarak halmazának, vagy a halak halmaza részhalmaza az állatok halmazának. A Cs˝orike pedig eleme a kanárik halmazának. Ez utóbbi relációra a kés˝obbiekben az egyed, az el˝obbire pedig a fajta elnevezéssel hivatkozunk. A szemantikus hálós megközelítésnek természetesen vannak el˝onyei és hátrányai is. El˝onyt jelent az átlátható grafikus megjelenítés, az explicit reláció a fogalmak, objektumok között, és az ábrázolás rugalmassága. Hátrány jelent viszont a sz˝uk kifejez˝oképesség, a heurisztikus keresés (nem hatékony), a relációk tulajdonságának (tranzitív, szimmetria) követése, a relációk különféle értelmezése, a relációk típusának nagy száma (a szemantikus hálók egyik továbbfejlesztésénél — conceptual dependency relationship— tucatnyi különféle relációt vezettek be, melyekre különféle módosító jelz˝ok alkalmazhatóak), negatív keresés esetén kombinatorikus robbanás történik a keresésnél.
3.5. Keretalapú ismeretábrázolás A keretalapú ismeretábrázolás Minsky nevéhez f˝uz˝odik (1975). Ez nem más, mint a szemantikus háló továbbfejlesztése. Itt egy csúcsnak saját strukturája lehet,
3. A TUDÁS LEÍRÁSA
21
ezt nevezzük keretnek. Mint az a 5. ábrán látszik egy csúcs egy objektumot ábrázol, és az objektum tulajdonságainak és azok értékenek párjai alkotják a csúcsot. (Emlékezzünk vissza az objektum, tulajdonság és érték hármasára!) A rendszer hierarchikus felépítés˝u, ennek megfelel˝oen az adott tulajdonságok örökl˝odnek. Esetünkben a nyúlról nem kell leírni azt, hogy sz˝or fedi, mert ez következik abból, hogy eml˝os. A kereteknél a szematikai hálóhoz hasonlóan meg kell különböztetni az egyed- és típuskereteket. Ez utóbbi objektumok egy csoportjának általános tulajdonságait írja le (prototipus), míg az el˝obbi egy speciális objektum egyedi tulajdonságait tartalmazza, s természetesen örökli a típusa tulajdonságait is. A keretalapú ismeretábrázolás kifejez˝oképességét növelend˝o a kerethez, vagy egyes tulajdonságaihoz különféle m˝uveleteket lehet rendelni. Ezzel például figyelni lehet, hogy az adott tulajdonság értéke megfelel-e bizonyos feltételeknek, más tulajdonság értékét egyéb értékekb˝ol lehet származtatni, stb. (Ebb˝ol fejl˝odött ki a napjaink programozási módszere: az objektumorientált programozás.) A keretrendszer sok jó tulajdonsággal rendelkezik, ezért is alkalmazza napjaink legtöbb szakért˝o rendszere ezt a módszert. Lássunk pár el˝onyös tulajdonságot: nagyon rugalmas, jó kifejez˝oképesség, az ok-okozati kapcsolatok könnyedén megfogalmazhatóak, rendezetten írható le a tudás, tartalmazza a hierarchiát és örökl˝odést, szabály alapú komponensekkel könnyen b˝ovíthet˝o. Természetesen a hátrányokat sem felejthetjük el: nehezen kezelhet˝ok a speciális esetek, a módosításoknak el˝ore nehezen látható következményei lehetnek más keretekben.
eml˝os vér meleg fedi sz˝or 6
nyúl típus eml˝os fül hosszú mozgás ugrál láb 4
ember típus eml˝os láb 2 farok nincs
5. ábra. Egyszer˝u keretek
III. fejezet
Logikai alapok 1. A logika definíciója Logikán a logikai nyelv és szemantika párosát értjük, ahol a Nyelv: Olyan jól formált kifejezések gy˝ujteménye, amelyhez jelentés rendelhet˝o. A klasszikus logikában ezeket a kifejezéseket nevezzük formuláknak. Szemantika: Ez adja meg, hogy az el˝obbi kifejezéseket hogyan értelmezzük valamir˝ol szóló állításokként. Ez a valami lehet valamilyen matematikai objektum, mint például a természetes számok, csoportok; de lehetnek hétköznapi dolgok, mint például kocsik, id˝ojárás. A nyelv állításai ezen objektumok tulajdonságairól, kapcsolatáról szólnak. A modell megadása azt jelenti, hogy minden egyes ilyen tulajdonság illetve reláció esetén megadjuk, hogy az mely esetekben igaz. Egy M modell megadása esetén a következ˝o definíciókat szokás használni: Legyen Γ formulák egy halmaza! M |= A: (M modell modellje az A formulának), ha A igaz M-ben. |= A: (A érvényes), ha A igaz minden modellben. M |= Γ: (M modellje Γ-nak), ha M |= A minden A ∈ Γ formulára. Γ |= A: (A logikai következménye Γ-nak), ha A igaz Γ minden modelljében. Ez szép elméleti definíció, de mivel általában végtelen sok modell létezik, nem tudjuk mindegyiket végigvizsgálni. Mivel kézzelfogható eredményekre is kiváncsiak vagyunk, például tudni szeretnénk, hogy egy kifejezés logikai törvény-e vagy egy kifejezés logikai következménye más kifejezéseknek, a definícióban szerepl˝o szemantikai megközelítés pedig nem automatizálható, szükségünk van egy másik módszerre is, ez pedig a levezetési rendszer. A levezetési rendszer szabályok egy olyan gy˝ujteménye, amellyel érdekes tényeket vezethetünk le tisztán mechanikus úton a szemantikai objektumok tulajdonságairól és kapcsolatairól. 23
24
III. LOGIKAI ALAPOK
2. Kijelentéslogika A kijelentéslogikában egyszer˝u kijelentéseink (állításaink, ítéleteink) vannak, melyek mindegyike vagy igaz, vagy hamis. Ilyen állítás például a Kett˝o páros szám. vagy Éva sz˝oke. A bonyolultabb állításokat a kijelentésekb˝ol állíthatjuk össze összeköt˝ojelek segítségével. A következ˝o összeköt˝ojeleket használjuk: ∧ ∨ ¬ ⊃
konjunkció diszjunkció negáció implikáció
(és) (vagy) (nem) (ha . . . , akkor)
Az összetett állítások igazságértékét a kijelentések értékéb˝ol számíthatjuk ki: P Q ¬P I I H I H H I I H H
P ∨Q P ∧P I I I H I H H H
P ⊃Q I H I I
Egy állítás érvényes (tautológia), ha a kijelentésváltozók tetsz˝oleges értékelésénél (másnéven minden interpretációban) igaz. Egy állítás kielégíthet˝o, ha van olyan interpretáció, melyben a formula igaz. Egy formula ellentmondásos, ha minden interpretációban hamis. Mivel az érvényesség és logikai következmény szorosan kapcsolódik, fontos eldöntetnünk egy formuláról, hogy az érvényes, vagy sem. Az összes eset vizsgálata hatásos, de nem hatékony. Egy becsületesebb rendszer több mint ezer tényt (kijelentést) ismer, s így 21000 esetet kellene megvizsgálni, ami lehetetlen! A legegyszer˝ubb levezetési rendszer egy levezetési szabályt alkalmaz, melynek a neve Modus Ponens. Ennek a szabálynak az alakja a következ˝o: A, A ⊃ B B A következ˝oképp értelmezzük: ha igaz az A és igaz az A ⊃ B premissza akkor igaz a B konklúzió is. Ha A jelöli az Esik. és B az Az utak vizesek. mondatot, akkor az Ha esik, akkor az utak vizesek. és Esik. feltételekb˝ol következik az Az utak vizesek. következmény. A hétköznapi életben sokszor lehet találkozni az alábbi hibás következtetéssel: Ha esik, akkor az utak vizesek. és Az utak vizesek. feltételekb˝ol következtetnek az Esik. következményre. Ennek a A, B ⊃ A B
˝ ˝ LOGIKA 3. ELSOREND U
25
szabály felelne meg, de ilyen levezetési szabály nem látezik! (Ennek igazolására készítse el a A ∧ (B ⊃ A) ⊃ B formula igazságtábláját!) Gondoljunk csak arra, ha ott járt a locsolókocsi, akkor is vizesek az utak!
3. Els˝orendu˝ logika Ha tudnánk, hogy Alíz Béla testvére (P ) és Béla Csaba testvére (Q), akkor mindenki számára nyilvánvaló, hogy Alíz Csaba testvére (R), de a kijelentéslogikában (P ∧Q) ⊃ R formula nem érvényes. A kijelentéslogika nem képes ilyen kapcsolatok, relációk kifejezésére. Ezért egy ennél kicsit bonyolultabb logikát fogunk használni, a klasszikus els˝orend˝u logikát. Erre a logikára, pontosabban ennek egy részére alapul a Prolog is. Akárcsak az el˝obbi példában szükségünk van arra, hogy objektumokra (emberekre, állatokra, tárgyakra, gépekre) hivatkozhassunk. Ha az objektumnak van neve, akkor egyszer˝u dolgunk van. Néha nem tudjuk a nevet, de valahogy utalhatunk rá, például Péter anyja. S vannak esetek, amikor egy változót kell használnunk. Az els˝orend˝u logikában a legegyszer˝ubb állítások különféle objektumok tulajdonságait, relációit írják le. Például sz˝ oke(anyja(Péter)), azaz Péter anyja sz˝oke, vagy magasabb(anyja(Péter),apja(Pál)), azaz Péter anyja magasabb mint Pál apja. A logikai összeköt˝ojelekkel ezekb˝ol az állításokból a korábbiakhoz hasonlóan összetett állítások készíthet˝oek. További lehet˝oség összetett állítások készítésére a kvantorok használata. Két kvantort használhatunk: az univerzálist (∀, bármely, minden) és az egzisztenciálist (∃, van, létezik.) A Minden leány csalfa, azaz a ∀xC(x) állítás azt fejezi ki, hogy a tárgyalási univerzum minden elemére (magyarul minden lányra) az adott állítás — azaz hogy a szóban forgó lány csalfa– igaz. Egy ilyen állítás pontosan akkor igaz, hogy ha tetsz˝oleges elemet kiválasztva, s az állításban szerepl˝o változó helyére írva igaz állítást kapunk. A Van becsületes politikus, azaz a ∃xB(x) állítás ehhez hasonlóan akkor lesz igaz, ha a politikusok halmazában találunk olyan személyt, aki becsületes. Els˝orend˝u logikában általános esetben az érvényesség eldöntése közel exponenciális bonyolultságú, azaz nagyon nehéz. Viszont Horn-formulák esetén ez a bonyolultság polinomiális, azaz jól használható a gyakorlatban. A Horn-formulák alakja: ∀ . . . (A1 ∧ . . . An ⊃ B), ahol A1 ,. . . An a feltételek, B a következmény, és minden a formulában el˝oforduló változóhoz tartozik egy univerzális kvantor. A Prolog nyelvben majd ezt úgy írjuk le: B :- A1 ,...,An . A Horn-formulák azt fejezik ki, ha A1 ,. . . ,An
26
III. LOGIKAI ALAPOK
feltételek igazak, akkor B kövekezmény is. Illetve hogy a B formula igaz legyen, ahhoz az kell hogy az A1 ,. . . ,An formulák igazak legyenek.
4. Gyakorlatok következtetésekre (1)
(2)
(3)
(4)
(5)
1. Ha autót veszek, akkor minden pénzem ráköltöm, és nem veszek új TV-t. 2. Ha eladom a régi TV-t, és nem veszek újat, akkor nem nézhetem otthon az olimpiát. K. Ha eladom a régi TV-t, és autót veszek, akkor nem nézhetem otthon az olimpiát. Következménye-e az 1 és 2 állításoknak a K? 1. Vannak Beatles-fizurás huligánok. 2. Minden huligánnak nyegle a modora. A. Van olyan nyegle modorú huligán, akinek Beatles-fizurája van. B. Minden nyegle modorú huligánnak Beatles-fizurája van. Következménye-e az 1 és 2 állításoknak az A? És a B? 1. Minden nem dohányzó kollégista bélyeggy˝ujt˝o. 2. Minden szemüveges bélyeggy˝ujt˝o dohányzik, vagy nincs olyan nem dohányzó bélyeggy˝ujt˝o, aki nem szemüveges. 3. Kis Béla, mióta nem visel szemüveget, leszokott a dohányzásról és nagy szenvedélye a bélyeggy˝ujtés. K. Minden szemüveges kollégista dohányzik. Következménye-e az 1, 2 és 3 állításoknak a K? 1. Egyik f˝oiskolai hallgató sem kapott jegyet. 2. Aki nem klubtag, az vendég. 3. Minden klubtag fizetett. 4. Minden vendég ebédelt. 5. Aki fizetett, az jegyet kapott. K. Minden f˝oiskolai hallgató ebédelt. Következménye-e az 1, 2, 3, 4 és 5 állításoknak a K? 1. Ebben a házban macskán kívül más állat nincs. 2. Minden olyan állatot szívesen dédelgetünk, amelyik szeret a holdra bámulni. 3. Amelyik állatot utálom, azt elkerülöm. 4. Nincsen olyan húsev˝o állat, amelyik ne üvöltene éjjel. 5. Nincsen olyan macska, amely ne fogna egeret. 6. Azokon kívül, amelyek ebben a házban vannak, egyetlen állat sem barátkozik velem.
˝ 5. ELOREÉS VISSZAFELE LÁNCOLÁSOS KÖVETKEZTETÉSEK
27
7. 8. 9. 10.
A kengurukat nem szívesen dédelgetjük. Csak húsev˝o állat fog egeret. Utálom az olyan állatokat, amelyek nem barátkoznak velem. Az olyan állatok, amelyek éjjel üvöltenek, szeretnek a holdra bámulni. K. Elkerülöm a kengurukat. Következménye-e az els˝o tíz állításnak a K? (6) 1. Egyes matematikusok szeretik a zenét. 2. Vannak, akik szeretik a zenét és értenek a geometriához. A. Minden matematikus ért a geometriához. B. Egyes matematikusok értenek a geometriához. C. Egyes emberek értenek a geometriához, és nagyon szeretik a zenét. Következménye-e az 1 és 2 állításoknak az A? És a B vagy a C?
5. El˝ore- és visszafele láncolásos következtetések Korábban már megismerkedtünk az el˝oreláncolásos és visszafele láncolásos következtetési módszerrel. Lássuk, hogyan fejezhet˝oek ki els˝orend˝u logikában a tények és szabályok! 1. 2. 3. 4. 5. 6. 7. 8. 9.
Ká kígyó – k(K). Szilvia elefánt – e(Sz). Csipike veréb – v(Cs). Minden veréb madár – ∀x(v(x) ⊃ m(x)). Minden hüll˝o állat – ∀x(h(x) ⊃ a(x)). Minden madár állat – ∀x(m(x) ⊃ a(x)). Minden pingvin madár – ∀x(p(x) ⊃ m(x)). Minden madár tojással szaporodik – ∀x(m(x) ⊃ t(x)). Minden kígyó hüll˝o – ∀k(v(x) ⊃ h(x)).
5.1. El˝oreláncolásos következtetés. A Csipikére vonatkozó el˝oreláncolásos következtetés a 1. ábrán látható.
5.2. Visszafele következtetés. A keresés a következ˝oképpen történik: rakjuk az összes kérdést (feltételezett következményt, célt) egy verembe, majd válasszunk ki egy célt, s határozzuk meg az összes olyan szabályt, melynek ez következménye lehet. Minden egyes ilyen szabályra hajtsuk végre a következ˝oket:
28
III. LOGIKAI ALAPOK
∀x(v(x) ⊃ m(x))
v(Cs)
∀x(m(x) ⊃ a(x))
@ ?
@ @ @ R @
?
v(Cs) ⊃ m(Cs)
m(Cs) ⊃ a(Cs)
m(Cs)
@
@ @ @ R @
a(Cs)
1. ábra. Csipike állat levezetése
– ha a szabály minden premisszája (feltétele) teljesül (tény), akkor a szabály alkalmazható, így a konklúzió (következmény), azaz a cél teljesül (ezt a célt töröljük a veremb˝ol). – ha valamely premissza nem teljesül, és van olyan szabály, melynek esetleg konklúziója lehet ez a premissza, akkor ezt a premisszát mint célt rakjuk a verembe. – ha nincs ilyen szabály, de a felhasználó a premisszát ténynek nyilvánítja, akkor a következ˝o premisszára kell ugrani, egyébként próbálkozzunk a következ˝o szabállyal. ha teljesen kiürül a verem, akkor kész vagyunk. Be tudjuk-e látni azt, hogy Csipike állat? Találjuk meg a hipotézist megalapozó tényeket, szabályokat! A feltételeink alapján ahhoz, hogy Csipike állat legyen azt kell belátni, hogy Csipike hüll˝o, vagy azt, hogy Csipike madár. Ez utóbbihoz elegend˝o azt belátni, hogy Csipike veréb. Ez a tény szerepel a feltételek között, így kész vagyunk.
5.3. Házi feladat. Legyenek a feltételeink a következ˝ok: (1) ha tanul, akkor jó oszályzatot kap (2) ha nem tanul, akkor rossz oszályzatot kap (3) ha süt a nap, akkor elmegy otthonról (4) ha rossz az id˝o, akkor otthon marad
˝ 5. ELOREÉS VISSZAFELE LÁNCOLÁSOS KÖVETKEZTETÉSEK
(5) ha elmegy otthonról, akkor nem tanul (6) ha otthon marad, akkor tanul Válaszolja meg a következ˝o kérdéseket! – Mi az oka, hogy a diák rossz osztályzatot kapott? – Mi kell ahhoz, hogy a diák jó osztályzatot kapjon?
29
IV. fejezet
Prolog A visszafele következtetésre mi a Prolog programnyelvet alkalmazzuk. Ez a nyelv a hetvenes évekbeli logikai kutatásoknak az eredménye, s a nyolcvanas években Magyarország a Prolog kutatásának, alkalmazásának élvonalához tartozott. Az akkori felfokozott érdekl˝odés a programnyelv iránt mára lecsengett, de jelenleg is sok helyen, sok célra használják. Sok fizet˝os és ingyenes implementáció létezik. Az órán mi az SWI-Prologot használjuk, melyet ingyen le lehet tölteni különféle operációs rendszerekre.
1. Prolog alapok Tekintsük az alábbi családfát!
Albertus Lydia Albert May Ralph
Alberta
Joan Wayne Martha Neal Amy
Nate
John
Cleo
DebbieElizabeth Sean Ian Bethany
Kathy
Kyle Daniel
Ezt a családfát a következ˝o adatokkal kódoljuk: megadjuk, hogy ki férfi (male), ki n˝o (female), ki kinek a szül˝oje (parent), és kik házasok (married). A Prologban amit nagybet˝uvel írunk, az változónak számít. Ezért a családfában szerepl˝o neveket kisbet˝ukkel kell írnunk. (Más megoldásként írhatnánk a neveket idéz˝ojelek között is.) Ezért ha azt akarjuk megadni, hogy Albertus férfi és Lydia n˝o, akkor azt a male(albertus) és female(Lydia) formában tehetjük meg. Továbbá azt, hogy Albertus Ralph szül˝oje, a következ˝oképpen írjuk: 31
32
IV. PROLOG
parent(albertus, ralph) tehát az els˝o helyen a szül˝o neve áll. Végül azt, hogy Albertus és Lydia házasok úgy írjuk, hogy married(albertus, lydia). Ne felejtsünk el minden egyes tényt ponttal lezárni! Ezek alapján a férfiakról szóló tények a következ˝ok: male(albertus). male(albert). male(ralph). male(neal). male(wayne). male(nate). male(ian). male(john). male(sean). male(kyle). male(daniel). male(shane). A n˝okr˝ol szólók pedig: female(lydia). female(may). female(alberta). female(joan). female(amy). female(bethany). female(debbie). female(cleo). female(elizabeth). female(kathy). female(martha). A szül˝oi kapcsolatokat az alábbi tények írják le: parent(albertus, ralph). parent(albert, alberta). parent(ralph, neal). parent(ralph, wayne). parent(ralph, martha). parent(wayne, amy). parent(neal, nate). parent(neal, ian). parent(neal, bethany). parent(john, debbie). parent(john, sean). parent(john, elizabeth). parent(sean, kyle). parent(sean, daniel). parent(lydia, ralph). parent(may, alberta). parent(alberta, neal). parent(alberta, wayne). parent(alberta, martha). parent(debbie, nate). parent(debbie, ian). parent(debbie, bethany). parent(cleo, debbie). parent(cleo, sean). parent(cleo, elizabeth). parent(kathy, kyle). parent(kathy, daniel). parent(joan, amy). A házaspárok listája meg eképp adható meg: married(neal, debbie). married(ralph, alberta). married(albertus, lydia). married(albert, may). married(sean, kathy). married(john, cleo). married(debbie,neal). married(alberta, ralph). married(lydia, albertus). married(may, albert). married(kathy, sean). married(cleo, john). Ezek a tények a honlapon a csalad.pro állományban találhatóak meg. Letöltés után az SWI-Prologot elindítva File menüpont Consult alpontját választva tölthet˝o be. (Ha megfelel˝oképpen lett telepítve az SWI, Windows alatt elegend˝o
1. PROLOG ALAPOK
33
duplán kattintani a megfelel˝o Prolog forrásra. Unix alatt pedig a program indítása után a consult("csalad.pro") parancsot kell kiadni.) Ezután már feltehetjük a kérdéseinket a rendszernek. Például azt, hogy Ralph férfi? a ?- male(ralph) azt hogy Milyen férfiak vannak az adatbázisban? a ?- male(X) Prolog-kérdéssel tudhatjuk meg. Az eldöntend˝o kérdésre természetesen yes vagy no lesz a válasz, míg a kiegészítend˝o kérdés esetén megadja a kérdezett (nagy kezdz˝obet˝uvel írt) változók értékét. Ha több ilyen is létezik, akkot a pontosvessz˝o megnyomására kapjuk a soron következ˝ot. (Enter lenyomására átugorhatjuk a további megoldásokat.) Ha már nincs több megoldás, vagy egyáltalán nem is volt, a válasz no lesz. Eddig a családról szóló adatbázisunk csak tényeket tartalmazott. Minden rokonsági kapcsolatot felesleges felsorolni, elég ha megadjuk, hogy ez a kapcsolat a már meglév˝oekb˝ol hogyan származtatható. Például az Y apja az Y férfi szül˝oje. Tehát hogy az X személy Y apja legyen, ahhoz az kell (pontosabban az már elegend˝o), hogy X férfi legyen, s X az Y szül˝oje legyen. Az ilyen definícióknál a definiálandó reláció szerepel el˝ol, ezt követi a :- jel, majd pedig a definiáló relációk vessz˝ovel elválasztva. ermészetesen itt is szükség van a lezáró pontra. Tehát a definíció a következ˝o lesz: father(X, Y) :- male(X), parent(X, Y). Feladat. Definiáljuk hasonlóképpen az anyja, fia, lánya, unokája, nagyapja, nagyanyja, testvére, bátyja, n˝ ovére, nagybátyja, nagynénje, apósa, anyósa, veje, menye, sógora és sógorn˝ oje predikátumokat! Például X akkor lesz az Y apósa, ha X férfi, valamint van egy Z, aki Y házastársa, és X gyereke: Mivel a házastárs szimmetrikus reláció (ha X-nek Y házastársa, akkor Y -nak is házastársa X), az alábbi definícióban mindkét irányt fel kell használni, tehát két részb˝ol fog állni a definíció: fatherInLaw(X, Y) :male(X), parent(X, Z), married(Z,Y). fatherInLaw(X, Y) :male(X), parent(X, Z), married(Z,Y). Miután senki sem testvére saját magának, valahogy ki kellene fejezni, hogy az X és az Y két különböz˝o személy. Ezt a Prologban az X\ == Y formában tehetjük meg. Megjegyzés. A Horn formuláknál arról volt szó, hogy minden változó univerzális kvantorhoz kapcsolódik, míg az após definíciójában a Z egzisztenciális kvnatorral
34
IV. PROLOG
szerepel. Nincs itt ellentmondás? Nincs, mivel a ∀x∀y ∃z (M (x) ∧ P (x, z) ∧ M (z, y) ⊃ F (x, y) formula ekvivalens a ∀x∀y∀z
M (x) ∧ P (x, z) ∧ M (z, y) ⊃ F (x, y)
formulával. Azaz ha egy változó a Prolog definícóban csak a jobb oldalon szerepel, akkor ahhoz gondolatban egy egzisztenciális kvantort kapcsoljunk!
2. Egyszeru˝ szakért˝o rendszerek 2.1. Ragadozó madarak Minden egyes madárról leírjuk azokat a jellemz˝o információkat (tulajdonságérték párokat), melyek az azonosításhoz kellenek. madar(baratkeselyu) :meret(nagy), fej(kopasz), szin(barna). madar(szirtiSas) :meret(nagy), fej(rozsda), szin(barna). madar(kanya) :meret(kozepes), szin(rozsda). madar(olyv) :meret(kozepes), szin(barna). madar(heja) :meret(kozepes), hat(palaszurke), has(csikos). madar(karvaly) :meret(kicsi), hat(kekesszurke), has(csikos). madar(kaba) :meret(kicsi), hat(palaszurke), has(foltos). madar(vercse) :meret(kicsi), hat(agyagvoros), has(vilagos). madar(kekvercse) :meret(kicsi), hat(kekesszurke), szin(rozsda). madar(retiHeja) :meret(kozepes), fej(vilagos), szin(barna). Eddig tartott a tudásbázis megadása. Ha megadjuk az aktuális madárra jellemz˝o adatokat: meret(nagy).
˝ RENDSZEREK ˝ SZAKÉRTO 2. EGYSZERU
35
fej(rozsda). szin(barna). akkor a ?- madar(X). kérdéssel megkapjuk a megoldást.
2.2. Szemantikus háló Tekintsünk egy igen egyszer˝u rendszert, ahol az ismert objektumnév, tulajdonság és érték hármasával tulajdonság(objektumnév,érték) formájában adjuk meg a tényeket! (A példában az isa az egy helyett szerepel, pl. A madár egy állat.) isa(madar, allat). mozog(madar,repul). aktiv(madar,nappal). isa(albatrosz, madar). szine(albatrosz,fekete_feher). isa(pingvin, madar). mozog(pingvin,uszik). szine(pingvin,fekete_feher). isa(kuvik,madar). aktiv(kuvik,ejjel). szine(kuvik,barna). isa(albert,albatrosz). isa(kristof,albatrosz). isa(kelemen,kuvik). isa(tux,pingvin). Egészítsük ki a programot az örökl˝odés lehet˝oségével. (Természetesen sok mással fel lehetne ruházni a rendszert, de nem célunk sem a programozás, sem a szemantikus hálók mélységeibe elmerülni.) Az örökl˝odés implementálása egy egyszer˝u predikátum esetén a következ˝oképpen történik: mozog(X,M):-isa(X,Os), mozog(Os,M). Ha ezen szabály nélkül feltennénk a rendszernek a mozog(tux,X) kérdést, akkor a válasz no lenne, mert tényeket a rendszer nem kapcsolná össze. Miután ezt a szabályt az el˝oz˝o tények után beszúrjuk a forrásba, és a rendszernek újra feltesszük a kérdést, el˝oször a tények között keres, s mivel ott sikertelenül próbálkozik, a szabályoknál folytatja a keresést. A szabály alapján az egyed helyett az osztályában, illetve osztály esetén a o˝ sosztályában folytatja a keresést. Ennek megfelel˝oen miután a Tux egy pingvin, a pingvin mozgási formája után keres. Ekkor megtalálja az úszást. A pontosvessz˝ovel újabb megoldásokra késztetve a rendszert, a pingvin o˝ sosztályában, a madarak között keres, s ott természetesen megtalálja a repülést. Eme utóbbi válasz nem szerencsés, s minden egyes tulajdonság esetén egy ilyen plusz sort, kellene a tényeinkhez írni. Ehelyett írjunk egy kicsit hosszabb programot. teny(Teny) :- call(Teny),!.
36
IV. PROLOG
teny(Teny) :Teny =.. [Relacio, Obj, Arg],isa(Obj,OsObj), OsTeny =.. [Relacio,OsObj, Arg],teny(OsTeny). Ha a tény predikátum argumentumaként egy kérdést adunk meg, akkor a rendszer el˝oször megpróbálja megválaszolni a kérdést (call). Ha ez sikerült, akkor kész vagyunk, s nincs szükségünk több megoldásra. (A további megoldások kihagyására szolgál a felkiáltójel.) Ha ebben a formában nem volt megoldás, akkor a kérdést részekre tördeljük, a kérdésben szerepl˝o egyedet vagy osztályt az o˝ sével helyettesítjük, s feltesszük az így készített kérdést. Az új kérdésre adott válasz lesz válasz az eredeti kérdésre is. Ezt a predikátumot használva csak az els˝o választ kapjuk meg a teny(mozog(tux,X)) kérdésre. Ezzel elkészítettünk egy egyszer˝u szemantikus hálót kezel˝o rendszert.
2.3. Minimális keretrendszer Ha az el˝obbi hármasok formájában tároljuk a tényeket, akkor az ugyanazon objektumhoz tartozó tények alkotják az egyes kereteket. (Az el˝obbi felsorolásban egy-egy bekezdés felel meg egy-egy keretnek.) ertek(Keret,Tulajdonsag, Ertek):Kerdez =.. [Tulajdonsag,Keret,Ertek], call(Kerdez),!. ertek(Keret,Tulajdonsag,Ertek):szulo(Keret,OsKeret),ertek(OsKeret,Tulajdonsag,Ertek). szulo(Keret,OsKeret):ertek(Keret,isa,OsKeret). A korábbi kérdés a ertek(tux,mozog,X) formában tehet˝o fel. Természetesen lehet˝oség van a keretrendszerhez jobban illeszked˝o formában megadni az adatokat: keret(madar, [isa-allat,mozog-repul,aktiv-nappal]). keret(albatrosz, [isa-madar,szine-fekete_feher]). keret(pingvin, [isa-madar,mozog-uszik,szine-fekete_feher]). keret(kuvik, [isa-madar,aktiv-ejjel,szine-barna]). keret(albert, [isa-albatrosz]). keret(kristof, [isa-albatrosz]).
˝ RENDSZEREK ˝ SZAKÉRTO 2. EGYSZERU
37
keret(kelemen, [isa-kuvik]). keret(tux, [isa-pingvin]). Itt egy listában szerepelnek a tulajdonság és érték párok. Az adatok megváltozásához ill˝oen a lekérdezéshez használt predikátumok is megváltoznak egy kicsit: ertek(Keret,Tulajdonsag, Ertek):keret(Keret,L), member(Tulajdonsag-Ertek,L),!. ertek(Keret,Tulajdonsag,Ertek):szulo(Keret,OsKeret), ertek(OsKeret,Tulajdonsag,Ertek). szulo(Keret,OsKeret):keret(Keret,L), member(isa-OsKeret,L).
2.4. Diagnosztika Tekintsük a következ˝o szabályokat: 1. Ha a motor kap benzint, és motor forog, akkor a gyújtással van probléma. 2. Ha a motor nem forog, és a lámpák nem világítanak, akkor az akkumulátorral, vagy a kábelekkel van probléma. 3. Ha a motor nem forog, de a lámpák világítanak, akkor az önindítóval van baj. 4. Ha a tartályban van benzin, és a karburátorban is, akkor a motor is kap benzint. Miért nem indul a kocsink? A szabályokat Prologban a következ˝oképpen fogalmazhatjuk meg: problema(gyujtas) :motor_benzint_kap, motor_forog. problema(akku_vezetek) :\+ motor_forog, \+ lampa_vilagit. problema(onindito) :\+ motor_forog, lampa_vilagit. motor_benzint_kap :tartalyban_benzin, karburatorban_benzin. A Prologban a \+ a tagadást fejezi ki. (Érdemes óvatosan bánni a tagadással, mert nem teljesen fedi a valódi tagadást!) Ha a ragadozó madarak adatbázisához hasonlóan megadnánk, hogy mi igaz, s mi nem, a problema(X) kérdésre megkapnak a választ. (Pontosabban a set_prolog_flag(unknown,fail) beállítást
38
IV. PROLOG
még el kellene végezni a kérdés feltevése el˝ott.) Egy méretesebb adatbázis esetén kényelmetlen minden feltételt el˝ore tesztelni. Hagyjuk a munkát a felhasználóra, s csak a szükséges kérdéseket tegyük fel! Ezzel az el˝obbi programrészlet is megváltozik. problema(gyujtas) :motor_benzint_kap, kerdez(’Forog a motor’, igen). problema(akku_vezetek) :kerdez(’Forog a motor’, nem), kerdez(’Vilagit a lampa’, nem). problema(onindito) :kerdez(’Forog a motor’, nem), kerdez(’Vilagit a lampa’, igen). motor_benzint_kap :kerdez(’Van a tartályban benzin’, igen), kerdez(’Van a karburátorban benzin’, igen). A kerdez predikátum hozzáadásával az el˝oz˝o program a Prolog tagadása megkerülhet˝o. Ha csak simán bekérnénk a választ a billenty˝uzetr˝ol, akkor újra és újra meg kellene válaszolni ugyanazokat a kérdéseket. Épp ezért bevezetjük az ismer predikátumot, amely tárolja a kérdésekhez tartozó válaszokat. Ezután ha egy új kerdést felteszünk, el˝oször azt vizsgáljuk meg, hogy a rendszer ismeri már a választ vagy sem. Ha igen, akkor már csak az a kérdés, hogy a válasz, és várt válasz megegyezik-e. Ha nem, akkor ki kell irni a kérdést (write), és be kell kérni a választ (read). kerdez(Mondat,Kerdes):ismer(Mondat,Valasz),!,Kerdes=Valasz. kerdez(Mondat,Kerdes):write(Mondat),write(’? ’),read(Valasz), asserta(ismer(Mondat, Valasz)), Kerdes=Valasz. A program használata el˝ott ne felejtsük el beállítani az unknown jelz˝ot!
2.5. Osztályozás Az el˝oz˝o feladatnál kicsit bonyolultabb példát vizsgálunk meg. Állatokat osztályozunk a tulajdonságaik szerint. A feltett kérdésekre adott válaszokat itt is tároljuk. kezd :feltetel(Allat), write(’Ugy vélem, hogy a keresett állat ’),
˝ RENDSZEREK ˝ SZAKÉRTO 2. EGYSZERU
39
write(Allat), nl, torol. A program indítása a kezd predikátummal történik. Ez a predikátum kiválaszt egy állatot, s próbál megbizonyosodni, hogy valóban arról az állatról van szó. Ha ez sikeres volt, akkor kész vagyunk, felesleges más állattal foglalkozni, s kiírhatjuk a tippet. feltetel(gepard) :- gepard, !. feltetel(tigris) :- tigris, !. feltetel(zsiraf) :- zsiraf, !. feltetel(zebra) :- zebra, !. feltetel(strucc) :- strucc, !. feltetel(pingvin) :- pingvin, !. feltetel(albatrosz) :- albatrosz, !. feltetel(’nem is létezik’). Ha egyik állatra sem illenek a válaszok, akkor az utolsó, feltétel nélküli esetr˝ol van szó. A továbbiakban felsoroljuk, hogy az adott állatoknak melyek a jellemz˝o vonásai. gepard :emlos, ragadozo, ellenoriz(’homokszín˝ u a sz˝ ore’), ellenoriz(’sötét pöttyei vannak’). tigris :emlos, ragadozo, ellenoriz(’homokszín˝ u a sz˝ ore’), ellenoriz(’fekete csíkos’). zsiraf :- patas, ellenoriz(’hosszú nyaka van’), ellenoriz(’hosszú lábai vannak’). zebra :- patas, ellenoriz(’fekete csíkos’). strucc :madar, ellenoriz(’nem repül’), ellenoriz(’hosszú nyaka van’). pingvin :madar, ellenoriz(’nem repül’), ellenoriz(’úszik’), ellenoriz(’fekete-fehér szín˝ u’). albatrosz :- madar, ellenoriz(’fekete-fehér szín˝ u’), ellenoriz(’jól repül’). Viszont nem részleteztük a nagyobb rendszertani egységeket. Ezeket felesleges lett volna felsorolni minden egyes állatnál, egy helyen írjuk le ezeket. Az itt felsorolt tulajdonságok elegend˝ok, s nem szükségesek. Ezért ha valamely állatot sz˝or borít,
40
IV. PROLOG
az már elegend˝o ahhoz, hogy eml˝os legyen, de ez nem szükséges feltétel (lásd bálna, denevér). Ezért szerepeltetünk további elégséges feltételeket is: emlos :- ellenoriz(’sz˝ or borítja’), !. emlos :- ellenoriz(’tejet ad’). madar :- ellenoriz(’tolla van’), !. madar :ellenoriz(’repül’), ellenoriz(’tojással szaporodik’). ragadozo :- ellenoriz(’húst eszik’), !. ragadozo :- ellenoriz(’hegyes fogai vannak’), ellenoriz(’karmai vannak’), ellenoriz(’el˝ ore néznek a szemei’). patas :- emlos, ellenoriz(’patái vannak’), !. patas :- emlos, ellenoriz(’rágófoai vannak’). A hátralev˝o programrész már tisztán technikai részlet. Két predikátum tárolja, hogy mely kérdésekre adtunk igen, illetve nem válaszokat. Ha az adott kérdés még sehol nem szerepel, akkor a gép rákérdez a felhasználóra, s tárolja a válaszát. A töröl predikátum meg törölni fogja a kérdések végén a válaszokat. kerdez(Kerdes) :write(’Igaz az állatra az, hogy ’), write(Kerdes), write(’? ’), read(Valasz), nl, ( (Valasz == igen ; Valasz == i) -> assert(igaz(Kerdes)) ; assert(hamis(Kerdes)), fail). :- dynamic igaz/1,hamis/1. ellenoriz(S) :(igaz(S) -> true ; (hamis(S) -> fail ; kerdez(S))). torol :- retract(igaz(_)),fail. torol :- retract(hamis(_)),fail. torol.
V. fejezet
CLIPS A CLIPS rendszer a nevét a C Language Integrated Production System kifejezés rövidítéseként kapta. Már a névb˝ol 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˝o 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˝oen 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˝unik, de azért igen jól használható.
1. Ki Csipike? Ugorjunk egyb˝ol mindennek a közepébe! A korábban már szerepl˝o 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˝o írásmódban kell a tényeinket, szabályainkat megfogalmazni. Ez azt is jelenti, hogy rengeteg zárójelet kell használnunk. Azt hogy Csipike veréb azt úgy is írhatjuk, hogy (Csipike vereb), (vereb Csipike) vagy akár(Csipike egy vereb). (A program szövegében nem érdemes ékezetes bet˝uket használni.) 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˝o helyre, s ezt követik az objektumok elnevezései.) 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. Tehát a CLIPS programját elindítva az (assert (vereb Csipike)) hatására veszi tudomásul ezt a tényt a rendszer. Miután több ilyen tényt is a rendszer tudomására hoztunk, a (facts) utasítással tudjuk lekérdezni a rendszer által ismert tényeket. A tények el˝ott álló számok azért lényegesek, mert 41
42
V. CLIPS
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˝oként megadott tényt. A program m˝ukö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. Ezek a csoportok begépelhet˝ok az el˝obbi módon, vagy akár egy küls˝o fájlból is beolvashatóak. (Ez utóbbi természetesen sokkal kényelmesebb.) A Csipikére és a többiekre jellemz˝o tények a csipike.clp fáljban találhatóak, ezeket a (load "csipike.clp") paranccsal lehet betölteni. 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. A szabályok betöltése még nem elegend˝o ahhoz, hogy egyb˝ol használatba vegyük a tényeket. Ehhez el˝obb ki kell adni a (reset) parancsot, amely aktivizálja a kiinduló tényeinket, illetve még létrehoz egy (initial-fact) tényt is. Ez utóbbi tényt felhasználva bemutatjuk a Hello world! programot, mellyel sok programnyelv ismertetése elkezd˝odik. Ez a program a CLIPS-ben a következ˝oké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˝o látásra csak a nyíl t˝unik ismer˝osnek. Az el˝otte és a mögötte álló sor alkotja a magát a szabályt. El˝ottük a szabályt definiáló kulcsszó, a szabály elnevezése (hello), s idéz˝ojelek 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˝ott 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˝uveletlista. Ez most egyetlen m˝uveletb˝ol áll, s abban pedig egy kiírás szerepel. A t arra szolgál, hogy a képerny˝ore írjon a rendszer, a crlf pedig a soremelésr˝ol gondoskodik. 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))
2. SZÜLETÉSNAP
43
volt. Innen els˝o 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˝ojellel kezd˝odnek. 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˝o ténnyel. Esetünkben a rendszer tudomására hozni, azaz alkalmazni rá az assert parancsot. 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˝oképpen néz ki: (defrule vereb-madar "Minden veréb madár" (vereb ?x) => (assert (madar ?x)) ) Az eredeti feladatban szerepl˝o összes szabály hasonlóképpen írható fel. Érdemes ezt a tagozást megtartani, mert így a kés˝obbiekben 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. Ha már adott az összes szabály meg a tények, akkor a (run) paranccsal indítható el a következtetés. (Ha nem akarjuk indítani, csak látni, hogy hogyan indulna el az egész, akkor az agenda parancsot kell használni.) Mindebb˝ol persze nem látunk semmit. A facts parancs kiadásával láthatjuk, hogy mir˝ol 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) )
2. Születésnap Készítsünk egy kisebb adatbázist, melyben személyek nevei és életkoruk szerepelnek, például a következ˝o alakú tényekként: (szemely Elek 5). Ezt érdemes egy külön fájlba menteni. Lesz még egy más formájú tényünk is, amely azt jelzi, hogy az adott személynek ma születésnapja van: (szuletesnap Elek). Az ilyen adatokat majd a futtatáskor visszük be a rendszerbe a már ismert
44
V. CLIPS
assert paranccsal. Természetesen ha valakinek születésnapja van, akkor o˝ t fel kell köszönteni. Ezt egy szabállyal oldjuk meg. (defrule szulinap "szulinapi koszonto" (szemely ?ki ?ev) (szuletesnap ?ki) => (printout t "Boldog szuletesnapot " ?ki "!" crlf) ) Itt két feltétel szerepel, s akárcsak a Prologban, itt is és kapcsolatot értünk köztük. Azaz ha találunk egy személy, akinek a nevét a ?ki elnevezés˝u, a korát a ?ev elnevezés˝u változóban tároljuk, s pont ennek a személynek ma születésnapja van, akkor kiírjuk a köszöntést a képerny˝ore. Hiába is indítjuk el többször a programot, a kiírás csak egyszer történik meg. Ez azért van, mert egy szabályt adott tényekre a rendszer csak egyszer hajt végre. Azt tudjuk, hogy a születésnappal mindenki egy évvel öregebb lesz. Lássuk, ezt hogyan oldhatjuk meg! (defrule szulinap "Valaki egy evvel oregebb lett" (szemely ?ki ?ev) (szuletesnap ?ki) => (printout t ?ki " "(+ 1 ?ev) " eves." crlf) ) Az el˝oz˝o szabályt cseréljük le ezzel! Ami újdonság a (+ 1 ?ev) kifejezés. Részeiben mindenki érti, hogy mir˝ol is van szó. Ismert az összeadás jele, a egyes is, és a kort tároló változó is. A Lispben, s ezért itt is az aritmetikai kifejezéseknél a m˝uveleti jel (esetünkben az összedás) kerül el˝ore, s ezt követik az argumentumok, s nem fogunk kiírni mást, mint a személy korábbi életkoránál eggyel nagyobb számot. Persze ennek a tényekben semmi eredménye nem lesz, ott még mindig a korábbi életkor fog szerepelni. Jó lenne ezt átírni! A tény módosítását egyszer˝uen oldjuk meg, töröljük a régit, s egy újat adunk meg helyette. (defrule szulinap "Valaki egy evvel oregebb lett" ?teny1 <- (szemely ?ki ?ev) ?teny2 <- (szuletesnap ?ki) => (retract ?teny1) (retract ?teny2) (printout t "Boldog szuletesnapot " ?ki "!" crlf) (assert (szemely ?ki (+ ?ev 1)) ) )
3. RENDEZETT ÉS NEM RENDEZETT TÉNYEK
45
Korábban az már szerepelt, hogy ha egy tényt törölni szeretnénk, akkor az azonosítóját meg kell adnunk. Itt a visszafele mutató nyíl pont ezt az azonosító számot írja be a ?teny1 és ?teny2 változókba. Ezek után már törölhetjük a tényeket, kiírhatjuk az üdvözletet, s rögzíthetjük az új életkort.
3. Rendezett és nem rendezett tények Az eddig használt tényeinknél a sorrendnek szerepe volt. Ha azt, hogy Vilmos l˝ott egy fácánt, (lott Vilmos facan) formában írjuk, akkor a (lott facan Vilmos) jelentése csak az lehet, hogy egy fácán lel˝otte Vilmost. Néha nehézkes ezt a sorrendet megtartani, f˝oleg akkor, ha egyes tulajdonságok hiányoznak. Éppen ezért minden értéket a tulajdonság elnevezésével kell szerepeltetni. Azaz az adatok megadása hasonló a II.3.3 fejezetben szerepeltetett keretrendszeréhez, csupán az osztályok hiányoznak. Az ott szerepl˝o nyulat a következ˝oképpen írhatnánk le itt: (nyul (tipus emlos) (ful hosszu) (mozgas ugral) (lab 4)) De ugyanezt értjük a (nyul (mozgas ugral) (lab 4) (ful hosszu) (tipus emlos)) tényen is. Az egyes tulajdonságok sorrendje nem számít. Persze a rendszernek valamit tudnia kell az ilyen tények szerkezetér˝ol is, mert mint az el˝obb is utaltam rá, nem mindig szerepel minden tulajdonság. A rendszernek a deftemplate segítségével adhatjuk meg a tények típusait. Például az el˝obbi születésnapi példában két tulajdonság, a név és az életkor szerepelt. Ezt a következ˝oképpen definiáljuk: (deftemplate szemely (slot nev) (slot kor) ) Ezek után tények például a (szemely (nev Elek)(kor 5)), (szemely (kor 18) (nev Eva)), és a (szemely (nev Bela)) is. A tényeket kilistázva láthatjuk, hogy az általunk nem szerepeltetett tulajdonság is megjelenik, de az értéke nil lesz. Méretesebb tényhalmaznál nehéz észrevenni, ha valamely ténnyel probléma van, el lett gépelve, stb. Épp ezért a hibás tényeket kisz˝urhetjük, ha típusokat vezetünk be. Például a név az egy szöveg, míg az életkor mindenképpen egy szám, ami rendszerint egész. Ezt szintén a deftemplate részben kell megadni.
46
V. CLIPS
(deftemplate szemely (slot nev (type STRING)) (slot kor (type INTEGER)) ) Megadhatjuk továbbá, hogy milyen értékeket fogadunk el: (slot neme (allowed-symbols ferfi no)) vagy hogy milyen értékhatárokon belül fogadunk el értékeket: (slot osztalyzat (range 1 5)) Továbbá a default kulcsszó után szerepeltethetjük az alapértelemezett értékeket, melyet az adott tulajdonság felvesz, ha nem adjuk meg konkrétan az értékét. A CLIPS kézikönyvében teljes részletességben szerepel, hogy mi mindent használhatunk itt. Egyel˝ore nekünk ennyi elég. (Lehet˝oség van arra is, hogy egy tulajdonságnak ne csak egy értéke lehessen, hanem több is. Ekkor a multislot elnevezést kell használni, s minden értékre külön változót lehet bevezetni, vagy a dollár-kérd˝ojellel kezd˝od˝o változó illeszkedik mindre.) Miután a születésnapi tényeket megváltoztattuk, a szabályoknak is módosulniuk kell: (defrule szulinap "Valaki egy evvel oregebb lett" ?teny1 <- (szemely (nev ?ki) (kor ?ev)) ?teny2 <- (szuletesnap ?ki) => (retract ?teny1) (retract ?teny2) (printout t "Boldog szuletesnapot " ?ki "!" crlf) (assert (szemely (nev ?ki) (kor (+ ?ev 1))) ) ) Készítse el azt a szabályt, mely születésnap esetén például azt írja ki, hogy Éva ma 18 éves lett! A nem rendezett adatoknál nincs szükség a töröl-újraír párosra, használható a módosítás is: (defrule szulinap "Valaki egy evvel oregebb lett" ?teny1 <- (szemely (nev ?ki) (kor ?ev)) ?teny2 <- (szuletesnap ?ki) => (retract ?teny2) (printout t "Boldog szuletesnapot " ?ki "!" crlf) (modify ?teny2 (kor (+ ?ev 1)) ) )
3. RENDEZETT ÉS NEM RENDEZETT TÉNYEK
47
Ez a módosítás akkor hasznos, ha a tényeink szerkezete ennél jóval bonyolultabb. Ugyanebben az esetben a duplicate segítségével készíthetünk egy másolatot, s megadhatjuk, hogy mely tulajdonságoknak lesz más értéke, mint az eredeti. Speciális eseteket nem olyan egyszer˝u leírni, de sokat segíthetnek a különféle feltételek. Ha valamiért a 30 éveseket nem kívánjuk felköszönteni (emlékeztetni az öregedésre), akkor a szabály a következ˝oképpen néz ki: (defrule szulinap (szemely (nev ?ki) (kor ~30)) ?teny <- (szuletesnap ?ki) => (retract ?teny) (printout t "Boldog szuletesnapot " ?ki "!" crlf) ) A hullámvonal (˜) a tagadást jelzi. Hasonlóképpen a függ˝oleges vonal a vagy kapcsolatnak felel meg, azaz a felsorolt nevezetes életkorokban speciális üdvözlés jár. (defrule szulinap (szemely (nev ?ki) (kor 50|60|70|75|80)) ?teny <- (szuletesnap ?ki) => (retract ?teny) (printout t "Nagyon boldog szuletesnapot " ?ki "!" crlf) ) Ha nem csak arra vagyunk kíváncsiak, hogy valamely objektum adott tulajdonságának az értéke megegyezik-e valamilyen általunk megadott konkrét értékkel, vagy éppen az általunk megadott értékt˝ol különbözik, akkor az objektum adott értékét egy változóba menthetjük. Például nem elég nekünk az, hogy a személy nem 30 éves, hanem arra is kiváncsiak vagyunk, hogy pontosan hány éves, akkor a (kor ?ev&˜30) feltételt használva az életkor a ?ev változóba kerül, feltéve ha az nem pont 30, mert akkor nem illeszkedik. (A & jel az és kapcsolatnak felel meg.) Természetesen a változók értékét már a feltételben vizsgálni lehet: (defrule szulinap (szemely (nev ?ki) (kor ?ev)) ?teny <- (szuletesnap ?ki) (test (< ?ev 18) ) => (retract ?teny) (printout t "Boldog szuletesnapot " ?ki "!" crlf)
48
V. CLIPS
) Most azt vizsgáltuk meg, hogy fiatalkorú-e az szóban forgó személy. Ez a vizsgálat elhelyezhet˝o lenne a kett˝ovel korábbi sorban egy és kapcsolat segítségével (?es&:(< ?kor 18)), de talán így jobban érthet˝o. Itt is, és egyéb tesztekben lehet a logikai összeköt˝ojeleket használni, természetesen a CLIPS szájíze szerint (or, and, not, exists és forall). Ha t˝uz- vagy bombariadó van az adott épületben, akkor azt ki kell üríteni: (defrule veszhelyzet-kiurites (or (riado (tipusa tuz) (helye ?epulet)) (riado (tipusa bomba) (helye ?epulet)) ) => (printout t "Uritse ki a " ?epulet "epuletet!" crlf) Ha valahol vészhelyzet van, ki kell hívni a t˝uzoltókat: (defrule veszhelyzet-tuzolto (exists (riado (tipusa tuz|bomba) ) ) => (printout t "Hivja a tuzoltokat!" crlf) Ha minden olyan épület ki lett ürítve, ahol vészhelyzet van, akkor ezt nyugtázzuk: (defrule veszhelyzet-kiurites-vege (forall (riado (tipusa tuz|bomba) (helye ?epulet)) (kiuritve ?epulet) ) => (printout t "Kiurites befelyezve!" crlf) Egyre több és több szabályunk van. A rules parancs kiadásával megkaphatjuk ezek listáját. Pontosabban ez csak a szabályok neveinek listáját adja meg, adott szabályt a ppdefrule paranccsal irathatunk ki: (ppdefrule szulinap). A read, readline és a bind segítségével küls˝o inputot is felhasználhatunk szabályainkban, ám erre el˝oreláthatólag nekünk nem lesz szükségünk a félév során. Vannak esetek, amikor mi szeretnénk megadni, hogy a sok lehetséges szabály közül melyikkel kezdjünk. Ha például találkozunk valakivel, akkor rendszerint köszönünk neki. Ha születésnapja van, akkor viszont felköszöntjük. A salience kulcsszó s utána egy érték megadásával rangsorolhatjuk a szabályaink végrehajtását (ennek az értéknek −10000 és 10000 közé kell esnie): (defrule koszon (declare (salience 10)) (szemely (nev ?nev)) =>
4. FELADATOK
49
(printout t "Jó napot, ", ?nev "!" crlf) ) (defrule felkoszont (declare (salience 20)) (szemely (nev ?nev)) (szuletesnap ?nev) => (printout t "Boldog szuletesnapot, ", ?nev "!" crlf) ) Ha a programunk nem úgy m˝uködik, ahogy mi szeretnénk, akkor a következtetés folyamata megszakítható a set-break utasítással. Ehhez azt a szabályt kell megadni argumentumként, amelyet már nem kívánunk végrehajtani. Ekkor kiirathatjuk az aktuális tényeket, szabályokat.
4. Feladatok 4.1. Autójavítás A következ˝oket kell tudnunk: – Ha rossz az akkumulátor, vagy a kipufogó, akkor az csak egy kisebb probléma. – Ha rossz a sebességváltó, vagy maga a motor, az már egy komoly probléma. – Ha már öreg az autónk, s komoly a probléma, akkor el kell adni. – Ha az autó fiatal, s komoly a probléma, meg kell javíttatni. – Ha öreg az autó, s csak egy kisebb probléma van vele, meg kell javíttatni. Írjon egy CLIPS programot, amely tartalmazza a megfelel˝o szabályokat! Próbálja ki több esetben is. Jól m˝uködik a program? Nem hiányzik valamilyen szabály az eredeti kiírásból? Próbálja a programban a szabályok számát csökkenteni a logikai összeköt˝ojelek segítségével! Próbálja ki a szabályait egy olyan öreg kocsi esetén, melynek rossz az akkumulátora és a motorja! Használja a szabályok rangsorolását, hogy életszer˝u legyen a megoldás.
4.2. Rend˝orségi nyilvántartás Készítsen egy nyilvántartást személyekr˝ol küls˝o jegyei alapján (név, életkor, nem, magasság, testsúly, haj szine és formája, szemszín, különös ismertet˝ojel). Definiáljon hozzájuk megfelel˝o típust! (Például sz˝oke, vörös, barna és fekete hajszín.) Készítsen két szabályt mely csak a férfiakat, és csak a n˝oket sorolja fel.
50
V. CLIPS
Készítse el ezeket a szabályokat két különböz˝o módon is! Írjon olyan szabályt, mely a rend˝orség által keresett 35-40 éves, magas, vékony testalkatú, sötéthajú elkövet˝ohöz kiírja az adatbázisban szerepl˝o ilyen tulajdonságú személyeket!
4.3. Sör Vegye figyelembe a következ˝o szabályokat: kiszolgálható a személy az – Egyesült Államokban, ha elmúlt 21, – Kanadában, ha elmúlt 18, – Németországban, ha elmúlt 16, és – Írországban, (születését˝ol kezdve) ha Guinnesst iszik. Adjon meg olyan szabályt, amely eldönti, hogy a tényben szerepl˝o személy az adott államban megihatja-e az adott fajtájú sört! Például (inna (nev Alfonz) (kor 22) (hely Kanada) (fajta Kobanyai) )
4.4. Házasságközvetít˝o Definiáljon egy mintát, mely tartalmazza a becenevet, kort, nemet, magasságot, hajszínt, jövedelmi viszonyt, s töltse fel legalább tíz személy adataival. Írjon olyan szabályokat, melyek kikeresik a sz˝oke hölgyeket és a gazdag urakat. Adjon meg feltételeket a leend˝o házastárssal kapcsolatban, s keresse meg az olyan párokat, melyeknél a feltételek az adottságokkal megegyeznek.
5. Keretrendszer Egy osztály a CLIPS-ben egy minta, amely leírja az ide tartozó elemek/objektumok jellemz˝o tulajdonságait. Minden egyes osztály a valódi világ, vagy az általunk modellezni kívánt világ egy részének absztrakciója. Absztrakt módon írjuk le a valódi világ dolgait, és modellezend˝o világot osztályok rendszerekéntként fogjunk fel. Az el˝obbiekben láthattuk, hogy a CLIPS lehet˝oséget teremt arra, hogy védjük adatainkat a hibáktól, például a range, allowed-numbers, stb. segítégével. Hasonló védelem létezik az osztályok esetén is, melyeket méretesebb programok esetén érdemes használni,
5.1. Osztályok definiálása Lássunk egy példát osztályokra, s egyben adataink védelmére is! Definiáljuk az emberek (PERSON) osztályt, melynek alosztálya lesz a férfiak (MALE) és n˝ok
5. KERETRENDSZER
51
(FEMALE) osztálya. A n˝ok osztályának alosztálya lesz a lányok (GIRL) és a hölgyek (WOMAN) osztálya. Hasonlóképpen a férfiak osztály alosztályai lesznek a fiúk (BOY) és az urak (MAN) osztályok. Miután olyan ember, aki nem is férfi és nem is n˝o, nem létezik, így az emberek osztálynak nem lesz, s˝ot nem is lehet egyede. Ezt majd a role abstract jelzi. Hasonlóképpen minden n˝o vagy lány vagy hölgy, ezért a n˝o osztálynak sem lesznek egyedei, és a férfi osztálynak sem. A lány, hölgy, fiú és úr osztálynak már lehetnek egyedei, ezt a role concrete jelzi. Az adott személy neme nem változik meg, ezért a sex tulajdonságnál a access read-only szerepel, azaz ez az érték csak olvasható, nem változtatható meg. A source composite segítségével ezt tovább örökítjük az alosztályok felé. A n˝o és férfi osztálynál már megadjuk a konkrét értéküket is, melyet felvesznek akkor is, ha semmi ilyen információt nem adunk meg az egyedek definíciójakor. Az emberek életkorára jellemz˝o tulajdonság természetesen egy számot jelöl, s hogy ne kelljen minden osztály esetén ugyanazt definiálni, hanem egy közös definíciót használhassunk, lesz szükségünk a visibility public megadására, a legb˝ovebb, azaz az ember osztály definiálásánál. Ezeket a tulajdonságokat öröklik az alosztályok, melyekben beállítjuk majd az alapértelmezett értékeket, s a határokat. Lássuk a definíciókat: (defclass PERSON (is-a USER) (role abstract) (slot sex (access read-only) (storage shared)) (slot age (type NUMBER) (visibility public)) (defclass FEMALE (is-a PERSON) (role abstract) (slot sex (source composite) (default female)) (defclass MALE (is-a PERSON) (role abstract) (slot sex (source composite) (default male)) (defclass GIRL (is-a FEMALE) (role concrete) (slot age (source composite) (default 4) (range 0.0 17.9)) ) (defclass WOMAN (is-a FEMALE) (role concrete) (slot age (source composite) (default 25) (range 18.0 120.0)) ) (defclass BOY (is-a MALE) (role concrete) (slot age (source composite)
)
)
)
52
V. CLIPS
(default 4) (range 0.0 17.9)) (defclass MAN (is-a MALE) (role concrete) (slot age (source composite) (default 25) (range 18.0 120.0))
)
)
(definstances PEOPLE (Peter of MAN (age 19)) (Ferenc of MAN (age 83)) (Katalin of WOMAN (age 19)) (Eva of WOMAN) (Jani of BOY (age 6)) (Feri of BOY) (Csilla of GIRL (age 6)) (Dia of GIRL) ) Ahogy látjuk az osztálydefiníció a defclass paranccsal történik, ahol az osztály (a hagyományokat követve nagybet˝us) elnevezése után, az is-a kulcsszót követ˝oen találjuk annak az osztálynak az nevét, melynek leszármazottja. Majd a különböz˝o most nem részletezett opciók beállítása után az egyes tulajdonságokat lehet megadni. Az egyedek definiálása történhetne a (makeinstance Peter of MAN (age 19) ),. . . formában is, de inkább a példában szerepl˝o módszert javaslom.
5.2. Üzenetek Az objektumorientáltság egyik jellemz˝oje az, hogy a különféle objektumok üzenetek útján érhet˝oek el. Üzenetek segítségével olvashatunk le bizonyos értékeket, pontosabban megkérhetjük az objektumot, hogy küldje vissza az értéket. Hasonlóképpen megkérhetjük, hogy állítsa be valamely tulajdonságot az általunk megadott értékre. Miután az általunk definiált osztályok a USER osztály alosztályai, s a USER osztály ismeri a print üzenetet, kérjük meg Ferit, hogy mutatkozzon be: (send [Feri] print). [Feri] of BOY (sex male) (age 4) Hasonlóképpen megkérhetnénk Ferit, hogy törölje ki magát az adatbázisunkból: (send [Feri] delete) Mint láttuk a makeinstance segítségével hozhatunk létre új egyedeket. Ha olyan nevet választunk, amely már szerepelt, akkor a régi egyed törl˝odik, s a helyét elfoglalja az újonnan megadott.
5. KERETRENDSZER
53
Ha másképp nem rendelkezünk, minden egyes tulajdonsághoz generálódik egy get- és put- üzenet. Az els˝ovel a tulajdonság értéke olvasható le, a másikkal pedig beállíthatjuk, például (send [Feri] get-age) és (send [Feri] put-age female). Ahogy várható volt, a második utasításra hibaüzenetet kapunk, mert csak olvasható tulajdonságként definiáltuk. (Természetesen, ha valamiért nem tetszik a gép által definiált tulajdonság, akkor magunk is írhatunk másikat helyette, s az override-message segítségével a vezérlést erre adhatjuk.) Az üzenetek helyett magunk is megváltoztathatjuk az egyes tulajdonságok értékét a modify-instance utasítás segítségével.
5.3. Egyedek kezelése Lekérdezhetjük, hogy szerepelnek-e egyedeink között valamilyen tulajdonságúak. Például keressünk egy 30 évesnél id˝osebb férfit: (find-instance ( (?ferfi MAN) ) ( > ?ferfi:age 30) ) Kereshetünk olyan emberpárokat is, melyek ugyanolyan id˝osek: (find-instance ( (?ferfi MAN) (?no WOMAN) ) (= ?ferfi:age ?no:age) ) Az el˝obbi példákban a find-instance lecserélhet˝o find-all-instancesre is, s ekkor az összes párost megkapjuk. A do-for-instance és a do-for-all-instances utasítással az adott feltételeknek megfelel˝o egyedekre az általunk megadott utasításokat hajthatjuk végre. Természetesen a korábban megismert szabályok egy kis módosítással a tények helyett az objektumokra is alkalmazhatóak: (defrule kicsi-vagy-meg ?valaki <- (object (is-a GIRL)(age ?kor)) (test (< ?kor 6)) => (printout t (instance-name ?valaki) " meg nem mehet iskolaba!" crlf) ) Mint látható, itt egy adott típusú objektumot kell keresni, s ha az objektum nevét szeretnénk használni, akkor az instance-name függvényt kell alkalmazni.
5.4. Üzenetkezel˝o függvények El˝ofordulnak olyan esetek, amikor egy tulajdonság más tulajdonságokból következik, onnan származtatható. Egy téglalap területe például az oldalai hosszából kiszámítható. Épp ezért nem érdemes a területet tulajdonságként tárolni, hanem
54
V. CLIPS
ha épp szükség van az értékére, a két oldal hossza alapján kell kiszámolni. Ekkor ha valamiért változik az oldalhossz, nem lesznek ellentmondó adataink. Habár kiindulhatnánk egyenesen a téglalapból, gyakoroljuk egy kicsit az osztályokat: (defclass SOKSZOG (is-a USER) (role abstract) (slot oldal (default 4)) ) (defclass HAROMSZOG (is-a SOKSZOG) (role concrete) (slot oldal (default 3)) ) (defclass TEGLALAP (is-a SOKSZOG) (role concrete) (slot a (type NUMBER) (default 2)) (slot b (type NUMBER) (default 3)) (message-handler terulet) ) (definstances ALAKZAT (t1 of TEGLALAP (a 3) (b 4)) (h1 of HAROMSZOG) ) Az szerepel a programban, hogy egy függvény számolja ki a területet. Hogyan m˝uködik ez? Szorozni kell, megpedig a szóban forgó téglalap két oldalhosszát. Objektum-orientált programozásban a szóban forgó egyedre rendszerint a self elnevezés˝u változóval hivatkoznak. Nekünk is így kell tennünk, de nem a téglalapra, hanem az oldalára hivatkozunk, így lesz bel˝ole ?self:a. (defmessage-handler TEGLALAP terulet () (* ?self:a ?self:b) ) (defmessage-handler TEGLALAP kiiras () (printout t "A teglalap terulete " (send ?self terulet) crlf) ) (defmessage-handler USER mi-vagy () (printout t "En egy " (class ?self) " vagyok." crlf) ) Amint látható, készítettünk még egy másik függvényt is, amely nem a konkrét számot adja vissza, hanem szövegesen válaszol. A harmadik függvény pedig akkor lesz érdekes, ha valaki kib˝ovíti ezt a szakért˝o rendszert a többi síkidom leírásával, s arra vagyunk kiváncsiak, hogy egy adott egyed éppen milyen típusú. A hagyományos m˝uveletek mellé definiálhatunk újabb függvényeket, melyek a f˝o m˝uvelet el˝ott, vagy után hajtódnak végre.
VI. fejezet
Szakért˝o rendszerek fejlesztése Ebben a fejezetben áttekintjük, egy adott szakért˝o rendszer kifejlesztésének lépéseit. Maga a folyamat hat szakaszból áll, melyek a következ˝ok: (1) (2) (3) (4) (5) (6)
a projekt kezdete, a rendszer analízise és tervezése, gyors prototípus, rendszerfejlesztés, alkalmazás és utómunkálatok.
1. A projekt kezdete Valakinek a fejében felmerül, hogy egy adott területen milyen jó lenne a számítógép segítségét igénybe venni. Ha ez egy nagyobb lélegzetvétel˝u projekt, akkor a költségek is tekintélyesek lesznek, ezért alaposan meg kell tervezni mindent.
1.1. Probléma megfogalmazása, igények felmérése A számítógéppel segítend˝o problémáról egy világos, érthet˝o beszámolót kell írni, amely minden segít˝o információt tartalmaz. Készíteni kell egy hivatalos listát az igényekr˝ol, hogy a probléma érthet˝o legyen.
1.2. Alternatív megoldások vizsgálata Fel kell mérni azt is, hogy egy saját rendszer kifejlesztése helyett megfelel˝o-e egy kereskedelemben kapható szoftvercsomag. Ehhez igénybe kell venni az adott terület szakért˝ojét, aki megállapíthatja, hogy a szoftver szolgáltatásai elegend˝oeke. Számolni kell ezen szoftver honosítási (testreszabási) költségeivel, a felhasználók oktatásával, betanításával. 55
56
˝ RENDSZEREK FEJLESZTÉSE VI. SZAKÉRTO
1.3. Szakért˝o rendszer megközelítés értékelése Ahhoz hogy szakért˝o rendszert lehessen használni az adott területen, az alábbak mindegyikének teljesülnie kell: – A feladat elméleti, s nem gyakorlati tapasztalatokat igényel. – Van legalább egy szakért˝o, aki vállalkozik a közös munkára. – Ez a szakért˝o képes mindenki számára érthet˝oen megfogalmazni a megoldási módszereket. – Ha több szakért˝o van, akkor meg tudnak egyezni az ismereteiken és a megoldási módszereiken. – A feladat nem túl bonyolult, jól érthet˝o, világosan definiált, nem változik gyakran, algoritmussal leírható megoldási módszer nem ismert. – A nem optimális vagy esetleg rossz megoldásai a szakért˝o rendszernek korrigálhatóak. – Adatok és példák (esetek) már ismertek. – A feladat megfogalmazásához maximum pár száz fogalom szükséges. Ha ez mind stimmel, akkor az alábbi pontok alapján dönthetünk a szakért˝o rendszer kifejlesztésér˝ol. (Gyakran többször is meg kell vizsgálni az újabb tények, ismeretek alapján, hogy ezek pontok valóban teljesülnek-e) – A feladat megoldása nagy haszonnal jár. (Ne felejtsük el, hogy a rendszerfejlesztés sokba kerül, csak akkor érdemes rá költeni, ha visszahozza az árát.) – A szakért˝o rendszer képes meg˝orizni a szakért˝ok megszerzett tudását, az nem vész el. – A szakért˝okre egyszerre több helyen is szükség van. (Ha nincs, felesleges géppel helyettesíteni az embert.) – A szakért˝ore veszélyes környezetben van szükség. (Nem kockáztatjuk azt az embert, amelyre már annyit költöttünk.) – A szakért˝o használata javítja a termelékenységet, vagy a min˝oséget. (Ha nincs szükség szakért˝ore, akkor szakért˝o rendszerre sem.) – A szakért˝o rendszer használható képzésre. – A szakért˝o rendszer gyorsabban válaszol, mint szakért˝o, vagy pontosabb, következetesebb válaszokat ad. Ne felejtsük el, a haszonnak meg kell haladnia a kiadásokat! Nézzük mely esetekben javalt a szakért˝o rendszer! – A probléma természete szimbólikus (nem számolási probléma) és heurisztikára épít. – A feladat nem túl egyszer˝u és nem is túl bonyolult egy szakért˝o számára. – A problémának kezelhet˝o a mérete és praktikus értéke van.
1. A PROJEKT KEZDETE
57
1.4. Tanulmányterv Közgazdasági: Képesek vagyunk elkészíteni? Technikai: Képesek vagyunk elkészíteni? Szervezeti: Ha elkészül, képesek vagyunk bevezetni?
1.5. Költséghatékonysági vizsgálat Meg kell határozni a projekt életképességét, ami gyakran nagyon bonyolult. Nehéz megjósolni a költségeket és a hasznot, mert itt több min˝oségi összetev˝o is lehet. A szakért˝o rendszer meg folyamatosan fejl˝odik, ezért ezeket a vizsgálatokat újra és újra el kell végezni (els˝o és második szakasz vége, prototípus elkészülte, kész rendszer beüzemelése, f˝opróba, azaz az éles alkalmazás el˝ott, használat alatt rendszeres id˝oközönként). A fejlesztési költségek becsléséhez fel kell mérni (és majd átvizsgálni) a rendszer lehet˝oségeit, s meg becsülni az egyes szakaszok id˝otartamát. A haszon becslésénél bizonyos összetev˝ok nem számszer˝usíthet˝ok, mások nem csak a szakért˝o rendszerhez kapcsolódnak, bizonyos összetev˝oknek csak hosszú távon ható eredményük van, s a szerteágazó következményeket (vev˝okör, kényelmetlenség, várakozási id˝o, stb) nehéz összesíteni.
1.6. Kérdések a vezet˝oség számára – El lehet-e adni az elkészült rendszer más cégek számára is? – Támogatja-e valamilyen információval a vállalatvezetést? – Mennyire zavarja a végfelhasználókat a rendszer, mennyi is milyen képzésre van szükség számukra? – Finanszírozható? – Rendelkezésre állnak a többi er˝oforrások is? – Vannak-e jogi vagy egyéb korlátozások? (Például nem megengedett adatkezelés.) – Ki lesz a fejlesztés vezet˝oje?
1.7. Fejleszt˝ocsapat megszervezése Ha a vállalat vezetése is a szakért˝o rendszer mellett teszi le a voksát, meg kell alakítani a fejleszt˝ocsapatot. Ez viszont a folyamatok el˝orehaladtával változni fog. A szokásos fejleszt˝okön kívül természetesen mindenképpen szükség van a szakért˝o(k)re és egy tudásmérnökre. Jó, ha jó kapcsolatot ápolunk a felhasznált programok terjeszt˝oivel, és érdemes a leend˝o felhasználókkal is rendszeres kapcsolatot tartani.
58
˝ RENDSZEREK FEJLESZTÉSE VI. SZAKÉRTO
2. A rendszer analízise és tervezése Ha megszületett a döntés, itt az id˝o alaposabban megtervezni a rendszert! Meg kell határozni a rendszer lehet˝oségeit, kapcsolódásait más számítógépes rendszerekhez. Meg kell adni a kockázati területeket, a felhasználni kívánt er˝oforrásokat, azok ütemezését, a fejleszt˝ocsoport összetételét, s minden olyan információt, amely szükséges lehet egy részletesebb tervhez. Miután ez elkészült, dönteni kell a fejlesztési stratégiáról. A szakért˝o rendszer a felhasználók gépein fog futni, vagy egy központi gépen? Mindenhonnan elérhet˝o a rendszer, vagy csak speciális helyeken használható? Hogy történjen a fejlesztés? Lehet bérelni egy tanácsadó céget, társulni egy egyetemmel, csatlakozni egy ágazati konzorciumhoz, de akár fel is lehet vásárolni egy fejleszt˝océget. A szaktudás gyakorlattal szerezhet˝o meg, s szakért˝okb˝ol ez csak részlegesen nyerhet˝o ki. De ki fogja kiválasztani a fejlesztésbe bevont szakért˝oket, mi alapján lehet valakit szakért˝onek tekinteni, mi a helyzet, ha több szakért˝ore is szükség van, és hogyan lehet szakért˝oket motiválni? Noha a hagyományos programozási nyelveken is írhatunk szakért˝o rendszereket, sokkal kényelmesebb és egyszer˝ubb egy fejlesztést segít˝o programmal dolgoznunk. Itt be kell tölteni a szakért˝ob˝ol kinyert tudásbázist jelent˝o szabályokat, s a következtet˝o rendszert futtatni kell a példaproblémákon. Hiba, eltérés esetén javítani kell a szabályokon, s újra kezdeni el˝or˝ol. Ha nincs hiba, akkor a fejleszt˝o rendszer megfelel˝o programjával már használható a is a szakért˝o rendszer. A CLIPS-hez hasonló keretprogramok (shell) esetén hasonlóan a mi dolgunk a tudásbázis (szabályok) megfogalmazása, míg a keretrendszer tartalmazza az adatgy˝ujt˝o alrendszert, következtet˝o részt, magyarázó részt, felhasználói felületet, és a tudásbázis kezel˝o (szerkeszt˝o, hibakeres˝o) részt. Hogy melyiket érdemes választani a sok kereskedelmi illetve ingyenes rendszer közül? Nehéz a válasz, mert a technológia nagyon gyorsan változik, sok kritériumnak kell megfelelnie a kiválasztott keretrendszernek. Az internet mint mindig, most is segíthet a döntésben.
3. Gyors prototípus A szakért˝o rendszerek fejlesztésénél ez egy kritikus pont. Létre kell hozni egy aprócska, de m˝uköd˝o rendszert, amit már lehet tesztelni, finomítani, b˝ovíteni. A szabályok száma itt még töredéke a teljes rendszerének, de a tudás ábrázolása már valódi formájában szerepel. Ez a kis rendszer igazolhatja, demonstrálhatja, hogy az elgondolás helyes volt. Most már ki lehet dolgozni a teljes rendszert.
6. UTÓMUNKÁLATOK
59
4. Rendszerfejlesztés A rendszerfejlesztésnek megvan a kidolgozott elmélete (életciklus megközelítés), a fejleszt˝ok sajnos ett˝ol gyakran eltérnek, inkább a prototípust fejlesztik tovább. A dolog természetét˝ol függ˝oen a legfontosabb most a tudásbázis kifejlesztése. Ehhez meg kell határozni a példákhoz a bemen˝o tényeket, a potenciális megoldásokat, készíteni kell egy vázlatot, döntési fát, és mindezek alapján végül a tudásbázist. Majd ezt tesztelni kell a példákra, az eredményeket értékelni, a tudásbázist ez alapján fejleszteni. A laboratoriumi teszteket valódi adokkal végzett tesztek követik, és egy szimulált környezetben kell kipróbálni. El lehet végezni a Turing-tesztet: a rendszer eredményét össze kell vetni egy szakért˝o válaszával. Újabb példákra kell futtatni, s fejleszteni a tudásbázist. El kell dönteni, hogy a rendszer azt csinálja-e ami a tervekben rögzített volt, s azt az elvárt pontossággal teszi-e! Meg kell vizsgálni, hogy a rendszer a specifikációinknak megfelel-e vagy sem.
5. Alkalmazás Miután a fejlesztés során a felhasználók egy csoportja már találkozott a rendszer korábbi változataival, s az o˝ igényüknek is megfelel˝oen fejl˝odött a rendszer, nagy ellenállásba nem ütközhet a rendszer bevezetése. Megfelel˝oképpen kell telepíteni, demonstrálni és betanítani a használatát. Ha az adatok olyanok, akkor külön figyelmet kell fordítani a biztonsági kérdésekre is. A felhasználókat segíteni kell a rendszer részletes és könnyen érthet˝o dokumentációjával is.
6. Utómunkálatok A környezet változik, így a rendszernek is együtt kell haladnia a változásokkal. El˝ofordulhatnak bonyolultabb esetek is, ezeket is fel kell venni a tudásbázisba. Rendszeresen értékelni kell a rendszert. Ekkor a következ˝o kérdések merülnek fel: – A karbantartás költsége milyen arányban áll a haszonnal? – A tudásbázis naprakész? – A rendszer elérhet˝o minden felhasználó számára? – Az elfogadottsága a felhasználók körében javul? – Az új ismeretek nem ütköznek a régiekkel?