% Die Relation V von Aufgabe 1 Blatt 1

v1rel(s0, s1).
v1rel(s1, s0).
v1rel(s1, s2).
v1rel(s2, s1).
v1rel(s2, s3).
v1rel(s2, s4).
v1rel(s3, s2).
v1rel(s3, s4).
v1rel(s4, s2).
v1rel(s4, s3).

% Neben Fakten benutzen wir auch eine Regel, um V zu beschreiben.

% Die Versionen v1rel und v2rel sind "aquivalent.

v2rel(s0, s1).
v2rel(s1, s2).
v2rel(s2, s3).
v2rel(s2, s4).
v2rel(s3, s4).

v2rel(Y,X):- v2rel(X,Y).


% Beispiel mit Listen

isin(X,[X|YS]).
isin(X,[Y|YS]):- isin(X,YS).

% append von Listen

append([],L,L).
append([X|L1],L2,[X|L3]):-append(L1,L2,L3).

% Alle Vorkommen eines Elements aus einer Liste streichen

del(X,[],[]).
del(X,[X|XS],Z):- del(X,XS,Z).
del(X,[Y|XS],[Y|Z]):- X \= Y, del(X,XS,Z).

% Alle Duplikate aus einer Liste streichen
squeeze([],[]).
squeeze([X|XS],[X|Z]):- del(X,XS,Z1), squeeze(Z1,Z).

% direktes Bild einer Menge M unter Relation R
% Menge und Relation als Listen kodiert

% Bild eines einzelnen Elements
dom1(X,[],[]).
dom1(X,[(X,Y)|R],[Y|Z]):- dom1(X,R,Z).
dom1(X,[(W,Y)|R],Z):-   X \= W, dom1(X,R,Z).

% Wende dom1 auf ganze Menge an
dom2([],_,[]).
dom2([X|XS],R,Z):- dom1(X,R,B), dom2(XS,R,BS), append(B,BS,Z).

% mach Duplikate raus

dom(L,R,Z):- dom2(L,R,Z1),squeeze(Z1,Z).

% die Relation V als Liste
vrel([(s0, s1),(s1, s0),(s1, s2),(s2, s1),(s2, s3),(s2, s4),
      (s3, s2),(s3, s4),(s4, s2),(s4, s3)]).

