© Patrick Blackburn, Johan Bos & Kristina Striegnitz FL 5: Aritmetik Teori –Introducerar Prologs inbyggda operationer för aritmetik –Tillämpar dessa på.

Slides:



Advertisements
Liknande presentationer
Pedagogisk planering Åk 7 - 9
Advertisements

Talföljder formler och summor
Andragradsfunktioner & Andragradsekvationer
En genomgång av spelet: Dubbelkrig-Grön
Funktioner och programorganisation
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.
Nya typer Konstruerare, selektorer och predikat Rekursiva datatyper
En övning i att formulera sig matematiskt
De fundamentala datatyperna
Logikprogrammering Ons, 25/9
Dcg-notation 21.2 G 2.3 M (BBS 8). dagens föreläsning extra argument i dcg-notation prolog-anrop i dcg-notation avslutande kommentarer om dcg.
Operatorer.
Växjö 21 april -04Språk & logik: Kontextfria grammatiker1 DAB760: Språk och logik 21/4: Kontextfria 10-12grammatiker Leif Grönqvist
Grundläggande programmering
Föreläsning 2 Datalogi för E1 2D1343
© Patrick Blackburn, Johan Bos & Kristina Striegnitz FL 7: Cut och negation (kap. 10) Teori –Förklarar hur man kontrollerar Prologs backtracking-beteende.
© 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.
Programmering B PHP Lektion 2
Programmering B PHP Lektion 3
1 Funktioner Nr 3 Funktionstyper, högre ordningens funktioner och polymorfism.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Programmering B PHP Lektion 2
Föreläsning 4 Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö.
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Vektorer (klassen Vector) Sortering
PROCESSPROGRAMMERING Föreläsning ‏ Innehåll: Högnivå objekt för trådprogrammering: - Trådgrupper (”Thread pools”)‏ - Exekverare (Executor.
Metoder och slingor Metoder och dess typ Slingor med while och for-satser.
Grundläggande programmering
Problemlösning Veckodagsproblemet Gissa talet Siffersumman.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 3 ( ) INNEHÅLL: -Jämförelseoperatorer -Villkorssatser -Logiska operatorer.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 3 ( ) INNEHÅLL: -Jämförelseoperatorer -Villkorssatser -Logiska operatorer.
F. Drewes, Inst. f. datavetenskap1 Föreläsning 11: Funktionella språk Funktioner och variabler i matematiken Funktionella språk LISP, ML och.
Logikprogrammering 21/10 Binära träd
1 Programmera med strängar nr 9 Tal till sträng Sträng till tal Grep Sträng till lista av ord.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 2 ( ) INNEHÅLL: -Variabler och datatyper -Tilldelning av variabler -Aritmetiska.
Kenneth Wilhelmsson 1 Logikprogrammering 10 P Onsdag 20 november 2002.
Läsbar prolog CM 8.1. allmäna principer correctness user-friendliness efficiency readability modifiability robustness documentation.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 3 ( ) INNEHÅLL: -Tabeller -Villkorssatser -Repetitionssatser.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 5 ( ) INNEHÅLL: -Metoder.
F4 - Funktioner & parametrar 1 Programmeringsteknik, 4p vt-00 Modularisering ”svarta lådor” Väl definierade arbetsuppgifter Enklare validering Enklare.
Logik med tillämpningar
För utveckling av verksamhet, produkter och livskvalitet. Stack och Kö - Implementering - Tilllämpningar.
Logikprogrammering 16/ : operatorer Staffan Larsson.
Labgrupper: 2 pers/grupp fr o m lab 2 schema ENKÄT.
© Patrick Blackburn, Johan Bos & Kristina Striegnitz Logikprogrammering –Undervisningsmaterialet NYTT för 2013: –Learn Prolog Now! –SWI Prolog-tolk, startas.
Föreläsning 7 Fysikexperiment 5p Poissonfördelningen Poissonfördelningen är en sannolikhetsfördelning för diskreta variabler som är mycket.
Aritmetik 3.4 M 8.2 E 2.2. dagens föreläsning operatorer för aritmetik tillämpningar.
1 Mönstermatchning och rekursion Nr 4. 2 Förenklad notation val fnname = fn name => expression Förenklas till fun fnname name = expression Exempel fun.
Föreläsning 13 Logik med tillämpningar Innehåll u Aritmetik i Prolog u Rekursiva och iterativa program u Typpredikat u Metalogiska predikat.
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 12: -kalkylen allmänt om -kalkylen syntax semantik att programmera i -kalkylen.
Karl-Henrik Hagdahl, 11 november Repetition Logikprogrammering: måndag 11 november 2002.
Satslogik, forts. DAA701/716 Leif Grönqvist 5:e mars, 2003.
Logikprogrammering 23/10 Binära träd In- och uthantering David Hjelm.
F2 1 Programmeringsteknik, 4p vt-00 Kommentarer Allt mellan /* och */ Varje kommentar byts ut mot en blank av kompilatorn /* Exempel på uttryck, tilldelningsoperatorn.
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.
F. Drewes, Inst. f. datavetenskap1 Föreläsning 12: -kalkylen allmänt om -kalkylen syntax semantik att programmera i -kalkylen.
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.
-Repetition -Variabler -Primitiva typer (+ boolean) -Operatörer +, ++, --, -Typ konvertering -Wrapper klasser -Jämförelse operatörer,(==, =,,!=, !) -String.
Mer om operatorer logiska operatorer bit-operatorer adress-operatorn ”komma”-operatorn punkt - operatorn.
-Repetition -Variabler -Primitiva typer (+ boolean) -Operatörer +, ++, --, -Typ konvertering -Wrapper klasser -Jämförelse operatörer,(==, =,,!=, !) -String.
OOP&M - teori1 OOP&M – Föreläsning 5 kap 8-13 Operatorer,typkonvertering, booleska operatorer, if och else.
Logikprogrammering ons 4/9 Rebecca Jonson.
Anders Sjögren Operatorer. Anders Sjögren Operand(er)
Föreläsning 3 Väsentliga delar i ett Javaprogram Input i paketet extra
Manada.se Kapitel 4 Ekvationer och formler. 4.1 Ekvationer och uttryck.
Presentationens avskrift:

© Patrick Blackburn, Johan Bos & Kristina Striegnitz FL 5: Aritmetik Teori –Introducerar Prologs inbyggda operationer för aritmetik –Tillämpar dessa på enkla listhanteringsproblem, mha ackumulatorer –Ser på svansrekursiva predikat och förklarar varför de är mera effektiva än icke-svansrekursiva predikat

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Aritmetik i Prolog Prolog erbjuder ett antal grundläggande verktyg för aritmetik Heltal och flyttal = 5 3 x 4 = 12 5 – 3 = 2 3 – 5 = -2 4  2 = 2 1 är resten när 7 divideras med 2 ?- 5 is 2+3. ?- 12 is 3  4. ?- 2 is 5-3. ?- -2 is 3-5. ?- 2 is 4/2. ?- 1 is mod(7,2). AritmetikProlog

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Exempel på förfrågningar ?- 10 is 5+5. yes ?- 4 is 2+3. no ?- X is 3  4. X=12 yes ?- R is mod(7,2). R=1 yes

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att definiera predikat mha aritmetik addThreeAndDouble(X, Y):- Y is (X+3)  2.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att definiera predikat mha aritmetik addThreeAndDouble(X, Y):- Y is (X+3)  2. ?- addThreeAndDouble(1,X). X=8 yes ?- addThreeAndDouble(2,X). X=10 yes

© Patrick Blackburn, Johan Bos & Kristina Striegnitz En närmare titt Det är viktigt att veta att +, -, / och  utför ingen aritmetik Uttryck som 3+2, 4-7, 5/5 är vanliga Prolog-termer –Funktor: +, -, /,  –Aritet: 2 –Argument: heltal

© Patrick Blackburn, Johan Bos & Kristina Striegnitz En närmare titt ?- X =

© Patrick Blackburn, Johan Bos & Kristina Striegnitz En närmare titt ?- X = X = 3+2 yes ?-

© Patrick Blackburn, Johan Bos & Kristina Striegnitz En närmare titt ?- X = X = 3+2 yes ? = X.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz En närmare titt ?- X = X = 3+2 yes ? = X. X = 3+2 yes ?-

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Predikatet is/2 För att tvinga Prolog att verkligen evaluera aritmetiska uttryck, måste vi använda is såsom vi gjorde i exempelfallen Detta instruerar Prolog att utföra beräkningarna Eftersom detta inte är ett vanligt Prolog- predikat, finns det några begränsningar

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Predikatet is/2 ?- X is

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Predikatet is/2 ?- X is X = 5 yes ?-

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Predikatet is/2 ?- X is X = 5 yes ? is X.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Predikatet is/2 ?- X is X = 5 yes ? is X. ERROR: is/2: Arguments are not sufficiently instantiated ?-

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Predikatet is/2 ?- X is X = 5 yes ? is X. ERROR: is/2: Arguments are not sufficiently instantiated ?- Result is

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Predikatet is/2 ?- X is X = 5 yes ? is X. ERROR: is/2: Arguments are not sufficiently instantiated ?- Result is Result = 10 yes ?-

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Begränsningar på användning av is/2 Vi får använda variabler på högra sidan av predikatet is Men när Prolog utför beräkningen måste variablerna vara instantierade med en variabelfri Prolog-term Denna Prolog-term måste vara ett aritmetiskt uttryck

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Notation Till slut två kommentarer på aritmetiska uttryck –3+2, 4/2, 4-5 är endast vanliga Prolog- termer i en användarvänlig notation: 3+2 är egentligen +(3,2) osv. –Även predikatet is är ett tvåställigt Prolog- predikat

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Notation Till slut två kommentarer på aritmetiska uttryck –3+2, 4/2, 4-5 är endast vanliga Prolog- termer i en användarvänlig notation: 3+2 är egentligen +(3,2) osv. –Även predikatet is är ett tvåställigt Prolog- predikat ?- is(X,+(3,2)). X = 5 yes

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Aritmetik och listor Hur lång är en lista? –Den tomma listan har längd 0 –En icke-tom lista har längd 1 plus längden av sin svans Försök formulera predikatet length!

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Längden av en lista i Prolog len([],0). len([_|L],N):- len(L,X), N is X + 1. ?-

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Längden av en lista i Prolog len([],0). len([_|L],N):- len(L,X), N is X + 1. ?- len([a,b,c,d,e,[a,x],t],X).

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Längden av en lista i Prolog len([],0). len([_|L],N):- len(L,X), N is X + 1. ?- len([a,b,c,d,e,[a,x],t],X). X=7 yes ?-

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Ackumulatorer Detta var ett rätt så bra program –Lätt att förstå –Relativt effektivt Men det finns en annan metod för att beräkna längden av en lista –Introducerar tanken bakom ackumulatorer –Ackumulatorer är variabler som innehåller mellanresultat

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att definiera acclen/3 Predikatet acclen/3 har tre argument –Listan vars längd vi vill få reda på –Längden av listan, ett heltal –En ackumulator som håller reda på mellanresultat för längden

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att definiera acclen/3 Ackumulatorn för acclen/3 –Startvärdet för ackumulatorn är 0 –Addera 1 till ackumulatorn för varje gång vi rekursivt behandlar huvudet av en lista –När vi når den tomma listan, innehåller ackumulatorn längden av listan Försök formulera acclen!

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Längden av en lista i Prolog acclen([],Acc,Length):- Length = Acc. acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length). ?-

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Längden av en lista i Prolog acclen([],Acc,Length):- Length = Acc. acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length). ?- addera 1 till ackumulatorn varje gång vi avlägsnar huvudet från listan

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Längden av en lista i Prolog acclen([],Acc,Length):- Length = Acc. acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length). ?- När vi når den tomma listan, innehåller ackumulatorn listans längd

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Längden av en lista i Prolog acclen([],Acc,Acc). acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length). ?-

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Längden av en lista i Prolog acclen([],Acc,Acc). acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length). ?-acclen([a,b,c],0,Len). Len=3 yes ?-

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för acclen/3 ?- acclen([a,b,c],0,Len). acclen([ ],Acc,Acc). acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length).

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för acclen/3 ?- acclen([a,b,c],0,Len). / \ acclen([ ],Acc,Acc). acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length).

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för acclen/3 ?- acclen([a,b,c],0,Len). / \ no ?- acclen([b,c],1,Len). / \ acclen([ ],Acc,Acc). acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length).

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för acclen/3 ?- acclen([a,b,c],0,Len). / \ no ?- acclen([b,c],1,Len). / \ no ?- acclen([c],2,Len). / \ acclen([ ],Acc,Acc). acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length).

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för acclen/3 ?- acclen([a,b,c],0,Len). / \ no ?- acclen([b,c],1,Len). / \ no ?- acclen([c],2,Len). / \ no ?- acclen([],3,Len). / \ acclen([ ],Acc,Acc). acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length).

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för acclen/3 ?- acclen([a,b,c],0,Len). / \ no ?- acclen([b,c],1,Len). / \ no ?- acclen([c],2,Len). / \ no ?- acclen([],3,Len). / \ Len=3 no acclen([ ],Acc,Acc). acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length).

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att tillägga ett wrapper-predikat acclen([ ],Acc,Acc). acclen([ _|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length). length(List,Length):- acclen(List,0,Length). ?-length([a,b,c], X). X=3 yes

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Svansrekursion Varför är acclen/3 bättre än len/2 ? –acclen/3 är svansrekursiv medan len/2 inte är det Skillnaden: –När det gäller svansrekursiva predikat är resultatet färdigt beräknat så fort vi når basfallet –När det gäller rekursiva predikat som inte är svansrekursiva, finns det ännu mål att evaluera på stacken när vi når basfallet

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Jämförelse acclen([],Acc,Acc). acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length). len([],0). len([_|L],NewLength):- len(L,Length), NewLength is Length + 1. Icke-svansrekursiv Svansrekursiv

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för len/2 ?- len([a,b,c], Len). len([],0). len([_|L],NewLength):- len(L,Length), NewLength is Length + 1.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för len/2 ?- len([a,b,c], Len). / \ no ?- len([b,c],Len1), Len is Len len([],0). len([_|L],NewLength):- len(L,Length), NewLength is Length + 1.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för len/2 ?- len([a,b,c], Len). / \ no ?- len([b,c],Len1), Len is Len / \ no ?- len([c], Len2), Len1 is Len2+1, Len is Len1+1. len([],0). len([_|L],NewLength):- len(L,Length), NewLength is Length + 1.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för len/2 ?- len([a,b,c], Len). / \ no ?- len([b,c],Len1), Len is Len / \ no ?- len([c], Len2), Len1 is Len2+1, Len is Len1+1. / \ no ?- len([], Len3), Len2 is Len3+1, Len1 is Len2+1, Len is Len len([],0). len([_|L],NewLength):- len(L,Length), NewLength is Length + 1.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för len/2 ?- len([a,b,c], Len). / \ no ?- len([b,c],Len1), Len is Len / \ no ?- len([c], Len2), Len1 is Len2+1, Len is Len1+1. / \ no ?- len([], Len3), Len2 is Len3+1, Len1 is Len2+1, Len is Len / \ Len3=0, Len2=1, no Len1=2, Len=3 len([],0). len([_|L],NewLength):- len(L,Length), NewLength is Length + 1.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sökträdet för acclen/3 ?- acclen([a,b,c],0,Len). / \ no ?- acclen([b,c],1,Len). / \ no ?- acclen([c],2,Len). / \ no ?- acclen([],3,Len). / \ Len=3 no acclen([ ],Acc,Acc). acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length).

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: X = 3*4. ?- X = 3*4. X = 3*4.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: X is 3*4. ?- X is 3*4. X = 12.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: 4 is X. ?- 4 is X. ERROR: is/2: Arguments are not sufficiently instantiated

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: X = Y. ?- X = Y. X = Y.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: 3 is 1+2. ?- 3 is 1+2. true.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: 3 is +(1,2). ?- 3 is +(1,2). true.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: 3 is X+2. ?- 3 is X+2. ERROR: is/2: Arguments are not sufficiently instantiated

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: X is 1+2. ?- X is 1+2. X = 3.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: 1+2 is 1+2. ?- 1+2 is 1+2. false. IS är inte unifierings- operator! Ej heller aritmetisk likhet!

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: is(X,+(1,2)). ?- is(X, +(1,2)). X = 3.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: 3+2 = +(3,2). ?- 3+2 = +(3,2). true.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: *(7,5) = 7*5. ?- *(7,5) = 7*5. true.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: *(7,+(3,2)) = 7*(3+2). ?- *(7, +(3,2)) = 7*(3+2). true.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: *(7,(3+2)) = 7*(3+2). ?- *(7,(3+2)) = 7*(3+2). true.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Vad svarar Prolog på: 7*3+2 = *(7,+(3,2)). ?- 7*3+2 = *(7,+(3,2)). false.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Definiera ett predikat increment/2 som kontrollerar att dess andra argument är ett större än dess första argument, ex. ?- increment(4,5). true. ?- increment(4,6). false. ?- increment(4,X). X = 5.

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Lite övningar... Definiera ett predikat increment/2 som kontrollerar att dess andra argument är ett större än dess första argument, ex. increment(B, A) :- A is B+1. Obs! ?- increment(X,5). ERROR: is/2: Arguments are not sufficiently instantiated

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att jämföra heltal Några av Prologs aritmetiska predikat utför de facto beräkningarna själva Detta gäller de operatorer som jämför heltal

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att jämföra heltal x < y x  y x = y x  y x  y x > y X < Y X =< Y X =:= Y X =\= Y X >= Y X > Y AritmetikProlog Obs!

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Jämförelseoperatorer Har den sedvanliga betydelsen Påtvingar både det vänstra och det högra argumentet att evalueras ?- 2 < 4+1. yes ?- 4+3 > 5+5. no

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Jämförelseoperatorer ?- 4 = 4. yes ?- 2+2 = 4. no ?- 2+2 =:= 4. yes Har den sedvanliga betydelsen Påtvingar både det vänstra och det högra argumentet att evalueras Unifiering!!! Aritmetisk likhet

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att jämföra tal Vi ska definiera ett predikat som tar två argument och gäller när: –Det första argumentet är en heltalslista –Det andra argumentet är det största heltalet i listan Grundidén –Vi ska använda en ackumulator –Ackumulatorn håller reda på det hittills största värdet –Om vi hittar ett större värde, uppdateras ackumulatorn

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Definition av accMax/3 accMax([H|T],A,Max):- H > A, accMax(T,H,Max). accMax([H|T],A,Max):- H =< A, accMax(T,A,Max). accMax([],A,A). ?- accMax([1,0,5,4],0,Max). Max=5 yes Fungerar ej för negativa tal!

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Att tillägga en wrapper max/2 accMax([H|T],A,Max):- H > A, accMax(T,H,Max). accMax([H|T],A,Max):- H =< A, accMax(T,A,Max). accMax([],A,A). max([H|T],Max):- accMax(T,H,Max). ?- max([1,0,5,4], Max). Max=5 yes ?- max([-3, -1, -5, -4], Max). Max= -1 yes ?- Fungerar detta för negativa tal?

© Patrick Blackburn, Johan Bos & Kristina Striegnitz Sammandrag Vi har bekantat oss med aritmetik i Prolog Vi har sett på skillnaden mellan svansrekursiva och icke- svansrekursiva predikat Vi har introducerat programmerings- teknik som använder ackumulatorer Vi har också introducerat idén om wrapper-predikat