farbe(rot).
farbe(gruen).
farbe(gelb).
farbe(blau).

nachbar(X, Y) :- farbe(X), farbe(Y), X \= Y.

deutschland(O2, O3, O4, O5, O6, O7, O8, O9) :-
  nachbar(O2, O5), nachbar(O2, O6),
  nachbar(O3, O4), nachbar(O3, O5), nachbar(O3, O6), nachbar(O3, O9),
  nachbar(O4, O5),
  nachbar(O5, O6),
  nachbar(O6, O7), nachbar(O6, O9),
  nachbar(O7, O8), nachbar(O7, O9),
  nachbar(O8, O9).

eventest(0).
eventest(X) :- X > 0, X1 is X - 1, oddtest(X1).

oddtest(1).
oddtest(X) :- X > 1, X1 is X - 1, eventest(X1).

evengen(0).
evengen(X) :- oddgen(Y), X is Y + 1, X > 0.

oddgen(1).
oddgen(X) :- evengen(Y), X is Y + 1, X > 1.

foo(_X).

foo(gruen, _).

%nametuple(T) :- (A,B,C,D) = T.

%erlaubt((links,links,links,links)).
%erlaubt((links,links,rechts,rechts)).

%verboten((links,rechts,rechts,rechts)).
%erlaubt(S) :- not(verboten(S)).

ufer(links).
ufer(rechts).
%situation((M,Z,W,K)) :- ufer(M), ufer(Z), ufer(W), ufer(K).
%erlaubt((M,Z,W,K)) :- situation((M,Z,W,K)), (Z = M; W \= Z, Z \= K).

harmlos(U,U,U).
harmlos(_,X,Y) :- X \= Y.

erlaubt((M,Z,W,K)) :- harmlos(M,Z,K), harmlos(M,W,Z).

gegenueber(links,rechts).
gegenueber(rechts,links).

fahrt((U,U,W,K), 'Ziege', (Un,Un,W,K)) :- gegenueber(U,Un).
fahrt((U,Z,U,K), 'Wolf', (Un,Z,Un,K)) :- gegenueber(U,Un).
fahrt((U,Z,W,U), 'Kohl', (Un,Z,W,Un)) :- gegenueber(U,Un).
fahrt((U,Z,W,K), 'leer', (Un,Z,W,K)) :- gegenueber(U,Un).

loesung(Fahrten) :- start(S), ziel(Z), erreichbar(S, [], Fahrten, Z).
start((links,links,links,links)).
ziel((rechts,rechts,rechts,rechts)).

erreichbar(S, _, [], S).
erreichbar(S, Besucht, [F|Fahrten], Z) :-
  fahrt(S, F, X), erlaubt(X),
  not(member(X, Besucht)),
  erreichbar(X, [X|Besucht], Fahrten, Z).
