% DEFINITION OF DELIVERY ROBOT WORLD IN STRIPS NOTATION

% ACTIONS
% move(Ag,Pos,Pos_1) is the action of Ag moving from Pos to Pos_1

preconditions(move(Ag,Pos,Pos_1),
    [autonomous(Ag), adjacent(Pos,Pos_1), sitting_at(Ag,Pos)]).
achieves(move(Ag,Pos,Pos_1),sitting_at(Ag,Pos_1)).
deletes(move(Ag,Pos,Pos_1),sitting_at(Ag,Pos)).

% pickup(Ag,Obj,Pos) is the action of agent Ag picking up Obj.
preconditions(pickup(Ag,Obj,Pos),
    [autonomous(Ag), Ag \= Obj, sitting_at(Obj,Pos), at(Ag,Pos) ]).
achieves(pickup(Ag,Obj,Pos), carrying(Ag,Obj)).
deletes(pickup(Ag,Obj,Pos), sitting_at(Obj,Pos)).

% putdown(Ag,Obj,Pos)
preconditions(putdown(Ag,Obj,Pos), 
    [autonomous(Ag),  Ag \= Obj, at(Ag,Pos), carrying(Ag,Obj)]).
achieves(putdown(Ag,Obj,Pos),sitting_at(Obj,Pos)).
deletes(putdown(Ag,Obj,Pos),carrying(Ag,Obj)).

% unlock(Ag,Door)
preconditions(unlock(Ag,Door),
    [autonomous(Ag), blocks(Door,P_1,_), opens(Key,Door),  
        carrying(Ag,Key), at(Ag,P_1)]).
achieves(unlock(Ag,Door),unlocked(Door)).

% PRIMITIVE RELATIONS
primitive(carrying(_,_)).
primitive(sitting_at(_,_)).
primitive(unlocked(_)).

% DERIVED RELATIONS

clause(at(Obj,Pos),[sitting_at(Obj,Pos)] ).
clause(at(Obj,Pos),[autonomous(Ag), Ag \= Obj, carrying(Ag,Obj), at(Ag,Pos)]).

clause(adjacent(o109,o103),[]).
clause(adjacent(o103,o109),[]).
clause(adjacent(o109,storage),[]).
clause(adjacent(storage,o109),[]).
clause(adjacent(o109,o111),[]).
clause(adjacent(o111,o109),[]).
clause(adjacent(o103,mail),[]).
clause(adjacent(mail,o103),[]).
clause(adjacent(lab2,o109),[]).
clause(adjacent(P_1,P_2), [blocks(Door,P_1,P_2), unlocked(Door)]).
clause(blocks(door1,o103,lab2),[]).
clause(opens(k1,door1),[]).
clause(autonomous(rob),[]).

% INITIAL SITUATION
holds(sitting_at(rob,o109),init).
holds(sitting_at(parcel,storage),init).
holds(sitting_at(k1,mail),init).

achieves(init,X) <-
   holds(X,init).

