Hoofdstuk 8 Prolog Prolog q Logisch programmeren Robinson
Hoofdstuk 8: Prolog
Prolog q Logisch programmeren, Robinson 1965, Kowalski & Colmerauer 1972 q Declaratieve en operationele interpretatie van de logica q Algoritme = logica + controle q Berekende antwoordsubstitutie = resultaat van programma
Prolog: feiten en regels fruit(appel). fruit(peer). fruit(perzik). gezond(X) : - fruit(X).
Prolog: feiten en regels fruit(appel) : - true. fruit(peer) : - true. fruit(perzik) : - true. gezond(X) : - fruit(X).
Prolog: gegevenstypes q Veranderlijken: beginnen met hoofdletter of _ (anonieme veranderlijken) (A, Fruit, _, _test) q Constanten: numerisch en symbolisch (100, 1. 3, appel, peer 2)
Prolog: gegevenstypes q structuren (vader(jan), succ(0)) q lijsten 4 [] 4 [1, appel, 3, Test] 4 [a|X] 4. (a, X)
Prolog: terugzoeken (backtracking) fruit(appel). --> ja fruit(kers). --> neen
SLD-Boom : - fruit(appel)
Prolog: terugzoeken (backtracking) fruit(X). X = appel; X = peer; X = perzik; neen
SLD-Boom : - fruit(X) {X/appel} {X/peer} {X/perzik}
Prolog: terugzoeken (backtracking) gezond(X). X = appel; X = peer; X = perzik; neen
SLD-Boom : - gezond(X) : - fruit(X) {X/appel} {X/peer} {X/perzik}
Prolog: de knip (cut) fruit(appel). fruit(peer) : - !. fruit(perzik). ? - fruit(X). X = appel; X = peer; neen
SLD-Boom : - fruit(X) {X/appel} : - ! {X/peer} {X/perzik}
Prolog: de knip (cut) ? - fruit(perzik). ja : - fruit(perzik) {X/perzik}
Een familierelatie vader(jan, piet). vader(jan, mia). moeder(eva, jan). mannelijk(piet). mannelijk(jan).
Een familierelatie vrouwelijk(mia). vrouwelijk(eva). ouder(X, Y) : - vader(X, Y). ouder(X, Y) : - moeder(X, Y). grootvader(X, Z) : - vader(X, Y), moeder(Y, Z). grootvader(X, Z) : - vader(X, Y), vader(Y, Z).
Een familierelatie grootmoeder(X, Z) : moeder(X, Y), moeder(Y, Z). grootmoeder(X, Z) : moeder(X, Y), vader(Y, Z). grootouder(X, Z) : - ouder(X, Y), ouder(Y, Z). voorouder(X, Y) : - ouder(X, Y). voorouder(X, Y) : - ouder(X, Z), voorouder(Z, Y).
Een familierelatie kind(X, Y) : - ouder(Y, X). kleinkind(X, Y) : grootouder(Y, X). brus(X, Y) : - ouder(Z, X), ouder(Z, Y), X<>Y. broer(X, Y) : - brus(X, Y), mannelijk(Y). zus(X, Y) : - brus(X, Y), vrouwelijk(Y).
Lijsten append([], Z, Z). append([X|Xs], Y, [X|Zs]) : append(Xs, Y, Zs). ? - append([], [1, 2, 3]). ja
Lijsten ? -append([a, b], [1, 2], Z). Z = [a, b, 1, 2]; neen ? - append(X, [1, 2], [a, b, 1, 2]). X = [a, b]; neen
Lijsten ? -append(X, Y, [a, b, Z, 2]). X = [], Y = [a, b, Z, 2]; X = [a], Y = [b, Z, 2]; X = [a, b], Y = [Z, 2]; X = [a, b, Z], Y = [2]; X = [a, b, Z, 2], Y = []; neen
Compleetheid p(X, Z) : - q(X, Y), p(Y, Z). p(X, X). q(a, b). ? - p(X, b). X = a; X = b; neen
Compleetheid p(X, Z) : - p(Y, Z), q(X, Y). p(X, X). q(a, b). ? - p(X, b). ? ? ? …
Compleetheid p(X, X). p(X, Z) : - p(Y, Z), q(X, Y). q(a, b). ? - p(X, b). X = a; X = b; ? ? ? …
Probleemgeval p(a, b). p(c, b). p(X, Z) : - p(X, Y), p(Y, Z). p(X, Y) : - p(Y, X). a c b : - p(a, c) : - p(a, Y), p(Y, c) : - p(b, Y), p(Y, c) : - p(p, Y’), p(Y’, Y), p(Y, c). . .
Probleemgeval q(a, b). q(c, b). p(X, Y) : p(X, Z) : P(X, Z) : : : - q(X, Y). q(Y, X). q(X, Y), p(Y, Z). q(Y, X), p(Y, Z). p(a, c) p(a, Y), p(Y, c) p(b, c) q(c, b) true
Declaratieve betekenis van de knip max(X, Y, Y) : - X<=Y, !. max(X, Y, X). ? - max(1, 2, 1)
Declaratieve betekenis van de knip q Goede oplossingen: max(X, Y, Y) : - X<=Y. max(X, Y, X) : - Y<X. max(X, Y, Z) : - X<=Y, !, Z=Y. max(X, Y, X). Knip is vergelijkbaar met goto
Negatie q Probleem als gevolg van het gebruik van Hornbepalingen q Geeft na omzetting naar de Kowalskinormaalvorm q Kan niet uitgedrukt worden!
Voorbeeld Uit mannelijk(adam). vrouwelijk(eva). volgt niet dat waar moet zijn
Negatie: oplossing 1 mannelijk(adam). vrouwelijk(eva). nietmannelijk(eva). nietvrouwelijk(adam). ? - nietvrouwelijk(adam). ja
Prolog: negatie als eindige faling mannelijk(adam). vrouwelijk(eva). not(D) : - call(D), !, fail. not(_). ? - not(vrouwelijk(adam)).
Negatie: drie modellen 1. De gesloten-wereldveronderstelling. Alles wat geen logisch gevolg is, is vals (BPMP) 2. Negatie als eindige faling. Alles wat niet in eindige tijd kan weerlegd worden, is vals ({A: A bezit een eindige falende SLD-boom}) Dit is een deelverzameling van 1.
Negatie HB NEF MP
Negatie als einde faling: declaratieve semantiek Completering (Clark). Vervanging van de enkelvoudige implicaties door dubbele
Completering (Clark) mannelijk(X) : identisch(X, adam) : mannelijk(X). vrouwelijk(X) : identisch(X, eva) : vrouwelijk(X). identisch(X, X).
Completering (Clark) Nu kan geresolveerd worden wel
Beperkingengebaseerd logisch programmeren q Genereer-en-test niet zeer efficiënt S E N D M O R E ----M O N E Y
Beperkingengebaseerd logisch programmeren q Met beperkingen: D: 0. . 9 E <> D Y = (D+E) mod 10 Y <> D Y <> E
Deterministische logische programmeertalen q Kop, wachter, lichaam min(X, Y, Z) : - X <= Y | Z = X. min(X, Y, Z) : - X > Y | Z = Y. q Slechts 1 oplossing per oproep q Geen bindingen mogelijk in de kop of wachter q Geen terugzoeken, geen knip q Verwant met functionele programmeertalen
- Slides: 41