Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "Logische Programmierung: Prolog Proseminar Programmiersprachen WS 2003/2004 Jochen Frey Betreuer: Prof. Dr. Gert Smolka."—  Präsentation transkript:

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

2 Jochen FreyLogische Programmierung: Prolog2 Übersicht

3 Jochen FreyLogische Programmierung: Prolog3 Deklarative Programmierung Zwei Interpretationen: –Prozedurale Interpretation: Wie wird etwas berechnet ? –Deklarative Interpretation: Was wird berechnet ? Logische Programmierung ist deklarative Programmierung mit Prädikatenlogik

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

5 Jochen FreyLogische Programmierung: Prolog5 Terme Grundlegende Datenstruktur in Prolog Grammatik: ::= | ::=

6 Jochen FreyLogische Programmierung: Prolog6 Logische Programme := Folge von Klauseln (Fakten und Regeln) RegelkopfRegelkörper H :- B 1, …, B 2 Deklarative SemantikProzedurale 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

7 Jochen FreyLogische Programmierung: Prolog7 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). Fakten Regeln male(terach). male(abraham). male(nachor). male(haran). male(isaac). male(lot). female(sarah). female(milcah). female(yiscah).

8 Jochen FreyLogische Programmierung: Prolog8 ?- father(abraham, isaac). 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: Yes

9 Jochen FreyLogische Programmierung: Prolog9 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

10 Jochen FreyLogische Programmierung: Prolog10 Ein Unifikations-Algorithmus 1.f(s 1, …, s n ) = f(t 1, …, t n )ersetzen durch s 1 =t 1, …, s n =t n 2.f(s 1, …, s n ) = g(t 1, …, t m ), mit fgFehler 3.x=xlöschen 4.t=x, wobei t keine Variable istersetzen durch x=t 5.x=t, wobei x nicht in t aber woanders Substitution vorkommt{x/t} anwenden 6.x=t, wobei x in t vorkommt und xtFehler

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

12 Jochen FreyLogische Programmierung: Prolog12 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). ?- father(abraham, isaac). DatenbasisAnfrageAntwort Yes

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

14 Jochen FreyLogische Programmierung: Prolog14 Beispiel ?- son(X,abraham). father(abraham,X),male(X). 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). X=isaac male(isaac). Output: X=isaac

15 Jochen FreyLogische Programmierung: Prolog15 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

16 Jochen FreyLogische Programmierung: Prolog16 Rücksetzen ?- daughter(X,haran)? 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). father(haran,X),female(X). X=lot female(lot). X=milcah female(milcah). X=yiscah female(yiscah). NoOutput: X=milcahOutput: X=yiscah ;

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

18 Jochen FreyLogische Programmierung: Prolog18 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

19 Jochen FreyLogische Programmierung: Prolog19 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).

20 Jochen FreyLogische Programmierung: Prolog20 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

21 Jochen FreyLogische Programmierung: Prolog21 Beispiele 5 is 2+3Yes X is 2+3 X=5 X is Y+3Fehler Unterschied: X = 2+3 Unifikation

22 Jochen FreyLogische Programmierung: Prolog22 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) :- 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

23 Jochen FreyLogische Programmierung: Prolog23 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

24 Jochen FreyLogische Programmierung: Prolog24 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).

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

26 Jochen FreyLogische Programmierung: Prolog26 freeze 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(X, Goal). ?- 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

27 Jochen FreyLogische Programmierung: Prolog27 N-Dame-Problem Auf einem N x N Schachbrett sollen N Damen so angeordnet werden, dass sie sich nicht gegenseitig schlagen können Lösung: [2,4,1,3]

28 Jochen FreyLogische Programmierung: Prolog28 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).

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

30 Jochen FreyLogische Programmierung: Prolog30 Anwendungen Automatisierte Beweise Expertensysteme Computerlinguistik Rapid Prototyping...

31 Jochen FreyLogische Programmierung: Prolog31 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


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

Ähnliche Präsentationen


Google-Anzeigen