block(A) :- on(A,_).
clear(A) :- on(A,_), \+ on(_,A).
clear(table).
above(A,B) :- on(A,B).
above(A,B) :- on(A,C), above(C,B).
notFinal(A) :- goal(A,B), \+ on(A,B).
notFinal(A) :- above(A,B), notFinal(B).
final(A) :- block(A), \+ notFinal(A).
final(table).
finalBasis(X) :- goal(_,X), \+ goal(X,_), final(X).
final(X,X) :-  finalBasis(X).
final(X,B1) :- on(B1,B2), goal(B1,B2), final(X, B2).
incomplete(X,T) :- goal(B,T), \+ on(B,T), final(X,T).
