wahrheitswert(wahr).
wahrheitswert(falsch).

tafel(F) :- F = [[U, V], [W, X]],
            wahrheitswert(U), wahrheitswert(V),
	    wahrheitswert(W), wahrheitswert(X).

und(falsch, _, falsch).
und(wahr, X, X).

interpretation(F, wahr, wahr, W)     :-  F = [[W, _], [_, _]].
interpretation(F, wahr, falsch, W)   :-  F = [[_, W], [_, _]].
interpretation(F, falsch, wahr, W)   :-  F = [[_, _], [W, _]].
interpretation(F, falsch, falsch, W) :-  F = [[_, _], [_, W]].

barbara(F) :- tafel(F), ketten(F).


ketten(F) :- wahrheitswert(A), wahrheitswert(B),
             wahrheitswert(C), wahrheitswert(U),
             wahrheitswert(V), wahrheitswert(W),
             wahrheitswert(X),
             interpretation(F, A, B, U), 
	     interpretation(F, B, C, V), 
             interpretation(F, A, C, W),
             und(U, V, X),
             interpretation(F, X, W, falsch), !, fail.

ketten(F) :- true.


?- barbara(F), write(F), nl, fail.

