Einführung in Prolog Copyright © 1999 by Michael Neumann ([email protected])

32
Einführung in Prolog Einführung in Prolog Copyright © 1999 by Michael Neumann ([email protected])

Transcript of Einführung in Prolog Copyright © 1999 by Michael Neumann ([email protected])

Page 1: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

Einführung in PrologEinführung in Prolog

Copyright © 1999 by Michael Neumann ([email protected])

Page 2: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

PROLOG

PROgramming in LOGic

Für was steht PROLOG?Für was steht PROLOG?

Page 3: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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

Page 4: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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.

Page 5: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

Programmlängen-VergleichProgrammlängen-Vergleich

Programmiersprache

FortranCobolAdaPL/I

CPascalBasic

MProlog

Programmgröße in Quellseiten

36252422222019 9

Page 6: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

Programmierparadigmen

Page 7: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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...

Page 8: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

2. Funktionales Programmieren2. Funktionales Programmieren

Das Programm ist eine Folge von Funktionen.

• Lisp

• Logo

• Haskell

• ML

• Hope

• Scheme

• Concurrent Clean

• Erlang

• NESL

• Sisal

• Miranda

Page 9: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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

Page 10: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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!

Page 11: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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).

Page 12: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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:

Page 13: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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

Page 14: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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.

Page 15: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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).

Page 16: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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:

Page 17: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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.

Page 18: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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

Page 19: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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

Page 20: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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))

Page 21: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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

Page 22: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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)

Page 23: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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).

Page 24: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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.

Page 25: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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‘ ).

Page 26: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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.

Page 27: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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.

Page 28: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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

Page 29: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

Programmbeispiele für Programmbeispiele für funktionale Sprachenfunktionale Sprachen

Page 30: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

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);

Page 31: Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

(print "Hello World")

(let ( (a 0) ) (while (< a 20) (princ a) (princ " ") (setq a (+ a 1)) ))