Logikprogrammierung

Werbung
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
Herunterladen