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 Logisches Programmieren<br />

listtoset([],[]).<br />

listtoset([X|R],[X|S]) :- remove(X,R,S1),listtoset(S1,S).<br />

remove(E,[],[]).<br />

remove(E,[E|R],S):- remove(E,R,S).<br />

remove(E,[X|R],[X|S]):- not(E == X), remove(E,R,S).<br />

union(X,Y,Z) :- append(X,Y,XY), listtoset(XY,Z).<br />

<strong>in</strong>tersect([],X,[]).<br />

<strong>in</strong>tersect([X|R],S,[X|T]) :- member(X,S),<strong>in</strong>tersect(R,S,T1),listtoset(T1,T).<br />

<strong>in</strong>tersect([X|R],S,T) :- not(member(X,S)),<strong>in</strong>tersect(R,S,T1),listtoset(T1,T).<br />

reverse([],[]).<br />

reverse([X|R],Y) :- reverse(R,RR), append(RR,[X],Y).<br />

reversea(X,Y) :- reverseah(X,[],Y).<br />

reverseah([X|Xs],Acc,Y):- reverseah(Xs,[X|Acc],Y).<br />

reverseah([],Y,Y).<br />

5.3.5 Differenzlisten<br />

Wir führen an <strong>die</strong>ser Stelle e<strong>in</strong>e weitere Darstellung von Listen e<strong>in</strong>, <strong>die</strong> sogenannten Differenzlisten.<br />

Diese werden später im Abschnitt 5.4 zum Parsen und Def<strong>in</strong>ite Clause Grammars<br />

e<strong>in</strong>e Rolle spielen und verwendet. Diese Darstellung besitzt den Vorteil, dass das<br />

append-Prädikat wesentlich effizienter implementiert werden kann.<br />

Betrachten wir zunächst <strong>die</strong> bisherige Implementierung von append erneut:<br />

append([],X,X).<br />

append([X|Y],U,[X|Z]) :- append(Y,U,Z).<br />

Der Nachteil <strong>die</strong>ser Implementierung liegt dar<strong>in</strong>, dass <strong>die</strong> Auswertung <strong>der</strong> Ergebnisliste<br />

<strong>die</strong> gesamte erste Liste abarbeiten muss, d.h. <strong>die</strong> Laufzeit ist l<strong>in</strong>ear <strong>in</strong> <strong>der</strong> Länge <strong>der</strong><br />

ersten Liste. Dies kann man sich klar machen, wenn man <strong>die</strong> Abarbeitung beispielhaft<br />

durchgeht:<br />

append([a 1 ,. . . ,a n ],[b 1 ,. . . ,b m ],L) X 1 = a 1 , Y 1 =[a 2 ,...,a n ], U 1 = [b 1 ,...,b m ], L = [a 1 |Z 1 ]<br />

append([a 2 ,. . . ,a n ],[b 1 ,. . . ,b m ],Z 1 ) X 2 = a 2 , Y 2 =[a 3 ,...,a n ], U 2 = [b 1 ,...,b m ], Z 1 = [a 2 |Z 2 ]<br />

append([a 3 ,. . . ,a n ],[b 1 ,. . . ,b m ],Z 2 ) X 3 = a 3 , Y 3 =[a 4 ,...,a n ], U 3 = [b 1 ,...,b m ], Z 2 = [a 3 |Z 3 ]<br />

......<br />

append([],[b 1 ,. . . ,b m ],Z n ) Z n = [b 1 ,...,b m ]<br />

Da Listen rekursiv dargestellt werden, gibt es zunächst ke<strong>in</strong>e bessere Möglichkeit das<br />

append-Prädikat zu implementieren. E<strong>in</strong> Ausweg stellen <strong>die</strong> sogenannten Differenzlisten<br />

dar: Anstelle <strong>der</strong> Liste selbst, wird dabei e<strong>in</strong>e Liste durch zwei Listen dargestellt. D.h. e<strong>in</strong>e<br />

Liste wird durch e<strong>in</strong> Paar (L 1 , L 2 ) dargestellt (o<strong>der</strong>, da <strong>in</strong> Prolog das M<strong>in</strong>uszeichen<br />

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!