1 / 26

Prolog, ons18/9

Prolog, ons18/9. Rebecca Jonson. Repetition från mån. Vikten av regel-, klausulordning hos rekursiva predikat. (Kursbok 2.6, BBS3.2) Basfallsregeln först, sedan rekursionregeln (reglerna). lika_långa([],[]). lika_långa([_|Xs],[_|Ys]):- Rätt!! lika_långa(Xs,Ys).

gotzon
Download Presentation

Prolog, ons18/9

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. Prolog, ons18/9 Rebecca Jonson

  2. Repetition från mån • Vikten av regel-, klausulordning hos rekursiva predikat. (Kursbok 2.6, BBS3.2) • Basfallsregeln först, sedan rekursionregeln (reglerna). lika_långa([],[]). lika_långa([_|Xs],[_|Ys]):- Rätt!! lika_långa(Xs,Ys). lika_långa2([_|Xs],[_|Ys]):- lika_långa2(Xs,Ys). Fel!! Loopar om vi lika_långa2([],[]). frågar lika_långa(X,Y).

  3. Repetition forts. • Mappning: applikation av ett predikat på varje element i en lista för att få en annan lista (en översatt lista). translist([], []). translist([SveOrd|SveMening], [EngOrd|EngMening]) :- trans(SveOrd, EngOrd), translist(SveMening,EngMening). För varje ord i listan översätter vi det ordet till dess engelska motsvarighet genom att använda predikatet trans/2. Genom rekursion får vi slutligen en lista med alla orden i den svenska listan översätta till engelska.

  4. Rep. Forts. • Mappning av en term till flera termer ?- trans2("bilen", X). X = ["the","car"] translist2([], []). translist2([Ord|Mening], Resultat) :- trans2(Ord, Resultat1), translist2(Mening, Resultat2), append(Resultat1, Resultat2, Resultat). ?- translist2(["bilen","är","i","huset"], Engelska). Engelska = ["the","car","is","in","the","house"]

  5. Rep. forts • Filtrering: Ta en lista med element och skapa en ny där bara vissa av elementen är med T.ex En lista med tal som vi filtrerar så att den nya listan bara innehåller positiva tal. ?- behåll(3). Yes ?- kastas(-3). Yes ?- behåll(0). Yes

  6. Rep. Forts. positiva([], []). positiva([Pos|Resten], [Pos|Positiva]) :- behåll(Pos), positiva(Resten, Positiva). positiva([Neg|Resten], Positiva) :- kasta(Neg), positiva(Resten, Positiva). ?- positiva([-1,2,-3,4], Lista). Lista = [2,4]

  7. Dagens föreläsning • Hur svarar Prolog på frågor • Backtracking • Konjunktion ” , ” • Disjunktion ” ; ” • Negation ” \+ ” • Delvis mappning med negation • Filtrering med negation • Olikhet ” \= ”

  8. Deklarativ vs. Procedurell syn P :- Q , R. • Deklarativ syn: • P är sann om Q och R är sanna. • Av Q och R följer P • Procedurell syn: • För att lösa problemet P, lös först delproblemet Q och sedan delproblemet R • För att uppfylla P, uppfyll först Q och sen R

  9. Hur svarar Prolog på frågor? För att svara på en fråga, försöker Prolog uppfylla en lista med mål, dvs bevisa att målen är sanna eller logiskt följer från de fakta och regler som finns i programmet. Om det finns variabler måste Prolog också hitta objekt istället för dessa som gör att målet/n uppfylls. Dessa instantieringar ges då också som svar. Om Prolog inte kan bevisa att de finns någon möjlig instantiering som gör att målen följer logiskt av programmet så blir svaret nej (no). För att bevisa att ett mål är sant söker Prolog från vänster till höger, uppifrån och ned efter fakta och regler som kan vara en lösning, eller dellösning på målen.

  10. Exempel just_ate(mosquito,blood(john)). just_ate(frog,mosquito). just_ate(stork,frog). is_digesting(X,Y):- just_ate(X,Y). is_digesting(X,Y):- just_ate(X,Z), is_digesting(Z,Y). ?- is_digesting(stork,mosquito).

  11. Backtracking • När Prolog försöker lösa en fråga genom att söka efter möjliga lösningar till frågan håller Prolog reda på sina vägval (dvs situationer där det finns flera alternativ). När en vald väg visar sig leda till ett misslyckande kan systemet hoppa tillbaka till sista vägvalet och pröva ett annat alternativ. Detta kallas backtracking. Backtracking används också om användaren ber om ett alternativ (;).

  12. Konjunktion ” , ” En konjunktion betyder ''både ... och ...'' och skrivs med kommatecken. Frågan tjosan, hoppsan? betyder ungefär ''lyckas både tjosan och hoppsan?''. OBS! först prövas det första målet, och endast om den lyckas så prövas den andra. ?- member(X, "abcd"), member(X, "fedc"). X = c ; X = d ; no (more solutions) Ovanstående kan alltså utläsas ungefär ''vilket X finns både i listan [a,b,c,d] och i listan [f,e,d,c]?''. Om man ställer målen i en annan ordning får man svaren i en annan ordning: ?- member(X, "fedc"), member(X, "abcd"). X = d ; X = c ; no (more solutions)

  13. Disjunktion ” ; ” En disjunktion betyder ''antingen ... eller ...'', eller om man så vill ''någon av ... eller ...'', och skrivs med semikolon. Alltså, målet tjosan;hoppsan? betyder ungefär ''lyckas antingen tjosan eller hoppsan?'', eller ''lyckas någon av tjosan eller hoppsan?''. Även här har Prolog en bestämd ordning i vilken den söker efter svar - först prövas det första målet, och om den misslyckas så prövas den andra istället. Observera att om båda målen är sanna så lyckas Prolog, vilket betyder att man kanske ska förtydliga till ''antingen ... eller ... (eller båda)''.

  14. Disjunktion ?- member(X, "abcd") ; member(X, "fedc"). X = a ; X = b ; X = c ; X = d ; X = f ; X = e ; X = d ; X = c ; no (more solutions) Ovanstående kan alltså utläsas ungefär ''vilket X finns antingen i listan [a,b,c,d] eller i listan [f,e,d,c] (eller i båda listorna)?''.

  15. Semikolon är inte nödvändig i Prolog - istället för att skriva en disjunktion i en regels högersida, som nedan så kan man skriva flera klausuler  längd_högst3(Lista) :- ( Lista = [] ; Lista = [_] ; Lista = [_,_] ; Lista = [_,_,_] ). Längd_högst3/1 kan således skrivas utan semikolon med fyra olika klausuler och disjunktion uppkommer genom att Prolog väljer regel (översta först): längd_högst3(Lista) :- Lista = []. längd_högst3(Lista) :- Lista = [_]. längd_högst3(Lista) :- Lista = [_,_]. längd_högst3(Lista) :- Lista = [_,_,_]. Disjunktion

  16. Disjunktion och den kan i sin tur skrivas ännu enklare som: längd_högst3([]). längd_högst3([_]). längd_högst3([_,_]). längd_högst3([_,_,_]). • Kommatecken binder hårdare än semikolon p,q;r,s? betyder samma sak som (p,q);(r,s)? och inte p,(q;r),s?

  17. Negation intelligent(newton). intelligent(hawkings). ?- intelligent(einstein). no Betyder inte att det är falskt utan att det inte går att bevisa att det är sant. Ibland vill vi inte veta huruvida något är sant utan om det falskt, d v s vi vill negera frågor

  18. Negation ” \+ ” • Negation i Prolog betyder ungefär ''…misslyckas'' och skrivs med \+ (i kursboken skrivs negation not, men det är inte standardprolog). • Alltså betyder frågan \+ gillar(måns,kajsa)? ungefär ''misslyckas gillar(måns,kajsa)?''. • Observera att detta inte är negation i ordets logiska bemärkelse, utan det är nära sammanknippat med hur Prolog letar efter lösningar på frågor. • Negation i Prolog fungerar dessutom inte särskilt bra med fria variabler

  19. Definitionen av man/1 fungerar jättebra så länge man använder det på existerande personer. ?- man(leif). yes ?- man(maud). no Däremot fungerar det inte särskilt bra på icke-personer - eftersom en icke-person inte är en kvinna så säger predikatet att den är en man istället. ?- man(sverige). yes person(göran). person(maud). person(gudrun). person(leif). kvinna(maud). kvinna(gudrun). man(X) :- \+ kvinna(X). Negation

  20. Negation • Dessutom blir det problem med fria variabler. Att fråga man(X)? är samma sak som att fråga ''misslyckas kvinna(X)?'', vilket skulle kunna utläsas ''kommer frågan 'finns det någon kvinna?' att misslyckas''? Och eftersom det finns någon kvinna, så kommer kvinna(X)? att lyckas, och därför kommer man(X)? att misslyckas. ?- man(X). no • Layout för negation: Operatorn \+ binder hårdare än konjunktion (och disjunktion). Därför betyder frågan \+ p,q? samma sak som (\+ p),q?. Menar man \+ (p,q)? så får man helt enkelt skriva på det sättet.

  21. Delvis mappning med negation Ibland vill man mappa ett predikat som bara är definierat för en del av de möjliga indata. Resten av indata kan man då t.ex. vilja behålla som de är. Predikatet trans/2 är t.ex. bara definierat för en begränsad ordlista så vi vill att vårt predikat translist/2 översätter de ord som är definierade och behåller de andra som de är.

  22. Forts. Mappning translist3([], []). translist3([SveOrd|SveMening], [EngOrd|EngMening]) :- trans(SveOrd, EngOrd), translist3(SveMening, EngMening). translist3([Ord|SveMening], [Ord|EngMening]) :- \+ trans(Ord, _), translist3(SveMening, EngMening). Det andra rekursionsfallet ska appliceras då trans/2 misslyckas, och i det fallet ska huvudet vara oförändrat, men svansen ska översättas. För att ta reda på om en fråga misslyckas finns specialpredikatet \+ som skrivs före frågan. Första delmålet i kroppen kan utsägas ungefär ''det finns inte någon översättning av ordet Ord''. ?- translist3(["3","bilar"], Engelska). Engelska = ["3","cars"]

  23. Filtrering med negation • Ofta har man bara ett predikat, t.ex. behåll/1 (istället för två som vi hade i måndags, behåll/1 och kasta/1) som man vill använda för att filtrera bort element från en lista. Om predikatet lyckas ska elementet behållas, om det misslyckas ska elementet kastas bort. • Det här löser vi genom att använda oss av negation för att omdefiniera vårt predikat positiva/2. Att inte behålla är ju detsamma som att kasta

  24. Forts. filtrering positiva([], []). positiva([Pos|Resten], [Pos|Positiva]) :- behåll(Pos), positiva(Resten, Positiva). positiva([Neg|Resten], Positiva) :- \+ behåll(Neg), positiva(Resten, Positiva). Ett alternativ, som är ekvivalent, är att vi definierar predikatet kasta/1 i termer av predikatet behåll/1: kasta(X) :- \+ behåll(X). Då kan vi behålla måndagens predikat positiva/2

  25. Olikhet ” \= ” Olikhet kan antingen skrivas genom att använda negation (om två objekt inte är lika så är de olika) eller så kan man använda det förkortade skrivsättet \= syskon(A, B) :- förälder(Förälder, A), förälder(Förälder, B), \+ (A = B). Den sista delfrågan säger att A och B måste vara olika personer. Den kan också skrivas \+ A=B eller förkortat A \= B. Observera att det är mycket viktigt att olikhetstestet kommer efter att man har hittat den gemensamma föräldern. Annars kommer frågan syskon(haakon,Y)? att misslyckas. Varför?

  26. Thank you!

More Related