© Patrick Blackburn, Johan Bos & Kristina Striegnitz FL 7: Cut och negation (kap. 10) Teori –Förklarar hur man kontrollerar Prologs backtracking-beteende.

Slides:



Advertisements
Liknande presentationer
F. Drewes, Inst. f. datavetenskap1 Föreläsning 13: Resolution •Resolution i satslogiken •Resolution i predikatlogiken.
Advertisements

Det första du bör göra är att rita horisonten
Gun Frödemo - kurator Studenthälsan.
Geometri 3x^5 Vinklar och areor Exponenter
IPad grundkurs.
Barnanpassad utredning
X-mas algebra Är du redo? Klicka!!.
Interface.  Interface är en datatyp och har alltså egen syntax och en hel del egna regler för vad arv från interface innebär.  Interface är renodlad.
En genomgång av spelet: Dubbelkrig-Grön
PowerPoint av Bendik S. Søvegjarto Koncept, text och regler av Skage Hansen.
Hej hypotestest!. Bakgrund  Signifikansanalys  Signifikansprövning  Signifikanstest  Hypotesprövning  Hypotestest Kärt barn har många namn Inblandade:
Kognitiva funktioner Verbal förmåga Logisk-Analytisk förmåga
Analytiker & Holistiker
hej och välkomna EKVATIONER Ta reda på det okända talet.
Intervju inför ViV-projektet.
Fem frågor att ställa i uppföljningsarbetet
1 Logikprogrammering ons 11/9 David Hjelm. 2 Repetition Listor är sammansatta termer. De består av en ordnad mängd element. Elementen i en lista kan vara.
Prolog, Mån 16/9 Rebecca Jonson.
Logikprogrammering, Mån 23/9 Rebecca Jonson. Repetition P :- Q, R. Deklarativ syn: –P är sann om Q och R är sanna. –Av Q och R följer P Procedurell syn:
© Patrick Blackburn, Johan Bos & Kristina Striegnitz FL 4: Listor (kap. 4 & 6) Teori –Introducera listor, en viktig rekursiv datastruktur som ofta används.
Föreläsning 2 21 jan 2008.
Webbanmälan till högskolestudier vt 2015
Logikprogrammering Ons, 25/9
Next previous Refactoring och lite mönster kodade i Java Innehåll Vad är refactoring? Ett större refactoringexempel Några mönster kodade i Java OOMPA 2000.
OOP Objekt-orienterad programmering
© Patrick Blackburn, Johan Bos & Kristina Striegnitz FL 5: Aritmetik Teori –Introducerar Prologs inbyggda operationer för aritmetik –Tillämpar dessa på.
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Föreläsning 2 Teori –Unifiering –Unifiering i Prolog –Sökning efter bevis Övningar –Ett lite större.
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Föreläsning 3: rekursion Teori –Introducera rekursiva definitioner i Prolog –Fyra exempel –Visa att.
© Patrick Blackburn, Johan Bos & Kristina Striegnitz FL 6: Definite Clause Grammars (kap. 7) Teori –Introducerar kontextfria grammatikor och några besläktade.
Sektorn för Socialtjänst
Logikprogrammering och Prolog
HJÄRNGYMPA.
Jonny Karlsson PROCESSPROGRAMMERING Föreläsning 8 ( ) Innehåll: Trådprogrammering i Java - Avbrott (”interrupts”) - Metoden join() -
Max start-guide Liten och väldigt snabbt ihopkastad.
Vad vår hjärna kan lura oss!
Att sälja Lions Quest-kurser till skolor /14.
Frågor om elevinflytande till elever i åk 3 – 9 i grundskolan
Känna till och ha provat metoder och verktyg för processledning
PROCESSPROGRAMMERING Föreläsning ‏ Innehåll: Högnivå objekt för trådprogrammering: - Trådgrupper (”Thread pools”)‏ - Exekverare (Executor.
Problemlösning Veckodagsproblemet Gissa talet Siffersumman.
Uppdaterad januari 2015 Webbanmälan till högskolestudier ht 2015 Material för studie- och yrkesvägledare.
Hur man lär sig saker på bästa sätt!
Anställningsintervjun
Kognitiv psykologi Tänk på en situation när det gick riktigt bra för dig. Varför gick det bra? Tänk på en situation när det gick riktigt dåligt för dig.
Logikprogrammering 21/10 Binära träd
En guide för arbeten i SO
Läsbar prolog CM 8.1. allmäna principer correctness user-friendliness efficiency readability modifiability robustness documentation.
Formell logik Kapitel 9 Robin Stenwall Lunds universitet.
Reflektioner från grupperna No hands up…
Logikprogrammering 16/ : operatorer Staffan Larsson.
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Logikprogrammering –Undervisningsmaterialet NYTT för 2013: –Learn Prolog Now! –SWI Prolog-tolk, startas.
Föreläsning 11 Logik med tillämpningar Innehåll u Generell resolution u Kapitel i Ben-Ari.
Föreläsning 13 Logik med tillämpningar Innehåll u Aritmetik i Prolog u Rekursiva och iterativa program u Typpredikat u Metalogiska predikat.
Karl-Henrik Hagdahl, 11 november Repetition Logikprogrammering: måndag 11 november 2002.
Satslogik, forts. DAA701/716 Leif Grönqvist 5:e mars, 2003.
Sms lån utan uc Uc är något som ständigt diskuteras bland dem som ofta använder sig av möjligheten till små snabba lån. Alla vet att när det görs en kreditprövning.
Föreläsning 16 Logik med tillämpningar Innehåll u Information kring kursvärdering och tentagenomgång u Genomgång av övningstenta 2.
Föreläsning 14 Logik med tillämpningar Innehåll u Cuts och negation u Input/output u Extralogiska predikat u Interaktiva program, failure-drivna.
Procedurellt potpurri Dagens samtalsämnen –Klipp (Cut) –If-then-else –fail/0 –repeat/0 Att läsa –The Art of Prolog, kapitel 11 –Relevant avsnitt i Learn.
Logikprogrammering ons 4/9 Rebecca Jonson.
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 13: Resolution Resolution i satslogiken Resolution i predikatlogiken.
Olika sätt att resonera kring hur människor bör handla
Krav på vetenskaplig tolkning
Olika sätt att resonera kring hur människor bör handla
Webbanmälan till högskolestudier HT 2017
Webbanmälan till högskolestudier HT 2016
Så här anmäler du dig till högskolan VT18
Så här anmäler du dig till högskolan HT18
Så här anmäler du dig till högskolan HT18
Så här anmäler du dig till högskolan VT19
Presentationens avskrift:

© 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!