Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
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/prologdict.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.OktoberSyntax Überblick = Kapitel2 Clocksin/Melish
➲ Sitzung 3: 8.November➲ Listen und Rekursive Suche = Kapitel2
Skript Max Hadersbeck, Abarbeitung Prolog = Kapitel 3 Hadersbeck
➲ Sitzung 4: 15.NovemberListen 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.NovemberCut Prädikat = Kapitel 4 Clocksin/Melish
➲ Sitzung 7 6.DezemberInput/Output = Kapitel 5 Clocksin/Melish, Skript Hadersbeck
➲ Sitzung 8 13.DezemberBuiltin Prädikate = Kapitel 6 + Hadersbeck
➲ Sitzung 9 20.DezemberAufgaben 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 PrologSelbstständiges Schreiben von ProgrammenFä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 implementiertDeklariere Fakten über Objekte und ihre BeziehungenDefiniere Regeln über Objekte und ihre BeziehungenStelle 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: JohnObjekt2: BuchEigentum: 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, BeziehungenDefinieren von Regeln Objekte, Beziehungen
Stellen von Fragen Objekte Beziehungen
Programmieren: Stelle Fakten und Regeln in einem oder mehreren Programmen bereitProgrammablauf: 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 KleinbuchstabenRelation wird nach vorne geschrieben, PräfixObjekte der Relation werden kommasepariert in runden Klammern angeordnetPunkt am Ende eines FaktsNamen zwischen Klammern, die Objekte bezeichnen heissen ArgumenteName der Relation vor der Klammer heisst Prädikat
likes : Prädikatjohn, mary: Argumente
Prolog Fakten
likes: Prädikat mit zwei Argumenten nämlich john und maryNamen für Prolog beliebig, Zahl der Argumente beliebigKollektion 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).
BeispieldatenbankDatenbank:
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 MaryDoes 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 VariableProlog 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 1likes(mary,wine). ↵ placemarker goal 1likes(john,wine).likes(john,mary).?- likes(mary,X), likes(john,X).Erstes Ziel erfüllt, X wird mit food instantiert: X=food, placemarker gesetztZweites Ziel: likes (john, food). X Unifikation. failBacktracking: gehe unter den placemarker von goal 1 und versuche dieses anders zu erfüllen.Erstes Ziel erfüllt, X wird mit wine instantiert: X=wineZweites Ziel wird: likes(john,wine). X Unifikation. Dritter Fakt matcht. Beide Ziele der Konjunktion erfüllt. Gesamte Anfrage: yes, X=wineErzwungenes 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 bytestrue.?- 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) ? creepX = wine ; Redo: (7) likes(john, wine) ? creep Fail: (7) likes(john, wine) ? creepfalse.
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 DatenbankLö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 wineIn 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 bytestrue.
[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) ? creepX = 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/Melish2.Bilden von Arbeitsgruppen, 3er Gruppen sind optimal3.Schreiben Sie ein Prolog Programm, das die Relation Bruder und
Schwester abbildet.