% Autor: %AUTHOR%
% Datum: %DATE%

:- dynamic(groesser/2).
:- dynamic(besitzt/2).
:- dynamic(besitzt_nicht/2).

groesser_als(X,Y) :- groesser(X,Y).
groesser_als(X,Y) :- groesser(X,Z), groesser_als(Z,Y).

kleiner(X,Y) :- groesser_als(Y,X).

kleiner_als(X,Y) :- kleiner(X,Y).
kleiner_als(X,Y) :- kleiner(X,Z), kleiner_als(Z,Y).

mensch(martin).
mensch(peter).
mensch(olaf).
mensch(ralph).
mensch(norbert).

fisch(makrele).
fisch(karpfen).
fisch(bachforelle).
fisch(regenbogenforelle).
fisch(saibling).

accMax([],A,A) :- !.
accMax([K|S],K,Max) :- accMax(S,K,Max).
accMax([K|S],A,Max) :- setof((X,Y),groesser_als(X,Y),Z),member((K,A),Z), accMax(S,K,Max).
accMax([K|S],A,Max) :- setof((X,Y),kleiner_als(X,Y),Z),member((K,A),Z), accMax(S,A,Max).

max(Liste,Max) :-  Liste = [K|_], accMax(Liste,K,Max).

besitzt_nicht(martin,karpfen).
besitzt_nicht(peter,saibling).
besitzt_nicht(olaf,makrele).
besitzt_nicht(martin,bachforelle).
besitzt_nicht(olaf,bachforelle).
besitzt_nicht(ralph,saibling).
besitzt_nicht(peter,regenbogenforelle).
besitzt_nicht(norbert,saibling).

gengroesser :- besitzt_nicht(martin,makrele), asserta(groesser(makrele,karpfen)).
gengroesser :- besitzt_nicht(peter,karpfen), asserta(groesser(karpfen,saibling)).
gengroesser :- besitzt_nicht(olaf,bachforelle), asserta(groesser(bachforelle,makrele)).
gengroesser :- besitzt_nicht(martin,karpfen), asserta(groesser(karpfen,bachforelle)).
gengroesser :- besitzt_nicht(olaf,regenbogenforelle), asserta(groesser(regenbogenforelle,bachforelle)).
gengroesser :- besitzt_nicht(ralph,karpfen), asserta(groesser(karpfen,saibling)).
gengroesser :- besitzt_nicht(peter,saibling), asserta(groesser(saibling,regenbogenforelle)).
gengroesser :- besitzt_nicht(norbert,bachforelle), asserta(groesser(bachforelle,saibling)).

genbesitzt :- kleiner_als(makrele,karpfen), asserta(besitzt(martin,makrele)).
genbesitzt :- kleiner_als(karpfen,saibling), asserta(besitzt(peter,karpfen)).
genbesitzt :- kleiner_als(bachforelle,makrele), asserta(besitzt(olaf,bachforelle)).
genbesitzt :- kleiner_als(karpfen,bachforelle), asserta(besitzt(martin,karpfen)).
genbesitzt :- kleiner_als(regenbogenforelle,bachforelle), asserta(besitzt(olaf,regenbogenforelle)).
genbesitzt :- kleiner_als(karpfen,saibling), asserta(besitzt(ralph,karpfen)).
genbesitzt :- kleiner_als(saibling,regenbogenforelle), asserta(besitzt(peter,saibling)).
genbesitzt :- kleiner_als(bachforelle,saibling), asserta(besitzt(norbert,bachforelle)).

genbesitzt_nicht :- mensch(A), mensch(B), mensch(C), mensch(D), mensch(X),
                    X \= A, X \= B, X \= C, X \= D, A \= B, A \= C, A \= D,
                    B \= C, B \= D, C \= D, besitzt(X,Y),
                    (not(besitzt_nicht(A,Y))->asserta(besitzt_nicht(A,Y));true),
                    (not(besitzt_nicht(B,Y))->asserta(besitzt_nicht(B,Y));true),
                    (not(besitzt_nicht(C,Y))->asserta(besitzt_nicht(C,Y));true),
                    (not(besitzt_nicht(D,Y))->asserta(besitzt_nicht(D,Y));true).
                    
genbesitzt_nicht2 :- fisch(A), fisch(B), fisch(C), fisch(D), fisch(Y),
                     Y \= A, Y \= B, Y \= C, Y \= D, A \= B, A \= C, A \= D,
                     B \= C, B \= D, C \= D, besitzt(X,Y),
                     (not(besitzt_nicht(X,A))->asserta(besitzt_nicht(X,A));true),
                     (not(besitzt_nicht(X,B))->asserta(besitzt_nicht(X,B));true),
                     (not(besitzt_nicht(X,C))->asserta(besitzt_nicht(X,C));true),
                     (not(besitzt_nicht(X,D))->asserta(besitzt_nicht(X,D));true).

genbesitzt2 :- mensch(A), mensch(B), mensch(C), mensch(D), mensch(E),
               A \= B, A \= C, A \= D, A \= E, B \= C, B \= D, B \= E, C \= D,
               C \= E, D \= E,
               besitzt_nicht(A,X), besitzt_nicht(B,X), besitzt_nicht(C,X),
               besitzt_nicht(D,X),
               (not(besitzt(E,X))->asserta(besitzt(E,X));true).
               
genbesitzt3 :- fisch(A), fisch(B), fisch(C), fisch(D), fisch(E),
               A \= B, A \= C, A \= D, A \= E, B \= C, B \= D, B \= E, C \= D,
               C \= E, D \= E,
               besitzt_nicht(X,A), besitzt_nicht(X,B), besitzt_nicht(X,C),
               besitzt_nicht(X,D),
               (not(besitzt(X,E))->asserta(besitzt(X,E));true).

solve :- findall(_,gengroesser,_), findall(_,genbesitzt,_), findall(_,genbesitzt_nicht,_), findall(_,genbesitzt_nicht2,_), findall(_,genbesitzt2,_), findall(_,genbesitzt3,_).

prepare :- retractall(groesser(_,_)), retractall(besitzt(_,_)), retractall(besitzt_nicht(_,_)).

start :- solve, solve, solve, solve, solve, setof((X,Y),besitzt(X,Y),Q), write(Q),
         max([makrele,karpfen,saibling,bachforelle,regenbogenforelle],Max), nl, write(Max).

