1% DELIVERY ROBOT DOMAIN IN THE SITUATION CALCULUS
    2
    3:- expects_dialect(cilog).    4
    5% INITIAL SITUATION
    6
    7sitting_at(rob,o109,init).
    8sitting_at(parcel,storage,init).
    9sitting_at(k1,mail,init).
   10color(parcel,blue,init).
   11%locked(door1,init).
   12
   13% DERIVED RELATIONS
   14
   15at(Obj,Pos,S) <-
   16   sitting_at(Obj,Pos,S).
   17at(Obj,Pos,S) <-
   18   carrying(Ag,Obj,S) &
   19   at(Ag,Pos,S).
   20
   21
   22adjacent(o109,o103,_).
   23adjacent(o103,o109,_).
   24adjacent(o109,storage,_).
   25adjacent(storage,o109,_).
   26%adjacent(o109,o111,_).
   27%adjacent(o111,o109,_).
   28adjacent(o103,mail,_).
   29adjacent(mail,o103,_).
   30adjacent(lab2,o109,_).
   31adjacent(P_1,P_2,S) <-
   32   blocks(Door,P_1,P_2)&
   33   unlocked(Door,S).
   34
   35% STATIC RELATIONS
   36blocks(door1,o103,lab2).
   37opens(k1,door1).
   38autonomous(rob).
   39
   40% ACTION PRECONDITIONS
   41poss(move(Ag,Pos,Pos_1),S)  <- 
   42   autonomous(Ag) &
   43   adjacent(Pos,Pos_1,S) &
   44   sitting_at(Ag,Pos,S).
   45poss(pickup(Ag,Obj),S) <-
   46   autonomous(Ag) &
   47   at(Ag,Pos,S)&
   48   sitting_at(Obj,Pos,S)&
   49   Ag \= Obj .
   50poss(putdown(Ag,Obj),S) <-
   51   carrying(Ag,Obj,S).
   52poss(unlock(Ag,Door),S) <-
   53   autonomous(Ag) &
   54   blocks(Door,P_1,_)&
   55   at(Ag,P_1,S)&
   56   opens(Key,Door)&
   57   carrying(Ag,Key,S).
   58
   59% PRIMITIVE PREDICATE DEFINITIONS
   60
   61sitting_at(Obj,Pos,do(move(Obj,Pos_0,Pos),S))  <-
   62   poss(move(Obj,Pos_0,Pos),S).
   63
   64sitting_at(Obj,Pos,do(putdown(Ag,Obj),S))  <-
   65   poss(putdown(Ag,Obj),S)&
   66   at(Ag,Pos,S).
   67
   68sitting_at(Obj,Pos,do(A,S) )  <- 
   69   poss(A,S) & 
   70   sitting_at(Obj,Pos,S) & 
   71   ~ ismove(A,Obj,Pos) &
   72   ~ ispickup(A,Obj).
   73ismove(move(Obj,Pos,_),Obj,Pos).
   74ispickup(pickup(_,Obj),Obj).
   75
   76carrying(Ag,Obj,do(pickup(Ag,Obj),S)) <-
   77   poss(pickup(Ag,Obj),S).
   78
   79carrying(Ag,Obj,do(A,S)) <-
   80   carrying(Ag,Obj,S) &
   81   poss(A,S) &
   82   A \= putdown(Ag,Obj).
   83
   84%locked(Door,do(A,S)) <-
   85%   locked(Door,S) &
   86%   poss(A,S) &
   87%   A \= unlock(Door).
   88
   89unlocked(Door,do(unlock(Ag,Door),S)) <-
   90   poss(unlock(Ag,Door),S).
   91unlocked(Door,do(A,S)) <-
   92   unlocked(Door,S) &     
   93   poss(A,S).
   94
   95% TRY the following queries:
   96% bound 10.
   97:- trace.   98askable sitting_at(parcel,o109,S).
   99% bound 8.
  100askable carrying(rob,k1,S).
  101% bound 16.
  102askable sitting_at(rob,lab2,S).
  103% bound 15.
  104askable sitting_at(rob,lab2,S).
  105      % warning: this takes a *very* *very* long time
  106askable sitting_at(parcel,lab2,S).
  107askable