Download presentation
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
Ähnliche Präsentationen
© 2025 SlidePlayer.org Inc.
All rights reserved.