410 likes | 590 Vues
Hoofdstuk 8: Prolog. Prolog. Logisch programmeren, Robinson 1965, Kowalski & Colmerauer 1972 Declaratieve en operationele interpretatie van de logica. Algoritme = logica + controle Berekende antwoordsubstitutie = resultaat van programma. Prolog: feiten en regels. fruit(appel).
E N D
Hoofdstuk 8: Prolog
Prolog • Logisch programmeren, Robinson 1965, Kowalski & Colmerauer 1972 • Declaratieve en operationele interpretatie van de logica • Algoritme = logica + controle • 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 • Veranderlijken: beginnen met hoofdletter of _ (anonieme veranderlijken) (A, Fruit, _, _test) • Constanten: numerisch en symbolisch (100, 1.3, appel, peer2)
Prolog: gegevenstypes • structuren (vader(jan), succ(0)) • lijsten • [] • [1,appel,3,Test] • [a|X] • .(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/perzik} {X/peer}
:- fruit(perzik) {X/perzik} Prolog: de knip (cut) ?- fruit(perzik). ja
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],[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). :- p(a,c) :- p(a,Y),p(Y,c) :- p(b,c) :- p(b,Y),p(Y,c) :- p(p,Y’),p(Y’,Y),p(Y,c) ... a b c
Probleemgeval q(a,b). q(c,b). p(X,Y) :- q(X,Y). p(X,Y) :- q(Y,X). p(X,Z) :- q(X,Y), p(Y,Z). P(X,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 • 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 • Probleem als gevolg van het gebruik van Hornbepalingen • Geeft na omzetting naar de Kowalskinormaalvorm • 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 (BP\MP) 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.
NEF MP Negatie HB
Negatie als einde faling: declaratieve semantiek Completering (Clark). Vervanging van de enkelvoudige implicaties door dubbele
Completering (Clark) mannelijk(X) :- identisch(X,adam). identisch(X,adam) :- mannelijk(X). vrouwelijk(X) :- identisch(X,eva). identisch(X,eva) :- vrouwelijk(X). identisch(X,X).
Completering (Clark) Nu kan wel geresolveerd worden
Beperkingengebaseerd logisch programmeren • Genereer-en-test niet zeer efficiënt S E N D M O R E --------- M O N E Y
Beperkingengebaseerd logisch programmeren • Met beperkingen: D: 0..9 E: 0..9 E <> D Y = (D+E) mod 10 Y <> D Y <> E
Deterministische logische programmeertalen • Kop, wachter, lichaam min(X,Y,Z) :- X <= Y | Z = X. min(X,Y,Z) :- X > Y | Z = Y. • Slechts 1 oplossing per oproep • Geen bindingen mogelijk in de kop of wachter • Geen terugzoeken, geen knip • Verwant met functionele programmeertalen