(keine Musterlösung)

p(X,Y) :- pp(X,[],Y).

pp([],X,X).
pp([A|X],Y,Z) :- pp(X,[A|Y],Z).

(a) Das Prädikat testet bei vollständiger Insanziierung, ob X die umgekehrte Liste von Y ist. Bei Anfragen mit einem partiell
spezifizierten Ziel, wird X bzw. Y, in der jeweils anderen Liste in umgekehrtert Reihenfolge wiedergegeben. Bei einem Vollständig
unterspezifizierten Aufruf, berechnet das Prädikat fortwährend umgekehrte Listen von X in Y.

(b)
% umkehrung(Liste1, Liste2).
% Liste1 und Liste2 sind Listen, so dass Liste2 sie jeweils die Element
% der anderen Liste in umgekehrter Reihenfolge enthalten.

umkehrung(Liste1,Liste2) :- akkumulator(Liste1,[],Liste2).

akkumulator([],Plazierung,Plazierung).
akkumulator([Kopf|Restkörper],Ergebnis,[],Platzhalter) :- akkumulator(Restkörper,[Kopf|Ergebnis],Platzhalter).

©
p([],[]). = yes
p([a],[a]). = yes
p([a,b],[a]). = no
p([1,2,3,4],[4,3,2,1]). = yes
p([1,3,4,7],[1,1,1,1]). = no
p([2,3,4,5],X). = X=[5,4,3,2] yes
p(X,Y). = X=[] Y=[]; X=[X1] Y=[X1]; X=[X1,Y1], Y=[Y1,X1]; … yes

(d)
Symmetrisch: ja
Reflexiv: nein
Transitiv: nein
1:m: ja
m:1: ja