PROGRAMMIERAUFGABE 8.1 prefixOf([],_). prefixOf([X|XL],[X|YL]) :- prefixOf(XL,YL). properPrefixOf([],[_|_]). properPrefixOf([X|XL],[X|YL]) :- properPrefixOf(XL,YL). sublistOf(XL,YL) :- prefixOf(XL,YL). sublistOf(XL,[_|YL]) :- sublistOf(XL,YL). properSublistOf(XL,YL) :- properPrefixOf(XL,YL). properSublistOf(XL,[_|YL]) :- sublistOf(XL,YL). PROGRAMMIERAUFGABE 8.2 embeddedIn([],_). embeddedIn([X|XL],[X|YL]) :- embeddedIn(XL,YL). embeddedIn(XL,[_|YL]) :- embeddedIn(XL,YL). PROGRAMMIERAUFGABE 8.3 matches([],[]). matches([X|XL],[X|YL]) :- matches(XL,YL). matches([?|XL],[_|YL]) :- matches(XL,YL). matches([*|XL],YL) :- matches(XL,YL). matches([*|XL],[_|YL]) :- matches([*|XL],YL). AUFGABE 8.4 Hier hatte ich offenbar einen Blackout, als ich mir die Aufgabe überlegt habe. Selbstverständlich berechnet a1 die Konkatenation der ersten und der zweiten Liste, während a2 die Konkatenation der zweiten und der ersten Liste berechnet. Sie liefern also für fast jede Anfrage unterschiedliche Ergebnisse. AUFGABE 8.5 a2 und a3 verhalten sich unterschiedlich, wenn das zweite und dritte Argument einer Anfrage Variable sind: a2 zählt die Lösungen auf, während a3 sofort in eine Endlosschleife gerät: ?- a2([1],X,Y). X = [] Y = [1] ; X = [_G285] Y = [_G285, 1] ; X = [_G285, _G291] Y = [_G285, _G291, 1] ; X = [_G285, _G291, _G297] Y = [_G285, _G291, _G297, 1] Yes ?- a3([1],X,Y). ERROR: Out of local stack