Ladda ner presentationen
Presentation laddar. Vänta.
1
logikprogrammering 16/10 2002: operatorer Staffan Larsson
2
Repetition: termer och unifiering
3
Sammansatta termer (i kursboken: ”strukturerade objekt”) termer med argument. En sammansatt term består av –ett namn (en atom) –ett antal argument (vilka termer som helst) Namnet på termen kallas funktor antalet argument kallas aritet eller ställighet. Syntax: –Namn(Arg1, Arg2, …, ArgN) –d v s samma som för predikat
4
exempel relationsschema % föreläsning(?Kurs, ?Föreläsare, ?Tid, ?Lokal) % där Kurs = kurs(Institution, Kursnamn, Kurskod) % Föreläsare = person(Förnamn, Efternamn, Telefonnummer) % Tid = tid(Datum, StartKlockslag, SlutKlockslag) % där Datum = datum(Dag, Månad, År) % Klockslag = klockslag(Timme, Minut) % Lokal = lokal(Byggnad, Lokalnamn)
5
exempel, forts. Måndagens föreläsning kan då se ut som följer i databasen. föreläsning( kurs(datavetenskap, logikprogrammering, inl070), person(staffan, larsson, 7734378), tid( datum(14,okt,2002), klockslag(13,15), klockslag(15,00)), lokal(matematiskt_centrum, hörsalen) ).
6
unifiering två termer unifierar, X=Y, om något av följande gäller: 1.någon är en oinstansierad variabel –den kommer att instansieras till den andra termen. 2.båda är atomer som är lika. 3.båda är tal som är lika. 4.båda är sammansatta termer med likadana funktorer och samma aritet, dessutom är motsvarande argument lika.
7
identitet Två termer är identiska om de är instansierade till samma sak, –Identitet testas med == –motsatsen är \== –två variabler som har unifierats är därefter identiska exempel ?- lisa==lisa. yes ?- X==X. yes ?- X==Y. no ?- X=Y, X==Y. yes
8
Predikaten arg/3 och functor/3 arg(+ArgNr,+Term,?Arg) –hämtar ett givet argument från en sammansatt term. –exempel: ?- arg(3, datum(15,okt,2001), X). X = 2001
9
arg/3 och functor/3 forts. Predikatet functor/3 kan användas på två sätt –ta reda på namnet och ariteten av en term functor(+Term,?Namn,?Aritet). exempel ?- functor(datum(15,okt,2001), Namn, Aritet). Namn = datum, Aritet = 3 ?- functor("lisa", Namn, Aritet). Namn = '.', Aritet = 2 –skapa en term om man känner till namnet och ariteten functor(?Term,+Namn,+Aritet). exempel ?- functor(Term, datum, 3). Term = datum(_, _, _) ?- functor(Term, '.', 2). Term = [_|_]
10
sammansättning och isärplockning av termer Term =.. [Funktor, Arg1, …, ArgN] ?- f(a,b) =.. L L= [f,a,b] ?- T =.. [rectangle, 3, 5]. T= rectangle(3,5) ?- Z =.. [p, X, f(X,Y)]. Z = p(X, f(X, Y))
11
listor som sammansatta termer förenklat skrivsätt för sammansatta termer uppbyggda av funktorn '.'/2. Man kan skriva dem som listor. ?- [1,2,3,4] = '.'(1, '.'(2, '.'(3, '.'(4, [])))). yes
12
operatorer
13
Operatorer Det finns förenklade skrivsätt även för andra termer än listor Vissa funktorer med 1 eller 2 argument kan man skriva som operatorer detta har ni redam använt mer än ni kanske tror används för att öka läsligheten
14
Matematiska operatorer Funktorerna +, -, *, /, etc är alla deklarerade som operatorer i Prolog. detta betyder att man kan skriva dem mellan sina argument observera att detta bara är ett förenklat skrivsätt - "syntaktiskt socker". ?- X = +(3, *(4, 5)). X = 3+4*5 ?- X = /(-(5,3), +(2,4)). X = (5-3)/(2+4)
15
prioritetsordning Alla operatorer har en prioritetsordning. Det är detta som gör att * binder hårdare än +, –dvs att 3+4*5 betyder 3+(4*5) och inte (3+4)*5.
16
associativitet Dessutom har de en associativitet –”-” associerar till vänster –det är detta som gör att 3-4-5 betyder (3- 4)-5 och inte 3-(4-5). ?- 3 - 4 - 5 = 3 - (4 - 5). no ?- 3 - 4 - 5 = (3 - 4) - 5. yes Vad blir svaret? –”+” och ”-” är båda vänsterassociativa, med samma prioritet –?- X = 3 – 4 + 5
17
Jämförelseoperatorer till exempel =, \=, ==, >, <, Alla dessa har lägre prioritet än de matematiska, –för att man ska kunna skriva 3*4=X utan att behöva sätta ut parenteser (3*4)=X. Exempel: ?- =(X, +(3,-(5,6))). X = 3+(5-6)
18
associativitet för jämförelseoperatorer Jämförelseoperatorerna associerar inte åt något håll; –man får ett syntaxfel om man skriver X = Y = Z. ?- X = Y = 5. {SYNTAX ERROR: in line 1 (within 1-2)}
19
operatorer som inte är specialtecken En operator behöver inte vara uppbyggd av specialtecken, t.ex. finns operatorn is: ?- X is 3+4. X = 7. ?- is(X, +(3,4)). X = 7
20
Enställiga operatorer En operator behöver inte ta två argument, vissa operatorer tar ett argument istället. –Detta gör att man slipper skriva parenteser om man vill göra ett tal negativt –man skriver -X istället för -(X).
21
negationsoperatorn Även negationen \+ är en enställig operator, –man kan skriva \+ test istället för \+(test). ?- \+ a=b. yes. ?- \+(a=b). yes. –men se upp: ?- \+ (X=a, X=b). yes ?- \+(X=a, X=b). {EXISTENCE ERROR: \+(X=a,X=b): procedure user:(\+)/2 does not exist}
22
Negation och mellanslag Om man har en enställig operator så är det en subtil skillnad med mellanslag. –Om man skriver \+ (p,q) så betyder det, som man antagligen hoppas \+((p,q)) dvs funktorn \+ med ett argument ((p,q)) –Men om man skriver \+(p,q) så betyder det \+(p,q) dvs funktorn \+ med två argument, p och q. Detta är egentligen bara ett problem för just negationen \+. Tag alltså alltid för vana att ha ett mellanslag efter \+ när du programmerar.
23
Lågprioriterade operatorer I Prolog är faktiskt nästan allt operatorer –negationen \+ –disjunktionen ; –if-then-else-pilen -> –DCG-regel-pilen --> –Prolog-klausul-"pilen" :- a :- b. :-(a,b).
24
konjunktionsoperatorn Till och med konjunktionen, är en operator, vilket kan leda till lite konstigheter. ?- ';'(X=a, Y=b). X = a ; Y = b; no (more solutions) ?- ','(X=a, Y=b). X = a, Y = b
25
Deklarera egna operatorer Man kan deklarera egna operatorer hur enkelt som helst. Det är bara att anropa det inbyggda predikatet op/3: ?- op(300, xfx, hoppar). yes ?- A = hoppar(hästen, högt). A = hästen hoppar högt ?
26
prioritet Det första argumentet är prioriteten, –ju lägre tal desto hårdare binder det. –mellan 1 och 1200 vad blir svaret? –?- op(300, xfx, hoppar). –?- op(400, xfx, och). –?- hasten hoppar hogt och gnaggar = ( hasten hoppar hogt ) och gnaggar.
27
associativitet Det andra argumentet är associativiteten; –xfx betyder att operatorn inte associerar åt något håll (t ex ”==”) –yfx betyder att operatorn associerar åt höger (t ex ”-” är deklarerad som yfx) ?- a - (b - c) = a - b - c. no ?- (a - b) - c = a - b - c. yes –xfy betyder att operatorn associerar åt vänster (t ex ”:” är deklarerad som xfy)
28
prefix och postfix associativitet för enställiga operatorer: –fx betyder att operatorn är enställig och prefix, d v s kommer före sitt argument –xf betyder att operatorn är enställig och postfix, d v s kommer efter sitt argument
29
alla operatorer I slutet av manualen (s. 597) finns en lista med de operatorer som är deklarerade som standard i Prolog, tillsammans med prioriteter och associativiteter. Det finns också en lite mindre lista i kapitel 3.3 i kursboken.
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.