PROLOG PROGRAMOZÁSI NYELV
LOGIKAI PROGRAMOZÁS, PROLOG Logikai programozás alapgondolata: program megírása a logika nyelvén program végrehajtása tételbizonyítási algoritmussal Hagyományos programnyelvek/ logikai programozás Prolog: Programming in Logic 70-es évek, Európa logika, predikátumkalkulus, Horn klóz, rezolúció, lineáris input stratégia keresés, célvezérelt, mélységi keresés/visszalépéses keresés probléma redukció (és-vagy gráf) – összefüggések a részfák megoldásai között! – illesztés
PROLOG PROGRAM ELEMEI alap adatstruktúrák termek konstansok (atomok, ~ objektumkonstansok) a, a17, 127 változók (~ objektumváltozók) X, X23 funkcionális termek (~ függvények) a(X, Y), a(a(1), a(2)), a(d(X, Z), u) funktor + argumentumok (termek) A(X, Y) listák [1, 2, 3], [X| Y], [a(1), a(3)], [[1], [2, 3, 4]], [ ] fej (head), farok (tail)
PROLOG PROGRAM ELEMEI Horn klózok (formulák) A B1 B2 . . . Bn A, Bi: predikátumok következmény (fej, head) feltétel (törzs, body) következmény részben egy predikátum feltétel részben predikátumok "és" kapcsolata nem lehet tagadás A : B1, B2, . . . , Bn. feltételes állítás A. tényállítás B1, B2, . . . , Bn. célállítás
Elsőrendű logika jelöléseivel: PROLOG PROGRAM ELEMEI Példa: Elsőrendű logika jelöléseivel: x l eleme(x, [x|l]) x y l eleme(x, l) eleme(x, [y|l]) Prolog jelöléssel: eleme(X, [X|L]). eleme(X, [Y|L]) : eleme(X, L). Prolog program impliciten összekapcsolt mondatok (klózok) minden változóhoz impliciten univerzális kvantor különböző klózok, különböző változók nincs globális változó (értékek illesztéssel)
PÉLDA: ÚTKERESÉS IRÁNYÍTOTT GRÁFON él(a, b). tények él(b, d). él(d, f). . . . (1) út(X, Y) : él(X, Y). szabályok (2) út(X, Y) : klózok között vagy él(X, Z), klóz törzs predikátumai között és út(Z, Y). Rekurzív szabály: fej predikátumszimbóluma a törzs predikátumszimbólumai között problémamegoldáshoz szükséges: triviális eset, amelyre a megoldás létezik (1) általános eset redukálása a triviális esetre (2) tail rekurzió – legkevesebb stack
PÉLDA: ÚTKERESÉS IRÁNYÍTOTT GRÁFON él(a, b). él(b, d). él(d, f). . . . (1) út(X, Y) : él(X, Y). (2) út(X, Y) : él(X, Z), út(Z, Y). ? - út(a, e) út/1 {X=a, Y=e} él(a, e) út/2 {X=a, Y=e} él(a, b) {Z=b} út(b, e) út/1 {X=b, Y=e} él(b, e) út/2 {X=b, Y=e} él(b, d) {Z=d} út(d, e) út/1 {X=d, Y=e} él(d, e) út/2 {X=d, Y=e} él(d, f) {Z=f} út(f, e) …. él(g, e) él(g, Z) KÖTÉSI LISTA STACK él(d, c) {Z=c} …. VISSZALÉPÉS
KLÓZOK KEZELÉSE visszalépés (retry) sikertelen kilépés (fail) sikeres kilépés (success) belépés (enter)
KÖVETKEZTETÉS PROLOGBAN mélységi keresés (nem teljes) célállítás igazolása részcélok igazolásával (probléma redukció) visszalépéses keresés (időben meghatározott visszalépés) klózok feltételrészének vizsgálata: balról jobbra klózok alkalmazása: leírási sorrend szerint
ILLESZTÉS (UNIFIKÁCIÓ) Nincs kitűntetett input/output – stack: illesztési lista két konstans illeszthető, ha azonosak a a a a1 a 17 változó bármivel illeszthető X 18 a Y Z a(13) X Y két funkcionális term illeszthető, ha funktoruk azonos argumentumszámuk azonos argumentumaik illeszthetők a(17) a(18) a(X) a(7) a(S, 3) a(Z) a(A, B) a(3, 4) a(A, A) a(t, u) a(X) a(a(a(7)))
ILLESZTÉS (UNIFIKÁCIÓ) X f(X) occur check kihagyva az unifikációból nem helyes mintaillesztés szerepe: kiválasztódik az adott eljáráshívásra alkalmazható eljárásdefiníció paraméterátadás stack: kötési lista döntési helyek
A PROLOGRÓL … összes megoldás előállítása kör a gráfban célállítás, fail. út(a, X), fail. X?? út(a, X), write("Út vezet a-ból ", X, "-be.\n"), fail. kör a gráfban végtelen út kiküszöbölése: már vizsgált pontok megőrzése út(X, Y, P) : él(X, Y), not(eleme(Y, P)). út(X, Y, P) : él(X, Z), not(eleme(Z, P), út(Z, Y, [Z|P]).
A PROLOGRÓL … legjobb megoldás open lista ?? megoldások gyűjtése ?? – globális változó nincs – dinamikus adatbáziskezelő predikátumok értékelés open lista ?? egy lehetséges válasz + választási (visszatérési) pontok mindig egyetlen megoldási úttal foglalkozik (megfelelő helyettesítésekkel) visszalépésnél: bizonyos kötések megszűntetése
beépített predikátumok A PROLOGRÓL … beépített predikátumok aritmetikai predikátumok +, , *, , abs, sin, . . . = (is) összehasonlítás X = 3+4, Y = X*15, X = X+1, 7 = X /2 ki- és bevitel write, read, . . . kifejezéskezelő predikátumok concat, fronttoken, str_int, . . . dinamikus adatbáziskezelő predikátumok assert, retract, . . . vezérlési predikátumok cut - ! fail
A PROLOGRÓL … cut - ! (/) mindig igaz predikátum backtrack során a cut-ot tartalmazó részcél hamis lesz „felégeti a hidat maga mögött” Ae, A, Au részcélok A :- B1, B2, B3, … A :- … cut nélküli visszalépés Ae, A, Au részcélok A :- B1, B2, !, B3, … A :- … visszalépés korlátozása 1 1 FAIL FAIL 2
PÉLDA: ÚTKERESÉS IRÁNYÍTOTT GRÁFON él(a, b). él(b, d). él(d, f). . . . út(X, Y) : él(X, Y). út(X, Y) : él(X, Z), út(Z, Y). ?- út(a,X). ! nélkül – összes út a-ból (10 megoldás) ! használatával: első megtalált út (1 megoldás) – (a, b) 1 él hosszú utak a-ból (2 megoldás) – (a, b), (a, c) + első 2 él hosszú út a-ból (3 megoldás) – + (a, d) + első ágon levő utak + ág csomópontjaiból 1 élhosszal tovább – (7 megoldás) - + (a, f), (a, g), (a, c), (a, c) összes út (10 megoldás)
program végrehajtásának irányítása A PROLOGRÓL … tagadás tagadás, mint fail operátor not P nincs elég információ P bizonyításához meta-programok program végrehajtásának irányítása klózok sorrendje – irányítja az elágazásokat klózokon belüli predikátumok sorrendje – meghatározza a részcélok sorrendjét kérdésben levő klózok sorrendje – meghatározza a részcélok sorrendjét visszalépésre kényszerítés (fail) visszalépés korlátozása (cut, !) – fa egy részének letiltása
program módosítása futás közben A PROLOGRÓL … program módosítása futás közben adat/program: klóz retract(klóz/tény), assert(klóz/tény), . . . programstruktúrák metaprogramok not(A) : A, !, fail. not(A). if(A, B, C) : A, !, B. if(A, B, C) : C. then(A, B) : A, B. else(A, B) : not(A), B. párhuzamos prologok klózok kiosztása a processzorok között CSProlog
A PROLOGRÓL … előnyök: hátrányok: jól-olvashatóság („beszédes” predikátum- és változónevek) könnyű módosíthatóság a problémát nem nekünk kell megoldani (beépített tételbizonyító algoritmus) hátrányok: nem minden probléma fejezhető ki jól logikai formalizmussal (pl. numerikus számítások) hiányos ismeretek kezelésére nem képes (monoton logikát használ)
EGY DEKLARATÍV PROLOG PROGRAM Három zenész problémája egy nemzetközi zenekar 3 zenésze szólót játszik egy darabban, mindenki egyszer a zongorista játszik először John szaxofonon játszik az ausztrál előtt Márk – aki az USA-ból jött – a hegedűs előtt játszik egy szólista Japánból jött egy szólistát Sam-nek hívnak Ki honnan jött, milyen hangszeren és milyen sorrendben játszik?
EGY DEKLARATÍV PROLOG PROGRAM 1. 2. 3. Ausztrália USA Japán zongora szaxofon hegedű John - + Márk Sam
EGY DEKLARATÍV PROLOG PROGRAM S a probléma megoldása ha S három szólistából áll és S első tagja X zongorán játszik és S-nek van két rendezett tagja Y, Z és Y neve John és Y szaxofonon játszik és Z Ausztráliából jött és S-nek van két rendezett tagja Y1, Z1 és Y1 neve Márk és Y1 az USA-ból jött és Z1 hegedűn játszik és S egy tagja U Japánból jött és S egy tagjának V neve Sam. megoldás(S) if szólisták(S), első(X,S), játszik(X,zongora), rendezett_tag (Y,Z,S), név(Y,john), játszik(Y,szaxofon), ország(Z,ausztrália), rendezett_tag (Y1,Z1,S), név(Y1,márk), ország(Y1,usa), játszik(Z1,hegedű), tag(U,S), ország(U,japán), tag(V,S), név(V,sam).
EGY DEKLARATÍV PROLOG PROGRAM megoldás(S) if szólisták(S), első(X,S), játszik(X,zongora), rendezett_tag (Y,Z,S), név(Y,john), játszik(Y,szaxofon), ország(Z,ausztrália), rendezett_tag (Y1,Z1,S), név(Y1,márk), ország(Y1,usa), játszik(Z1,hegedű), tag(U,S), ország(U,japán), tag(V,S), név(V,sam). szólisták(sz(_,_,_)). első(X,sz(X,_,_)). rendezett_tag(X,Y,sz(X,Y,_)). rendezett_tag(X,Y,sz(_,X,Y)). rendezett_tag(X,Y,sz(X,_,Y)). tag(X,sz(X,_,_)). tag(X,sz(_,X,_)). tag(X,sz(_,_,X)). név(szólista(N,_,_),N). játszik(szólista(_,H,_),H). ország(szólista(_,_,O),O).