290 likes | 418 Views
logikprogrammering 16/10 2002: operatorer. Staffan Larsson. Repetition: termer och unifiering. 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)
E N D
logikprogrammering 16/10 2002: operatorer Staffan Larsson
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
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)
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) ).
unifiering • två termer unifierar, X=Y, om något av följande gäller: • någon är en oinstansierad variabel • den kommer att instansieras till den andra termen. • båda är atomer som är lika. • båda är tal som är lika. • båda är sammansatta termer med likadana funktorer och samma aritet, dessutom är motsvarande argument lika.
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
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
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 = [_|_]
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))
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
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
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)
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.
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
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)
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)}
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
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).
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}
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.
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).
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
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 ?
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.
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)
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
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.