% Simple Robot Arm Planner

%  e represents initial state:


% Initial state specification:

% World Axioms.

above(X,Y,S) :- on(X,Y,S).
above(X,Y,S) :- on(X,Z,S), above(Z,Y,S).

% Change Axioms

holding(X,pickup(X,S)) :- armempty(S), clear(X,S).

on(c,a,e).
%on(X,Y,stack(X,Y,S)) :- clear(Y,S), holding(X,S).
on(X,Y,stack(X,Y,S)) :- holding(X,S), clear(Y,S).
on(X,Y,pickup(Z,S)) :- nott(X=Z), on(X,Y,S).
on(X,Y,putdown(Z,S)) :- on(X,Y,S).
on(X,Y,stack(Z,G,S)) :- on(X,Y,S).

clear(b,e).
clear(c,e).
clear(X,pickup(Y,S)) :- on(Y,X,S), holding(Y,pickup(Y,S)).
%clear(X,pickup(Y,S)) :- on(Y,X,S), clear(Y,S), armempty(S).
clear(X,putdown(Y,S)) :- clear(X,S).
clear(X,pickup(Y,S)) :- clear(X,S).
clear(X,stack(Y,Z,S)) :- nott(Z=X), clear(X,S).

ontable(a,e).
ontable(b,e).
ontable(X,putdown(X,S)) :- holding(X,S).
ontable(X,pickup(Y,S)) :- nott(X=Y), ontable(X,S).
ontable(X,putdown(Y,S)) :- ontable(X,S).
ontable(X,stack(Y,Z,S)) :- ontable(X,S).


armempty(e).
armempty(putdown(X,S)) :- holding(X,S).
armempty(stack(X,Y,S)) :- holding(X,S), clear(Y,S).

nott(A) :- !, not(A).
nott(A) :- call(A), !, 5=4.
nott(A).












