Einführung in Prolog Copyright © 1999 by Michael Neumann ([email protected])
-
Upload
udo-wojahn -
Category
Documents
-
view
108 -
download
0
Transcript of Einführung in Prolog Copyright © 1999 by Michael Neumann ([email protected])
Einführung in PrologEinführung in Prolog
Copyright © 1999 by Michael Neumann ([email protected])
PROLOG
PROgramming in LOGic
Für was steht PROLOG?Für was steht PROLOG?
AnwendungsgebieteAnwendungsgebiete
• Expertensystem (Diagnosesystem)
• Relationale Datenbanken
• mathematische Logik
• abstrakte Problemlösungen
• Simulieren des menschlichen Sprachverstehens
• automatischer Entwurf
• Lösung von symbolischen Gleichungen
• Analyse biochemischer Strukturen
• zahlreiche Gebiete der KI
Geschichte der Logischen Geschichte der Logischen ProgrammierungProgrammierung
Die Geschichte der Logischen Programmierung ist nicht sehr lang.Die theoretischen Grundlagen wurden in den 70er Jahren erarbeitet.Der erste Prolog-Interpreter wurde 1972 von Alain Colmerauer in Marseilles geschrieben. Erst Anfang der 80er Jahre kamen die erstenkommerziellen Prolog-Interpreter auf den Markt.Durch die Wahl von PROLOG als Sprache der Rechner der 5. Generation bei einem jap. Forschungsprojekt gelang der weltweite Durchbruch.
Programmlängen-VergleichProgrammlängen-Vergleich
Programmiersprache
FortranCobolAdaPL/I
CPascalBasic
MProlog
Programmgröße in Quellseiten
36252422222019 9
Programmierparadigmen
1. Imperatives Programmieren1. Imperatives Programmieren
Es wird beschrieben, WIE ein bestimmtes Problem gelöst werden soll.
• Assembler
• ADA
• BASIC
• C / C++
• COBOL
• FORTRAN
• Java
• Modula
• PASCAL
• Perl
• PL/1
• Simula
• Smalltalk
• und viele mehr...
2. Funktionales Programmieren2. Funktionales Programmieren
Das Programm ist eine Folge von Funktionen.
• Lisp
• Logo
• Haskell
• ML
• Hope
• Scheme
• Concurrent Clean
• Erlang
• NESL
• Sisal
• Miranda
3. Deklaratives Programmieren3. Deklaratives Programmieren
Es wird beschrieben, WAS das Problem ist, nicht jedoch wie dieses zu lösen ist. Die Lösung muß der Computer finden.
• Prolog
• Goedel
• Escher
• Elf
• Mercury
4. Objektorientiertes Programmieren4. Objektorientiertes Programmieren
Wird in Verbindung mit den drei vorhergehenden Paradigmen verwendet.
•Smalltalk
•Java
•Eiffel
•C++
•Object Pascal
•XLISP
•Haskell
•andere...
Imperativ: Funktional: Deklarativ:
•Bestimmte Versionen von Prolog
•und andere...
Nahezu alle neuen Programmiersprachen sind Nahezu alle neuen Programmiersprachen sind objektorientiert!objektorientiert!
FaktenRegeln
Das Prinzip von Das Prinzip von PROLOGPROLOG
Wissensbasis
Fragen
bilden
Die gestellten Fragen werden aufgrund der Fakten und Regeln (Wissensbasis) durch die Prolog-Interferenzmaschine entweder als beweisbar (yes) oder als nicht beweisbar ausgewertet (no).
FaktenFaktenBeispiele:
• ‘die Sonne scheint‘.
• es_regnet.
• wertvoll(gold).
• männlich(daniel).
• mag(john,mary).
• besitzt(john,gold).
• vater(hans, gabriel).
Schreibweise in Prolog:
• Die Sonne scheint.
• Es regnet.
• Gold ist wertvoll.
• Daniel ist männlich.
• John mag Mary.
• John besitzt Gold.
• Hans ist der Vater von Gabriel.
Natürliche Bedeutung:
FaktenFakten
mag ( john, mary ) .
Prädikat (Funktor)
Argumente
Die Reihenfolge von john und mary ist nicht egal, d.h. es ist ein Unterschied ob man mag(john,mary) oder mag(mary,john) schreibt. Ersteres könnte z.B. „John mag Mary“, das andere „Mary mag John“ bedeuten.
Prolog weiß nicht, was ein Fakt bedeutet. Deshalb muß man selber festlegen was z.B. mag(john,mary) bedeutet.
• Ein Fakt kann beliebig viele Argumente haben.
• Ein Fakt muß mit einem Punkt beendet werden.
• Ein Fakt muß mit einem Kleinbuchstabe oder ‘ beginnen.
Anzahl d. Argumente = Stelligkeit
FaktenFaktenEin Beispiel:
besitzt(john, gold).
besitzt(john, buch).
mag(john, mary).
mag(joe, fisch).
eingegebene Fakten: Fragen an den Prolog-Interpreters:
?- besitzt(john,gold).yes
?- mag(joe, fleisch).no
Um die Frage besitzt(john,gold) beantworten zu können, durchsucht Prolog die Wissensbasis von oben nach unten nach einem passenden Fakt, und wird in der 1. Zeile fündig. Darum antwortet Prolog mit yes was so viel wie „bewiesen“ bedeutet. Auf die Frage mag(joe,fleisch) antwortet Prolog mit no, was „nicht beweisbar“ bedeutet, da es keinen passenden Fakt finden kann.
VariablenVariablen
besitzt(john, gold).
besitzt(john, buch).
mag(john, mary).
mag(joe, fisch).
Wissensbasis:
Um festzustellen, was John besitzt, kann man die Frage besitzt(john,X) stellen. X ist dabei eine Variable.Prolog antwortet dabei mit folgendem:
X = gold X = buch
Variablen beginnen mit einem Großbuchstaben oder Unterstrich .
_ ist eine anonyme Variable. Bei dem Beispiel oben, würde _ anstatt X folgendes bedeuten: Besitzt John etwas? (Antwort: yes).
RegelnRegeln
Beispiel:
Mary mag jeden, der Wein mag. mag(mary,X) :- mag(X,wein).
Regeln drücken die Abhängigkeit eines Faktums von einem oder mehreren anderen Fakten aus.
bruder(X,Y) :- männlich(X), eltern(X,A,B), eltern(Y,A,B).
X ist der Bruder von Y.
X ist dann der Bruder von Y, wenn X männlich ist und X und Y die gleichen Eltern A und B haben.
Beispiel:
RegelnRegelnDie linke Seite (vor :- ) ist wahr, wenn die rechte Seite bewiesen werden kann.
Ein Komma zwischen zwei Fakten auf der rechten Seite entspricht einer logischen UND-Verknüpfung. Ein Semikolon entspricht einer ODER-Verknüpfung. Es kann geklammert werden.
Die UND- bzw. ODER-Verknüpfungen können auch bei Fragen angewendet werden.
Mit not kann verneint werden.
Die Regeln werden auch Horn-Klauseln genannt.
ArithmetikArithmetikBeispiel: Berechnen der Fakultät
fak(0,1).
fak(N,X) :- N > 0, M is N - 1, fak(M,Y), X is N * Y.
?- fak(0,N).
N = 1
FUNCTION fak(N : Integer) : Integer;BEGIN
IF N = 0 THEN fak := 1ELSE IF N > 0 THEN fak := N * fak(N-1);
END;
Aufruf: ?- fak(6,N).
N = 720
ArithmetikArithmetikBeispiel: Berechnen der Fibonacci Folge
fib(0,1).
fib(1,1).
fib(N,X) :- N1 is N - 1, N2 is N - 2, fib(N1,X1), fib(N2,X2), X is X1 + X2.
?- fib(11,N).
N = 144
Aufruf: ?- fib(4,N).
N = 5
ArithmetikArithmetik
+ - * / Addition, Subtraktion, Multiplikation, Divisionmod Modulo// ^ Gleitzahl-Division, Potenzierung( ) Prioritätis Zuweisen eines arith. Ausdruckes> < größer, kleiner=> =< größer gleich, kleiner gleich (zuerst = dann > !)=:= gleich (arithmetisch)=\= ungleich (arithmetisch)
Infix: (4 + 1)*4 Postfix: *(4,+(4,1))
Elemente von PrologElemente von Prolog
1. Atome:
Atome fangen mit einem Kleinbuchstaben an oder bestehen aus Sonderzeichen. In ‘ eingeschlossene Zeichen oder Buchstaben sind auch Atome.Beispiele für Atome: blah123 --> ‘Hallo‘
2. Variablen:
Variablen beginnen mit einem Großbuchstaben oder einem Unterstricht.Beispiele für Variablen: Blah123 _123_hundert
3. Integer-Konstanten:
z.B.: 1234 888888844
ListenListen
Listen werden durch eckige Klammern definiert. Listen können Elemente mit unterschiedlichen Typen aufnehmen.
[ 1,2,3,4,5 ]
[1 | [2 | [3 | [4]]]]
[ vater, ‘Hallo‘, 1, 3, mag(john,mary) ]
[ 1, [2,3,4], 5] verschachtelte Liste
[] leere Liste
[ Head | Tail ] = [ 1,2,3,4 ]
Head = 1
Tail = [ 2,3,4 ]
[ X, Y, Z ] = [ 1, 2, 3]X = 1Y = 2Z = 3
Unifizierung(Pattern-Matching)
ListenListenBestimmen der Länge einer Liste:
list_length( [], 0 ).list_length( [H | T], N ) :- list_length(T,M), N is M + 1.
Zählen eines Elements einer Liste:
count_element( [], Element, 0).count_element( [H|T], Element, Anzahl) :-
H = Element, count_element(T, Element, X), Anzahl is X + 1.count_element( [H|T], Element, Anzahl) :-
count_element(T, Element, Anzahl).
Prüfen ob Element in Liste vorhanden ist:
member(E, [E|T]).member(E, [H|T) :- member(E,T).
ListenListenZwei Listen verknüpfen:
concat([], L, L).concat([H|T], L, [H|NeueListe] ) :- concat(T,L,NeueListe).
Eine in “ eingeschlossene Zeichenkette, ist eine Liste aus Zeichen, ein String.
StrukturenStrukturen
zeitpunkt(datum(16,5,1999),uhrzeit(18,30)).
(Zusammengesetzte Terme)
buch( autor(clocksin,mellish), titel(‘Programmieren in PROLOG‘) ).
cd( band(metallica), titel(‘Load‘), dauer(67) ).cd( band(metallica), titel(‘Reload‘), dauer(72) ).
?- cd( band(metallica), titel(X), _ ). Gibt alle Titel von Metallica aus.
zeitpunkt(16,5,1999,18,30).
buch( clocksin, mellsih, ‘Programmieren in PROLOG‘ ).
Beispiel für BacktrackingBeispiel für Backtrackingmaennlich( john ).maennlich( george ).
ist_vater_von( george, mary ).ist_vater_von( george, john ).ist_vater_von( harry, sue ).ist_vater_von( edward, george ).
ist_sohn_von(X,Y) :- ist_vater_von(Y,X), maennlich(X).
?- ist_sohn_von(X,Y).
X = johnY = george
X = georgeY = edward
Wenn ein Ziel (Goal) nicht erfüllt werden kann, dann wird der Fakt links neben dem Gescheitertem nach einem alternativen Ausgang geprüft.
SWI-PrologSWI-Prolog% ist ein Zeilenkommentar
Starten einer Wissensbasis:• Doppelklick auf Datei, oder• consult(DATEI). im Interpreter eingeben, wobei DATEI z.B. für
‘C:/Prolog/x.pl‘ steht oder wenn x.pl geladen werden soll und sich im Standardverzeichnis befinden, dann reicht consult(x).
Mit halt. wird der Interpreter beendet.
Bei mehreren möglichen Ausgängen (siehe letzte Seite), wird nach jeder Ausgabe gewartet. Drücke ; (Semikolon) wenn der nächste Ausgang angezeigt werden soll, oder RETURN wenn nichts weiter angezeigt werden soll.
SWI-PrologSWI-Prolog
read(X). Liest von der Tastatur (oder Datei) in Xwrite(X). Schreibt X auf den Bildschirm (oder Datei).get(Ascii). Liest Zeichen von Tastatur (Datei) in Ascii.put(Ascii). Schreibt Zeichen Ascii auf Bildschirm (Datei).nl. Neue Zeile.tab(N). Schreibt N Leerzeichen.
tell(DATEI). Öffnet Datei (überschreiben, erstellen).told(DATEI). Schließt Datei.append(DATEI). Öffnet Datei zum anhängen von Daten.
true immer beweisbarfail nicht beweisbar
Programmbeispiele für Programmbeispiele für funktionale Sprachenfunktionale Sprachen
fun iter (a,b) = if a <= b then (print(Int.toString(a*a)^" "); iter(a+1,b) ) else print "\n";
iter(1,10);
fun iter 0 = ""| iter n = (iter(n-1); print(Int.toString(n*n)^" "); "\n");
print(iter 10);
(print "Hello World")
(let ( (a 0) ) (while (< a 20) (princ a) (princ " ") (setq a (+ a 1)) ))
EndeEnde
Homepagehttp://www.s-direktnet.de/homepages/neumann/index.htm
Copyright © 1999 by Michael Neumann