smg
player p1
intruder
endplayer
player p2
observer
endplayer
global turn : [1..2] init 1;
global caught : bool init false;
global found_item : bool init false;
const int X_MAX = 10;
const int Y_MAX = 10;
const int RANGE_SQRD = 8;
formula same_pos = x=a & y=b;
formula intruder_at_exit = x=X_MAX-1 & y=Y_MAX-1;
formula are_close = pow(x-a, 2) + pow(y-b, 2) <= RANGE_SQRD ;
module intruder
x : [0..X_MAX] init 0;
y : [0..Y_MAX] init 0;
s1: [0..1] init 0;
[] turn=1 & s1=0 & same_pos & !intruder_at_exit -> (caught'=true);
[] turn=1 & s1=0 & same_pos & intruder_at_exit -> (s1'=1);
[] turn=1 & s1=0 & !same_pos -> (s1'=1);
[] turn=1 & s1=1 & x<X_MAX-1 &!caught-> (x'=x+1) & (turn'=2) & (s1'=0);
[] turn=1 & s1=1 & x>0 &!caught-> (x'=x-1) & (turn'=2) & (s1'=0);
[] turn=1 & s1=1 & y<Y_MAX &!caught-> (y'=y+1) & (turn'=2) & (s1'=0);
[] turn=1 & s1=1 & y>0 &!caught-> (y'=y-1) & (turn'=2) & (s1'=0);
[] turn=1 & s1=1 &!caught & !intruder_at_exit->
0.9 : (turn'=2) & (s1'=0)
+ 0.1 : (turn'=2) & (s1'=0) & (found_item'=true);
[] turn=1 & s1=1 &!caught -> (turn'=2) & (s1'=0);
endmodule
module observer
a : [0..X_MAX-1] init X_MAX-1;
b : [0..Y_MAX-1] init Y_MAX-1;
s2 : [0..1] init 0;
detected : bool init false;
[] turn=2 & s2=0 & are_close -> (detected'=true) & (s2'=1);
[] turn=2 & s2=0 & !are_close -> (detected'=false) & (s2'=1);
[] turn=2 & s2=1 & detected & a<X_MAX-1-> (a'=a+1) & (turn'=1) & (s2'=0);
[] turn=2 & s2=1 & detected & a>0 -> (a'=a-1) & (turn'=1) & (s2'=0);
[] turn=2 & s2=1 & detected & b<Y_MAX-1 -> (b'=b+1) & (turn'=1) & (s2'=0);
[] turn=2 & s2=1 & detected & b>0 -> (b'=b-1) & (turn'=1) & (s2'=0);
[] turn=2 & s2=1 & detected -> (turn'=1) & (s2'=0);
[] turn=2 & s2=1 & !detected ->
0.25: (a'=min(a+1,X_MAX-1)) & (turn'=1) & (s2'=0)
+ 0.25: (a'=max(a-1,0)) & (turn'=1) & (s2'=0)
+ 0.25: (b'=min(b+1,X_MAX-1)) & (turn'=1) & (s2'=0)
+ 0.25: (b'=max(b-1,0)) & (turn'=1) & (s2'=0);
endmodule
label "exit" = intruder_at_exit;
label "caught" = caught=true;
label "found_item" = found_item=true;
label "detected" = detected;