
%%%%%%%%%%%%%%% direttive iniziali
:- [golog_swi].
:- [util].

%%% direttive discontiguous per i fluenti
:- discontiguous on/3.
%%%%%%%%%%% dichiarazione delle azioni primitive
primitive_action(move(_,_,_)).
%%%%%% Restore suppressed situation arguments.
restoreSitArg(on(X,Y),S,on(X,Y,S)).

%%%%%%% Action precondition axioms
poss(move(X,From,To),S) :-
	on(X,From,S), tavolo(To), From \= To.

%%%%%%% Successor state axioms
on(X,T,do(A,S)) :- A = move(X,_,T) ;
                   on(X,T,S), not(A = move(X,T,_)).

%%%%%%% definizione di eventuali predicati statici
tavolo(X) :- member(X,[grande,piccolo,basso]).
oggetto(X) :- member(X,[palla,cubo,piramide,libro,pc,penna]).
colore(X,rosso) :- member(X,[palla,cubo]).
colore(X,giallo) :- member(X,[piramide,libro]).
colore(X,verde) :- member(X,[pc,penna]).

%%%% Initial situation
on(X,piccolo,s0) :- oggetto(X).

%% procedura: sposta X sul tavolo T
proc(sposta(X,T),
     pi(from,move(X,from,T))).

%% Procedura: spostare tutti gli oggetti di colore C sul tavolo T
% 3 versioni: con while, ricorsiva e con l'uso di star
proc(spostatutti_while(C,T),
     while(some(x,colore(x,C) & - on(x,T)),
	   pi(x,?(colore(x,C)) : sposta(x,T)))).

proc(spostatutti_ric(C,T),
     ?(all(x,colore(x,C) => on(x,T))) #
    pi(x, ?(colore(x,C)) :
      sposta(x,T)) : spostatutti_ric(C,T)).

proc(spostatutti_star(C,T),
     star(pi(x,?(colore(x,C)) : sposta(x,T))) :
    ?(all(x,colore(x,C) => on(x,T)))).

% procedura: toglie da un tavolo tutti gli oggetti di colore diverso da C
% 3 versioni anche qui
proc(toglitutti_while(C,T),
     while(some(x,on(x,T) & -colore(x,C)), /* atomi negati per ultimi */
	   pi(x,?(on(x,T) & -colore(x,C)) :
	     pi(t, ?(tavolo(t)) :
	       move(x,T,t))))).

proc(toglitutti_ric(C,T),
     ?(all(x,on(x,T) => colore(x,C))) #
    pi(x, ?(on(x,T) & - colore(x,C)) :
      pi(t, ?(tavolo(t)) :
	move(x,T,t)) : toglitutti_ric(C,T))).

proc(toglitutti_star(C,T),
     star(pi(x, ?(on(x,T) & - colore(x,C)) :
	    pi(t, ?(tavolo(t)) :  move(x,T,t)))) :
    ?(all(x,on(x,T) => colore(x,C)))).

