TUDSALAP RENDSZEREK Elad Kovcs Zita 20182019 I flv









































































- Slides: 73

TUDÁSALAPÚ RENDSZEREK Előadó: Kovács Zita 2018/2019. I. félév Prolog

A Prolog � 1972: Alain Colmerauer (és Philippe Roussel) kifejleszti a Prolog programozási nyelvet

Alain Colmerauer (1941 -2017) � 2017. május közepén, 76 éves korában elhunyt Alain Colmerauer, francia számítástechnikus. �Colmerauer ugyan a számítástechnika több területén is nagyot alkotott, legemlékezetesebb teljesítményeként azonban vélhetően mégis a Prolog programozási nyelv megalkotása vonul majd be az informatikai történelembe.

Alain Colmerauer (1941 -2017) �Alain Marie Albert Colmerauer 1941 január 24 -én született egy francia kisvárosban. �Általános és középiskolai tanulmányainak elvégzését követően �a Grenoble-i Műszaki Egyetemre jelentkezett, ahol 1963 -ban diplomát, majd 1967 -ben doktori címet is szerzett a számítástechnikai tudományok területén.

Alain Colmerauer (1941 -2017) �Ezt követően a kanadai Montreali Egyetemre ment dolgozni, ahol tanársegédi munkája mellett kidolgozta az ún. Q-Systems alapelméletét, ami irányított gráfok segítségével próbált megoldást adni a különböző nyelvek közötti automatikus fordításra. �Később ezen ötletre alapozva, illetve azt továbbgondolva alkotta meg a Colmerauer által vezetett egyetemi kutatócsapat a világ első logikai programozási nyelvét, a Prolog-ot is.

Alain Colmerauer (1941 -2017) �Az először 1970 -ben publikált, de később számos iterációban újragondolt és kibővített nyelv gyorsan a számítógépes nyelvészeti alkalmazások és egyes mesterséges intelligencia programok kedvelt fejlesztőeszközévé vált, és máig őrzi vezető pozícióját ezen a területen. �Benne írták meg például az IBM Watson rendszerének nagy részét is, ami az első számítógépes rendszer volt, ami képes volt megverni legjobb emberi ellenfeleit is - a leginkább a magyar Mindent vagy semmit-hez hasonlítható - Jeopardy! kvízműsorban.

Alain Colmerauer (1941 -2017) �Colmerauert munkássága elismeréseként 1985 -ben a Francia Tudományos Akadémia díját kapta meg, 1986 -ban pedig a francia kormány is kitüntette őt. 1991 -ben beválasztotta tagjai közé az Amerikai Mesterséges Intelligencia Társaság. �Alain Colmerauer 76 évet élt.

A Prolog � 1972: Alain Colmerauer kifejleszti a Prolog programozási nyelvet � a Prolog név a francia eredetű programmation en logique (logikai programozás) kifejezés rövidítése � az első logikai programozási nyelvnek tekinthető � egy megadott logikai formuláról (célformula) képes eldönteni, hogy logikai következménye-e formulák egy adott halmazának. Utóbbi formulák és a célformula a program bemenete, a kimenet pedig a válasz, hogy következik-e a célformula a többi formulából. � Röviddel Colmauer után Szeredi Péter is kifejlesztett egy Prolog interpretert Magyarországon.

A Prolog �Jellemző kiterjesztés . pl. pro. P �Dialektusok ISO Prolog, Edinburgh Prolog �Hatással volt rá Planner �Befolyásolt nyelvek Visual Prolog, Mercury, Oz, Erlang, Strand, KL 0, KL 1, Datalog

Prolog megvalósítások � � � � � MProlog Quintus Prolog PDC Visual Prolog CS-Prolog GNU Prolog SWI Prolog SICStus Prolog Jekejeke Prolog BProlog, Ciao, ECLi. PSe, Logic Programming Associates, Poplog Prolog, P#, Strawberry, tu. Prolog, XSB, YAP-Prolog

A Prolog mint logikai gép �A Prolog eredetileg (és a szakma úgy tartja, ma is) egyszerű felépítésű és könnyen használható nyelv volt; célközönségét kezdetben az „informatikában járatlan nyelvészek” képezték. �A szintaxis és szemantika leginkább a matematikai logika egy ágának, az elsőrendű logikának a szimbólum- és gondolatvilágára épül: a Prolog nyelv kifejezései általában elsőrendű logikai kifejezéseknek feleltethetőek meg.

A Prolog mint logikai gép � A Prolog azonban nem az elsőrendű logika számítógépes megvalósítása, azzal csak átfedésben van. � Egyrészt nem képes az egész elsőrendű logika rendszerének és eredményeinek kezelésére, csak annak egy részét, a Horn-logikát képes visszaadni különféle okok miatt; � másrészt a logikai negációt és az univerzális kvantifikációt sem képes teljes mértékben, szemantikailag hűen kezelni; nincsenek erre szolgáló beépített eszközei;

A Prolog mint logikai gép �viszont bizonyos eszközei (elsősorban az (ön)rekurzív predikátum-definíciók, a dinamikus klózok és az olyan beépített algoritmusok, mint a vágás alkalmazása) révén meg túl is szárnyalja az elsőrendű logikát, az ún. fixpontlogika területére vezetve a gyanútlan felhasználót. �Ezek a jellemzők szükségképp leszűkítik a Prolog alkalmazhatóságát a nem-algoritmizált, elméleti matematikai levezetőrendszerekkel szemben.

A Prolog mint programozási nyelv � Az informatikában használt nyelvosztályzás szerint a Prolog deklaratív (nem imperatív, nem procedurális) nyelv. � Ez azt jelenti, hogy a programozónak azt kell leírnia, hogy a megadott adatokból mit kellene kiszámítani (és a Program azt jelzi vissza, lehetséges-e ez), és nem azt az algoritmust, hogy az adatokból hogyan kellene kiszámítani valamit. � Ezen kívül sem eljárások, sem objektumok, sem adattípusok nem vagy nem olyan kifejezetten találhatóak benne, mint más nyelvekben (amikor ilyenekről beszélünk, az inkább metaforikus értelmű).

A Prolog mint programozási nyelv �A Prolog nyelvének is megvan a maga jelkészlete, ábécéje, az ezekből képezett kifejezéseket (némileg pontatlanul) termeknek nevezzük. �A Prolog forrásprogramok legtöbb sora egy olyan logikai kifejezés (formula, a Prologtudomány nyelvezetében összetett term – avagy (program)klóz), melyet a program alkalmazása során általában speciális implikációs formulának értelmezünk.

A Prolog mint programozási nyelv �Matematikailag, elméleti szempontból minden ilyen a kifejezést (programklózt) lehetséges és célszerű Horn-klóznak tekinteni. �A Prolog verziók legtöbbje képes ezeken kívül numerikus és szöveges kifejezések kezelésére is, de a logikai (forrás)programok „lelkét” a programklózok alkotják; maga a logikai (forrás)program tehát felfogható úgy, mint egy rendezett elsőrendű klózhalmaz (illetve mint e halmaz klózaiból képezett egyetlen konjunktív normálforma).

A Prolog működése � A programnak (szoftvernek) meg kell adnunk egy célformulát (célklózt), ezután a program (szoftver) ellenőrzi, hogy a célklóz a logikai (forrás)program logikai következményei közt van-e. (lekérdezés, query) � A döntési eljárás az elsőrendű logika egyik levezető módszere, a lineáris inputrezolúció, ennek algoritmizált számítógépes megvalósításait LUSHnak (Linear (input)resolution with Unrestricted Selection function for Horn clauses; Lineáris (input)rezolúció Kötetlen (literál)kiválasztó eljárással Horn-klózokra) nevezzük.

A Prolog működése � A LUSH egy egész eljáráscsalád, futtatás előtt a programozó adja meg, hogy milyen meghatározottabb beállításokkal (paraméterekkel) működjön; ennek hatására némileg módosul a futtatókörnyezet által végrehajtott algoritmus. � Ily módon tehát a Prolog az automatikus tételbizonyítás egy, fent említett korlátai ellenére a tapasztalatok szerint nagy számítóerejű megvalósítása. � A további alapvető, működését leíró fogalmak az illesztőhelyettesítés (unifikáló helyettesítés, unifikáció, faktorizáció), a tail recursion és a visszalépés (backtracking).

A Prolog alkalmazásai � A Prologot gyakran használják mesterségesintelligencia- alkalmazások megvalósítására, illetve a számítógépes nyelvészet eszközeként (különös tekintettel a természetes nyelvfeldolgozásra, melyre eredetileg tervezték). � A kutatások egyik fontos támogatója és gerjesztője volt az a tény, hogy a Prolog-variánsokat (például a Kernel Nyelvet) operációs rendszerként használó számítógépek előállítására, az ún. Ötödik Generációs Számítógéprendszer-Projektre az 1980 -s években elég nagy hangsúlyt fektettek (elsősorban japán kezdeményezésre), bár mára az eredeti kutatás szinte teljesen leállt. � Manapság a fő kutatási terület a nyelv felhasználása adatbáziskezelő programként.

Szintaxis Term és típus � A Prolog nem alkalmaz a hagyományos informatikai értelemben „adattípusokat” úgy, ahogyan az más programnyelvekben szokásos. � Ehelyett inkább „lexikai elemekről” beszélhetünk. � A Prologban mind az adatokat, mind a végrehajtandó programot termek (ti. kifejezés, terminus) formájában írjuk le. � Ez a nyelv egyetlen, összetett adatokat megjeleníteni képes struktúrája. � Ezek tekintendőek a Prolog programozási nyelv szavainak. � Egy összetettebb Prolog kifejezés egy névből, és a névhez rendelt adott számú egyszerűbb kifejezésből, argumentumból áll (az argumentumok újabb Prolog kifejezések).

Szintaxis Funktor �A kifejezés nevéből és argumentumszámából képezett rendezett pár a kifejezés funktora. �Hogy egy adott kifejezést adatként vagy végrehajtandó programként kezel-e a futtatókörnyezet, csupán attól függ, hogy milyen kontextusban szerepel. �Ez a rugalmasság lehetővé teszi, hogy egy Prolog programból magát a programot dinamikusan, futás közben módosítsuk.

Szintaxis Egyszerű és összetett term �A termek tehát a Prolog nyelvének szabályosan képzett, értelmesnek (a program interpretere által értelmezhetőnek) tekinthető, a nyelv szintaktikája alapján jól képzett kifejezései. �Lehetnek egyszerű termek, melyek a legkisebb értelmes kifejezések (ezek részeit a Prolog nem érti, de magát a kifejezést már igen). �A termek lehetnek összetett termek is, melyek végső soron az egyszerű termekből (közvetve esetleg más összetett termekből) épülnek fel.

Szintaxis Egyszerű termek �Az egyszerű vagy atomi termek a következő félék lehetnek: atom szám változó lista füzér

Szintaxis Egyszerű termek: atom � Az atomok szövegkonstansok: betűk, számok, egyéb írásjelek sorozatai, kezdőbetűjük mindig kisbetű (sohasem nagybetű vagy aláhúzásjel, mert ezekkel a változók nevei kezdődnek). Az egy hosszúságú atomok (1 darab írásjelből állóak) neve, mint minden programozási nyelvben, itt is karakter. � Tetszőleges karakterekből (a szóközt is beleértve) létrehozható atom, ha aposztrófokkal zárjuk közre (Például '+' atom, míg + egy beépített aritmetikai operátor; 'X' egy atom, de X egy változó). � Az atomokat – az aposztrófok között megadottak kivételével – szóközök határolják, így ha atomként szóközjelet akarunk megjeleníteni, akkor egy másik jellel kell jelölni (általában _ jellel).

Szintaxis Egyszerű termek: atom Példák atomokra: atom másik_atom ‘Minden aposztrófok karaktersor is atom‘ ‘ ‘ ‘+‘ ‘X‘ ‘ 3‘ közti

Szintaxis Egyszerű termek: szám �A számokon belül a legtöbb Prolog nyelvjárás megkülönbözteti ugyan a lebegőpontos és az egész számokat, azonban mivel a Prolog nem erősen típusos programozási nyelv, a két ábrázolásmód felcserélhető és keverhető az aritmetikai kifejezésekben. �Számos Prolog változatban az egész számok méretére nincs is felső korlát. �Az ilyen egészszám-ábrázolás szokásos neve bignum (az angol „big numbers”, azaz „nagy számok” kifejezésből).

Szintaxis Egyszerű termek: szám Példák számokra: 12 34. 45 1 e-1 5934875492834759384573451234987653

Szintaxis Egyszerű termek: változó � A változó nagybetűvel (vagy aláhúzásjellel) kezdődő, alfanumerikus karakterből és a _ aláhúzásjelből felépíthető stringekkel jelölt „adattípus”. � Az imperatív programozási paradigmájú nyelvektől eltérően, a Prolog környezetben a változóknak csak egyszer tudunk a program élete során értéket adni. � Nevezetes még a névtelen változó, egy „bármilyen változót” jelenthető joker-karakter, amit egyetlen aláhúzásjel (_) jelöl. � Ennek a változónak minden előfordulása, új, ún. friss változót vezet be a programban. � Akkor használatos, amikor az adott változó értékére nem vagyunk kíváncsiak; ilyenkor megspórolható egy változónév kigondolása, és helytakarékosabb is.

Szintaxis Egyszerű termek: változó Példák változókra: X Yb 0_1 a _idiamin 4 _ Ha egy Prolog változó egy eljárás lefutása során „értéket kapott” (ez az unifikáló illesztés végrehajtása során történik), akkor – amíg visszalépés nem történik – a változó értéke megmarad. Ebben eltérés mutatkozik az imperatív programnyelvektől, és így a Prolog változó a matematikai „ismeretlen” fogalmához áll közel.

Szintaxis Egyszerű termek: lista �Termek és típus véges sorozatát listának (list) nevezzük. �A listák jelölése általában [t 1, t 2, … , tn] alakban történhet (általános alak), ahol t 1, t 2, …, tn a lista elemei. �A Prolog lista nem önálló adattípus, hanem '. '/2 funktorú kifejezések láncolt listája, ahol a funktor első argumentuma mindig a lista fejét, azaz első elemét, a második pedig a lista farkát, azaz az eggyel rövidebb listát jelenti. �Tehát például az [1, 2, 3] alakú lista valójában az �'. '(1, '. '(2, '. '(3, []))) láncolt listát jelenti.

Szintaxis Egyszerű termek: lista A listákat ezért általános alakjuk helyett a következő rekurzióval is megadhatjuk: 1. Létezik az üres lista (melynek egy eleme sincs), melyet többnyire a nil vagy [] atom szokott jelezni. 2. ha T lista és H term, akkor [H|T]-vel jelöljük a H termet első elemként tartalmazó azon listát, melynek többi elemei rendre a T elemei. Ennek megfelelően az első, H elem neve a lista feje, a régebbi T lista pedig a bővített lista farka. Ez a jelölés a '. '(H, T) belső felépítésű Prolog listát takarja.

Szintaxis Egyszerű termek: lista Ezen kívül még több lehetőségünk is van listák építésére és kezelésére: �Elemek felsorolása: [abc, 1, f(x), Y, g(A, rst)] �Egy elem hozzáadása: [abc | L 1] �Több elem hozzáadása: [abc, 1, f(x) | L 2] �Termkiterjesztés: '. '(abc, '. '(1, '. '(f(x), '. '(Y, '. '(g(A, rst), [])))))

Szintaxis Egyszerű termek: lista A legtöbb Prolog fordító tartalmaz beépített listakezelő műveleteket: �member elem keresése listában �del elem törlése listából �length listahossz megadása �last utolsó listaelem meghatározása �conc listák egyesítése (konkatenáció) �cikl különféle ciklusszervezési lehetőségek

Szintaxis Egyszerű termek: füzér (string) �A legtöbb Prolog megvalósításban használhatunk füzéreket, amelyeket kettős idézőjelek közé írt karaktersorozatokként írhatunk le. �A füzéreket többnyire az egyes karakterek listájaként ábrázolják a futtatókörnyezetek.

Szintaxis Összetett termek �Az összetett termek, avagy programklózok atomi termekből mint argumentumokból képezett, szintaktikailag implikációs vagy annak tekinthető kifejezések, melyeket az interpreter logikailag mint Horn-klózokat kezel.

Szintaxis Összetett termek �Programklóznak általában az A : - B 1, B 2, … , Bn alakú kifejezéseket nevezzük, ahol A és B 1, B 2, … , Bn egyszerű termek. �Logikai szempontból ezt a kifejezést a következő normálforma alakú kifejezésre fordíthatjuk le: A∨¬B 1∨¬B 2∨…∨¬Bn (*)

Szintaxis Összetett termek A Prologban három eset képzelhető el: 1. 2. 3. � Az A „üres” atom (azaz a : - jel bal oldalára nem írunk semmit sem), tehát a (*) formula valamennyi atomja negált. Ekkor a klóz a célklóz. A nem üres, de n=0, azaz a : - jel jobb oldalán semmi sem áll, tehát a klóz egyetlen negálatlan állításból, „atomi tényből” áll. Ilyenkor magát a : - implikációjelet sem írjuk ki. Az ilyen klózok a tények. Sem A nem üres, sem pedig az n nem nulla, tehát a : - jel mindkét oldalán áll atom (és bal oldalán egyetlenegy atom), azaz a (*) formula tartalmaz pontosan egy negálatlan és legalább egy negált atomot. Ezek a klózok a definit klózok, vagy szabályok. A programklózoknak tehát, a célklózon kívül, két fő fajtája a tények, illetve a szabályok.

Szintaxis Összetett termek: tények (facts) � atom(a 1, a 2, …, an) alakú, egy fejnek nevezett atomból és valahány argumentumból álló kifejezések. � Az argumentumok többféle típusúak lehetnek. � A kifejezés nevéből és az aritásából álló megjelölést (rendezett párt) a kifejezés funktorának nevezzük. � A „fej” atomot általában mint predikátumnevet szokás értelmezni, tehát például az barát(dani, tomi) � alakú tény azt fejezné ki, hogy a „dani” atommal és a „tomi” atommal jelölt egyedek „barát”-ok (természetesen ez az értelmezésmód nem kötelező, bonyolultabb programokban sokszor inkább jelentés nélküli, egy-két betűs predikátumneveket használnak; csupán hozzájárul a program jobb érthetőségéhez).

Szintaxis Összetett termek: tények (facts) �Ennélfogva lehetséges, hogy több ténynek is azonos atom legyen a feje, mint például az a következő hat darab tény némelyikében látható: barát(dani, tomi) barát(ági, jani) kutya(blöki) kutya(dodi) barát(blöki, tomi) barát(blöki, dodi) �Egy adott logikai (forrás)programban az összes tény halmazát néha szokás az adott program adatbázisának nevezni.

Szintaxis Összetett termek: szabályok (rules) �logikai kifejezésként Horn-klózok fej : - törzs. a fej igaz, ha a törzs igaz �szintén összetett termek, funktoruk ': -'/2, ahol a fejet és a törzset a : - operátor választja el egymástól. �A törzset alkotó, vesszővel elválasztott, illetve a fejet alkotó egyszerű kifejezést a szabály literáljainak is nevezzük. �A tényállításokat alkotó egyszerű kifejezések is literálok, egy tény tehát egyetlen literálból áll.

Szintaxis Összetett termek: szabályok (rules) Példák szabályokra: névfej(1, atom, X) : - nevtorzs 1(uj, uj), nevtorzs 2(x, Y, z), … stb. kif(beágyazott(0), arg)

Szintaxis Összetett termek: szabályok (rules) �Nagyjából itt is elmondható, ami a tények esetében, tehát hogy legegyszerűbb esetben a szabályokat mint állításokat, predikátumokat értelmezzük. Például nagyapja(X, Y) : - apja(X, Z), apja(Z, Y) n(X, Y) : - a(X, Z), a(Z, Y)

nagyapja(X, Y) : - apja(X, Z), apja(Z, Y) A legegyszerűbb e klózokat tehát úgy kiolvasni, hogy „Ha valaki (X) apja a fiának (Z) és a fiú is apja az unokának (Y), akkor ezt a valakit (X-et) az unoka (Y) nagyapjának nevezzük”. Tehát ez bizonyos értelemben a „nagyapja(… , …)” predikátum „definíciója” – ez magyarázza a „definit” jelzőt a „definit programklóz” kifejezésben (a hagyományos, köznapi és matematikai logikával szemben az a különbség, hogy a Prologban nincs beépített eszköz a „csak akkor” reláció ábrázolására, tehát ezt más módon kell megoldani). Természetesen a fenti klózoknak másféle predikátumot is tekinthetünk az értelmezésének, a megoldandó problémától és a programozó szándékaitól függően.

Szintaxis Eljárás �A Prologban egy eljárás (szokás partíciónak is nevezni) olyan klózok összessége, amelyek feje és argumentumszáma (azaz melyek funktora) megegyezik. �Lehetséges azonos nevű, de különböző argumentumszámú eljárások definiálása.

További beépített parancsok �Metapredikátumok �Interpreter vezérlőparancsok �Interface parancsok

További beépített parancsok Metapredikátumok �Ezen predikátumok segítségével a felhasználó képes a Prolog termek osztályzására, és így a Prolog nyelv metanyelvét képezik: var(X) nonvar(X) atomic(X) compound(X) atom(X) number(X) integer(X) float(X) X változó X nem változó X konstans X összetett kifejezés (struktúra) X egyszerű kifejezés (atom) X szám X egész („típusú”) számérték X lebegőpontosan ábrázolt szám

További beépített parancsok Interpreter vezérlőparancsok �A fail (kudarc) parancs, melyet az összetett termekbe mint literált lehet beírni, az SLDalgoritmus visszalépését vezérli a levezetésgráfban. Hasonló a mindig igaznak számító true predikátum. �A cut (vágás) parancs hatására a levezetésgráf bizonyos ágain az SLDalgoritmus nem megy végig. Ez is a visszalépések szabályzása útján hat.

További beépített parancsok Interface parancsok �A futtatott program és a környezet (felhasználó, perifériák, számítógép) közti kommunikációt segítik. �write – szöveg kiírása a képernyőre. �Használata: write(atom), ahol az atom betűsor helyére valamilyen atom helyettesíthető.

További beépített parancsok write példa �A Helló, Világ!-program a következőképp fest a Prolog nyelven: write('Helló, világ!'), nl.

Az interpreter működése – a LUSH-eljáráscsalád � A LUSH betűszó feloldása: for. Linear (input)resolution with Unrestricted Selection function Horn clauses, azaz kb. „Lineáris rezolúció Több (literál)kiválasztási eljárással Horn-klózokra”. � Ez azt jelenti, hogy az interpreter a program klózain, melyek Horn-klózok, lineáris (input)rezolúciót hajt végre, amely nem determinisztikus eljárás, hanem minden lépésben esetleg több literál közül egyet választ ki, és hogy milyen szabály (azaz literálkiválasztási eljárás) szerint, azt a felhasználó állíthatja be a program futtatásakor. � Tehát önmagában a LUSH eljárás, minthogy indeterminisztikus, nem egy algoritmus. � A literálkiválasztó stratégia rögzítésével viszont az lesz.

Az interpreter működése – a LUSH-eljáráscsalád �A Prologban legtöbbször használt literálválasztó stratégia a Robert Kowalski által kidolgozott ún. SLD-stratégia, amelynek során a rezolválandó mellékklózból a program mindig a klóz legbalra eső alkalmas (kirezolválható) literálját választja ki (ha van ilyen, ha nincs, akkor a program egy másik mellékklózt választ, ha pedig nincs, akkor kudarc jelzésével véget ér a futása).

Az interpreter működése – a LUSH-eljáráscsalád �Ezt magyarítva terminológiában BELstratégiának (balról az első literál) nevezhetnénk. �Használható még a JEL-stratégia is (jobbról az első literál), de ez végtelen futásba viheti a programot (az újabb Prolog verziókban ezt a problémát általában már kiküszöbölik). �Mivel az SLD-algoritmus nem képes a negáció kezelésére, ezt több negációkezelő stratégiával egészítették ki.

A LUSH/BEL, azaz SLD-stratégia algoritmusa �E ciklikus algoritmus a lineáris inputrezolúció egy megvalósítása. �Bármely ciklusa végrehajtásakor, az ún. visszalépések végrehajthatósága miatt, szükség van az előző lépések során végrehajtott lépésekről (gyakorlatilag az összes előforduló központi klózról és mellékklózról) való információ tárolására.

A LUSH/BEL, azaz SLD-stratégia algoritmusa Kezdetben az aktuális célklóz a program eredeti célklóza. 2. Ha az aktuális célklóz az üres klóz, akkor pozitív eredménnyel vége a programnak: rezolúciós cáfolatot kaptunk, a célklóz következménye a program többi klózának. Ekkor a 6. lépés következik, egyébként (ha nem üres klóz az aktuális) a következő, azaz 3. lépés. 3. Az aktuális célklózból kiválasztja balról az első literált, ez az aktuális literál. 1.

A LUSH/BEL, azaz SLD-stratégia algoritmusa Ha van olyan partíció, amely az aktuális literállal kezdődik, akkor e partíció legelső (az előző lépések során még ki nem választott) klózát kiválasztjuk. Ha nincs ilyen partíció, vagy ennek már nincs kiválasztható klóza, akkor a 6. lépés következik, egyébként az 5. lépés. 5. Illesztjük a kiválasztott partíció kiválasztott klózát az aktuális klózzal és képezzük az így kapott két klóz elsőrendű (más néven bináris) rezolvansét. Ez lesz az új aktuális célklóz, és visszalépünk a 2. lépésre. Egyébként (ha az illesztés vagy a rezolúció nem hajtható végre), a választás "kudarcos"-nak minősül, és visszalépünk a 4. lépéshez. 4.

A LUSH/BEL, azaz SLD-stratégia algoritmusa 6. Ha az aktuális célklóz az eredeti célklóz, az algoritmusnak vége. Egyébként pedig a jelenlegi aktuális célklóz törlődik, és az azt megelőző aktuális célklóz lesz újra az aktuális célklóz. Ekkor pedig visszalépünk a 3. lépésbe. Ez az algoritmus a levezetésgráf „mélységben először” bejárási stratégiájának felel meg.

Rezolúció a Prologban �A program mindig, minden lépésben a : - C 1, C 2, …, Cn �alakú aktuális célklózt rezolválja valamely A : - B 1, B 2, …, Bm �alakú programklózzal �(illetve esetleg egy programklóz ún. alapelőfordulásával, ami azt jelenti, hogy a klóz néhány változóiba a programban előforduló konstansok lettek helyettesítve. �Ilyen helyettesítések az ún. illesztés avagy faktorizálás során következik be ).

Visszalépés Példa: családfakutatás � Szemléletes, köznapi formában adott a következő szabály: � „Ha valaki apja másvalakinek, és e másvalaki is apja még valakinek, akkor az elsőként említett valaki nagyapja a harmadikként említett mégvalakinek. ” � Álljon egy program ebből a szabályból, és egy családfarészletet leíró adatbázisból, mely családban egy István nevű ősnek két fia van, Dániel és Nándor, Dánielnek pedig van még egy fia, István 2. � Le tudja-e vezetni a Prolog, hogy István nagyapja Péternek?

Visszalépés Példa: családfakutatás Program „Családfa” nagyapja(X, Y) : - apja(X, Z), apja(Z, Y). apja(istván, dániel). apja(istván, nándor). apja(dániel, istván 2). apja(nándor, péter). Cél: : - nagyapja(istván, péter)

Program „Családfa” � A programkonstansok most keresztnevek, de a helyesírási konvenciótól eltérően nem írhatjuk őket nagybetűvel, hisz akkor változókat jelentenének. � Nyilvánvaló, hogy érvényes nagyapja(istván, péter). � A program – SLD-stratégia beállítása esetén – a következő lépéseket fogja végrehajtani az első sikeres levezetésig: adjuk meg neki célklózként a levezetendő állítás negáltját, azaz a : - nagyapja(istván, péter). predikátumot (emlékeztetünk: ha a : - jel bal oldalán áll egy literál, az jelenti a literál tagadását). � A program indulásakor az aktuális célklóz az eredetileg megadott, : - nagyapja(istván, péter).

Program „Családfa” �A Prolog generál egy új aktuális célklózt úgy, hogy megkeresi a programban mint klózlistában az első olyan klózt, ami az aktuális célklóz bal első literáljával rezolválható. �Az aktuális célklóz nem üres, ezért a programklózok között felülről lefelé haladva megkeressük azt a partíciót, amely az aktuális célklóz balról az első literáljának fejével kezdődik, tehát keresgélünk az nagyapja/2 funktorú predikátumok közt.

Program „Családfa” �Tehát a „nagyapa” fejjel rendelkező predikátumokból álló partíció legelső (még fel nem dolgozott, azaz az aktuális célklózzal rezolválni még nem próbált) elemét választjuk ki, ez lesz az aktuális mellékklóz. �Az első (és egyetlen) ilyen predikátum a megfelelő partícióban: nagyapja(X, Y) : apja(X, Z), apja(Z, Y). . �Ezt választjuk ki, és ezzel próbáljuk az aktuális célklózt rezolválni.

Program „Családfa” �Mivel ez változókat tartalmaz, ha van az aktuális célklózban olyan változóhely, mely konstanssal van behelyettesítve, akkor a mellékklózban is behelyettesítjük a megfelelő változókat. �Ez az illesztés (unifikáció, faktorizáció etc. ) �Ennek eredményeképp (X helyébe "istván", Y helyébe "péter" kerül) kapjuk a nagyapja(istván, péter) : - apja(istván, Z), apja(Z, péter). mellékklózt.

Program „Családfa” �Képezzük az elsőrendű rezolvenst. �Ez nem más, mint : - apja(istván, Z), apja(Z, péter). �Ez lesz az új aktuális célklóz. �Most végrehajtjuk az eddigi ezzel a célklózzal. lépéseket újra

Program „Családfa” � Kiválasztjuk a bal első literálját: 1. apja(istván, Z). Az aktuális célklóz nem üres, tehát nem vagyunk készen. Bal első literálja apja(…, …), tehát az „apja” partícióban keresgélünk mellékklóz után. A legelső klóz az apja/2 partícióban apja(istván, dániel). . Ez lesz az új mellékklóz. 2. Illesztünk: Z : = dániel, tehát a célklóz apja : apja(istván, dániel), apja(dániel, péter). alapformáját rezolváljuk az apja(istván, dániel). alapformulával. Az eredmény: : apja(dániel, péter). . Ez lesz az új aktuális célklóz. 1.

Program „Családfa” 2. Ez nem üres, tehát nem vagyunk kész. Kiválasztjuk a bal első literált, és keresgélünk a megfelelő funktorú partícióban. 1. Az egyetlen klóz, amit elvileg illeszteni lehetne a fenti aktuális célklózzal, az a : - apja(dániel, péter). célklóz negáltja, apja(dániel, péter). . Ez nem szerepel az adatbázisban (egyáltalán, a programban sem). Nincs az aktuális célklózzal illeszthető klóz. Ez azt jelenti, hogy az aktuális célklóz kudarcos, a program visszalép az előző aktuális célklózhoz, ami tehát : - apja(istván, Z), apja(Z, péter). .

Program „Családfa” 1. Ez nem üres, tehát nem vagyunk készen. Bal első literálját kiválasztjuk. Ennek funktora apja/2. Keresünk a célklózhoz még feldolgozatlan mellékklózt az "apja" fejű klózokból álló partícióban. Mivel a partíció legelső klózát már feldolgoztuk, kudarcos eredménnyel, most választjuk a második klózát, ez apja(istván, nándor). . 1. Illesztünk: Z : = nándor. Az illesztett klózok : - apja(istván, nándor), apja(nándor, péter). és apja(istván, nándor). . 2. Képezzük az illesztett klózok rezolvensét: : apja(nándor, péter). . Ez az új aktuális célklóz. 2. Ez nem üres. Bal első literáljához illeszthető klózt keresünk, ami tehát csak apja(nándor, péter). lehet.

Szemantika � A Prolog rekurzív logikai formulákat kezelni képes rendszer. Az ilyen rendszerek vizsgálatának leggyakoribb matematikai eszköze az ún. fixpontlogika. � A programnyelv-szemantika a programok mint egy programnyelv kifejezéseinek értelmezésével, a program jelentésének vizsgálatával foglalkozik. Ezen belül ▪ az első, a deklaratív szemantika vizsgálja, hogy a programot mint formulahalmazt értelmezve, milyen logikai következmények vonhatóak le belőle. ▪ a második, az eljárásszemantika (procedurális szemantika) vizsgálja, hogy a program mint algoritmikusan megvalósított kalkulus milyen (azaz például milyen korlátai vannak a lineáris inputrezolúciónak) ▪ a harmadik, a kiszámítási szemantika pedig, hogy a klóz- illetve literálsorrendnek milyen szerepe van a program futásában.

A negációkezelés � A Prolog célklóza szükségképp : - C 1, C 2 , … , Cn � alakú, ami tudniillik olyan programklózt akar jelenteni, mely nem tartalmaz pozitív literált, vagyis a : - implikációjeltől balra eső, konklúzió szerepű literál az üres klóz (üres literál). � Tehát logikai formulákkal a következő Horn-klózról van szó: ¬C 1∨¬C 2∨…∨¬Cn � A Prolog leíró nyelvében nem szerepel negáció, hiszen egy literál negációját úgy fejezzük ki, hogy amikor a formulát programklóz alakba írjuk, a : - jel jobb oldalára essen.

A negációkezelés �A célklóz pedig attól célklóz, hogy a klóz minden literálja a jobb oldalán van. �Tehát a Prolog csak olyan célklózok kezelésére képes, melyeknek nincs negálatlan, a : - jel bal oldalára eső literáljuk, és ezért nem képes az elsőrendű logika apparátusához hasonlóan kezelni tetszőleges formula negációját.

A negációkezelés �Az SLD-t a hetvenes években Robert Kowalski dolgozta ki. �Mivel nem képes a negáció kezelésére, többen is továbbfejlesztették módszerét a negációkezelés valamilyen megoldására. �Az első ilyen próbálkozás Clark SLDNFmódszere (SLD with negation as finite failure, kb. SLD-eljárás a negáció véges lépésben meghiúsuló levezetésként való értelmezésével). �Ezt ma is használják a Prologban.

A negációkezelés � Meg kell jegyeznünk, hogy ez nemcsak hogy nem szemantikailag hű kezelése a negációnak, de bizonyos esetekben végtelen ciklusba is viheti a programot. � Ezen kívül még rengeteg eljárást kidolgoztak és dolgoznak (SLS, SLT, CAW stb. ), ezek közül még a CAW használatos leginkább a megvalósult Prolog verziókban. � A negációkezelésre két módszert szoktak beépíteni: A zárt világ feltételezés módszere (CWA, closed world assumption) A negáció mint kudarc módszer (NF, negation as failure).

Forrás, linkek �https: //hu. wikipedia. org/wiki/Prolog �http: //nyelvek. inf. elte. hu/leirasok/Prolog/inde x. php? chapter=9 �https: //en. wikipedia. org/wiki/Prolog