Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Logische Programmierung: Prolog

Ähnliche Präsentationen


Präsentation zum Thema: "Logische Programmierung: Prolog"—  Präsentation transkript:

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

2 Logische Programmierung: Prolog
Übersicht Jochen Frey Logische Programmierung: Prolog

3 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

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

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

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

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

8 Anfragen 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 Jochen Frey Logische Programmierung: Prolog

9 Logische Programmierung: Prolog
Unifikation 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 Jochen Frey Logische Programmierung: Prolog

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

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

12 Beispiel: 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 Jochen Frey Logische Programmierung: Prolog

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

14 Beispiel father(abraham,isaac). father(haran,lot).
father(haran,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). X=isaac male(isaac). Output: X=isaac Jochen Frey Logische Programmierung: Prolog

15 Logische Programmierung: Prolog
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

16 Rücksetzen father(abraham,isaac). father(haran,lot).
father(haran,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). X=lot female(lot). X=milcah female(milcah). X=yiscah female(yiscah). No Output: X=milcah Output: X=yiscah ; Jochen Frey Logische Programmierung: Prolog

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

18 Beispiel: append append([], Ys, 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],[c,d]). Yes Jochen Frey Logische Programmierung: Prolog

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

20 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

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

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

23 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

24 Logische Programmierung: Prolog
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

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

26 freeze 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]). X = 1; X = 2; X = 4 Jochen Frey Logische Programmierung: Prolog

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

28 Logische Programmierung: Prolog
N-Dame-Problem queens(N,Qs) :- range(1,N,Ns), permutation(Ns,Qs), safe(Qs). range(M,N,[M|Ns]) :- M < N, M1 is M+1, range(M1,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]) :- N1 is N+1, attack(X,N1,Ys). Jochen Frey Logische Programmierung: Prolog

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

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

31 Logische Programmierung: Prolog
Literatur Kowalski, R.: Algorithm = Logic + Control, Communication of the ACM 22, pp , 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


Herunterladen ppt "Logische Programmierung: Prolog"

Ähnliche Präsentationen


Google-Anzeigen