%auf(a,b).
%auf(b,c).
%auf(c,tisch).

%rekursiv werden Bloecke umgesetzt, bis gewuenschtes Ergebnis erreicht

stelle_auf(A,B) :- auf(A,B).
stelle_auf(A,B) :- not(auf(A,B)),A\=tisch,A\=B, frei(A),frei(B), %auf(A,X),
                   retract(auf(A,X)),assert(auf(A,B)),assert(bewegt(A,X,B)).

frei(tisch).
frei(X) :- not(auf(_,X)).
frei(A) :- A\=tisch,
           auf(X,A), frei(X),
           retract(auf(X,A)), assert(auf(X,tisch)),assert(bewegt(X,A,tisch)).

bereinige:- retractall(auf(U,V)),retractall(bewegt(U,V,W)).
