Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avThomas Jonasson
1
aritmetik 3.4 M 8.2 E 2.2
2
dagens föreläsning operatorer för aritmetik tillämpningar
3
aritmetik i prolog aritmetik utförs av inbyggda predikat argumenten är aritmetiska uttryck ett aritmetiskt uttryck kan bestå av: –siffror, –variabler, –funktorer
4
operatorer i prolog traditionell notation 6+2 = 8 6*2 = 12 6-2 = 4 6/2 = 3 prolog 8 is 6+2. 12 is 6*2. 4 is 6-2. 3 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.
5
exempel ?- X = 3 + 2. X = 3 + 2 ?- X is 3 + 2. X = 5 =matchar isutvärderar (evaluerar)
6
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
7
\= 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’?
8
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!) ?- 1 + 2 =:= 2 + 1 yes ?- 1 + 2 = 2 + 1 no ’värdet av 1+2’ är lika med ’värdet av 2+1’? ’1+2’ är lika med ’2+1’?
9
fler operatorer (forts.) X == Yidentitetsrelationen, X och Y är identiska variabler (dvs har samma namn), eller är identiska operationer applicerade på identiska termer
10
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:
11
inbyggda predikat som evaluerar Z is X X =:= Y X =\= Y X < Y X > Y X =< Y X >= Y
12
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
13
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.)
14
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
15
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.
16
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
17
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!
18
körning… ?- length([a,b,c],N). N = 3 ?- length([a,b,[c,d],e],N). N = 4
19
använd ’=’ ist. f. ’is’ length2([],0). length2([_|Tail], N) :- length2(Tail, N1), N = 1 + N1.
20
körning… ?- length2([a,b,[c,d],e],N). N = 1+(1+(1+(1+0)))
21
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.
22
körning… ?- summera(1,10,X). X = 55 ?- summera(1,1000,X). X = 500500
23
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
24
applikation 3 sumlista/2 summerar elementen i en lista sumlista([],0). sumlista([N|Ns], Summa) :- sumlista(Ns,Delsumma), Summa is N+Delsumma.
25
körning… ?- sumlista([3,4,2,2],S). S = 11
26
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.
27
körning… ?- medel([1,2,3,4,5], Avg). Avg = 3.0 ?- medel([0],A). A = 0.0
28
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
29
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.
30
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.
31
nästa föreläsning ackumulatorer litteratur: –CM 3.7 –AOP 8.3 –(BBS 5.3, 6.2.2)
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.