
% direttive iniziali
:- [golog_swi,util].
:- discontiguous has/2,
	atRobby/2.

% azioni primitive
primitive_action(go(_,_)).
primitive_action(buy(_)).

% restoreSitArg 
restoreSitArg(has(X),S,has(X,S)).
restoreSitArg(atRobby(X),S,atRobby(X,S)).

%  Action Precondition Axioms.
poss(go(X,Y),S) :- atRobby(X,S), \+ X=Y.
poss(buy(X),S) :- sells(Y,X), atRobby(Y,S).

%  Successor State Axioms.
has(X,do(A,S)) :- A=buy(X) ; has(X,S).
atRobby(X,do(A,S)) :-
	A=go(_,X) ;
	atRobby(X,S), \+ A=go(X,_).

% Initial situation and static predicates
atRobby(home,s0).
sells(super,milk).
sells(grocer,milk).
sells(hw,drill).
sells(super,banana).

% procedure
proc(go_and_buy(X),
     buy(X) #
    pi(y, ?(sells(y,X)) :
      pi(from, go(from,y) : buy(X)))).

%% si puo' anche usare la ripetizione non deterministica:
proc(go_and_buy_star(X),
    star(pi(y, ?(sells(y,X)) :
	   pi(from, go(from,y)))) :
    buy(X)).
% ma se il robot deve comprare il  latte, puo' andare su e giu' varie
% volte tra super e grocer prima di decidersi a comprare

proc(compratutti(L),
     ?(L=[]) #
    pi(x, pi(rest, ?(L=[x|rest]) :
      go_and_buy(x) : compratutti(rest)))).

