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

Documents pareils