Page 1
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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