• Keine Ergebnisse gefunden

Einführung in Prolog

N/A
N/A
Protected

Academic year: 2022

Aktie "Einführung in Prolog"

Copied!
34
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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

(2)

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.

(3)

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

(4)

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

(5)

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.

(6)

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

(7)

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

(8)

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.

(9)

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.

(10)

Einführungsbeispiel

Fakten Fragen Konjunktionen Regeln

Natürlichsprachlich: John gehört das Buch

Objekt1: John Objekt2: Buch

Eigentum: gerichtete Relation zwischen Objekten

(11)

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

(12)

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

(13)

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

(14)

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.

(15)

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

(16)

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.

(17)

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

(18)

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 */

(19)

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!

(20)

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.

(21)

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.

(22)

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

(23)

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

(24)

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!

(25)

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.

(26)

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.

(27)

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.

(28)

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.

(29)

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.

(30)

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.

(31)

Regeln Beispiel

likes(mary,food).

likes(jane,wine).

likes(mary,wine).

likes(john,X) :- likes(X, wine), likes(X,food).

?- likes(john, X).

(32)

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 .

(33)

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

(34)

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.

Referenzen

ÄHNLICHE DOKUMENTE

Erinnerung: Terme stehen nur für sich selbst Daher Gleichungen wie 4 = 1 + 3 nicht erfüllbar Daher: Spezielles Rechenprädikat Term is Term. Rechte Seite darf nur Arithmetik und

Konsultieren Sie die Datei anschließend mit F9 erneut und prüfen Sie durch geeignete Fragestellung mit phrase('Satz',…, ob die Grammatik korrekt arbeitet. f) Erweitern Sie

clause(H,B) Es wird nach einer Klausel gesucht, deren Kopf mit H und deren Koerper mit B unifizierbar ist.... Programmierkurs Prolog, SS 1998

2. Ist L leer, so melde einen Fehlschlag. Stellt n einen Zielknoten dar, so melde Erfolg und liefere den Pfad vom Startknoten zu n... 4. Anderenfalls entferne n aus L und

Antwort: Weil der Flur nass ist und wenn das Bad trocken ist, dann ist das Problem in der Küche. Wenn das Problem in der Küche ist und kein Wasser von draußen gekommen ist, dann ist

• Klauseln werden static kompiliert, wenn nicht explizit durch dynamic/1 anders gewünscht...

Kontextfreie Sprachen werden durch Grammatiken beschrieben, die aus einer Menge von Regeln der Form. N --> V1,

  Compound terms unify if their functors and components unify.. We also say