Title: Logische%20Programmierung:%20Prolog
1Logische ProgrammierungProlog
- Proseminar Programmiersprachen WS 2003/2004
- Jochen Frey
- Betreuer Prof. Dr. Gert Smolka
2Übersicht
3Deklarative Programmierung
- Zwei Interpretationen
- Prozedurale Interpretation
- Wie wird etwas berechnet ?
- Deklarative Interpretation
- Was wird berechnet ?
- Logische Programmierung ist deklarative
Programmierung mit Prädikatenlogik
4Geschichte von Prolog
- Entwickelt 1970 (Kowalski, Colmerauer)
- PROrammieren in LOGik
- Beeinflusste viele Entwicklungen
- 5th Generation Project
- Deductive Databases
- Constraint Logic Programming
-
5Terme
- Grundlegende Datenstruktur in Prolog
- Grammatik
-
- ltTermgt ltVariablegt ltETermgt
- ltETermgt ltZahlgt ltSymbol(Term, , Term)gt
- ltFaktgt ltETermgt
- ltRegelgt ltETerm - ETerm, , ETermgt
-
-
6Logische Programme
- Folge von Klauseln (Fakten und Regeln)
H - B1, , B2
Regelkopf
Regelkörper
Deklarative Semantik
Prozedurale Semantik
H erfüllt, falls zuerst B1 und dann B2 erfüllt
werden können
H erfüllt, fall sowohl B1 als auch B2 erfüllt
werden können
Für die Abarbeitung von Prolog-Programmen wird
den Programmklauseln eine prozedurale Semantik
unterstellt
7Beispiel Biblische Familie
- father(terach, abraham).
- father(terach, nachor).
- father(terach, haran).
- father(abraham, isaac).
- father(haran, lot).
- father(haran, milcah).
- father(haran, yiscah).
-
- mother(sarah, isaac).
- son(X,Y) - father(Y,X), male(X).
- daughter(X,Y) - father(Y,X), female(X).
male(terach). male(abraham). male(nachor). male(ha
ran). male(isaac). male(lot). female(sarah). fema
le(milcah). female(yiscah).
Fakten
Regeln
8Anfragen
-
- Prolog prüft nun, ob die Anfrage eine logische
Konsequenz des Programms ist - Ist dies der Fall so antwortet Prolog mit Yes
- Andernfalls mit No
- Hier
?- father(abraham, isaac).
Yes
9Unifikation
- Lösen von Gleichungen zwischen Termen
- durch Unifikation
- finden einer Substitution s zwischen Termen t1
und t2, mit s(t1) s(t2) - allgemeinste Lösung wird als allgemeinster
Unifikator bezeichnet
10Ein Unifikations-Algorithmus
- f(s1, , sn) f(t1, , tn) ersetzen durch
- s1t1, , sntn
- f(s1, , sn) g(t1, , tm), mit f?g Fehler
- xx löschen
- tx, wobei t keine Variable ist ersetzen durch
xt - xt, wobei x nicht in t aber woanders
Substitution - vorkommt x/t anwenden
-
- xt, wobei x in t vorkommt und x?t Fehler
11Beispiele
- father(X, isaac)
- father(abraham, Y)
- Y
- father(X, isaac)
- father(haran, lot)
- father(abraham, isaac)
- father(X, isaac)
- mother(sarah, isaac)
Xabraham Yisaac
Yfather(X,isaac)
nicht unifizierbar
nicht unifizierbar
12Beispiel Biblische Familie
Datenbasis
Anfrage
Antwort
- father(terach, abraham).
- father(terach, nachor).
- father(terach, haran).
- father(abraham, isaac).
- father(haran, lot).
- father(haran, milcah).
- father(haran, yiscah).
-
- mother(sarah, isaac).
?- father(abraham, isaac).
Yes
13Auswertungsmechanismus
- Prolog sucht eine Auflösungssequenz um eine
Anfrage zu beantworten durch - Backward-Chaining (top-down)
- Tiefensuche
14Beispiel
father(abraham,isaac). father(haran,lot). father(h
aran,milcah). father(haran,yiscah). male(isaac).
male(lot). female(milcah). female(yiscah). son(X
,Y) - father(Y,X), male(X). daughter(X,Y) -
father(Y,X), female(X).
?- son(X,abraham).
father(abraham,X),male(X).
Xisaac male(isaac).
Output Xisaac
15Rücksetzen
- Problem
- Bei der Unifikation innerhalb einer Resolution
einer Anfrage tritt ein Fehler auf - Lösung
- Rückschritt zum letzten Punkt an dem Prolog eine
Auswahl treffen musste - Rückgängigmachen der Variablenbindungen
- Nächste Klausel auswählen
16Rücksetzen
father(abraham,isaac). father(haran,lot). father(h
aran,milcah). father(haran,yiscah). male(isaac).
male(lot). female(milcah). female(yiscah). son(X
,Y) - father(Y,X), male(X). daughter(X,Y) -
father(Y,X), female(X).
?- daughter(X,haran)?
father(haran,X),female(X).
Xlot female(lot).
Xmilcah female(milcah).
Xyiscah female(yiscah).
No
Output Xmilcah
Output Xyiscah
17Beispiel member
- member(X, XXs).
- member(X, YYs) - member(X, Ys).
?- member(X, 1,2,3).
?- member(X, 2,3).
X1
?- member(X, 3).
X2
X3
18Beispiel append
- append(, Ys, Ys).
- append(XXs, YS, XZs) - append(Xs, Ys, Zs).
?- append(a,b,c,d,a,b,c,d).
?- append(b,c,d,b,c,d).
?- append(,c,d,c,d).
Yes
19Beispiel last
- last(X, X).
- last(YYs, X) - last(Ys, X).
?- last(1,2,3, X).
?- last(2,3, X).
?- last(3, X).
X3
Alternative last(List, Last) - append(_,
Last, List).
20Evaluation arithmetischer Ausdrücke
- built-in Prädikat is/2
- nimmt eine Variable und ein Term als Argumente
- berechnet den Term
- und bindet die Variable an den berechneten Term
- falls linkes Argument keine Variable Vergleich
- Fehlermeldung wenn im rechten Argument eine
ungebundene Variable steht
21Beispiele
- 5 is 23 Yes
- X is 23 X5
- X is Y3 Fehler
- Unterschied X 23 Unifikation
22Beispiele
- if_then_else if P then Q else R
- Intuitiv
- if_then_else(P, Q, R) - P, Q.
- if_then_else(P, Q, R) - not P, R.
-
- if_then_else(P, Q, R) - P, Q.
- if_then_else(P, Q, R) - R.
- Lösung mit Cut
- if_then_else(P, Q, R) - P, !, Q.
- if_then_else(P, Q, R) - R.
ineffizient
falsch
23built-in Prädikat cut ( ! )
- Idee Suchbäume stutzen um unnötige
Berechnungen zu vermeiden - 2 Arten
- grüne cuts schneiden Suchbäume weg, die nicht
zur Lösung beitragen Effizienssteigerung - rote cuts schneiden Suchbäume weg, die Lösungen
enthalten - Bedeutung des Prog. wird geändert
- meistens Programmierfehler
24Negation
- Implementierung mit cut
- not(X) - X, !, fail.
- not(X).
- Unterscheiden von Fehlschlagen und Erfolg einer
Berechnung - Beispiel alle Elemente einer Liste ? 3
- ?- member(X, 1,2,3,4), not(X3).
25Problem mit built-in Prädikaten
- Der Programmierer muss über die Resolution
nachdenken - Es besteht also keine deklarative Semantik mehr
- Falsche Reihenfolge führt zu Fehlern
- Beispiele
?- X is Y3, Y 2.
?- Y 2, X is Y3.
X 5
Fehler
X 1 X 2 X 4
?- member(X, 1,2,3,4), not(X3).
?- not(X3), member(X, 1,2,3,4).
No.
26freeze
freeze(X, Goal).
- Die Ausführung eines Ziels kann verzögert werden,
bis die Variable X gebunden wird - Somit kann z. B. die Problematik von einigen
built-in Prädikaten behoben werden
?- freeze(Y,(X is Y3)), Y 2.
X 5
?- freeze(X, not(X3)), member(X, 1,2,3,4).
X 1 X 2 X 4
27N-Dame-Problem
- Auf einem N x N Schachbrett sollen N Damen so
angeordnet - werden, dass sie sich nicht gegenseitig schlagen
können
1
2
Lösung 2,4,1,3
3
4
28N-Dame-Problem
- queens(N,Qs) - range(1,N,Ns), permutation(Ns,Qs),
safe(Qs). - range(M,N,MNs) - M lt N, M1 is M1,
range(M1,N,Ns). - range(N,N,N).
- permutation(Xs,ZZs) - select(Z,Xs,Ys),
permutation(Ys,Zs). - permutation(,).
- safe(QQs) - safe(Qs), not(attack(Q,Qs)).
- safe().
- attack(X,Xs) - attack(X,1,Xs).
- attack(X,N,YYs) - X is YN.
- attack(X,N,YYs) - X is Y-N.
- attack(X,N,YYs) - N1 is N1, attack(X,N1,Ys).
29Zusammenfassung
- deklarative Programmiersprache
- Suche eingebaut
- sehr effiziente Techniken für Rück-setzen und
Unifikation - fehlende Typen
- keine Module
- problematische Arithmetik
- spezifische Kontrollmechanismen
30Anwendungen
- Automatisierte Beweise
- Expertensysteme
- Computerlinguistik
- Rapid Prototyping
- ...
31Literatur
- Kowalski, R. Algorithm Logic Control,
Communication of the ACM 22, pp.424-436, 1979 - Mitchell, J.C. Concepts in Programming
Languages. 1.Aufl., Cambridge University Press,
2003 - Sterling, L. Shapiro, E. The Art of Prolog. 1.
Aufl., MIT, 1986