
          %  A Blocks World Problem

/* Initial Situation   u
                       a
                       b   v
                       c   e   w
                       d   f   g                     */

ontable(d,s0).  ontable(f,s0).  ontable(g,s0).  on(u,a,s0).
on(a,b,s0).  on(b,c,s0).  on(c,d,s0).  on(v,e,s0).  on(e,f,s0).
on(w,g,s0).  clear(u,s0).  clear(v,s0).  clear(w,s0).

/* Goal                u
                       v
                       w
                       d
                       c   g
                       b   f
                       a   e                         */

goal(S) :- ontable(a,S), ontable(e,S), on(u,v,S), on(v,w,S),
           on(w,d,S), on(d,c,S), on(c,b,S), on(b,a,S),
           on(g,f,S), on(f,e,S), clear(u,S), clear(g,S).

%  Good towers.

goodTower(a,S) :- ontable(a,S).
goodTower(b,S) :- on(b,a,S), goodTower(a,S).
goodTower(c,S) :- on(c,b,S), goodTower(b,S).
goodTower(d,S) :- on(d,c,S), goodTower(c,S).
goodTower(w,S) :- on(w,d,S), goodTower(d,S).
goodTower(v,S) :- on(v,w,S), goodTower(w,S).
goodTower(u,S) :- on(u,v,S), goodTower(v,S).

goodTower(e,S) :- ontable(e,S).
goodTower(f,S) :- on(f,e,S), goodTower(e,S).
goodTower(g,S) :- on(g,f,S), goodTower(f,S).
