© Patrick Blackburn, Johan Bos & Kristina Striegnitz FL 7: Cut och negation (kap. 10) Teori –Förklarar hur man kontrollerar Prologs backtracking-beteende mha predikatet cut –Introducerar negation –Förklarar hur cut kan “paketeras” i en mera strukturerad form, dvs negation as failure
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Cut Backtracking är en typisk egenskap hos Prolog Backtracking kan dock leda till ineffektivitet: –Prolog kan slösa tid på att undersöka alternativ som inte leder någon vart –Lite kontroll skulle välkomnas Predikatet cut !/0 erbjuder ett sätt att kontrollera backtracking
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel på cut Cut är ett Prolog-predikat, så vi kan sätta det i regelkroppen: – Exempel: p(X) :- b(X), c(X), !, d(X), e(X). Cut är ett mål som alltid lyckas Förbinder Prolog till de val som gjordes sedan “föräldramålet” anropades
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att förklara cut För att förklara cut måste vi –Ta en titt på cut-fri Prolog-kod och se vad den gör när det gäller backtracking –Tillägga cuts till denna Prolog-kod –Studera samma kodbit med tillagda cuts och se hur dessa cuts inverkar på backtracking
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X) :- a(X). p(X) :- b(X), c(X), d(X), e(X). p(X) :- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). ?- a(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1 ?- p(X). ?- a(X). X=1
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; ?- p(X). ?- a(X).?- b(X),c(X),d(X),e(X). X=1
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; ?- p(X). ?- a(X).?- b(X),c(X),d(X),e(X). X=1
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; ?- p(X). ?- a(X). ?- c(1),d(1),e(1). ?- b(X),c(X),d(X),e(X). X=1
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; ?- p(X). ?- a(X). ?- d(1), e(1). ?- c(1),d(1),e(1). ?- b(X),c(X),d(X),e(X). X=1
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; ?- p(X). ?- a(X). ?- d(1), e(1). ?- c(1),d(1),e(1). ?- b(X),c(X),d(X),e(X). X=1 †
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; ?- p(X). ?- a(X). ?- d(1), e(1). ?- c(1),d(1),e(1). ?- b(X),c(X),d(X),e(X). X=1 X=2 †
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; ?- p(X). ?- a(X). ?- d(1), e(1). ?- c(1),d(1),e(1).?- c(2),d(2),e(2). ?- b(X),c(X),d(X),e(X). X=1 X=2 †
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; ?- p(X). ?- a(X). ?- d(2), e(2).?- d(1), e(1). ?- c(1),d(1),e(1).?- c(2),d(2),e(2). ?- b(X),c(X),d(X),e(X). X=1 X=2 †
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; ?- p(X). ?- a(X). ?- d(2), e(2). ?- e(2). ?- d(1), e(1). ?- c(1),d(1),e(1).?- c(2),d(2),e(2). ?- b(X),c(X),d(X),e(X). X=1 X=2 †
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; X=2 ?- p(X). ?- a(X). ?- d(2), e(2). ?- e(2). ?- d(1), e(1). ?- c(1),d(1),e(1).?- c(2),d(2),e(2). ?- b(X),c(X),d(X),e(X). X=1 X=2 †
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; X=2; ?- p(X). ?- a(X).?- f(X). ?- d(2), e(2). ?- e(2). ?- d(1), e(1). ?- c(1),d(1),e(1).?- c(2),d(2),e(2). ?- b(X),c(X),d(X),e(X). X=1 X=2 †
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; X=2; X=3 ?- p(X). ?- a(X).?- f(X). ?- d(2), e(2). ?- e(2). ?- d(1), e(1). ?- c(1),d(1),e(1).?- c(2),d(2),e(2). ?- b(X),c(X),d(X),e(X). X=1 X=2 † X=3
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: cut-fri kod p(X):- a(X). p(X):- b(X), c(X), d(X), e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X). X=1; X=2; X=3; no ?- p(X). ?- a(X).?- f(X). ?- d(2), e(2). ?- e(2). ?- d(1), e(1). ?- c(1),d(1),e(1).?- c(2),d(2),e(2). ?- b(X),c(X),d(X),e(X). X=1 X=2 † X=3
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att tillägga cut Anta att vi tillägger ett cut i den andra regeln, efter det andra delmålet : Om vi nu ställer samma fråga får vi följande respons: p(X):- b(X), c(X), !, d(X), e(X). ?- p(X). X=1; no
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: kod med cut p(X):- a(X). p(X):- b(X),c(X),!,d(X),e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: kod med cut p(X):- a(X). p(X):- b(X),c(X),!,d(X),e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- p(X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: kod med cut ?- p(X). p(X):- a(X). p(X):- b(X),c(X),!,d(X),e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: kod med cut ?- p(X). X=1 ?- p(X). ?- a(X). X=1 p(X):- a(X). p(X):- b(X),c(X),!,d(X),e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: kod med cut ?- p(X). X=1; ?- p(X). ?- a(X).?- b(X),c(X),!,d(X),e(X). X=1 p(X):- a(X). p(X):- b(X),c(X),!,d(X),e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: kod med cut ?- p(X). X=1; ?- p(X). ?- a(X).?- b(X),c(X),!,d(X),e(X). X=1 p(X):- a(X). p(X):- b(X),c(X),!,d(X),e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: kod med cut ?- p(X). X=1; ?- p(X). ?- a(X).?- b(X),c(X),!,d(X),e(X). X=1 p(X):- a(X). p(X):- b(X),c(X),!,d(X),e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- c(1),!,d(1),e(1). X=1
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: kod med cut ?- p(X). X=1; ?- p(X). ?- a(X).?- b(X),c(X),!,d(X),e(X). X=1 p(X):- a(X). p(X):- b(X),c(X),!,d(X),e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- c(1), !, d(1), e(1). X=1 ?- !, d(1), e(1).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: kod med cut ?- p(X). X=1; ?- p(X). ?- a(X).?- b(X),c(X),!,d(X),e(X). X=1 p(X):- a(X). p(X):- b(X),c(X),!,d(X),e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- c(1), !, d(1), e(1). X=1 ?- !, d(1), e(1). ?- d(1), e(1). X X
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel: kod med cut ?- p(X). X=1; no ?- p(X). ?- a(X).?- b(X),c(X),!,d(X),e(X). X=1 p(X):- a(X). p(X):- b(X),c(X),!,d(X),e(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- c(1), !, d(1), e(1). X=1 ?- !, d(1), e(1). ?- d(1), e(1). †
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vad cut gör... Cut-predikatet förbinder oss till de val som gjordes sedan föräldramålet unifierades med vänstra sidan av regeln som innehåller cut T. ex. i en regel av formen q:- p 1, …, p n, !, r 1, …, r n. när vi når cut-operatorn förbinder den oss till: –den här specifika regeln för q –till de val som har gjorts i p 1, …, p n –men INTE till de val som görs i r 1, …, r n
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vad cut gör... Du kan tänka dig cut som en betongvägg q:- p 1, …, p n, !, r 1, …, r n. Vi går inte tillbaka bakom väggen och försöker bevisa q på nytt. Vi försöker inte heller göra om bindningarna i p 1, …, p n Däremot kan vi nog binda om variablerna i r 1, …, r n och söka alla bevisen för dessa delmål.
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vad cut gör... p(X):- b(X),c(X),!,d(X),e(X). % Obs!! Om denna regel är den % första får vi inga svar! p(X):- a(X). % Cut ser till att vi inte prövar de andra reglerna. p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). Kolla alltså noga var du använder cut! Cut sist i en regel => regeln måste ha lyckats innan cut tar effekt.
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Testa: kod med cut ~ soini$ swipl -s cuttest.pl ?- p(X). false. ?- p(X). ?- b(X),c(X),!,d(X),e(X). p(X):- b(X),c(X),!,d(X),e(X). p(X):- a(X). p(X):- f(X). a(1). b(1). b(2). c(1). c(2). d(2). e(2). f(3). ?- c(1), !, d(1), e(1). X=1 ?- !, d(1), e(1). ?- d(1), e(1). †
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att använda cut Betrakta predikatet max/3 som lyckas ifall dess tredje argument är det större av de två första max(X,Y,Y):- X =< Y. max(X,Y,X):- X>Y.
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att använda cut Betrakta predikatet max/3 som lyckas ifall dess tredje argument är det större av de två första max(X,Y,Y):- X =< Y. max(X,Y,X):- X>Y. ?- max(2,3,3). yes ?- max(7,3,7). yes
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att använda cut Betrakta predikatet max/3 som lyckas ifall dess tredje argument är det större av de två första max(X,Y,Y):- X =< Y. max(X,Y,X):- X>Y. ?- max(2,3,2). no ?- max(2,3,5). no
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Predikatet max/3 Var ligger problemet? Det finns en potentiell ineffektivitet –Anta att det anropas med ?- max(3,4,Y). –Det unifierar Y korrekt med 4... –... men när vi frågar efter flera lösningar, försöker det satisfiera den andra regeln, till ingen nytta. max(X,Y,Y):- X =< Y. max(X,Y,X):- X>Y. reglerna uteslutar varann
© Patrick Blackburn, Johan Bos & Kristina Striegnitz max/3 med cut Mha cut är detta lätt att fixa: Notera hur detta fungerar: –Om X =< Y lyckas, förbinder cut oss till detta val och den andra regeln av max/3 ignoreras –Om X =< Y misslyckas, fortsätter Prolog till den andra regeln max(X,Y,Y):- X =< Y, !. max(X,Y,X):- X>Y.
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Green Cuts Cuts som inte ändrar betydelsen hos en regel kallas för green cuts Cut:en i max/3 exemplifierar green cut: –Den nya koden ger exakt samma svar som den gamla versionen –men den är mera effektiv
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Ett annat max/3 med cut Varför inte helt avlägsna kroppen hos regel två? Den är ju redundant. Hur bra blev det? max(X,Y,Y):- X =< Y, !. max(X,Y,X).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Ett annat max/3 med cut Varför inte helt avlägsna kroppen hos regel två? Den är ju redundant. Hur bra blev det? –okej! max(X,Y,Y):- X =< Y, !. max(X,Y,X). ?- max(200,300,X). X=300 yes
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Ett annat max/3 med cut Varför inte helt avlägsna kroppen hos regel två? Den är ju redundant. Hur bra blev det? –okej... max(X,Y,Y):- X =< Y, !. max(X,Y,X). ?- max(400,300,X). X=400 yes
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Ett annat max/3 med cut Varför inte helt avlägsna kroppen hos regel två? Den är ju redundant. Hur bra blev det? –Oops... max(X,Y,Y):- X =< Y, !. max(X,Y,X). ?- max(200,300,200). yes Y kan inte samtidigt vara 200 och 300 så vi tar r2
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Reviderad max/3 med cut Unifiering efter att cut har överskridits: Det här fungerar: max(X,Y,Z) :- X =< Y, !, Y=Z. max(X,Y,X). ?- max(200,300,200). no Lyckas nu,så R2 ignoreras
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Red Cuts Cuts som ändrar betydelsen hos ett predikat kallas för red cuts Cut:en i den reviderade max/3 är ett exempel på ett red cut: –Om vi avlägsnar cut:en, får vi inte ett ekvivalent program Program som innehåller red cuts –Är inte helt deklarativa –Kan vara svåra att läsa –Kan leda till fel som är svåra att upptäcka
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Ett annat inbyggt predikat: fail/0 Såsom namnet låter förstå är detta ett predikat som genast misslyckas när Prolog försöker bevisa det Detta låter kanske inte så nyttigt men kom ihåg: när Prolog misslyckas (fails!), försöker det backtracka (kolla exemplet med bonden med sitt resesällskap!)
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vincent och hamburgare cut-fail-kombinationen tillåter oss att koda undantag enjoys(vincent,X) :- bigKahunaBurger(X), !, fail. enjoys(vincent,X) :- burger(X). burger(X) :- bigMac(X). burger(X) :- bigKahunaBurger(X). burger(X) :- whopper(X). bigMac(a). bigKahunaBurger(b). bigMac(c). whopper(d).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vincent och hamburgare cut-fail-kombinationen tillåter oss att koda undantag enjoys(vincent,X):- bigKahunaBurger(X), !, fail. enjoys(vincent,X):- burger(X). burger(X):- bigMac(X). burger(X):- bigKahunaBurger(X). burger(X):- whopper(X). bigMac(a). bigKahunaBurger(b). bigMac(c). whopper(d). ?- enjoys(vincent,a). yes
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vincent och hamburgare cut-fail-kombinationen tillåter oss att koda undantag enjoys(vincent,X):- bigKahunaBurger(X), !, fail. enjoys(vincent,X):- burger(X). burger(X):- bigMac(X). burger(X):- bigKahunaBurger(X). burger(X):- whopper(X). bigMac(a). bigKahunaBurger(b). bigMac(c). whopper(d). ?- enjoys(vincent,b). no
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vincent och hamburgare cut-fail-kombinationen tillåter oss att koda undantag [trace] ?- enjoys(vincent,b). Call: (6) enjoys(vincent, b) ? creep Call: (7) bigKahunaBurger(b) ? creep Exit: (7) bigKahunaBurger(b) ? creep Call: (7) fail ? creep Fail: (7) fail ? creep Fail: (6) enjoys(vincent, b) ? creep false. ?- enjoys(vincent,b). no
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vincent och hamburgare cut ser till att R2 inte används [trace] ?- enjoys(vincent,b). Call: (6) enjoys(vincent, b) ? creep Call: (7) bigKahunaBurger(b) ? creep Exit: (7) bigKahunaBurger(b) ? creep Call: (7) fail ? creep Fail: (7) fail ? creep Fail: (6) enjoys(vincent, b) ? creep false. ?- enjoys(vincent,b). no
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vincent och hamburgare cut ser till att R2 inte används; utan cut får vi: ?- enjoys(vincent, b). true ; false.
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vincent och hamburgare cut ser till att R2 inte används; utan cut får vi: [trace] ?- enjoys(vincent, b). Call: (6) enjoys(vincent, b) ? creep Call: (7) bigKahunaBurger(b) ? creep Exit: (7) bigKahunaBurger(b) ? creep Call: (7) fail ? creep Fail: (7) fail ? creep Redo: (6) enjoys(vincent, b) ? creep Call: (7) burger(b) ? creep Call: (8) bigMac(b) ? creep Fail: (8) bigMac(b) ? creep Redo: (7) burger(b) ? creep Call: (8) bigKahunaBurger(b) ? creep Exit: (8) bigKahunaBurger(b) ? creep Exit: (7) burger(b) ? creep Exit: (6) enjoys(vincent, b) ? creep true ;
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vincent och hamburgare cut-fail-kombinationen tillåter oss att koda undantag enjoys(vincent,X):- bigKahunaBurger(X), !, fail. enjoys(vincent,X):- burger(X). burger(X):- bigMac(X). burger(X):- bigKahunaBurger(X). burger(X):- whopper(X). bigMac(a). bigKahunaBurger(b). bigMac(c). whopper(d). ?- enjoys(vincent,c). yes
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vincent och hamburgare cut-fail-kombinationen tillåter oss att koda undantag enjoys(vincent,X):- bigKahunaBurger(X), !, fail. enjoys(vincent,X):- burger(X). burger(X):- bigMac(X). burger(X):- bigKahunaBurger(X). burger(X):- whopper(X). bigMac(a). bigKahunaBurger(b). bigMac(c). whopper(d). ?- enjoys(vincent,d). yes
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Negation as Failure Cut-fail-kombinationen verkar erbjuda oss en typ av negation Den kallas negation as failure, och definieras enligt följande: neg(Goal):- Goal, !, fail. neg(Goal).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Negation as Failure Om Goal lyckas, ska Prolog MISSLYCKAS och backtracka – men inte bakom cut! Om Goal misslyckas, lyckas neg(Goal), dvs dess negation neg(Goal):- Goal, !, fail. neg(Goal).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vincent och hamburgare igen enjoys(vincent,X):- burger(X), neg(bigKahunaBurger(X)). burger(X):- bigMac(X). burger(X):- bigKahunaBurger(X). burger(X):- whopper(X). bigMac(a). bigKahunaBurger(b). bigMac(c). whopper(d).
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Vincent och hamburgare igen enjoys(vincent,X):- burger(X), neg(bigKahunaBurger(X)). burger(X):- bigMac(X). burger(X):- bigKahunaBurger(X). burger(X):- whopper(X). bigMac(a). bigKahunaBurger(b). bigMac(c). whopper(d). ?- enjoys(vincent,X). X=a X=c X=d
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Ett annat inbyggt predikat: \+ Eftersom negation as failure behövs så ofta, finns det inget behov att definiera det själv I standard Prolog står prefixoperatorn \+ för negation as failure (också not används fortfarande) Vincents preferenser: enjoys(vincent,X):- burger(X), \+ bigKahunaBurger(X). ?- enjoys(vincent,X). X=a X=c X=d
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Negation as failure och logik Negation as failure är inte logisk negation Om vi ändrar på ordningen på delmålen i “vincent och hamburgare” får vi ett annorlunda beteende: enjoys(vincent,X) :- \+ bigKahunaBurger(X), burger(X). ?- enjoys(vincent,X). no
Vad beror detta på? Försök rita resolutionsträdet... © Patrick Blackburn, Johan Bos & Kristina Striegnitz enjoys(vincent,X) :- \+ bigKahunaBurger(X), burger(X). burger(X) :- bigMac(X). burger(X) :- bigKahunaBurger(X). burger(X) :- whopper(X). bigMac(a). bigKahunaBurger(b). bigMac(c). whopper(d). ?- enjoys(vincent,X). no
Vad beror detta på? Försök rita resolutionsträdet... © Patrick Blackburn, Johan Bos & Kristina Striegnitz enjoys(vincent,X) :- \+ bigKahunaBurger(X), burger(X). burger(X) :- bigMac(X). burger(X) :- bigKahunaBurger(X). burger(X) :- whopper(X). bigMac(a). bigKahunaBurger(b). bigMac(c). whopper(d). ?- enjoys(vincent, X). false. ?- trace. true. [trace] ?- enjoys(vincent, X). Call: (6) enjoys(vincent, _G1564) ? creep Call: (7) bigKahunaBurger(_G1564) ? creep Exit: (7) bigKahunaBurger(b) ? creep Fail: (6) enjoys(vincent, _G1564) ? creep false.
Vad beror detta på? Tolkningen blir: “Är det så att vincent enjoys X?” Första delmålet: /+ (bigKahunaBurger(X)) Systemet försöker verifiera (bigKahunaBurger(X) Detta lyckas för X = b Då misslyckas /+ Då misslyckas ?- enjoys(vincent, X). © Patrick Blackburn, Johan Bos & Kristina Striegnitz enjoys(vincent,X) :- \+ bigKahunaBurger(X), burger(X). ?- enjoys(vincent, X). false. [trace] ?- enjoys(vincent, X). Call: (6) enjoys(vincent, _G1564) ? creep Call: (7) bigKahunaBurger(_G1564) ? creep Exit: (7) bigKahunaBurger(b) ? creep Fail: (6) enjoys(vincent, _G1564) ? creep false.
Alltså: Så fort man kan bevisa målet efter not (\+) för något värde för X, misslyckas not. Det finns ingenting i denna förfrågning som skulle forcera systemet att generera andra bindningar för X. Hur fixa detta problem? © Patrick Blackburn, Johan Bos & Kristina Striegnitz
Generera kandidaterna Vi måste först använda oss av ett annat predikat för att generera kandidaterna som testas © Patrick Blackburn, Johan Bos & Kristina Striegnitz enjoys(vincent,X) :- burger(X), \+ bigKahunaBurger(X). burger(X) :- bigMac(X). burger(X) :- bigKahunaBurger(X). burger(X) :- whopper(X). bigMac(a). bigKahunaBurger(b). bigMac(c). whopper(d). ?- enjoys(vincent,X). X = a ; X = c ; X = d.
Trace... © Patrick Blackburn, Johan Bos & Kristina Striegnitz [trace] ?- enjoys(vincent,X). Call: (6) enjoys(vincent, _G1564) ? creep Call: (7) burger(_G1564) ? creep Call: (8) bigMac(_G1564) ? creep Exit: (8) bigMac(a) ? creep Exit: (7) burger(a) ? creep Call: (7) bigKahunaBurger(a) ? creep Fail: (7) bigKahunaBurger(a) ? creep Redo: (6) enjoys(vincent, a) ? creep Exit: (6) enjoys(vincent, a) ? creep X = a ; Redo: (8) bigMac(_G1564) ? creep Exit: (8) bigMac(c) ? creep Exit: (7) burger(c) ? creep Call: (7) bigKahunaBurger(c) ? creep Fail: (7) bigKahunaBurger(c) ? creep Redo: (6) enjoys(vincent, c) ? creep Exit: (6) enjoys(vincent, c) ? creep X = c ; Första sorten: bigMac (a och c)
Trace... © Patrick Blackburn, Johan Bos & Kristina Striegnitz Redo: (7) burger(_G1564) ? creep Call: (8) bigKahunaBurger(_G1564) ? creep Exit: (8) bigKahunaBurger(b) ? creep Exit: (7) burger(b) ? creep Call: (7) bigKahunaBurger(b) ? creep Exit: (7) bigKahunaBurger(b) ? creep Andra sorten: bigKahuna- Burger (b) Lyckas, så \+ miss- lyckas
Trace... © Patrick Blackburn, Johan Bos & Kristina Striegnitz Redo: (7) burger(_G1564) ? creep Call: (8) whopper(_G1564) ? creep Exit: (8) whopper(d) ? creep Exit: (7) burger(d) ? creep Call: (7) bigKahunaBurger(d) ? creep Fail: (7) bigKahunaBurger(d) ? creep Redo: (6) enjoys(vincent, d) ? creep Exit: (6) enjoys(vincent, d) ? creep X = d. Tredje sorten: whopper(d)
Det var det! © Patrick Blackburn, Johan Bos & Kristina Striegnitz Bästa tentplugg (Prolog-delen) = rö5 i sin helhet!