1 / 31

Logische Programmierung: Prolog

Logische Programmierung: Prolog. Proseminar Programmiersprachen WS 2003/2004 Jochen Frey Betreuer: Prof. Dr. Gert Smolka. Übersicht. Deklarative Programmierung. Zwei Interpretationen: Prozedurale Interpretation: „Wie wird etwas berechnet ?“ Deklarative Interpretation:

Anita
Download Presentation

Logische Programmierung: Prolog

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Übersicht 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 Logische Programmierung: Prolog

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

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

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

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

  11. Beispiele • father(X, isaac) father(abraham, Y) • Y father(X, isaac) • father(haran, lot) father(abraham, isaac) • father(X, isaac) mother(sarah, isaac) X=abraham Y=isaac Y=father(X,isaac) nicht unifizierbar nicht unifizierbar 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 Logische Programmierung: Prolog

  13. Auswertungsmechanismus • Prolog sucht eine Auflösungssequenz um eine Anfrage zu beantworten durch: • Backward-Chaining(top-down) • Tiefensuche 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 Logische Programmierung: Prolog

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

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

  19. 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). 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 Logische Programmierung: Prolog

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

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

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

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

  28. 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). Logische Programmierung: Prolog

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

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

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

More Related