Logisch Programmeren/Prolog 2006-7 Jori Mur Center for Language and Cognition (CLCG) Rijksuniversiteit Groningen j.mur@rug.nl
1 Overzicht generatiegenoot/2 Lijsten
2 Huiswerkopgave % % truus % / \ % griet trina % / \ % marie klara maart % % hiske sasha %
3 Huiswerkopgave moeder(hiske,marie). moeder(marie,griet). moeder(klara,griet). moeder(griet,truus). moeder(trina,truus). moeder(maart,trina). moeder(sasha,maart).
4 Huiswerkopgave Twee voor de hand liggende base cases: generatiegenoot(x,x). of generatiegenoot(x,y):- moeder(x,z), moeder(y,z).
5 Huiswerkopgave Recursieve clause in beide gevallen: generatiegenoot(x,y):- moeder(x,x1), moeder(y,y1), generatiegenoot(x1,y1).
6 Huiswerkopgave versie 1 generatiegenoot(x,x). generatiegenoot(x,y):- moeder(x,x1), moeder(y,y1), generatiegenoot(x1,y1).
7 Huiswerkopgave versie 1?- generatiegenoot(truus,y). Y = truus?- generatiegenoot(klara,y). Y = klara; Y = marie; Y = marie; Y = klara; Y = klara; Y = maart?- generatiegenoot(x,klara). Y = klara; Y = marie; Y = marie; Y = klara; Y = klara; Y = maart
8 Huiswerkopgave versie 1?- generatiegenoot(x,y). Y = X; X = hiske, Y = hiske; X = hiske, Y = hiske; X = hiske, Y = hiske; X = hiske, Y = sasha; X = enz... (27 total)
9 Huiswerkopgave versie 2 generatiegenoot(x,y):- moeder(x,z), moeder(y,z). generatiegenoot(x,y):- moeder(x,x1), moeder(y,y1), generatiegenoot(x1,y1).
10 Huiswerkopgave versie 2?- generatiegenoot(truus,y). no?- generatiegenoot(klara,y). Y = marie; Y = marie; Y = klara; Y = klara; Y = maart?- generatiegenoot(x,klara). Y = marie; Y = marie; Y = klara; Y = klara; Y = maart
11 Huiswerkopgave versie 2?- generatiegenoot(x,y). X = hiske, Y = hiske; X = hiske, Y = hiske; X = hiske, Y = hiske; X = hiske, Y = sasha; X = enz... (26 total)
12 Huiswerkopgave Alternatieve goal-volgorde: generatiegenoot(x,y):- moeder(x,z), moeder(y,z). generatiegenoot(x,y):- generatiegenoot(x1,y1), moeder(x,x1), moeder(y,y1). Slaagt wanneer verwacht, maar faalt niet. Komt in lus op bijv. generatiegenoot(sasha,marie).
13 Huiswerkopgave Dezelfde oplossing op verschillende manieren bewezen kan je voorkomen door te zorgen dat er geen overlap is tussen de cases: generatiegenoot(x,y):- moeder(x,z), moeder(y,z). generatiegenoot(x,y):- moeder(x,x1), moeder(y,y1), X1 \= Y1, generatiegenoot(x1,y1).
14 Lijsten Vorig week successorfunctie als recursieve datastructuur. s(s(s(s(0)))) s/1 willekeurig lange reeksen, en daarmee willekeurig grote getallen.
15 Lijsten we kunnen ook meerplaatsige recursieve datastrukturen maken. Bijv:./2 heeft een willekeurige term als eerste argument en een term van eigen type als tweede de 0 van s/1 heet hier [].(a,.(b,.(c,[]))) willekeurig lange lijsten van elementen. zeer veel gebruikt in Prolog-praktijk (itt successor-functie).
16 Definitie lijst lijst([]). lijst(.(_head,tail)) :- lijst(tail).
17 Speciale Notatie Lijsten zijn dermate populair in Prolog dat er een speciale notatie voor bestaat: [] voor de lege lijst, [Head Tail] ipv.(head,tail), en [a,b,c] voor de lijst met precies de elementen a,b en c..(a,.(b,.(c,[]))) == [a,b,c] == [a [b,c]] == [a,b [c]] == [a,b,c []] Een goed lees- en schrijfbare notatie, maar voor Prolog is het gewoon./2
18 Definitie in speciale notatie lijst([]). lijst([_head Tail]) :- lijst(tail).
19 Lijsten [a,b,x,d(e,f)] [a,[b,x],d(e,f)] [a,b,c,d,[]] [a,b,c,d []] bevat 4 elementen bevat 3 elementen bevat 5 elementen bevat 4 elementen [a,b,c d] [a,b,c [d]] is niet goed gedefinieerd is wel goed gedefinieerd.
20 Matching en Lijsten Met matching kan je specifieke elementen van een lijst vinden:?- [_,_,X _] = [a,b,c,d,e,f]. X = c?- [_,_,_ X] = [a,b,c,d,e,f]. X = [d,e,f]?- [_,[_,_,_ Y] _] = [a,[b,c,d,e,f]]. Y = [e,f]?- [_,_,_,_] = [a,[b,c,d,e,f]]. no
21 Member member/2 is waar als het eerste argument een element is van het tweede argument: member(x,[x _]). member(x,[_ Y]) :- member(x,y). Member kan gebruikt worden om te testen, maar ook om Prolog om een element van die lijst te vragen.
22 Allemaal 1-en, Deelverzameling % allemaalenen/1?lijstvaneenen allemaalenen([1]). allemaalenen([1 X]):- allemaalenen(x). % deelverzameling/2 +DeelVz +Vz deelverzameling([],y). deelverzameling([x Y],Z):- member(x,z), deelverzameling(y,z).
23 Vertaal vertaling(x,y,v,u) is waar als alle voorkomens van X in V, Y in U zijn, en V en U verder identiek. vertaling(a,e,[b,l,a,b,l,a],u). U = [b,l,e,b,l,e].
24 Vertaal vertaling(_,_,[],[]). vertaling(x,y,[x Vt],[Y Ut]):- vertaling(x,y,vt,ut).
25 Vertaal vertaling(_,_,[],[]). vertaling(x,y,[x Vt],[Y Ut]):- vertaling(x,y,vt,ut). vertaling(x,y,[vh Vt],[Vh Ut]):- X \== Vh, vertaling(x,y,vt,ut).