% Structure of the family:
%
%                    Christine oo Heinz  Maria oo Fritz
%                      /    \               |
%                     /      \              |
%      Monika oo Herbert    Angelika oo Hubert
%       /  \                   |
%      /    \                  |
%  Susanne  Norbert          Andreas

% Definition der Ehefrau-Ehemann-Relation:
ehemann(christine, heinz).
ehemann(maria,     fritz).
ehemann(monika,    herbert).
ehemann(angelika,  hubert).

% Definition der Kind-Mutter-Relation:
mutter(herbert, christine).
mutter(angelika,christine).
mutter(hubert,  maria).
mutter(susanne, monika).
mutter(norbert, monika).
mutter(andreas, angelika).


% zu speziell:
% vater(susanne,herbert) :- mutter(susanne,monika), ehemann(monika,herbert).
vater(Kind,Vater) :- mutter(Kind,Mutter), ehemann(Mutter,Vater).

% Grossvater G eines Enkels E:
grossvater(E,G) :- vater(E,V), vater(V,G).
grossvater(E,G) :- mutter(E,M), vater(M,G).

% Ist eine Person ein Ehemann?
istEhemann(P) :- ehemann(_,P).


muetter(Ms) :- findall(M,mutter(_,M),Ms).

grossvaeter(Gs) :- findall(G,grossvater(_,G),Gs).

enkel_grossvaeter(EGs) :- findall(ek(E,G) ,grossvater(E,G), EGs).

% Alle Kinder von einer Mutter:
% kinder(M,Ks) :- findall(K, mutter(K,M), Ks).
kinder(M,Ks) :- bagof(K, mutter(K,M), Ks).

istVater(V) :- vater(_,V).

% vaeter(Vs) :- bagof(V,vater(_,V),Vs).
% vaeter(Vs) :- bagof(V,istVater(V),Vs).
vaeter(Vs) :- bagof(V, K^vater(K,V), Vs).

vaeter_menger(Vs) :- setof(V, K^vater(K,V), Vs).
