Prolog
Transcription
Prolog
Prolog Vertiefungsmodul Programmiersprachen VM Programmiersprachen - Prolog Florian Kleene Agenda Entstehung und Geschichte Aufbau von Prolog Programmen Fakten Regeln Anfragen Funktionsweise des Interpreters Grundlagen der Logik U ifik ti Unifikation Resolution Backtracking und Cut Prolog in der Praxis Expertensysteme p y Send + More = Money Zusammenfassung und Fazit 1 VM Programmiersprachen - Prolog Einordnung 2 VM Programmiersprachen - Prolog Entstehung und Geschichte N Name „Prolog“ P l “ von franz. f „PROgrammation PRO i en LOGique“ LOGi “ bekannteste logische Programmiersprache Was statt Wie Wie“ deklarativ (wie bspw bspw. SQL) Æ „Was Entwickelt von Alain Colmeraurer und Mitarbeitern am Group d‘Intelligence Artificielle in Marseille Ausgangspunkt war das Frage-Antwort-System - System-Q um 1970 erste Version von Prolog Hauptanwendungsgebiet ist die Künstliche Intelligenz automatisierte Beweise Sprachverarbeitung (Spracherkennung, Texterkennung) E Expertensysteme t t Bildverarbeitung 3 VM Programmiersprachen - Prolog Entstehung und Geschichte Zunächst nur engem Personenkreis bekannt 1981: Japanische Regierung: „Fifth Generation Project“ Prolog als Basissprache für neue Mehrprozessorarchitektur großes finanzielles Budget (400 Mio US$) Æ weltweite Beachtung des Projekts Projekts, Prolog erlangt Bekanntheit Viele verschiedene Systeme Micro-Prolog, Prolog I und II, Turbo-Prolog, SWI-Prolog, IF-Prolog unterschiedliche Syntax, unterschiedliche Built-In Prädikate Utilities: Interpreter Interpreter, Compiler Compiler, Editor Editor, Bugtracker, Bugtracker Built-In-Prädikate Built In Prädikate Konvergenz 1995: ISO Standard (Teil 1) Æ umgesetzt von SWI- und IF-Prolog 2000: ISO Standard (Teil 2) Æ bislang kaum umgesetzt 4 VM Programmiersprachen - Prolog Aufbau von Prolog Programmen Programmierer erstellt mit Editor eine Wissensbasis Wissensbasis (Ausschnitt aus der Realwelt) abgeschlossenes System Fakten Eigenschaften Ei h ft von Objekten Obj kt Beziehungen von Objekten zueinander Regeln g ((Gesetzmäßigkeiten) g ) Programmierer g Benutzerschnittstelle (Prompt) Anfragen Interpreter Ableitung von Anfragen aus der Wissensbasis durch logische Inferenz 5 VM Programmiersprachen - Prolog Benutzer Aufbau von Prolog Programmen - Fakten Fakten immer als eindeutig wahr angesehen Interpretation durch den Nutzer/Programmierer Æ Prolog P l verarbeitet b it t nur Z Zeichenfolgen i h f l Beispiele: p student(florian). % Florian ist Student. vater(reinhold,florian).% Interpretation, wer ist wessen Vater? kind(verheiratet(doris,reinhold),florian). ( ( , ), ) % Struktur Allgemeine Struktur: f kt ::= funktor. fakt f kt | funktor({argument,}* f kt ({ t }* argument). t) Konstanten beginnen mit einem Kleinbuchstaben Variablen beginnen mit einem Großbuchstaben oder Unterstrich Kommentare durch % eingeleitet, oder durch /* … */ eingeschlossen Abschluss jeder Zeile durch einen Punkt 6 VM Programmiersprachen - Prolog Aufbau von Prolog Programmen - Regeln Regeln machen Wissensbasis übersichtlicher ermöglichen Inferenz (Schlussfolgerung) Beispiel „Jeder Student interessiert sich für Informatik“: Lösung 1: student(florian). student(philipp). interesse(florian,informatik). interesse(philipp,informatik). Lösung 2: student(florian). student(philipp). % viele weitere Studenten interesse(X,informatik) :- student(X). % eine einzige Regel Allgemeine Struktur: regel ::= kopf :- rumpf. ::= fakt :- {struktur,}* struktur. Kopf erfüllt, falls alle Bedingungen des Rumpfs erfüllbar sind 7 VM Programmiersprachen - Prolog Aufbau von Prolog Programmen - Anfragen Ä i l Äquivalent zu „Hello H ll World“ W ld“ ist i „Stammbaum“ S b “ in i Logik L ik % Wissenbasis mensch(florian). h(fl i ) mensch(thomas). % … vater(reinhold,florian). % … mutter(doris florian) mutter(doris,florian). % … elternteil(X,Y) :- vater(X,Y). elternteil(X,Y) :- mutter(X,Y). vorfahre(X,Y) , :- elternteil(X,Y). , vorfahre(X,Y) :elternteil(Z,Y),vorfahre(X,Z). 8 VM Programmiersprachen - Prolog Aufbau von Prolog Programmen - Anfragen N Nutzung d der Programme P d durch h Anfragen A f am Prompt P Beispielanfragen: p g ?- vater(hermann,reinhold). true. ?- elternteil(reinhold,florian). true. ?- mensch(tobias). false. false ?- vorfahre(X,reinhold). X=hermann; X=katharina; false. ? vorfahre(doris,Y). ?vorfahre(doris Y) Y=florian; Y=thomas; false. 9 VM Programmiersprachen - Prolog Aussagenlogik Grundlagen der Logik Beispielformel: a ∧ (¬b ∨ c ) ∧ b Kontradiktion: für keine Belegung erfüllt. Bsp.: a ∧ ( ¬b ∨ b ) Tautologie: für alle Belegungen erfüllt erfüllt. Bsp Bsp.:: ( ¬a ∨ a ) Hornklausel Disjunktion (Oder-Verknüpfung) von Literalen höchstens ein Term in nicht negierter Form vorhanden Bsp : a, ( ¬a ∨ b ), Bsp.: ) (¬a ∨ ¬b ∨ c )), (¬a ∨ ¬b ∨ ¬c ) Hornformel (spezielle KNF) Konjunktion (Und-Verknüpfung) von Hornklauseln Fakt: genau ein nicht-negiertes Literal Regel: Kopf: nicht-negiert, Rumpf: alle Literale negiert Anfrage: alle Literale negiert 10 VM Programmiersprachen - Prolog Unerfüllbarkeitstest Eliminierung von Literalen durch Schlussfolgerung Bsp.: (a ∨ b ) ∧ ( ¬b ∨ c ) ⇒ (a ∨ c ) ( ¬a → b ) ∧ ( b → c ) ⇒ ( ¬ a → c ) Ergebnis bei Anwendung auf Kontradiktion: leere Klausel (Widerspruch) Markierungsalgorithmus ermöglicht effiziente Prüfung exponentielle Laufzeit wird verhindert p Grund: Hornformeln Anfragen negierte Anfrage der Wissensbasis hinzufügen wenn Herleitung g der leeren Klausel möglich: g Æ Widerspruch (Kontradiktion) Æ nicht negierte Anfrage ist Tautologie, also beweisbar 11 VM Programmiersprachen - Prolog Unerfüllbarkeitstest - Beispiel Programm {e, c,(d ← e ),(b ← c, d ),(a ← b )} ⇒ {e, c,(d ∨ ¬e ),(b ∨ ¬c ∨ ¬d ),(a ∨ ¬b )} Anfrage ← a ⇒ ¬a Abarbeitungsfolge ( ← a ) ∧ (a ← b ) (← b ) ∧ (b ← c ∧ d ) (← c ∧ d ) ∧ c ( ← d ) ∧ (d ← e ) (← e ) ∧ e ← 12 VM Programmiersprachen - Prolog leere Klausel (Widerspruch) Æ also Anfrage bewiesen Grundlagen der Logik Problem: Aussagenlogik sieht keine Funktoren vor Problem: Variablen vater ( X , florian ) Æ kein Wahrheitswert zugeordnet Bindung durch Quantoren nötig Variablen V i bl in i Wissensbasis: Wi b i implizit i li it allquantifiziert ll tifi i t Variablen in Anfragen: implizit existenzquantifiziert Lösung: Übergang zur Prädikatenlogik erster Ordnung Anwendung des Unerfüllbarkeitstests zunächst Eliminierung von Existenzquantoren durch Skolemisierung ∀Y : ∃X : mann(Y ) → lieben(Y , X ) ⇔ ∀Y : mann(Y ) → lieben(Y , fs (Y )) anschließend: Weglassen der Allquantoren und Unerfüllbarkeitstest 13 VM Programmiersprachen - Prolog Unifikation Beweis von einfachen Anfragen aus der Wissensbasis Suche nach Prädikat mit gleichem Funktor + Stelligkeit üb i ti d Fakt, F kt übereinstimmende üb i ti d St kt Æ Matching M t hi übereinstimmender Struktur (Kopf einer Regel) Æ Unifikation + Resolution Beispiele: Zwei Konstanten ?- =(florian, ? (florian, florian). % true Konstante und (ungebundene) Variable ?- =(florian, X). % X=florian Struktur und (ungebundene) Variable ?- =(mensch(florian), X). % X=mensch(florian) Zwei Variablen ?- =(X,Y). % X und Y stehen für den selben Wert Zwei Strukturen ?- =(eltern(X,doris),eltern(reinhold,doris)). % X=reinhold 14 VM Programmiersprachen - Prolog Resolution Schlussfolgerungsmechanismus nötig für die Auswertung von Regeln Resolution einer Anfrage g und einer Regel g ergibt g neue, wahrheitsäquivalente Anfrage Beispielanfrage: % relevanter Teil der Wi Wissensbasis: l t T il d b i ?- vorfahre(reinhold,thomas). vater(reinhold,thomas). true. elternteil(X,Y) :- vater(X,Y). vorfahre(X,Y) f h (X Y) :- elternteil(X,Y). lt t il(X Y) Ablauf 15 1. vorfahre(reinhold,thomas). UND vorfahre(X,Y):-elternteil(X,Y). Æ elternteil(reinhold,thomas). 2. elternteil(reinhold,thomas). UND elternteil(X,Y):-vater(X,Y). Æ vater(reinhold,thomas). 3. vater(reinhold,thomas). UND vater(reinhold,thomas). Æ true. VM Programmiersprachen - Prolog SLD-Resolution Abarbeitungsreihenfolge von Anfragen Anfragen: von links nach rechts Wissensbasis: von oben nach unten Æ prozedurale Arbeitsweise (unerwünscht in reiner Logik) Beispielanfrage: B i i l f beweisbar(egal). Æ unendliche Schleife Æ obwohl als Fakt vorhanden % Wissensbasis: beweisbar(X) :- zirkel(X). zirkel(Y) ( ) :- beweisbar(Y). ( ) beweisbar(egal). Häufige Fehlerquelle in Programmen Rekursiv definierte Prädikate wichtig: erst Abbruchbedingung, dann rekursive Prädikatsdefinition einzige Möglichkeit Schleifen in Prolog zu erzeugen 16 VM Programmiersprachen - Prolog Backtracking und Cut Backtracking wenn Interpreter in „Sackgasse Backtracking, Sackgasse“ geraten Suche nach alternativen Beweismöglichkeiten Variableninstanziierungen gemacht g werden rückgängig g ggg Beispielanfrage: ( , ) ?- elternteil(doris,florian). true. % relevanter Teil der Wissensbasis: mutter(doris,florian). mutter(doris florian) elternteil(X,Y) :- vater(X,Y). elternteil(X,Y) :- mutter(X,Y). Vorgehensweise 1. 2. 3. 17 elternteil(doris,florian). UND elternteil(X,Y):-vater(X,Y). Æ vater(doris,florian). g Schritt Æ Backtracking elternteil(doris,florian). UND elternteil(X,Y):-mutter(X,Y). Æ mutter(doris,florian). mutter(doris,florian). UND mutter(doris,florian). Æ true. VM Programmiersprachen - Prolog Backtracking und Cut Cut (Prolog Prädikat: !) verhindert Backtracking gezielt Programmierer greift aktiv in Lösungssuche ein Effizienzsteigerung durch Änderung Ä der Suchreihenfolge Nachbildung von if-then-else wird möglich In Literatur kontrovers diskutiert Befürworter: Optimierungspotential Gegner: prozedurale Komponente, die dem Charakter der logischen Programmiersprache total entgegensteht Charakterisierung des Prolog Interpreters Prinzipien der Uninfikation und Resolution verwendet Ti f Tiefensuche, h Backtracking, B kt ki C t Cut 18 VM Programmiersprachen - Prolog Prolog in der Praxis - Expertensysteme Experten durch Maschine ersetzen, weil Problemstruktur für Menschen zu komplex (Behörden) lt A f ll it ti (E t zu teuer) t ) seltene Ausfallsituation (Experten nur geringe Anzahl an Experten weltweit verfügbar Prolog ermöglicht regelbasierte Expertensysteme Programmierer g und Experten p erstellen zusammen die Wissensbasis Programmschnittstellen ermöglichen Zugang zu externem Wissen Grundgerüst für alle Expertensysteme identisch (leere Shells) Æ strikte t ikt Trennung T von Wissen Wi und d Wissensverarbeitung Wi b it dynamische Änderung der Wissensbasis zur Laufzeit Æ Differenzierung g zwischen g generellem Wissen und Fallwissen 19 VM Programmiersprachen - Prolog Prolog in der Praxis – Send + More = Money I % Wissensbasis perm([],[]). perm(Liste,[X|Perm]) :- select(X,Liste,Rest),perm(Rest,Perm). select(X,[X|Rest],Rest). l t( [ | t] t) select(X,[Kopf|Liste],[Kopf|Rest]) :- select(X,Liste,Rest). generiere(S,E,N,D,M,O,R,Y) g ( , , , , , , , ) :perm([S,E,N,D,M,O,R,Y,_,_],[1,2,3,4,5,6,7,8,9,0]). gleichung(S,E,N,D,M,O,R,Y) :- (S*1000+E*100+N*10+D*1) + (M*1000+O*100+R*10+E*1) =:= (M*10000+O*1000+N*100+E*10+Y*1) (M*10000+O*1000+N*100+E*10+Y*1). loese :- generiere(S,E,N,D,M,O,R,Y), gleichung(S,E,N,D,M,O,R,Y),not(M=:=0),!, write(M),write(O),write(N),write(E),write(Y). Anfrage: ?- loese. ? loese 10652 true. 20 VM Programmiersprachen - Prolog Prolog in der Praxis – Send + More = Money II Mi i l Minimalversion i Wissensbasis besteht aus einer Zeile Code Built In Prädikats permutation(_,_) t ti ( ) Nutzung des Built-In % Wissensbasis loese :l permutation([S,E,N,D,M,O,R,Y,_,_],[1,2,3,4,5,6,7,8,9,0]), (S*1000+E*100+N*10+D)+(M*1000+O*100+R*10+E) =:=(M*10000+O*1000+N*100+E*10+Y), =:=(M*10000+O*1000+N*100+E*10+Y) not(M=:=0), % M soll nicht 0 sein !, % Nur eine Lösung write(M),write(O),write(N),write(E),write(Y).% it (M) it (O) it (N) it (E) it (Y) % Ausgabe A b der d Lösung Lö Anfrage ?- loese. loese 10652 true. 21 VM Programmiersprachen - Prolog Zusammenfassung und Fazit Stärken Code-Änderung dynamisch zur Laufzeit Æ Lernfähigkeit Korrektheitsbeweise möglich (nähe zur Mathematik) Schwächen im Vergleich zu imperativen oder objektorientierten Sprachen: langsamere Ausführungsgeschwindigkeit trotz Cut keine einheitlichen Standards trotz ISO Norm arithmetische Operationen „schwierig“ zu realisieren Fazit Fifth Generation Projekt 1992 als gescheitert erklärt Trend zu Mehrprozessorsystemen als neue Chance für Prolog?! „Either it [the Fifth Generation Project] was a failure, or it was ahead of its time“ 22 VM Programmiersprachen - Prolog Literatur F. Belli: Einführung in die logische Programmierung mit Prolog, Bibliograsches Institut Mannheim, 1986. F. Belli: Prolog-Systeme in der Praxis, Mannheim, 1988. Wilhelm Bolkart: Programmiersprachen der 4. und 5. Generation, Hamburg,1987. p g g in Prolog, g, William F. Clocksin,, Christopher S. Mellish: Programming Springer,2003. R. Cordes, R. Kruse, H. Langendörfer, H. Rust: Prolog: Eine methodische Einführung, Vieweg, 1990. Hans Kleine Büning, Stefan Schmittgen: Prolog: Grundlagen und Anwendungen, Teubner, 1988. Esther König, König Roland Seifert: Grundkurs Prolog für Linguisten Linguisten, UTB Linguistik,1989. Uwe Schöning: Logik für Informatiker, Spektrum 2000. Spektrum, 2000 Dr. Stuart E. Savory: Expertensysteme: Nutzen für Ihr Unternehmen, R. Oldenbourg Verlag, 1989. 23 VM Programmiersprachen - Prolog Markierungsalgorithmus Programm F = ( ¬a ∨ ¬ b ∨ ¬d ) ∧ ¬ e ∧ ( ¬ c ∨ a ) ∧ c ∧ b ∧ ( ¬ g ∨ d ) ∧ g ) W h h it t f l 64 Zeilen Z il Wahrheitstafel: g g Markierungsalgorithmus 1. Schritt: c, b, g markiert 2. Schritt: a,, d markiert Ausgabe: unerfüllbar, da (a ∧ b ∧ d → 0) folgt, wobei a, b, d markiert sind 24 VM Programmiersprachen - Prolog