% This is the example from "Abducing through negation as failure:
% stable models in the independent choice logic".
% Copyright 1997. All Rights reserved. David Poole.

carrying(key,s(T)) <-
   do(pickup(key),T) &
   at(robot,Pos,T) &
   at(key,Pos,T) &
   pickup_succeeds(T).

random([pickup_succeeds(T): 0.7,pickup_fails(T):0.3]).

carrying(key,s(T)) <-
   ~ do(pickup(key),T) &
   ~ do(putdown(key),T) &
   carrying(key,T) &
   ~ drops(key,T).

drops(key,T) <-
   slippery(key,T) &
   drop_slippery_key(T).

drops(key,T) <-
   ~ slippery(key,T) &
   fumbles_key(T).

random([drop_slippery_key(T):0.9,holds_slippery_key(T):0.1]).
random([fumbles_key(T):0.2,retains_key(T):0.8]).

at(robot,Pos,s(T)) <-
   do(goto(Pos),T) &
   goto_succeeds(T).
at(robot,Pos1,s(T)) <-
   do(goto(Pos),T) &
   at(robot,Pos1,T) &
   ~ goto_succeeds(T).
at(robot,Pos,s(T)) <-
   ~ goto_action(T) &
   at(robot,Pos,T).
goto_action(T) <-
   do(goto(Pos),T).

random([goto_succeeds(T):0.93,goto_fails(T):0.07]).

at(key,Pos,T) <-
   carrying(key,T) &
   at(robot,Pos,T).
at(key,Pos,s(T)) <-
   ~ carrying(key,s(T)) &
   at(key,Pos,T).

slippery(key,s(T)) <-
   slippery(key,T) &
   stays_slippery(T).
%slippery(key,s(T)) <-
%   ~ slippery(key,T) &
%   becomes_slippery(T).
slippery(key,0) <-
   initially_slippery(key).

random([stays_slippery(T):0.75,stops_being_slippery(T):0.25]).
random([becomes_slippery(T):0.05,stays_unslippery(T):0.95]).
random([initially_slippery(key):0.5,initially_unslippery(key):0.5]).

% Particular scenario
do(goto(loc1),0) <- true.
do(pickup(key),s(0)) <- true.
%do(pickup(key),s(s(0))) <- true.
do(goto(loc2),s(s(0))) <- true.

at(key,loc1,0) <- true.
at(robot,loc0,0) <- true.
  
%? explain(at(robot,loc1,s(0)), [],[]).
%? explain(carrying(key,s(s(0))), [],[]).
%? explain(slippery(key,s(s(0))), [],[]).
%? explain(slippery(key,s(0)), [],[]).
%? explain(slippery(key,0), [],[]).
%? explain(carrying(key,s(s(s(0)))), [],[]).
%? explain(~ carrying(key,s(s(s(0)))), [],[]).
%? explain(at(key,loc1,s(s(s(0)))), [],[]).
%? explain(drops(key,s(s(0))), [],[]).
