1 / 29

logikprogrammering 16/10 2002: operatorer

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)

vashon
Download Presentation

logikprogrammering 16/10 2002: operatorer

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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: • 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.

  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.

More Related