# 
# 
# 
# cobegin
#    loop
#    think
#    a = ++t;
#    while s+1 < a do wait;
#    critical section
#    s++;
#    end loop
#    ||
#    loop
#    think
#    b = ++t;
#    while s+1 < b do wait;
#    critical section
#    s++;
#    end loop
# coend
# 


TT2TW := {[t,s] -> [t+1,s]};
TW2TC := {[t,s] -> [t,s]};
TC2TT := {[t,s] -> [t,s+1]};

WT2WW := {[t,s] -> [t+1,s]};
WW2WC := {[t,s] -> [t,s] };
WC2WT := {[t,s] -> [t,s+1]};

CT2CW := {[t,s] -> [t+1,s]};
CW2CC := {[t,s] -> [t,s] };
CC2CT := {[t,s] -> [t,s+1]};

TT2WT := {[t,s] -> [t+1,s]};
WT2CT := {[t,s] -> [t,s] };
CT2TT := {[t,s] -> [t,s+1]};

TW2WW := {[t,s] -> [t+1,s]};
WW2CW := {[t,s] -> [t,s] };
CW2TW := {[t,s] -> [t,s+1]};

TC2WC := {[t,s] -> [t+1,s]};
WC2CC := {[t,s] -> [t,s] };
CC2TC := {[t,s] -> [t,s+1]};



all := TT2TW 
  union TW2TC 
  union TC2TT 
  union WT2WW 
  union WW2WC 
  union WC2WT 
  union CT2CW 
  union CW2CC 
  union CC2CT 
  union TT2WT 
  union WT2CT 
  union CT2TT 
  union TW2WW 
  union WW2CW 
  union CW2TW 
  union TC2WC 
  union WC2CC 
  union CC2TC;

all;
all+;



reachable(TT,WT,TW,WW,CT,CW,CC,TC,WC)  {
  TT->TW  : TT2TW ,
  TW->TC  : TW2TC ,
  TC->TT  : TC2TT ,
  WT->WW  : WT2WW ,
  WW->WC  : WW2WC ,
  WC->WT  : WC2WT ,
  CT->CW  : CT2CW ,
  CW->CC  : CW2CC ,
  CC->CT  : CC2CT ,
  TT->WT  : TT2WT ,
  WT->CT  : WT2CT ,
  CT->TT  : CT2TT ,
  TW->WW  : TW2WW ,
  WW->CW  : WW2CW ,
  CW->TW  : CW2TW ,
  TC->WC  : TC2WC ,
  WC->CC  : WC2CC ,
  CC->TC  : CC2TC ,
  TT : {[0,0]}
  };

