:- ['9_agentspeak'].
:- dynamic loc/2.
:- dynamic carries/2.


query :- desire(+(loc(gold,a)),[]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

adjacent(a,b).
adjacent(b,c).
loc(agent,a).
loc(gold,a).
loc(depot,c).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

do(pick(gold)) :- loc(agent,X),
                  retract(loc(gold,X)),
                  assert(carries(agent,gold)).

do(move(X,Y)) :-  loc(agent,X),
                  retract(loc(agent,X)),
                  assert(loc(agent,Y)).

do(drop(gold)) :- loc(agent,_),
                  retract(carries(agent,gold)).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

procedure(+(loc(gold,X)),P) :- 
      loc(agent,X), loc(depot,Y),
      P = [do(pick(gold)), !(loc(agent,Y)), do(drop(gold))].

procedure(+(!(loc(agent,X))),P) :- loc(agent,X), P=[].

procedure(+(!(loc(agent,X))),P) :-
      loc(agent,Y), not X=Y, adjacent(Y,Z), not loc(obstacle,Z),
      P = [do(move(Y,Z)), !(loc(agent,X))].

