

:- [golog_swi, util].

%%% direttive discontiguous per i fluenti
:- discontiguous caricato/2, stanco/2.
%%%%%%%%%%% dichiarazione delle azioni primitive
primitive_action(carica(_,_)).
primitive_action(scarica(_,_)).
%%%%%% Restore suppressed situation arguments.
restoreSitArg(caricato(X),S,caricato(X,S)).
restoreSitArg(stanco(X),S,stanco(X,S)).

%%%%%%% Action precondition axioms
poss(carica(R,X),S) :-
	robot(R), oggetto(X), \+ stanco(R,S), \+ caricato(X,S).
poss(scarica(R,X),S) :-
	robot(R), oggetto(X), caricato(X,S),\+ stanco(R,S).

%%%%%%% Successor state axioms
caricato(X,do(A,S)) :- A = carica(_,X) ;
	caricato(X,S), \+ A = scarica(_,X).
stanco(R,do(A,_)) :-
	(A=carica(R,X) ; A=scarica(R,X)), pesante(X).
%%% un robot e' stanco soltanto durante l'esecuzione di una singola
%%% azione, quindi se vale stanco(R,S), non vale stanco(R,do(A,S)).

%%%%%%% definizione di eventuali predicati statici
robot(pippo). robot(pluto).
oggetto(a). oggetto(b). oggetto(c).
oggetto(d). 
pesante(a). pesante(c).

%%%% Initial situation
caricato(d,s0).

%%% procedure
proc(carica(X),
     pi(r,carica(r,X))). 

proc(caricatutti_while,
     while(some(x, oggetto(x) & -caricato(x)),
		 pi(x, pi(r, carica(r,x))))).

proc(caricatutti_ric,
     ?(all(x,oggetto(x) => caricato(x))) #
    pi(x, pi(r,carica(r,x))) :
    caricatutti_ric).

proc(scaricatutti_while,
     while(some(x, oggetto(x) & caricato(x)),
	   pi(x, pi(r, scarica(r,x))))).

proc(scaricatutti_ric,
     ?(all(x,oggetto(x) => -caricato(x))) #
    pi(x, pi(r,scarica(r,x))) :
    scaricatutti_ric).


