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

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

5.3 Implementierung logischer Programmiersprachen: Prolog<br />

nur e<strong>in</strong>en Term konstruiert auch gleich als Differenz L 1 − L 2 ). Die eigentliche Liste ist<br />

dabei <strong>die</strong> Differenz von L 1 und L 2 , d.h. L 2 muss e<strong>in</strong> Suffix von L 1 se<strong>in</strong>. Z.B. kann <strong>die</strong> Liste<br />

[1,2,3] als Differenzliste ([1,2,3,4,5] - [4,5]) dargestellt werden. Offensichtlich<br />

ist <strong>die</strong>se Darstellung nicht e<strong>in</strong>deutig, vielmehr kann [1, 2, 3] durch jede Differenzliste <strong>der</strong><br />

Form ([1,2,3|Y] - Y) dargestellt werden. Zum Programmieren eignet sich <strong>die</strong> letzte<br />

Darstellung (mit Y als nicht <strong>in</strong>stanziierte Variable), denn <strong>die</strong>se schafft gerade den Platz,<br />

um etwas an <strong>die</strong> Liste <strong>in</strong> konstanter Zeit anzuhängen. Genauer lässt sich dann append mit<br />

konstanter Laufzeit implementieren. Wir beschreiben zunächst <strong>die</strong> Idee und geben dann<br />

<strong>die</strong> Implementierung an.<br />

Seien <strong>die</strong> Listen L und M als Differenzlisten (L 1 − L 2 ) und (M 1 − M 2 ) gegeben. Wenn<br />

M 1 gerade gleich zu L 2 ist, dann entspricht das Anhängen von M an L gerade <strong>der</strong> Differenzliste<br />

(L 1 − M 2 ). Das folgende Bild verdeutlich <strong>die</strong>s<br />

L<br />

L 1<br />

L 2<br />

M<br />

M 1<br />

M 2<br />

L 1<br />

M 2<br />

L<br />

M<br />

Man sieht, L 2 muss gleich zu M 1 se<strong>in</strong>. An<strong>der</strong>enfalls funktioniert das Ane<strong>in</strong>an<strong>der</strong>hängen<br />

nicht. Die Implementierung <strong>in</strong> Prolog ist daher gerade:<br />

appendD(L1 - L2,M1 - M2,L1 - M2) :- L2 = M1.<br />

Diese kann noch vere<strong>in</strong>facht werden, sodass e<strong>in</strong> e<strong>in</strong>zelner Fakt ausreicht:<br />

append(L1 - L2,L2 - M2,L1 - M2).<br />

Die Auswertung e<strong>in</strong>er Anfrage append(Liste1 - Liste1Rest, Liste2 - Liste2, Ergebnis)<br />

ist offensichtlich <strong>in</strong> konstanter Zeit möglich, wenn Liste1Rest e<strong>in</strong>e Variable ist: In <strong>die</strong>sem<br />

Fall muss unifiziert werden: Liste1Rest = Liste2, was <strong>in</strong> konstanter Zeit möglich ist,<br />

wenn Liste1Rest e<strong>in</strong>e Variable ist.<br />

E<strong>in</strong> Beispielaufruf zeigt <strong>die</strong>s:<br />

?- appendD([1,2,3|Y]-Y,[4,5,6|Z]-Z,R).<br />

Y = [4, 5, 6|Z],<br />

R = [1, 2, 3, 4, 5, 6|Z]-Z<br />

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!