fl 5: aritmetikusers.abo.fi/soini/prolog5.pdffl 5: aritmetik • teori – introducerar prologs...

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

Upload: others

Post on 30-Jan-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 2: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Aritmetik i Prolog

•  Prolog erbjuder ett antal grundläggande verktyg för aritmetik

•  Heltal och flyttal

2 + 3 = 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).

Aritmetik Prolog

Page 3: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 4: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Att definiera predikat mha aritmetik

addThreeAndDouble(X, Y):- Y is (X+3) * 2.

Page 5: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 6: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 7: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

En närmare titt

?- X = 3 + 2.

Page 8: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

En närmare titt

?- X = 3 + 2. X = 3+2 yes

?-

Page 9: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

En närmare titt

?- X = 3 + 2. X = 3+2 yes

?- 3 + 2 = X.

Page 10: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

En närmare titt

?- X = 3 + 2. X = 3+2 yes

?- 3 + 2 = X. X = 3+2 yes

?-

Page 11: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 12: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Predikatet is/2

?- X is 3 + 2.

Page 13: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Predikatet is/2

?- X is 3 + 2. X = 5 yes

?-

Page 14: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Predikatet is/2

?- X is 3 + 2. X = 5 yes

?- 3 + 2 is X.

Page 15: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Predikatet is/2

?- X is 3 + 2. X = 5 yes

?- 3 + 2 is X. ERROR: is/2: Arguments are not sufficiently instantiated

?-

Page 16: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Predikatet is/2

?- X is 3 + 2. X = 5 yes

?- 3 + 2 is X. ERROR: is/2: Arguments are not sufficiently instantiated

?- Result is 2+2+2+2+2.

Page 17: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Predikatet is/2

?- X is 3 + 2. X = 5 yes

?- 3 + 2 is X. ERROR: is/2: Arguments are not sufficiently instantiated

?- Result is 2+2+2+2+2. Result = 10 yes

?-

Page 18: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 19: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 20: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 21: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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!

Page 22: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Längden av en lista i Prolog

len([],0). len([_|L],N):- len(L,X), N is X + 1.

?-

Page 23: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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).

Page 24: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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 ?-

Page 25: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 26: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 27: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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!

Page 28: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Längden av en lista i Prolog

acclen([],Acc,Length):- Length = Acc.

acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length).

?-

Page 29: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 30: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 31: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Längden av en lista i Prolog

acclen([],Acc,Acc).

acclen([_|L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(L,NewAcc,Length).

?-

Page 32: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

?-

Page 33: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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).

Page 34: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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).

Page 35: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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).

Page 36: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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).

Page 37: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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).

Page 38: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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).

Page 39: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 40: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 41: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 42: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Sökträdet för len/2 ?- len([a,b,c], Len). len([],0).

len([_|L],NewLength):- len(L,Length), NewLength is Length + 1.

Page 43: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Sökträdet för len/2 ?- len([a,b,c], Len). / \ no ?- len([b,c],Len1),

Len is Len1 + 1.

len([],0). len([_|L],NewLength):- len(L,Length), NewLength is Length + 1.

Page 44: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Sökträdet för len/2 ?- len([a,b,c], Len). / \ no ?- len([b,c],Len1),

Len is Len1 + 1. / \ no ?- len([c], Len2),

Len1 is Len2+1, Len is Len1+1.

len([],0). len([_|L],NewLength):- len(L,Length), NewLength is Length + 1.

Page 45: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Sökträdet för len/2 ?- len([a,b,c], Len). / \ no ?- len([b,c],Len1),

Len is Len1 + 1. / \ 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 Len1 + 1.

len([],0). len([_|L],NewLength):- len(L,Length), NewLength is Length + 1.

Page 46: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Sökträdet för len/2 ?- len([a,b,c], Len). / \ no ?- len([b,c],Len1),

Len is Len1 + 1. / \ 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 Len1 + 1. / \

Len3=0, Len2=1, no Len1=2, Len=3

len([],0). len([_|L],NewLength):- len(L,Length), NewLength is Length + 1.

Page 47: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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).

Page 48: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på:

•  X = 3*4.

?- X = 3*4.

X = 3*4.

Page 49: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på:

•  X is 3*4.

?- X is 3*4.

X = 12.

Page 50: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  4 is X.

?- 4 is X.

ERROR: is/2: Arguments are not sufficiently instantiated

Page 51: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  X = Y.

?- X = Y.

X = Y.

Page 52: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  3 is 1+2.

?- 3 is 1+2.

true.

Page 53: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  3 is +(1,2).

?- 3 is +(1,2).

true.

Page 54: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  3 is X+2.

?- 3 is X+2.

ERROR: is/2: Arguments are not sufficiently instantiated

Page 55: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  X is 1+2.

?- X is 1+2.

X = 3.

Page 56: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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!

Page 57: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  is(X,+(1,2)).

?- is(X, +(1,2)).

X = 3.

Page 58: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  3+2 = +(3,2).

?- 3+2 = +(3,2).

true.

Page 59: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  *(7,5) = 7*5.

?- *(7,5) = 7*5.

true.

Page 60: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  *(7,+(3,2)) = 7*(3+2).

?- *(7, +(3,2)) = 7*(3+2).

true.

Page 61: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  *(7,(3+2)) = 7*(3+2).

?- *(7,(3+2)) = 7*(3+2).

true.

Page 62: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

Lite övningar ...

•  Vad svarar Prolog på: •  7*3+2 = *(7,+(3,2)).

?- 7*3+2 = *(7,+(3,2)).

false.

Page 63: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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.

Page 64: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 65: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 66: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Aritmetik Prolog

Obs!

Page 67: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 68: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 69: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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

Page 70: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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!

Page 71: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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?

Page 72: FL 5: Aritmetikusers.abo.fi/soini/Prolog5.pdfFL 5: Aritmetik • Teori – Introducerar Prologs inbyggda operationer för aritmetik – Tillämpar dessa på enkla listhanteringsproblem,

© P

atr

ick B

lack

bu

rn,

Joh

an

Bo

s &

Kri

stin

a S

trie

gn

itz

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