Einführung in Prolog
Literatur
➲
Clocksin/Mellish Programming in Prolog
➲
Skript aus dem Kurs Max Hadersbeck
➲
Skript aus dem Kurs Hans Leiss
➲
Bratko Prolog Programming for Artificial Intelligence
➲
Prolog Lexikon im Web
http://www.cse.unsw.edu.au/~billw/prologdic
t.html
Einführung in Prolog
Kurzcharakteristik:
Prolog steht für Programming in Logic. Entwickelt in den 70er Jahren von Colmerauer.
Ein Programm in einer logischen Programmiersprache ist eine Sammlung von Formeln. Die Auswertungsstrategie gehört nicht zum Programm sondern ist in der Sprache selbst implementiert.
Schleifenkonstrukte und Variablenzuweisungen sind nur sehr eingeschränkt möglich.
Einmal gebundenen Variablen kann nur über Backttracking ein neuer Wert zugewiesen werden.
Kursübersicht
➲
Sitzung 1: 18.Oktober
Tutorial = Kapitel1 Clocksin/Melish
➲
Sitzung 2: 25.Oktober
Syntax Überblick = Kapitel2 Clocksin/Melish
➲
Sitzung 3: 8.November
➲
Listen und Rekursive Suche = Kapitel2
Skript Max Hadersbeck, Abarbeitung Prolog
= Kapitel 3 Hadersbeck
➲
Sitzung 4: 15.November
Listen und Rekursive Suche = Kapitel3
Clocksin/Melish
Kursübersicht
➲
Sitzung 5 22.November
Akkumulatoren und Differenzlisten=Kapitel 3 Clocksin/Melish/ + Kapitel 2/4 Hadersbeck
➲
Sitzung 6 29.November
Cut Prädikat = Kapitel 4 Clocksin/Melish
➲
Sitzung 7 6.Dezember
Input/Output = Kapitel 5 Clocksin/Melish, Skript Hadersbeck
➲
Sitzung 8 13.Dezember
Builtin Prädikate = Kapitel 6 + Hadersbeck
➲
Sitzung 9 20.Dezember
Aufgaben und Datenstrukturen = Kapitel 7
Organisatorisches
➲
Klausur I: Montag, 07.Februar 2011. Stoff der Vorlesung. 90 Minuten für alle. v.a.
Theorie und Fragen zu Programmen.
➲
Klausur II: Dienstag, 08. Februar 2011.
90 Minuten, nicht für Informatik Bachelor Studenten. Stoff sind die Aufgaben der
Übung, praktischer Teil, selbstständig
Programme auf dem Blatt schreiben
können.
Organisatorisches II
➲
Übung Dienstag von 12-14 Uhr.
Besprochen werden die Übungsaufgaben bzw. zusätzliche Aufgaben
➲
Abgabetermin für Aufgaben per Webseite:
Montag 8.00 Uhr
➲
Aufgaben werden von allen Bachelor
CL/SLK CL Magister Studenten korrigiert;
müssen jedoch nicht gemacht werden.
➲
Webseite:
http://www.cis.uni-munehnchen.de/kurse/ws_10/prolog
Ziel der Veranstaltung
Erlernen der Grundlagen der Programmiersprache Prolog Selbstständiges Schreiben von Programmen
Fähigkeit ein grösseres Prologsystem zu verstehen, insbesondere als Voraussetzung des Kurses im 4. Semester, CL2
Ein kurzes Tutorial zu Prolog
Prolog ist eine Sprache mit der man Probleme von Objekten und deren Beziehungen beschreiben kann. Die Programme definieren Eingaben für den Ablaufalgorithmus. Probleme werden deklarativ dargestellt. Rekursion spielt eine grosse Rolle. Klarheit über den Abarbeitungsmechanismus ist unverzichtbar.
Einerseits Stärke. Auch komplexe Programme v.a. Im Bereich der Sprachmodellierung, der Beweismodellierung und der strategischen Planung können implementiert werden. Andererseits problematisch, da man die Programme kaum übersehen kann (unvorhersehbare
Seiteneffekte von Änderungen) und kooperatives Programmieren sehr schwer ist.
Elemente eines Prolog Programms
Prolog ist eine Programmiersprache um z.T. für andere Sprachen sehr schwierige Probleme zu lösen.
Hauptmerkmal: Backtracking Algorithmus schon implementiert Deklariere Fakten über Objekte und ihre Beziehungen
Definiere Regeln über Objekte und ihre Beziehungen Stelle Fragen über Objekte und ihre Beziehungen
Beispiel Schwestern: zwei Menschen sind Schwestern wenn beide weiblich sind und sie dieselben Eltern haben.
Es handelt sich um eine Definition und nicht darum alle Aspekte abzubilden die mit dem Begriff „Schwester“ verbunden sind.
Einführungsbeispiel
Fakten Fragen Konjunktionen Regeln
Natürlichsprachlich: John gehört das Buch
Objekt1: John Objekt2: Buch
Eigentum: gerichtete Relation zwischen Objekten
Pseudoformale Beschreibung des Schwesternbeispiels
Zwei Menschen sind Schwestern wenn Sie weiblich sind und dieselben Eltern haben.
X=weiblich, Eltern(X,E1,E2), Y=weiblich, Eltern(Y,E1,E2).
',' wird in Prolog für die Konjunktion 'Λ' verwendet; das ist
später sehr wichtig für die Variablenbindung d.h. Nur die Konjunktion stellt hier sicher dass die Variablen E1 und E2 in beiden Teilklauseln für dasselbe stehen
Elemente eines Prologprogramms
Deklarieren von Fakten Objekte, Beziehungen Definieren von Regeln Objekte, Beziehungen
Stellen von Fragen
Objekte Beziehungen
Programmieren: Stelle Fakten und Regeln in einem oder mehreren Programmen bereit
Programmablauf: Eine Frage setzt Inferenzen von einem Fakt zum anderen von einer Regel zur
anderen in Gang
Fakten
In jedem Prologbuch, auch in der formalen Semantik:
likes(john, mary).
Namen aller Beziehungen und Objekte beginnen mit Kleinbuchstaben
Relation wird nach vorne geschrieben, Präfix
Objekte der Relation werden kommasepariert in runden Klammern angeordnet
Punkt am Ende eines Fakts
Namen zwischen Klammern, die Objekte bezeichnen heissen Argumente
Name der Relation vor der Klammer heisst Prädikat
likes : Prädikat
john, mary: Argumente
Prolog Fakten
likes: Prädikat mit zwei Argumenten nämlich john und mary Namen für Prolog beliebig, Zahl der Argumente beliebig
Kollektion von Fakten und Regeln wird auch Datenbank (database) genannt.
Achtung: john und John sind verschieden. mary und marry auch.
Prolog Fragen
Eine Frage sieht in Prolog aus wie ein Fakt mit einem speziellen führenden Symbol:
?:- owns(john, house).
Prolog nimmt das Fragesymbol zum Anlass seine Datenbank zu durchsuchen. Es sucht Fakten, die mit dem Fakt der Frage matchen.
?:- likes(john,mary).
?:- likes(mary,john).
Prolog Match
Suche einen Fakt in der Datenbank der mit der Frage matcht.
Wann gibt es einen Match
Prädikate müssen gleich sein. Achtung Spelling!
Argumente müssen gleich sein. Achtung Ordnung! Achtung Spelling!
Findet Prolog einen Fakt der mit der Frage matcht:
yes.
sonst
no.
Beispieldatenbank
Datenbank:
likes (joe, fish).
likes (joe, mary).
likes (mary,book).
likes (john,book).
Anfragen:
?- likes(joe,money).
?- likes(mary, joe).
?- likes(mary,book).
?- likes(marry,book).
?- king(john,france).
Beispieldatenbank
Datenbank:
likes (joe, fish).
likes (joe, mary).
likes (mary,book).
likes (john,book).
Anfragen:
?- likes(joe,money). no. /*Prädikat matcht, Anzahl Argumente, aber zweites Argument nicht */
?- likes(mary, joe). no. /*Prädikat matcht, Anzahl Argumente, aber Ordnung der Argumente stimmt nicht. Scheitert schon am ersten Argument*/
?- likes(mary,book). yes /*Prädikat, Argumentzahl und Argumente */
?- likes(marry,book). no /* mary = mary ? no */
?- king(john,france). no /* scheitert schon beim Prädikat */
Was bedeutet 'no'
no heisst, kein match mit der Frage. no ≠ falsch.
no heisst nicht beweisbar gegeben die Datenbank.
human(socrates).
human(aristoteles).
athenian(socrates).
?- athenian(socrates). yes.
?- athenian(aristoteles). no.
?- greek(socrates). no.
Aus unserer unvollständigen Datenbank können wir nicht
die reale Geschichte beweisen!
Fragen allgemeinerer Natur
Bislang diskutierte Fragen nicht so interessant. Wir bekommen dieselbe Information zurück, die wir hineingetan haben.
Frage allgemeinerer Natur: Welche
Objekte mag Mary Does Mary like X.
?- likes(mary,X).
Variablennamen beginnen in Prolog mit einem Grossbuchstaben.
Benutzt Prolog eine Variable, so kann diese instantiert sein oder nicht.
Instantiert heisst: ein Objekt ist an die Variable
gebunden, für das die Variable steht.
Frage mit einer Variable
Prolog sucht durch alle Fakten um Dinge zu finden, die Mary mag.
likes(mary,flowers).
likes(mary,john).
likes(mary,mary).
likes(paul,mary).
?- likes(mary,X).
yes. X=flowers.
Beim Durchsuchen der Datenbank erlaubt Prolog der Variable mit jedem anderen Argument an der gleichen Position im Fakt zu
matchen.
Prolog sucht top down. Findet ein Prädikat likes, matcht mary und instantiert X mit flowers. Alles matcht also yes.
Ausgabe mehrerer Lösungen
Nach einem Match markiert Prolog die entsprechende Stelle in der Datenbank. Durch Eingabe des Strichpunktes ' ; ' wird eine neue Suche ausgelöst.
Prolog kehrt in die Datenbank zurück und sucht ab der letzten Markierung topdown.
So findet es die anderen Lösungen.
X=john X=mary
Konjunktionen
Do John and Mary like eachother?
zwei Fragen: mag John Mary und mag Mary John. In Prolog zwei goals verbunden durch die Konjunktion ' , '.
?-likes(john, mary), likes(mary, john) In unserer Datenbank: no
Kombination von Variablen und Konjunktionen
likes(mary,food).
likes(mary,wine).
likes(john,wine).
likes(john,mary).
Gibt es etwas das sowohl john als auch mary mögen?
Informal: irgendein X das mary mag Λ john mag X.
?- likes(mary,X), likes(john,X).
Erfülle das erste Ziel, versuche das zweite Ziel zu erfüllen.
!Im Backtrackingprozess hat jedes Ziel seinen eigenen Placemarker!
Kombination von Variablen und Konjunktionen
likes(mary,food). ↵ placemarker goal 1 likes(mary,wine). ↵ placemarker goal 1 likes(john,wine).
likes(john,mary).
?- likes(mary,X), likes(john,X).
Erstes Ziel erfüllt, X wird mit food instantiert: X=food, placemarker gesetzt
Zweites Ziel: likes (john, food). X Unifikation. fail
Backtracking: gehe unter den placemarker von goal 1 und versuche dieses anders zu erfüllen.
Erstes Ziel erfüllt, X wird mit wine instantiert: X=wine
Zweites Ziel wird: likes(john,wine). X Unifikation. Dritter Fakt matcht.
Beide Ziele der Konjunktion erfüllt. Gesamte Anfrage: yes, X=wine Erzwungenes Backtraking: ' ; '
Bottom up: Fakt 4 matcht nicht, Versuch goal 1 anders zu lösen (resolve); keine weitere Möglichkeit goal 1 zu lösen also no.
Programm im trace Betrieb
?- consult('goalsconjunctions.pl').
% goalsconjunctions.pl compiled 0.00 sec, 240 bytes true.
?- trace.
true.
[trace] ?- likes(mary,X),likes(john,X).
Call: (7) likes(mary, _G901) ? creep Exit: (7) likes(mary, food) ? creep Call: (7) likes(john, food) ? creep Fail: (7) likes(john, food) ? creep
Redo: (7) likes(mary, _G901) ? creep Exit: (7) likes(mary, wine) ? creep Call: (7) likes(john, wine) ? creep Exit: (7) likes(john, wine) ? creep X = wine ;
Redo: (7) likes(john, wine) ? creep Fail: (7) likes(john, wine) ? creep false.
Variableninstantierung in Zielkonjunktionen
1. Ziel Fakt
likes(mary,X) likes(mary,wine)
2. Ziel
likes(john,X)
Sobald eine Variable instantiert wird hier mit wine wird sie an allen Stellen instantiert, also auch im zweiten Ziel.
Variableninstantierung:
Backtracking
Resatisfy: uninstantiere alle Variablen, die in dem Ziel instantiert
wurden das durch ' ; ' auf andere Art gelöst werden soll. Dasselbe gilt für Teilziele die durch Backtracking rückwärts zu Alternativen
gezwungen werden.
Dies ist gerade der Vorteil von Prolog: so eine Buchhaltung selbst zu Programmieren ist durchaus anspruchsvoll.
Regeln
John mag alle Menschen
Lösung 1: schreibe separate Fakten für alle Personen in der Datenbank
Lösung 2: verallgemeinere zu John mag jedes Objekt, gegeben das Objekt ist ein Mensch.
Prolog Regeln drücken aus, dass ein Fakt von einer Gruppe anderer Fakten abhängt.
Regeln
John mag jeden der Wein mag.
John likes X if X likes wine
In Prolog besteht eine Regel aus einem Kopf und einem Rumpf verbunden durch ' :- '
likes(john, X) :- likes(X, wine).
Ein heikler john:
likes(john, X) :- likes(X, wine), likes(X,food).
Achtung Variableninstantierung: Variablen werden komplett
instantiert vom Kopf bis zum Rumpf. Dies ist später sehr wichtig weil so über Regelaufrufe auch Variablen beim Aufrufer instantiert werden.
Regeln Beispiel
likes(mary,food).
likes(jane,wine).
likes(mary,wine).
likes(john,X) :- likes(X, wine), likes(X,food).
?- likes(john, X).
Regeln Beispiel
[trace] ?- consult('EXAMPLES/vl1.2_rules.pl').
% EXAMPLES/vl1.2_rules.pl compiled 0.00 sec, 120 bytes true.
[trace] ?- likes(john,X).
Call: (6) likes(john, _G1284) ? creep Call: (7) likes(_G1284, wine) ? creep Exit: (7) likes(jane, wine) ? creep
Call: (7) likes(jane, food) ? creep Fail: (7) likes(jane, food) ? creep
Redo: (7) likes(_G1284, wine) ? creep Exit: (7) likes(mary, wine) ? creep
Call: (7) likes(mary, food) ? creep Exit: (7) likes(mary, food) ? creep Exit: (6) likes(john, mary) ? creep X = mary .
Zusammenfassung
Fakten Objekten zuordnen
Fragen zu Objekten stellen
Variablen benutzen und den Skopus der Variablen sehen
Konjunktionen
Beziehungen in der Form von Regeln repräsentieren
Einführung zum Backtracking
Hausaufgabe
1.Lesen Sie Kapitel 1, Clocksin/Melish
2.Bilden von Arbeitsgruppen, 3er Gruppen sind optimal
3.Schreiben Sie ein Prolog Programm, das die Relation Bruder und Schwester abbildet.