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