bits(0..11).

{x(I)} :-bits(I).
{y(I)} :-bits(I).

p(I,J) :- bits(I), bits(J), x(I), y(J).

false :- bits(I), bits(J), p(I,J), I+J>=12.

s(0,J) :- bits(J), p(0,J+1), not p(J+1,0).
s(0,J) :- bits(J), p(J+1,0), not p(0,J+1) .

s(I+1,J) :- bits(I), bits(J), c(I,J), not s(I,J+1), not p(J+1,I+1).
s(I+1,J) :- bits(I), bits(J), not c(I,J), s(I,J+1),not  p(J+1,I+1).
s(I+1,J) :- bits(I), bits(J), not c(I,J),not  s(I,J+1), p(J+1,I+1).
s(I+1,J) :- bits(I), bits(J), c(I,J), s(I,J+1), p(J+1,I+1).

c(0,J) :- bits(J), p(0,J+1), p(J+1,0).

c(I+1,J) :- bits(I), bits(J), c(I,J),s(I,J+1).
c(I+1,J) :- bits(I), bits(J), p(J+1,I+1), s(I,J+1).
c(I+1,J) :- bits(I), bits(J), p(J+1,I+1), c(I,J).

false :- bits(J), c(12,J).

m(0) :- p(0,0).

m(I+1) :- bits(I), s(I,0).

false :- not m(0).

false :- not m(1).

false :- not m(2).

false :- m(3).

false :- not m(4).

false :- not m(5).

false :- m(6).

false :- m(7).

false :- m(8).

false :- not m(9).

false :- not m(10).

false :- m(11).

false :- m(12).

compute{ not false }

