
0{puton(A,B,I)}1 :- block(A), object(B), A!=B, I=0..n-1.
0{puton(A,B,I)}0 :- block(A), object(B), A!=B, I=n.

:- puton(A,B,I), puton(C,D,I), A!=C.
:- puton(A,B,I), puton(C,D,I), B!=D.

block(red).
block(blue).
block(green).
object(table).
object(X) :- block(X).

%dynamic laws
on(A,B,I+1) :- puton(A,B,I), I=0..n-1.
-on(A,C,I+1) :- puton(A,B,I), on(A,C,I),  I=0..n-1.
:- puton(A,B,I), on(A,B,I).


%static laws
:- on(A,B,I), on(C,B,I), A!=C, B!=table, I=0..n.

on(A,B,I+1) :- on(A,B,I), not -on(A,B,I+1), I=0..n-1.
-on(A,B,I+1) :- -on(A,B,I), not on(A,B,I+1), I=0..n-1.


%initial state
on(red,table,0).
on(blue,table,0).
on(green,table,0).



%goal
:- not on(red,green,n).
:- not on(green, blue,n).

#hide block/1.
#hide object/1.