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

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

deutschland(SH,MV,HH,HB,NI,ST,BE,BB,SN,NW,HE,TH,RP,SL,BW,BY) :-
  nachbar(SH,NI), nachbar(SH,HH), nachbar(SH,MV),
  nachbar(HH,NI),
  nachbar(MV,NI), nachbar(MV,BB),
  nachbar(NI,HB), nachbar(NI,BB), nachbar(NI,ST), nachbar(NI,TH), nachbar(NI,HE), nachbar(NI,NW),
  nachbar(ST,BB), nachbar(ST,SN), nachbar(ST,TH),
  nachbar(BB,BE), nachbar(BB,SN),
  nachbar(NW,HE), nachbar(NW,RP),
  nachbar(SN,TH), nachbar(SN,BY),
  nachbar(RP,SL), nachbar(RP,HE), nachbar(RP,BW),
  nachbar(HE,BW), nachbar(HE,TH), nachbar(HE,BY),
  nachbar(TH,BY),
  nachbar(BW,BY).

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.

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

harmlos(_,X,Y) :- gegenueber(X,Y).
harmlos(M,M,M).

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

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

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

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






