• Keine Ergebnisse gefunden

Prolog by example

N/A
N/A
Protected

Academic year: 2022

Aktie "Prolog by example"

Copied!
18
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Prolog by example

Carsten Rösnick

(2)

Was ist Prolog?

Programmation en Logique (1970er)

Nutzer erstellt Datenbasis

Definiert, was gilt in seinem Universum

Closed-world assumption

Inferenz

(3)

Grundlagen (1)

Ein erstes Beispiel:

v(a). v(b). v(c). Fakten (facts)

e(a,b). e(b,c). Fakten (facts)

t(X,Y) :- e(X,Z), e(Z,Y). Regeln (goals)

Konstantensymbole: a,b,c

Funktions-/Relationssymbole: v,e,t

Variablen: X,Y

(4)

Grundlagen (2)

t(X,Y) :- e(X,Z), e(Z,Y).

Regeln (goals)

Konjunktion in Regeln: Komma “,”

Disjunktion in Regeln: Semikolon “;”

Fakt- und Regelende: Punkt “.”

(5)

Grundlagen (3): Quantoren

Regel:

p(X,Y) :- (q(X,Z), q(Z,Y)); q(Y,Z).

Z ist frei in p → Z Existenz-quantifiziert

X,Y gebunden in p → X,Y All-quantifiziert

Regeln mit gleicher Conclusio

= Disjunktion der Prämissen

t(X,Y) :- p(X), q(Y).

t(X,Y) :- r(X,Y).

x y zQxzQzy∨Qyz Pxy

xyPxQy∨ RxyTxy

(6)

Ausführen von Prolog Programmen

Unterstellen Nutzung von GNU Prolog [1]

Fakten und Regeln in Textdatei data.pro sammeln

Datenbasis data.pro in Prolog-Programm übersetzen mit gplc data.pro

Programm ausführen: ./data

Anfragen stellen: weitere Lösungen mit ;+Enter,

alle Lösungen mit a+Enter

?- predicate(a,b,X).

X=c;

X=d

(7)

Beispiel: n! Berechnen (1)

Vordefinierte Struktur: ganze Zahlen (arithmetische Ausdrücke)

Erster (merkwürdiger) Versuch:

factorial(1) :- 1.

factorial(N) :- N*factorial(N-1).

Problem 1: Merkwürdige Vermischung von Syntax, Semantik und Wahrheitswert der Interpretation.

Lösungsidee:

factorial(0,1).

factorial(N,R) :- factorial(N-1,R1), R=N*R1.

(8)

Beispiel: n! Berechnen (2)

Problem 2: Endlosrekursion

Grund (Auswertungsbaum) am Bsp. factorial(2,R): factorial(2,R).

factorial(2-1,R).

factorial(2-1-1,R).

factorial(2-1-1-1,R).

...

Lösungsidee:

factorial(N,R) :-

N1 is N-1, factorial(N1,R1), R is N*R1.

(9)

Beispiel: n! Berechnen (3)

Merke: Auswertung arithmetischer Ausdrücke stets mit Y is X, auch um Endlosrekursion zu vermeiden

Problem 3: Endlosrekursion (cont.)

factorial(2,R).

N1 is 2-1.

factorial(1,R).

N1 is 1-1.

factorial(0,R).

N1 is 0-1.

factorial(-1,R).

...

(10)

Beispiel: n! Berechnen (4)

Lösung (final):

factorial(0,1).

factorial(N,R) :-

N > 0,

N1 is N-1,

factorial(N1,R1), R is N*R1.

(11)

Warum löst das unser Problem?

Und: Warum haben wir das “Problem”

überhaupt?

→ Prolog's Suchstrategie: Backtracking

Auch: Prolog Auswertungsbaum

Erst Regeln in der Reihenfolge ihres Auftretens in der Datenbasis probieren

Dann Teilformeln innerhalb einer Regel von

links nach rechts versuchen zu verifizieren

(12)

Nochmal Rekursion (1)

Auswertungsbaum Grund dafür, dass Reihenfolge relevant ist. Beispiel dafür:

parent(a,b). parent(b,c).

ancestor(A,B) :- parent(A,B).

ancestor(A,B) :- ancestor(X,B), parent(A,X).

Zwei Lösungsideen. Lösungsidee 1:

Menschen definieren:

human(a). human(b). human(c).

ancestor(A,B) :-

human(X), ancestor(X,B), parent(A,X).

(13)

Nochmal Rekursion (2)

ancestor(A,B) :- parent(A,B).

ancestor(A,B) :- ancestor(X,B), parent(A,X).

ancestor(b,a).

parent(b,a). fail

ancestor(X1,a), parent(b,X1).

parent(b,a). fail

ancestor(X2,a), parent(X1,X2), parent(b,X1).

parent(X1,a), parent(b,X1).

... fail

ancestor(X3,a), parent(X2,X3), parent(X1,X2), parent(b,X1).

...

(14)

Nochmal Rekursion (3)

Lösung(sidee 2): tail recursion (good practice!)

Rekursiv vorkommendes Prädikat stets als letzten Term der Konjunktion angeben

Kurz: Rekursionsanfang stets vor Rekursionsschritt

ancestor(A,B) :- parent(A,X), ancestor(X,B).

→ spart hier sogar die eigenhändige Angabe der Menschen (human(-) Fakt)

(15)

not/1-Prädikat in GNU Prolog

not ist kein vordefiniertes Prädikat

Mögliche Definition:

not(X) :- \+ call(X).

Vordefinierte Negation \+

Closed-world assumption

Weitere Möglichkeit:

not_f(f(X)) :- f(X), !, fail.

(16)

Lösen von Rätseln:

Türme von Hanoi

Signatur der Regel:

move(

Anzahl Scheiben, Startstab A,

Zielstab B, Hilfsstab C).

Abbildung: Lösungsstrategie Türme von Hanoi [4]

(17)

Ausblick

[ ...für kommendes Semester, nicht für FGdI :) ]

Cut-Operator

(hier ist Vorsicht geboten!)

zur Auswertungssteuerung

Listen

Auf Präfix einer Liste prüfen

Listenelemente Zählen (mit/ohne Duplikaten)

Listen umdrehen

Ein-/Ausgabeoperationen

im Hanoi-Beispiel gesehen

(18)

Referenzen

[1] GNU Prolog Website: http://www.gprolog.org/

[2] Eine Einführung in Prolog und die logische

Programmierung (.ppt), Mala Bachmann, 2001.

[3] http://www.csupomona.edu/~jrfisher/www/

prolog_tutorial/contents.html

[4] http://www.mathematik.uni-ulm.de/

sai/ss03/prog/Aufgaben/blatt04/

Referenzen

ÄHNLICHE DOKUMENTE

Palaestrio, Sklave des Theopropides...Christoph Kampleitner, 7p Messenio, Sklave des Theopropides...Rafael Denkmayr, 7p Theoprópides, Vater des Philolaches...Vanja Baker,

Lilli steht auf ihrem rechten Fuß und hebt ihre rechte Hand hoch. Emma steht auf ihrem linken Fuß und hebt ihre linke

Copyright: H-Faktor GmbH, Niekao Lernwelten, Dortmund Verantwortlich für den Inhalt: Udo Kiel Autorin: Jana Bredemeier, Zeichnungen: cliparts2go Niekao Lernwelten ® 07/2012 ;

Der grüne Kegel steht zwischen dem roten und dem gelben Kegel, wobei der Gelbe links und der Rote rechts steht.. Der rote Kegel steht links vom grünen Kegel und der gelbe Kegel

Ziehe Linien von den Gegenständen an an folgende Stellen: (Wenn du Lust hast, kannst du die Kärtchen auch ausschneiden und an die richtige Stelle legen).. Markiere das Ziel mit

Wie viele Personen gehen nach links und wie viele Personen gehen nach rechts?. Rechts

• Keywords: Programmierparadigma, deklaratives Programmieren, Wissensbasis (Klauseln), Klauseln (Fakten, Regeln, Anfragen), Regeln (Regelkopf, Regelkörper), Prädikate, Terme

In weiteren Schrit- ten soll der Verhältniswert zwi- schen aktuellem Rentenwert (Ost) und dem Westwert jedes Jahr um 0,7 Prozentpunkte angehoben werden, bis der