Logische Programmierung Prolog Proseminar Programmiersprachen WS 20032004 Jochen

  • Slides: 31
Download presentation
Logische Programmierung: Prolog Proseminar Programmiersprachen WS 2003/2004 Jochen Frey Betreuer: Prof. Dr. Gert Smolka

Logische Programmierung: Prolog Proseminar Programmiersprachen WS 2003/2004 Jochen Frey Betreuer: Prof. Dr. Gert Smolka Jochen Frey Logische Programmierung: Prolog

Übersicht Jochen Frey Logische Programmierung: Prolog 2

Übersicht Jochen Frey Logische Programmierung: Prolog 2

Deklarative Programmierung • Zwei Interpretationen: – Prozedurale Interpretation: „Wie wird etwas berechnet ? “

Deklarative Programmierung • Zwei Interpretationen: – Prozedurale Interpretation: „Wie wird etwas berechnet ? “ – Deklarative Interpretation: „Was wird berechnet ? “ • Logische Programmierung ist deklarative Programmierung mit Prädikatenlogik Jochen Frey Logische Programmierung: Prolog 3

Geschichte von Prolog • Entwickelt 1970 (Kowalski, Colmerauer) • PROrammieren in LOGik • Beeinflusste

Geschichte von Prolog • Entwickelt 1970 (Kowalski, Colmerauer) • PROrammieren in LOGik • Beeinflusste viele Entwicklungen: – 5 th Generation Project – Deductive Databases – Constraint Logic Programming Jochen Frey Logische Programmierung: Prolog 4

Terme • Grundlegende Datenstruktur in Prolog • Grammatik: Jochen Frey <Term> <ETerm> : :

Terme • Grundlegende Datenstruktur in Prolog • Grammatik: Jochen Frey <Term> <ETerm> : : = <Variable> | <ETerm> : : = <Zahl> | <Symbol(Term, …, Term)> <Fakt> : : = <ETerm> <Regel> : : = <ETerm : - ETerm, …, ETerm> Logische Programmierung: Prolog 5

Logische Programme : = Folge von Klauseln (Fakten und Regeln) H : - B

Logische Programme : = Folge von Klauseln (Fakten und Regeln) H : - B 1, …, B 2 Regelkopf Deklarative Semantik H erfüllt, fall sowohl B 1 als auch B 2 erfüllt werden können Regelkörper Prozedurale Semantik H erfüllt, falls zuerst B 1 und dann B 2 erfüllt werden können Für die Abarbeitung von Prolog-Programmen wird den Programmklauseln eine prozedurale Semantik unterstellt Jochen Frey Logische Programmierung: Prolog 6

Beispiel: Biblische Familie father(terach, abraham). father(terach, nachor). father(terach, haran). father(abraham, isaac). father(haran, lot). father(haran,

Beispiel: 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). male(terach). male(abraham). male(nachor). male(haran). male(isaac). male(lot). Fakten female(sarah). female(milcah). female(yiscah). son(X, Y) : - father(Y, X), male(X). daughter(X, Y) : - father(Y, X), female(X). Regeln Jochen Frey Logische Programmierung: Prolog 7

Anfragen ? - father(abraham, isaac). • Prolog prüft nun, ob die Anfrage eine logische

Anfragen ? - father(abraham, isaac). • 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: Yes Jochen Frey Logische Programmierung: Prolog 8

Unifikation Lösen von Gleichungen zwischen Termen durch Unifikation: – finden einer Substitution s zwischen

Unifikation Lösen von Gleichungen zwischen Termen durch Unifikation: – finden einer Substitution s zwischen Termen t 1 und t 2, mit s(t 1) = s(t 2) – allgemeinste Lösung wird als allgemeinster Unifikator bezeichnet Jochen Frey Logische Programmierung: Prolog 9

Ein Unifikations-Algorithmus 1. f(s 1, …, sn) = f(t 1, …, tn) 2. f(s

Ein Unifikations-Algorithmus 1. f(s 1, …, sn) = f(t 1, …, tn) 2. f(s 1, …, sn) = g(t 1, …, tm), mit f≠g ersetzen durch s 1=t 1, …, sn=tn Fehler 3. x=x löschen 4. t=x, wobei t keine Variable ist ersetzen durch x=t 5. x=t, wobei x nicht in t aber woanders vorkommt Substitution {x/t} anwenden 6. x=t, wobei x in t vorkommt und x≠t Fehler Jochen Frey Logische Programmierung: Prolog 10

Beispiele • father(X, isaac) father(abraham, Y) X=abraham Y=isaac • Y father(X, isaac) Y=father(X, isaac)

Beispiele • father(X, isaac) father(abraham, Y) X=abraham Y=isaac • Y father(X, isaac) Y=father(X, isaac) • father(haran, lot) father(abraham, isaac) nicht unifizierbar • father(X, isaac) mother(sarah, isaac) nicht unifizierbar Jochen Frey Logische Programmierung: Prolog 11

Beispiel: Biblische Familie Datenbasis father(terach, abraham). father(terach, nachor). father(terach, haran). father(abraham, isaac). father(haran, lot).

Beispiel: Biblische Familie Datenbasis father(terach, abraham). father(terach, nachor). father(terach, haran). father(abraham, isaac). father(haran, lot). father(haran, milcah). father(haran, yiscah). Anfrage ? - father(abraham, isaac). Antwort Yes mother(sarah, isaac). Jochen Frey Logische Programmierung: Prolog 12

Auswertungsmechanismus • Prolog sucht eine Auflösungssequenz um eine Anfrage zu beantworten durch: – Backward-Chaining

Auswertungsmechanismus • Prolog sucht eine Auflösungssequenz um eine Anfrage zu beantworten durch: – Backward-Chaining (top-down) – Tiefensuche Jochen Frey Logische Programmierung: Prolog 13

Beispiel father(abraham, isaac). father(haran, lot). father(haran, milcah). father(haran, yiscah). ? - son(X, abraham). father(abraham,

Beispiel father(abraham, isaac). father(haran, lot). father(haran, milcah). father(haran, yiscah). ? - son(X, abraham). father(abraham, X), male(X). male(isaac). male(lot). female(milcah). female(yiscah). X=isaac male(isaac). Output: X=isaac son(X, Y) : - father(Y, X), male(X). daughter(X, Y) : - father(Y, X), female(X). Jochen Frey Logische Programmierung: Prolog 14

Rücksetzen Problem: Bei der Unifikation innerhalb einer Resolution einer Anfrage tritt ein Fehler auf

Rü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 Jochen Frey Logische Programmierung: Prolog 15

Rücksetzen father(abraham, isaac). father(haran, lot). father(haran, milcah). father(haran, yiscah). ? - daughter(X, haran)? father(haran,

Rücksetzen father(abraham, isaac). father(haran, lot). father(haran, milcah). father(haran, yiscah). ? - daughter(X, haran)? father(haran, X), female(X). male(isaac). male(lot). female(milcah). female(yiscah). X=lot female(lot). X=milcah female(milcah). X=yiscah female(yiscah). No Output: X=milcah Output: X=yiscah son(X, Y) : - father(Y, X), male(X). daughter(X, Y) : - father(Y, X), female(X). Jochen Frey Logische Programmierung: Prolog ; 16

Beispiel: member(X, [X|Xs]). member(X, [Y|Ys]) : - member(X, Ys). ? - member(X, [1, 2,

Beispiel: member(X, [X|Xs]). member(X, [Y|Ys]) : - member(X, Ys). ? - member(X, [1, 2, 3]). Jochen Frey X=1 ? - member(X, [2, 3]). ; X=2 ? - member(X, [3]). ; X=3 Logische Programmierung: Prolog 17

Beispiel: append([], Ys). append([X|Xs], YS, [X|Zs]) : - append(Xs, Ys, Zs). ? - append([a,

Beispiel: append([], Ys). append([X|Xs], YS, [X|Zs]) : - append(Xs, Ys, Zs). ? - append([a, b], [c, d], [a, b, c, d]). ? - append([b], [c, d], [b, c, d]). ? - append([], [c, d]). Yes Jochen Frey Logische Programmierung: Prolog 18

Beispiel: last([X], X). last([Y|Ys], X) : - last(Ys, X). ? - last([1, 2, 3],

Beispiel: last([X], X). last([Y|Ys], X) : - last(Ys, X). ? - last([1, 2, 3], X). ? - last([3], X). X=3 Alternative: last(List, Last) : - append(_, [Last], List). Jochen Frey Logische Programmierung: Prolog 19

Evaluation arithmetischer Ausdrücke built-in Prädikat is/2: • nimmt eine Variable und ein Term als

Evaluation 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 Jochen Frey Logische Programmierung: Prolog 20

Beispiele • 5 is 2+3 • X is 2+3 Yes X=5 • X is

Beispiele • 5 is 2+3 • X is 2+3 Yes X=5 • X is Y+3 Fehler Unterschied: X = 2+3 Unifikation Jochen Frey Logische Programmierung: Prolog 21

Beispiele if_then_else: „if P then Q else R“ Intuitiv: if_then_else(P, Q, R) : -

Beispiele 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. ineffizient if_then_else(P, Q, R) : - P, Q. if_then_else(P, Q, R) : - R. falsch Lösung mit Cut: if_then_else(P, Q, R) : - P, !, Q. if_then_else(P, Q, R) : - R. Jochen Frey Logische Programmierung: Prolog 22

built-in Prädikat cut („ ! “) Idee: Suchbäume „stutzen“ um unnötige Berechnungen zu vermeiden

built-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 Jochen Frey Logische Programmierung: Prolog 23

Negation • Implementierung mit cut: not(X) : - X, !, fail. not(X). • Unterscheiden

Negation • 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(X=3). Jochen Frey Logische Programmierung: Prolog 24

Problem mit built-in Prädikaten • Der Programmierer muss über die Resolution nachdenken • Es

Problem 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: ? - Y = 2, X is Y+3. ? - member(X, [1, 2, 3, 4]), not(X=3 ). Jochen Frey ? - X is Y+3, Y = 2. X=5 X = 1; X = 2; X=4 Fehler ? - not(X=3), member(X, [1, 2, 3, 4]). Logische Programmierung: Prolog No. 25

freeze(X, Goal). • Die Ausführung eines Ziels kann verzögert werden, bis die Variable X

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 Y+3)), Y = 2. X=5 ? - freeze(X, not(X=3)), member(X, [1, 2, 3, 4]). Jochen Frey X = 1; X = 2; X=4 Logische Programmierung: Prolog 26

N-Dame-Problem Auf einem N x N Schachbrett sollen N Damen so angeordnet werden, dass

N-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 Jochen Frey Logische Programmierung: Prolog 27

N-Dame-Problem queens(N, Qs) : - range(1, N, Ns), permutation(Ns, Qs), safe(Qs). range(M, N, [M|Ns])

N-Dame-Problem queens(N, Qs) : - range(1, N, Ns), permutation(Ns, Qs), safe(Qs). range(M, N, [M|Ns]) : - M < N, M 1 is M+1, range(M 1, N, Ns). range(N, N, [N]). permutation(Xs, [Z|Zs]) : - select(Z, Xs, Ys), permutation(Ys, Zs). permutation([], []). safe([Q|Qs]) : - safe(Qs), not(attack(Q, Qs)). safe([]). attack(X, Xs) : - attack(X, 1, Xs). attack(X, N, [Y|Ys]) : - X is Y+N. attack(X, N, [Y|Ys]) : - X is Y-N. attack(X, N, [Y|Ys]) : - N 1 is N+1, attack(X, N 1, Ys). Jochen Frey Logische Programmierung: Prolog 28

Zusammenfassung • deklarative Programmiersprache • Suche eingebaut • sehr effiziente Techniken für Rücksetzen und

Zusammenfassung • deklarative Programmiersprache • Suche eingebaut • sehr effiziente Techniken für Rücksetzen und Unifikation • fehlende Typen • keine Module • problematische Arithmetik • spezifische Kontrollmechanismen Jochen Frey Logische Programmierung: Prolog 29

Anwendungen • • • Automatisierte Beweise Expertensysteme Computerlinguistik Rapid Prototyping. . . Jochen Frey

Anwendungen • • • Automatisierte Beweise Expertensysteme Computerlinguistik Rapid Prototyping. . . Jochen Frey Logische Programmierung: Prolog 30

Literatur Kowalski, R. : Algorithm = Logic + Control, Communication of the ACM 22,

Literatur 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 Jochen Frey Logische Programmierung: Prolog 31