% vater(v,k) :<=> v ist der Vater von k
vater(fritz,thomas).
vater(thomas,maria).
vater(thomas,anna).
% ...

% grossvater(g,e) :<=> g ist der Grossvater von k
% Intuitiv (unnvollstaendig!): G ist der Vater von V und V ist der Vaters von K
% Implikation: vater(G,V) /\ vater(V,E) ==> grossvater(G,E)
grossvater(G,E) :- vater(G,V), vater(V,E).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Listenkonkatenation in Haskell:
% app []     ys = ys
% app (x:xs) ys = x : app xs ys

app([]    ,Ys,Ys).
app([X|Xs],Ys,[X|Zs]) :- app(Xs,Ys,Zs).

% Letzte Element einer Liste:
last(Xs,Z) :- app(_,[Z],Xs).

% elem(Xs,E) :<=> E ist ein Element der Liste Xs
elem(Xs,E) :- app(As,_,Xs), last(As,E).
