1 / 41

Hoofdstuk 8: Prolog

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).

chibale
Download Presentation

Hoofdstuk 8: Prolog

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Hoofdstuk 8: Prolog

  2. Prolog • Logisch programmeren, Robinson 1965, Kowalski & Colmerauer 1972 • Declaratieve en operationele interpretatie van de logica • Algoritme = logica + controle • Berekende antwoordsubstitutie = resultaat van programma

  3. Prolog: feiten en regels fruit(appel). fruit(peer). fruit(perzik). gezond(X) :- fruit(X).

  4. Prolog: feiten en regels fruit(appel) :- true. fruit(peer) :- true. fruit(perzik) :- true. gezond(X) :- fruit(X).

  5. Prolog: gegevenstypes • Veranderlijken: beginnen met hoofdletter of _ (anonieme veranderlijken) (A, Fruit, _, _test) • Constanten: numerisch en symbolisch (100, 1.3, appel, peer2)

  6. Prolog: gegevenstypes • structuren (vader(jan), succ(0)) • lijsten • [] • [1,appel,3,Test] • [a|X] • .(a,X)

  7. Prolog: terugzoeken (backtracking) fruit(appel). --> ja fruit(kers). --> neen

  8. SLD-Boom :- fruit(appel)

  9. Prolog: terugzoeken (backtracking) fruit(X). X = appel; X = peer; X = perzik; neen

  10. SLD-Boom :- fruit(X) {X/appel} {X/peer} {X/perzik}

  11. Prolog: terugzoeken (backtracking) gezond(X). X = appel; X = peer; X = perzik; neen

  12. SLD-Boom :- gezond(X) :- fruit(X) {X/appel} {X/peer} {X/perzik}

  13. Prolog: de knip (cut) fruit(appel). fruit(peer) :- !. fruit(perzik). ?- fruit(X). X = appel; X = peer; neen

  14. SLD-Boom :- fruit(X) :- ! {X/appel} {X/perzik} {X/peer}

  15. :- fruit(perzik) {X/perzik} Prolog: de knip (cut) ?- fruit(perzik). ja

  16. Een familierelatie vader(jan, piet). vader(jan, mia). moeder(eva, jan). mannelijk(piet). mannelijk(jan).

  17. 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).

  18. 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).

  19. 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).

  20. Lijsten append([],Z,Z). append([X|Xs],Y,[X|Zs]) :- append(Xs,Y,Zs). ?- append([],[1,2,3],[1,2,3]). ja

  21. 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

  22. 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

  23. Compleetheid p(X,Z) :- q(X,Y), p(Y,Z). p(X,X). q(a,b). ?- p(X,b). X = a; X = b; neen

  24. Compleetheid p(X,Z) :- p(Y,Z), q(X,Y). p(X,X). q(a,b). ?- p(X,b). ?????

  25. Compleetheid p(X,X). p(X,Z) :- p(Y,Z), q(X,Y). q(a,b). ?- p(X,b). X = a; X = b; ?????

  26. 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

  27. 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

  28. Declaratieve betekenis van de knip max(X,Y,Y) :- X<=Y, !. max(X,Y,X). ?- max(1,2,1)

  29. 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

  30. Negatie • Probleem als gevolg van het gebruik van Hornbepalingen • Geeft na omzetting naar de Kowalskinormaalvorm • Kan niet uitgedrukt worden!

  31. Voorbeeld Uit mannelijk(adam). vrouwelijk(eva). volgt niet dat waar moet zijn

  32. Negatie: oplossing 1 mannelijk(adam). vrouwelijk(eva). nietmannelijk(eva). nietvrouwelijk(adam). ?- nietvrouwelijk(adam). ja

  33. Prolog: negatie als eindige faling mannelijk(adam). vrouwelijk(eva). not(D) :- call(D), !, fail. not(_). ?- not(vrouwelijk(adam)).

  34. 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.

  35. NEF MP Negatie HB

  36. Negatie als einde faling: declaratieve semantiek Completering (Clark). Vervanging van de enkelvoudige implicaties door dubbele

  37. 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).

  38. Completering (Clark) Nu kan wel geresolveerd worden

  39. Beperkingengebaseerd logisch programmeren • Genereer-en-test niet zeer efficiënt S E N D M O R E --------- M O N E Y

  40. Beperkingengebaseerd logisch programmeren • Met beperkingen: D: 0..9 E: 0..9 E <> D Y = (D+E) mod 10 Y <> D Y <> E

  41. 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

More Related