20.03.2014 Aufrufe

Einführung in die Methoden der Künstlichen Intelligenz - Goethe ...

Einführung in die Methoden der Künstlichen Intelligenz - Goethe ...

Einführung in die Methoden der Künstlichen Intelligenz - Goethe ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

5.3 Implementierung logischer Programmiersprachen: Prolog<br />

Beispiel 5.3.1. Nehmen wir an, wir wollen das Prädikat vorfahr(X, Y ) implementieren, das wahr<br />

ist, wenn X e<strong>in</strong> Vorfahre von Y ist (über beliebig viele Generationen h<strong>in</strong>weg). Mit dem bestehenden<br />

Prädikat eltern kann man <strong>die</strong>s <strong>in</strong> Prolog implementieren als:<br />

vorfahr1(X,Z) :- vorfahr1(X,Y),vorfahr1(Y,Z).<br />

vorfahr1(X,Y) :- eltern(X,Y).<br />

Je<strong>der</strong> Aufruf von vorfahr1 (z.B. mit konkreten Werten vorfahr1(karl,maria))<br />

führt direkt zur nicht Term<strong>in</strong>ierung, da mit <strong>der</strong> ersten Klausel<br />

vorfahr1(X,Z) :- vorfahr1(X,Y),vorfahr1(Y,Z). resolviert wird, und im Anschluss<br />

wie<strong>der</strong> usw.<br />

Dreht man <strong>die</strong> Klauseln um, so erhält man:<br />

vorfahr2(X,Y) :- eltern(X,Y).<br />

vorfahr2(X,Z) :- vorfahr2(X,Y),vorfahr2(Y,Z).<br />

Dann erhält man Antworten, aber <strong>die</strong> Suche nach weiteren Antworten führt <strong>in</strong> den nichtterm<strong>in</strong>ierenden<br />

Zweig (nachdem alle Instanziierungen für eltern(X,Y) probiert wurden, wird <strong>die</strong> zweite<br />

Klausel verwendet, <strong>die</strong> dann zur Nichtterm<strong>in</strong>ierung führt).<br />

E<strong>in</strong>e bessere Variante ist:<br />

vorfahr(X,Y) :- eltern(X,Y).<br />

vorfahr(X,Z) :- eltern(X,Y),vorfahr(Y,Z).<br />

Diese term<strong>in</strong>iert stets, da sie stets <strong>die</strong> Relation eltern(X,Y) <strong>in</strong>stanzieren muss: Da es nur endlich<br />

viele solcher Instanziierungen gibt, term<strong>in</strong>iert <strong>die</strong> Suche.<br />

E<strong>in</strong> weiteres Beispiel zeigt, dass man <strong>die</strong> Klauseln nicht immer so anordnen kann, dass<br />

<strong>die</strong> Suche term<strong>in</strong>iert:<br />

Beispiel 5.3.2. Sei p e<strong>in</strong> zweistelliges Prädikat, das symmetrisch und transitiv ist. Wir geben<br />

e<strong>in</strong>ige Fakten an und <strong>die</strong> beiden Eigenschaften:<br />

p(a,b).<br />

p(c,b).<br />

p(X,Y) :- p(Y,X).<br />

p(X,Z) :- p(X,Y),p(Y,Z).<br />

Für <strong>die</strong> Anfrage p(a,c) (<strong>die</strong> offensichtlich true geben sollte) f<strong>in</strong>det Prolog ke<strong>in</strong>e Anwort (son<strong>der</strong>n<br />

term<strong>in</strong>iert nicht), unabhängig davon, wie man <strong>die</strong> 4 Klauseln anordnet, es gibt aber e<strong>in</strong>e erfolgreiche<br />

SLD-Ableitung, <strong>die</strong>se muss jedoch e<strong>in</strong>mal <strong>die</strong> Symmetrie-Klausel und e<strong>in</strong>mal <strong>die</strong> Transitivität-<br />

Klausel anwenden. Die Prolog-Ausführung wendet aber je nach Reihenfolge immer <strong>die</strong> gleiche<br />

Klausel an.<br />

M. Schmidt-Schauß & D. Sabel, Skript KI, WS 2012/13 163 Stand: 7. Januar 2013

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!