Prolog-Kurs SomSem 2017 Daniel Beßler/Hagen Langer Prolog – erste Schritte 11.4.2017
Plan der Veranstaltung (1) Grundlagen der Prädikatenlogik (optional und Umfang je nach vorhandenen Vorkenntnissen) Prolog-Einführung Fakten und Regeln Rekursive Definitionen ‚Pure Prolog‘ und prozedurale Erweiterungen Spezielle Programmiertechniken (Differenzlisten etc.) Warren Abstract Machine (WAM)
Prolog-Interpreter http://www.swi-prolog.org/ Wissenbasis mit Prolog als Anfragesprache: http://www.open-ease.org/
Rückblick: Syntax FOL Variablensymbole Prädikatensymbole x, y, z, ... bzw. xi mit i=1,2, ... Prädikatensymbole P, Q, R, ... bzw. Pik, i=1,2, ... k Funktionssymbole f, g, h oder bzw. fik, i=1,2, ... mit Stelligkeit k Funktionssymbole mit Stelligkeit 0 sind Konstanten
Konjunktive Normalform Ein Literal ist eine atomare Formel oder die Negation einer atomaren Formel z.B. A, ¬A oder generell (L1, ¬L2) Eine Klausel ist eine Disjunktion von Literalen z.B. (A B D), (A ¬ B ¬ D) , einzelne Literale sind ebenfalls Klauseln Eine Formel ist in konjunktiver Normalform (KNF, engl. CNF) wenn sie eine Konjunktion von Klauseln ist = (C1 ... Cn) Konjunktion von Klauseln Ci = ( L1i ... L1ki) Disjunktion von Literalen
KNF (2) Theorem Transformation in KNF Zu jeder Formel existiert eine Formel in KNF mit Transformation in KNF Negationen in die Klammern ziehen: Doppelte Negation, de Morgan Disjunktionen in die Klammern ziehen: Distributivität (Kommutativität)
KNF aus der Wahrheitstafel Jede Belegung, die kein Modell ist, entspricht einer Klausel Klausel Negation der Belegungen, die keine Modelle sind, z.B. ¬ (¬ A ¬ B C) ( A B ¬ C) A B C 1 A B ¬ C 1 A ¬ B C 1 A ¬ B ¬ C 1 1 1 1 1 1 1 ¬A ¬B C 1 1 ¬A ¬B ¬C 1 1 1 KNF() = (A B ¬ C) ... (¬A ¬B ¬C )
Horn-Formeln Definition Beispiel Eine Formel in KNF ist eine Horn-Formel, wenn jede Klausel höchstens ein positives Literal enthält Beispiel Horn-Formel (A ¬B) (¬A ¬C D) D ¬E Anschaulicher: (B A) (A C D) (1 D) (E 0) 0 für beliebige unerfüllbare Formel 1 für beliebige Tautologie
Fakten und Regeln: A (Fakt) (A1 A2 An D) (Regel) D :- A1 A2 , An . head, neck, body
Notationskonventionen: Atome: a, b, a1, 'Hier ist alles erlaubt', ... Variablen: A, Abc, _, _3248, ... - “anonyme Variable”: _ Fakten: a(b,c), a(b), - N.B.: a/2 ist verschieden von a/1! b, b(b(c)), ...
Standardbeispiel Verwandtschaftsbeziehungen: /* Exemplarische Prolog-Wissensbasis */ kind_von(klaus, maria). % klaus ist kind von maria usw. kind_von(klaus, martin). weiblich(maria). männlich(klaus). männlich(martin).
Anfragen an eine Wissensbasis kind_von(klaus, maria). kind_von(klaus, martin). weiblich(maria). männlich(klaus). männlich(martin). ?- kind_von(X, Y). X = klaus, Y = maria; X = klaus, Y = martin; no 12
Anfragen an eine Wissensbasis kind_von(klaus, maria). kind_von(klaus, martin). weiblich(maria). männlich(klaus). männlich(martin). mutter(X) :- weiblich(X), kind_von(Y,X). ?-mutter(X). 13
Anfragen an eine Wissensbasis kind_von(klaus, maria). kind_von(klaus, martin). weiblich(maria). männlich(klaus). männlich(martin). mutter(X) :- weiblich(X), kind_von(Y,X). ?-mutter(X). weiblich(X) kind_von(Y,X) X = maria 14
Anfragen an eine Wissensbasis kind_von(klaus, maria). kind_von(klaus, martin). weiblich(maria). männlich(klaus). männlich(martin). mutter(X) :- weiblich(X), kind_von(Y,X). ?-mutter(X). weiblich(X) kind_von(Y,X) X = maria kind_von(Y,maria) 15
Anfragen an eine Wissensbasis kind_von(klaus, maria). kind_von(klaus, martin). weiblich(maria). männlich(klaus). männlich(martin). mutter(X) :- weiblich(X), kind_von(Y,X). ?-mutter(X). weiblich(X) kind_von(Y,X) X = maria kind_von(Y,maria) kind_von(klaus, maria) 16
Rekursive Regeln ?- kind_von(klaus, maria). kind_von(klaus, martin). kind_von(martin, ludwig). vorfahr(X,Y) :- kind(Y,X). kind_von(Y,Z), vorfahr(X,Z). ?- 17
Rekursive Regeln ?- vorfahr(ludwig,klaus). kind_von(klaus, maria). kind_von(klaus, martin). kind_von(martin, ludwig). vorfahr(X,Y) :- kind_von(Y,X). kind_von(Y,Z), vorfahr(X,Z). ?- vorfahr(ludwig,klaus). 18
Rekursive Regeln ?- vorfahr(ludwig,klaus). kind_von(klaus, ludwig) kind_von(klaus, maria). kind_von(klaus, martin). kind_von(martin, ludwig). vorfahr(X,Y) :- kind_von(Y,X). kind_von(Y,Z), vorfahr(X,Z). ?- vorfahr(ludwig,klaus). kind_von(klaus, ludwig) fail 19
Rekursive Regeln ?- vorfahr(ludwig,klaus). kind_von(klaus, ludwig) kind_von(klaus, maria). kind_von(klaus, martin). kind_von(martin, ludwig). vorfahr(X,Y) :- kind_von(Y,X). kind_von(Y,Z), vorfahr(X,Z). ?- vorfahr(ludwig,klaus). kind_von(klaus, ludwig) fail kind_von(klaus,Z) vorfahr(ludwig,Z) Z = maria ... fail Z = martin vorfahr(ludwig, martin) 20
list([X|R]) :- list(R). Listen: [a,b,c], [], [a,X,c], [a|X] [[a],b] list([]). list([X|R]) :- list(R). 21
Listen: ?- member(a,[a,b,c]). yes ?- member(X,[a,b,c]). X = a; ... ?- member(d,[a,b,c]). no ?- member(X,[]). 22
Listen: member(X,[X|R]). member(X,[Y|R]) :- member(X,R). 23
?- append([a],[b,c],[a,b,c,d]). no Listen: ?- append([a,b],[c,d],X). X = [a,b,c,d] ?- append([a],[b,c],[a,b,c,d]). no 24
?- append([a],[b,c],[a,b,c,d]). no Listen: ?- append([a,b],[c,d],X). X = [a,b,c,d] ?- append([a],[b,c],[a,b,c,d]). no append([],X,X). append([X|R],Y,[X|R2]) :- append(R,Y,R2). 25
Manipulation der Wissensbasis in Prolog Einfügen von Fakten oder Regeln in die aktuelle Wissensbasis assert, asserta, assertz Beispiel: ?- weiblich(anne). no ?- assert(weiblich(anne)). yes 26
Manipulation der Wissensbasis in Prolog (2) Entfernen von Fakten oder Regeln aus der aktuellen Wissensbasis retract, retractall Beispiel: ?- weiblich(anne). yes ?- retract(weiblich(anne)). no 27
Manipulation der Wissensbasis in Prolog (3) Enfernen von Fakten oder Regeln aus der aktuellen Wissensbasis retract, retractall Beispiel: ?- assert(weiblich(anne)), assert(weiblich(berta)). yes ?- retractall(weiblich(_)). ?- weiblich(anne). no 28
Manipulation der Wissensbasis in Prolog (4) Laden eines Prolog-Programms (implementationsspezifisch) ?- consult(family). - lädt family.pl ohne Überschreiben yes ?- [family]. - dto. ?- reconsult(family). - lädt family.pl mit Überschreiben ?- listing. - schreibt Wissensbasis 29
Weitere wichtige Builtin-Prädikate ?- halt. - beendet Prolog-Session ?- trace. - Startet Trace-Modus (Debugging) yes ?- notrace. - Beendet Trace-Modus debug, nodebug 30