Logikprogrammierung � Berechnung durch Resolution � Die Programmiersprache Prolog Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.1 Logikprogrammierung – Berechnung durch Resolution Resolution als Berechnungsmodell bisher Resolution nur als Verfahren zum Beweis der Unerfüllbarkeit einer Klauselmenge Resolution kann mehr: Erzeugung neuer Terme durch MGUs in Iteration der Resolution ist auch eine Berechnung Verallgemeinerung: • gegeben Eingabe-Klauselmenge C, Ziel-Klausel ϕ • berechne Substitution σ, so dass σ(ϕ) aus C per Resolution herleitbar ist 213 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.1 Logikprogrammierung – Berechnung durch Resolution Beispiel Bsp. Konstante 0, einst. Funktion s zur symbolischen Repräsentation natürlicher Zahlen Axiomatisierung der Addition: ∀x.Add(x, 0, x) ∀x.∀y .∀z.Add(x, y , z) → Add(x, s(y ), s(z)) Axiomatisierung der Multiplikation: ∀x.Mult(x, 0, 0) ∀x.∀y .∀z.Mult(x, y , z) ∧ Add(y , z, u) → Mult(x, s(y ), u) 214 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.1 Logikprogrammierung – Berechnung durch Resolution Beispiel Was ist 3 + 2? Für welchen Term t ist Add(s(s(s(0))), s(s(0)), t) Konsequenz aus obiger Klauselmenge? Beachte: Φ |= ϕ gdw. Φ ∧ ¬ϕ unerfüllbar benutze also Resolutionsverfahren für {Add(x, 0, x)}, {¬Add(x, y , z), Add(x, s(y ), s(z))}, {¬Add(s 3 (0), s 2 (0), u)} führe am Ende aufgesammelte Substitutionen aus, um u korrekt zu instanziieren Was ist 3 ∗ 2? Übung. 215 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.1 Logikprogrammierung – Berechnung durch Resolution Beispiel symbolische Differenzierung modellieren; Signatur (+, ∗, 1, 0, x, y , . . .) (Achtung, x etc. ist Konstante in Signatur, aber Variable in modelliertem Szenario!) {D(x, x, 1)} {D(y , x, 0) | y �= x} {D(f , x, f � ) ∧ D(g , x, g � ) → D(+(f , g ), x, +(f � , g � ))} {D(f , x, f � ) ∧ D(g , x, g � ) → D(∗(f , g ), x, +(∗(f , g � ), ∗(f � , g )))} Übungen: • berechne die Ableitung von x 2 · (y + x) nach x • erweitere dies um natürliche Zahlen und Operatoren pow (f , n) für Polynome 216 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.1 Logikprogrammierung – Berechnung durch Resolution Resolutionsstrategien Ziel: Berechnungsmechanismus in Resolution in einer Programmiersprache ausnutzen pragmatisches Problem: obiger Resolutionskalkül nicht sehr zielgerichtet; Resolutions-Baumstruktur vollkommen beliebig effiziente Auswertung in Interpreter erfordert klarere Regeln leicht zu machen, z.B. “wähle immer kleinste passende Klausel” etc. wirft Frage auf: gilt Korrektheit (Φ unerfüllbar gdw. Resolutionsbeweis existiert) auch unter Einschränkung auf bestimmte Resolutionsstrategien? 217 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.1 Logikprogrammierung – Berechnung durch Resolution SLD-Resolution Def.: SLD-Resolutionsbeweis für Φ ist Liste C1 , . . . , Cn , so dass • C1 ∈ Φ • für alle i = 2, . . . , n existiert C ∈ Φ, so dass Ci Resolvent von Ci−1 und C beachte: Liste = degenerierter Baum Bsp.: (man stelle sich geeignete FO-Literale vor) Φ = {{A, B}, {¬A, B, ¬C }, {¬B, ¬C }, {C }} 218 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.1 Logikprogrammierung – Berechnung durch Resolution SLD-Resolution und Horn-Klauseln zur Erinnerung: Horn-Klausel ist P(t̄) ∨ ¬Q1 (s̄1 ) ∨ . . . ∨ ¬Qn (s̄n ) mit n ≥ 0 Theorem 41 (ohne Beweis) Sei Φ Menge von Horn-Klauseln. Φ ist unerfüllbar gdw. es SLD-Resolutionsbeweis für Φ gibt. SLD-Resolution ist nicht vollständig für allgemeine Klauselmengen Bsp.: man versuche, einen SLD-Resolutionsbeweis für Φ := {{A, B}, {¬A, B}, {A, ¬B}, {¬A, ¬B}} zu konstruieren 219 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.2 Logikprogrammierung – Prolog Programmiersprache Prolog Prolog-Programm ist Liste von Fakten (einelementige Hornklausel) und Regeln (mehrelementige Hornklauseln) • Variablen beginnen mit Großbuchstaben oder Unterstrich • Funktionen und Prädikate beginnen mit Kleinbuchstaben Bsp.: p(X,c,X). p(X,f(Y),f(Z)) :- p(X,Y,Z). 220 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.2 Logikprogrammierung – Prolog Syntax Klauselform gemacht für Konjunktionen im Antezedent: isWitch(X) :- female(X), burnable(X), sameWeight(X,duck). Disjunktionen im Antezedent modellierbar: A ∨ B → C ≡ (A → C ) ∧ (B → C ) isParent(X,Y) :- isFather(X,Y). isParent(X,Y) :- isMother(X,Y). oder isParent(X,Y) :- isFather(X,Y); isMother(X,Y). 221 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.2 Logikprogrammierung – Prolog Anfragen Anfrage an ein Programm (besser: den Interpreter) stößt Berechnung an Anfrage = Liste von Prädikaten (Ziele, Goals) Bsp.: vert(point(X,Y1),point(X,Y2)). hori(point(X1,Y),point(X2,Y)). Anfrage P1 = point(3,4), P2 = point(2,5), vert(P1,Z), horiz(P2,Z). 222 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.2 Logikprogrammierung – Prolog Semantik wie wird eine Anfrage unter einem Prolog-Programm ausgewertet? intuitiv: • arbeite der Reihe nach alle Ziele der Anfrage ab • zu jedem Ziel suche passende linke Seite (Unifikation!) einer Regel oder eines Fakts • ersetze Ziel durch rechte Seite dieser Regel • wende berechnete Substitution auf sämtliche Restziele an formal: SLD-Resolution mit jeweils erster passender Klausel 223 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.2 Logikprogrammierung – Prolog 224 SLD-Resolution in Prolog Abweichungen von einfacher SLD-Resolution: • Prolog berechnet mehr als eine Antwort isAdvisor(euler,lagrange). isAdvisor(lagrange,fourier). isAdvisor(lagrange,poisson). isAdvisor(poisson,dirichlet). .. . isDescendant(X,Y) :- isAdvisor(Y,X); isAdvisor(Y,Z), isDescendant(X,Z). • Termination und Antworten abhängig von Klauselreihenfolge term1(X). term1(X) :- term1(f(X)). term2(X) :- term2(f(X)). term2(X). • Termination und Antworten abhängig von Literalreihenfolge (ähnlich) Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.2 Logikprogrammierung – Prolog Gleichheit beachte: Resolution lässt sich wie Sequenzenkalkül auf FO mit Gleichheit erweitern Prolog kennt auch Gleichheitsprädikat = Behandlung von Gleichheit bei SLD-Resolution besonders einfach • bisher unbenutzte Klauseln werden so belassen • bisherige Berechnung steckt ganz in Substitutionen aktueller Klausel Gleichheit wie definiertes Prädikat, welches Gleichheit auf Termen realisiert Bsp.: Was bewirken folgende Anfragen? s = s, s = t, X = X, X = Y? 225 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.2 Logikprogrammierung – Prolog Unifikation in Prolog Prolog benutzt anderen Mechanismus als kennengelernte syntaktische Unifikation zur Erinnerung: x und f (x) nicht unifizierbar Grund: x kommt selbst in f (x) vor Unifikation ist Kern des Berechnungsmechanismus in Prolog • wird ständig ausgeführt • muss deswegen möglichst schnell gehen • aus Effizienzgründen Verzicht auf Test auf Auftreten Bsp.: Anfrage X = f(X) 226 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.2 Logikprogrammierung – Prolog Arithmetik Additionsbeispiel leicht in Prolog zu implemetieren: add(X,null,X). add(X,s(Y),s(Z)) :- add(X,Y,Z). Verwendung von abstrakten Termen jedoch unhandlich Prolog kennt auch arithmetische Operatoren +,-,* etc., Ausdruck 3+2*4 ist aber nur Term! was ist Antwort auf Anfrage 2+2 = 3+1? Addition also z.B. folgendermaßen; funktioniert das? add1(X,0,X). add1(X,Y,Z) :- add1(X,Y-1,Z-1). 227 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.2 Logikprogrammierung – Prolog Arithmetik funktionierende Lösung: add2(X,0,Z) :- Z is X. add2(X,Y,Z) :- V is Y-1, W is X+1, add2(W,V,Z). beachte: Prädikat is ist Gleichheit auf arithmetischen Termen, nachdem rechte Seite ausgewertet wurde! Variablen darin müssen instanziiert sein was sollte bei folgenden Anfragen herauskommen? • X is 3+1. • 3+1 is X. • X is X. • 2+2 is 3+1. beachte: add kann auch subtrahieren, add2 aber nicht 228 Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.2 Logikprogrammierung – Prolog Listen brauchbare Programmiersprache muss Datenstrukturen zur Verfügung stellen einfachstes Beispiel: Listen sind prinzipiell über Terme modellierbar; Benutzung jedoch einfacher bei eingebautem Datentyp • Listennotation: [0,2,4,[1,3],X,[3,Y]] • leere Liste is [] • Separation in Kopfteil und Restliste: [X | Z], [X,Y | Z], etc. Bsp.: extrahiere Listenelement an bestimmter Position atPosition(X,[X| ],P) :- 0 is P. atPosition(X,[ |T],P) :- atPosition(X,T,P-1). 229