Einführung in PROLOG
Christian Stocker
Inhalt
● Was ist PROLOG?● Der PROLOG-
Interpreter– Welcher Interpreter?– SWI-Prolog
● Syntax– Einführung– Fakten, Regeln,
Anfragen– Operatoren– Rekursion– Listen– Cut
● Funktionsweise– So arbeitet Prolog– Warrens Abstrakte
Maschine● Codebeispiele● Zusammenfassung
Was ist PROLOG? (1)
● PROLOG = Programming in Logic● 1972 von Alain Colmerauer entwickelt● Keine prozedurale Programmiersprache
sondern eine deklarative mit prozeduralen Elementen
● Nichtlineares Programmieren wird betrieben● „Maschinensprache des Logikprozessors“● Prolog wird Interpretiert● Interpreter erstmals in LISP programmiert
Was ist PROLOG? (2)
● Prolog-Programm besteht nur aus Datenbasis
● Es wird beschrieben, WAS das Problem ist, nicht jedoch wie dieses zu lösen ist
● Arbeitet auf Prädikatenlogik● Prolog-Programm ist Sammlung von
Hornklauseln
Der PROLOG-Interpreter(1)
● SWI-Prolog– Wird hier für Beispiele benützt– Für Windows, Linux und MacOS verfügbar– www.swi-prolog.org
● Gnu-Prolog– Für Constraint Programming besser geeignet– Für Windows und Linux verfügbar– http://pauillac.inria.fr/~diaz/gnu-prolog/
● Qu-Prolog● Minerva● SICStus Prolog
SWI-Prolog(1)
● Leistungsfähiger Prolog-Interpreter● Entwickelt auf Uni Amsterdam● Freeware● Sehr große Bibliothek● Installationen für Windows, Linux und
MacOS verfügbar● Integrierter Debugger● Basiert auf einer eingeschränkten Version
der Warren Abstract Machine
SWI-Prolog(2)
● Start auf Shell mit pl● Prolog-Files mit Texteditor schreiben● Programm im Interpreter öffnen:[name]. Oder consult(name).
● Anfrage aus Interpreter stellen● Interpreter beenden:halt.
● Hilfe mit help(Topic) oder apropos(Topic)
Syntax
● Einführung● Fakten, Regeln, Anfragen● Operatoren● Rekursion● Listen● Cut
Syntax/Einführung
● Prolog Statements werden immer mit Punkt (.) abgeschlossen
● Prädikate und Konstanten werden klein geschrieben
● Variablen beginnen mit Großbuchstaben● Unterscheidung zwischen
– Fakten– Regeln– Anfragen
● Einzeilige Kommentare: % <Comment>● Mehrzeilige: /* <Comment> */
Syntax/ Fakten, Regeln, Anfragen
● Fakten– Beispiel: „John ist männlich“:maennlich(john).
– Beispiel: „John mag Mary“:mag(john,mary).
– Ein Fakt besteht aus einem Prädikat und dessen Argumenten. Die Anzahl der Argumente beschreibt die Stelligkeit
– Ein Fakt kann beliebig viele Argumente haben– Ein Fakt muss immer mit einem Kleinbuchstabe
beginnen
Syntax/ Fakten, Regeln, Anfragen
● Regeln– Regeln drücken die Abhängigkeit eines Faktums
von einem oder mehreren anderen Fakten aus– Bsp: „Mary mag jeden, der Wein mag“mag(mary,X) :- mag(X,wein).
– :- kann als umgedrehter Implikationspfeil gelesen werden
– Die linke Seite ist wahr, wenn die rechte Seite bewiesen werden kann
– X ist eine Variable, mary und wein sind Konstanten
Syntax/ Fakten, Regeln, Anfragen
● Regeln– Ein Komma zwischen zwei Fakten auf der
rechten Seite entspricht einer logischen UND Verknüpfung
– Ein Semikolon entspricht einem logischen ODER– Bsp: eltern(X,Y) :- vater(X,Y); mutter(X,Y).opa(X,Y) :- vater (X,Z), vater(Z,Y).
– Mit not kann eine Klausel verneint werdenmann(X) :- not frau(X).
– Regeln müssen als Hornklauseln formuliert werden.
Syntax/ Fakten, Regeln, Anfragen
● Anfragen– Anfragen werden im Prolog-Interpreter gestellt– Beispiel: „Ist John männlich?“?- maennlich(john).
– Interpreter antwortet mit yes, wenn dies Beweisbar ist.
– Beispiel: „Wen mag Mary?“?- mag(mary,X).Interpreter antwortet mit X=john
– Falls es mehrere Antworten gibt, kann mit 'n' die nächste Antwort angesehen werden.
Syntax/ Fakten, Regeln, Anfragen
● Anfragen– Analog zu den Regeln können auch hier logische
Verknüpfungen angewandt werden.– '_' steht für ein leeres Argument. Hier ist es
sozusagen egal, was an dieser Stelle gilt.– Beispiel: „Wer mag alles irgendjemanden?“?- mag(X,_).
Syntax/Operatoren
● :- Regeloperator● == Gleichheitsoperator● =:= Gleichheitsoperator für Zahlenwerte● \= Ungleichungsoperator● >= Größer/Gleich● =< Kleiner/Gleich● is Zuweisungsoperator für Zahlenwerte● not Verneinung für Klauseln● * / + - Rechenoperationen
Syntax/Rekursion
● Ohne Rekursion– grosselter(X,Y):- elter(X,Z), elter(Z,Y).
– urgrosselter(X,Y):- elter(X,Z), grosselter(Z,Y).
– ururgrosselter(X,Y):- elter(X,Z), urgrosselter(Z,Y).
– urururgrosselter(X,Y):- elter(X,Z),ururgrosselter(Z,Y).
Syntax/Rekursion
● Mit Rekursion– vorfahr(X,Y) :- elter(X,Y).vorfahr(X,Y) :- elter(X,Z), vorfahr(Z,Y).
● Rekursion in Prolog analog zu anderen bekannten Programmiersprachen
Syntax/Listen
● Listen werden durch eckige Klammern definiert. Listen können Elemente mit unterschiedlichen Typen aufnehmen.
● Beispiele:– [1,2,3,4,5]– [1,2,3,[4,5]]– [hugo,'Hallo',4,5,mag(john,mary)]– [] leere Liste– [Head|Tail] = [1,2,3,4]
Head=1Tail=[2,3,4]
Syntax/Listen
● Bestimmen der Länge einer Listelist_length([],0).list_length([H|T],N) :- list_length(T,M),N is M+1.
● Prüfen, ob Element in Liste vorhandenmember(E,[E|T]).member(E,[H,T] :- member(E,T).
● Listen anhängenappend([1,2,3],[4,5],Target).
Syntax/Cut
● Beispiel:loesung(X):-zahl(X),X =:= 2*X-4.zahl(1).zahl(N) :- zahl(M), N is M+1.
● Problem: Programm findet zwar Lösung X=4 aber es termiert nicht.
● Lösung:loesung(X):-zahl(X),X=:= 2*X-4,!.
● Cut verhindert weiteres Backtracking nach gefundener Lösung
Funktionsweise
● So arbeitet PROLOG● Warrens Abstrakte Maschine
So arbeitet PROLOG
● PROLOG vergleicht eine Anfrage der Reihe nach mit den Fakten aus der Datenbasis.
● Eine Variable kann mit jeder Konstante matchen.
● Werden mehrere Ziele benötigt, versucht Prolog erst das erste und schaut, ob das nächste Ziel erfüllt werden kann, ansonsten kommt es zum Backtracking.
● Bsp: ?- elter(daisy,X), maennl(X).Trifft maennl(X) nicht zu, wird X zurückgesetzt und neu belegt.
Warren's abstrakte Maschine
● Prolog wird in einen Zwischencode (ähnl. Java, managed .NET) übersetzt. Dieser Zwischencode wird von der WAM interpretiert und ausgeführt.
● Die WAM ist eine Virtuelle Machine. Es ist somit möglich WAM Code auf jeder Hardware zu betreiben.
● In SWI-Prolog arbeitet eine sehr eingeschränkte WAM.
● Literatur: Warren's Abstract Machine -a tutorial reconstruction
Beispiele
● Ein Familienstammbaum● Einfärben von Flächen● Ein mathematisches Rätsel
Ein Familienstammbaum
Einfärben von Flächen
1 2
4 3Farben rot, blau, gelb für Einfärbung verfügbar
Ein mathematisches Rätsel
ABB - CD = EED- - *
FD + EF = CF= = =
EGD * FH = ???
Zusammenfassung
● Was ist PROLOG?● Der PROLOG-
Interpreter– Welcher Interpreter?– SWI-Prolog
● Syntax– Einführung– Fakten, Regeln,
Anfragen– Operatoren– Rekursion– Listen– Cut
● Funktionsweise– So arbeitet Prolog– Warrens Abstrakte
Maschine● Codebeispiele
Ende
Unterlagen zum Vortrag auf/pub/stud/stud/stockerc/prolog/
(C)2006 Christian Stocker