aritmetik 3.4 M 8.2 E 2.2
dagens föreläsning operatorer för aritmetik tillämpningar
aritmetik i prolog aritmetik utförs av inbyggda predikat argumenten är aritmetiska uttryck ett aritmetiskt uttryck kan bestå av: –siffror, –variabler, –funktorer
operatorer i prolog traditionell notation 6+2 = 8 6*2 = = 4 6/2 = 3 prolog 8 is is 6*2. 4 is is 6/2. is/2 tar två argument, varav det andra måste vara ett giltigt aritmetiskt uttryck (med alla variabler instansierade). Det första måste vara antingen en siffra, eller en variabel som representerar en siffra.
exempel ?- X = X = ?- X is X = 5 =matchar isutvärderar (evaluerar)
fler operatorer **upphöjt //heltalsdivision modmodulo (rest vid heltalsdivision) >större än <mindre än >=större el. lika med <=mindre el. lika med =\=inte lika med (evaluerat värde) \=inte lika med
\= och =\= ?- 3 \= 3. no ?- 3 =\= 3. no ?- 3 \= 4. yes ?- 3 =\= 4. yes ?- 3 \= 2+1. yes ?- 3 =\= 2+1. no ’3’ är skilt från ’2+1’? ’värdet av 3’ är skilt från ’värdet av 2+1’?
fler operatorer (forts.) X =:= Y värdet av X är lika med värdet av Y (’forced evaluation’) Jämför med: X = Y matcha X med Y (och instansiera om det går!) ? =:= yes ? = no ’värdet av 1+2’ är lika med ’värdet av 2+1’? ’1+2’ är lika med ’2+1’?
fler operatorer (forts.) X == Yidentitetsrelationen, X och Y är identiska variabler (dvs har samma namn), eller är identiska operationer applicerade på identiska termer
aritmetik i prolog (forts.) aritmetiska uttryck kan ses som datastrukturer för att utvärdera uttrycken ges de som argument till något av de inbyggda predikaten som tvingar utvärdering:
inbyggda predikat som evaluerar Z is X X =:= Y X =\= Y X < Y X > Y X =< Y X >= Y
exempel ?- X = 2, Y is X+1. X = 2, Y = 3 ? ?- X = 2, Y = X+1. X = 2, Y = 2+1 ?- X = 2, Y =:= X+1. Instantiation error in argument 1 of =:= /2 goal: _76=:=2+1 ?- X = 2, 3 =:= X+1. X = 2 ?- X=3, X =:= 2+1, X is 1+2. X = 3
funktioner och relationer aritmetiska operatorer kan delas in i: –funktioner (t ex +, -, max, sqrt, etc.) –relationer (t ex, etc.) relationer utvärderar alltid (is/2 behövs alltså inte) Fler SICStus-specifika operatorer finns i M 8.2. (trigonometri etc.)
sammanfattning Z is X X, som måste vara ett aritmetiskt uttryck, utvärderas och resultatet unifieras med Z. X = Y variablerna X och Y är lika: X är unifierbar med Y. X =:= Y det numeriska värdet av X och Y är lika. X =\= Y de numeriska värdena av X och Y är olika. X == Y identitetsrelationen
sammanfattning (forts.) X < Y Det numeriska värdet av X är mindre än det numeriska värdet av Y. X > Y Det numeriska värdet av X är större än det numeriska värdet av Y. X =< Y Det numeriska värdet av X är mindre eller lika med det numeriska värdet av Y. X >= Y Det numeriska värdet av X är större eller lika med det numeriska värdet av Y.
lite om notation X is 3+2. % ’is’ infix % ’+’ infix X is +(3,2). % ’is’ infix % ’+’ prefix is (X, +(3,2)). % ’is’ prefix % ’+’ prefix is X+ 32
applikation 1 length/2 räknar ut längden av en lista. length([],0). length([_|Tail], N) :- length(Tail, N1), N is 1 + N1. Obs! N1 måste vara instansierat. Alltså det rekursiva anropet först!
körning… ?- length([a,b,c],N). N = 3 ?- length([a,b,[c,d],e],N). N = 4
använd ’=’ ist. f. ’is’ length2([],0). length2([_|Tail], N) :- length2(Tail, N1), N = 1 + N1.
körning… ?- length2([a,b,[c,d],e],N). N = 1+(1+(1+(1+0)))
applikation 2 summera/3 summerar alla heltal mellan två givna tal. summera(N, N, N). summera(N, M, Summa) :- N < M, N1 is N+1, summera(N1, M, Delsumma), Summa is N + Delsumma.
körning… ?- summera(1,10,X). X = 55 ?- summera(1,1000,X). X =
analys summera(1,2,Summa). 1 < 2 N1 is 1+1 summera(2,2,Delsum) Summa is 1+2 Summa = 3 summera(N, N, N). summera(N, M, Summa) :- N < M, N1 is N+1, summera(N1,M,Delsum), Summa is N + Delsum. true! N1=2 Basfallet: Delsum=2 Summa=3
applikation 3 sumlista/2 summerar elementen i en lista sumlista([],0). sumlista([N|Ns], Summa) :- sumlista(Ns,Delsumma), Summa is N+Delsumma.
körning… ?- sumlista([3,4,2,2],S). S = 11
applikation 4 vad kan göras med length/2 och sumlista/2? medel/2 räknar ut medelvärdet av talen i en lista. :- consult('length.pl'). :- consult('sumlista.pl'). medel(Lista, Medel) :- sumlista(Lista,Summa), length(Lista,Antal), Medel is Summa/Antal.
körning… ?- medel([1,2,3,4,5], Avg). Avg = 3.0 ?- medel([0],A). A = 0.0
medel([4,6],X) sumlista ([4,6],Y) length ([4,6],Z) X is Y/Z sumlista ([6],Y1) Y is 4+Y1 sumlista ([],Y2) Y1 is 6+Y2 length ([6],Z1) length ([],Z2) Z is 1+Z1 Z1 is 1+Z2 Y2=0Y1=6+0 Y=4+6 Z2=0Z1=1+0 Z=1+1 X=10/2 sumlista ([4,6],Y) sumlista ([6],Y1) sumlista ([],Y2) Y1 is 6+Y2 Y is 4+Y1 length ([4,6],Z) length ([6],Z1) length ([],Z2) Z1 is 1+Z2 Z is 1+Z1 X is Y/Z medel([4,6],X) X=5 Y=10Z=2
applikation 5 kvadratsumma/2 summerar kvadraten av värdena i en lista. kvadratsumma([],0). kvadratsumma([N|Ns], Summa) :- kvadratsumma(Ns,Delsumma), Summa is N*N + Delsumma.
körning… ?- kvadratsumma([1,2],X). Call: kvadratsumma([1,2],_464) Call: kvadratsumma([2],_996) Call: kvadratsumma([],_1508) Exit: kvadratsumma([],0) Call: _996 is 2*2+0 Exit: 4 is 2*2+0 Exit: kvadratsumma([2],4) Call: _464 is 1*1+4 Exit: 5 is 1*1+4 Exit: kvadratsumma([1,2],5) X = 5 ? Basfallet: Delsumma=0 kvadratsumma([],0). kvadratsumma([N|Ns], Summa) :- kvadratsumma(Ns,Delsumma), Summa is N*N + Delsumma.
nästa föreläsning ackumulatorer litteratur: –CM 3.7 –AOP 8.3 –(BBS 5.3, 6.2.2)