# 
# 
# 
# 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,t+1]};
TW2TC := {[t,s,a] -> [t,s] : s+1 >= a};
TC2TT := {[t,s] -> [t,s+1]};

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

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

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

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

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

# remove WW
WT2WC := WT2WW join WW2WC;
WT2CW := WT2WW join WW2CW;
WT2WC;
WT2CW;

TW2WC := TW2WW join WW2WC;
TW2CW := TW2WW join WW2CW;

# remove CW
CT2CC := CT2CW join CW2CC;
CT2TW := CT2CW join CW2TW;
TW2CC := TW2CW join CW2CC;
TW2TW := TW2CW join CW2TW;
WT2CC := WT2CW join CW2CC;
WT2TW := WT2CW join CW2TW;

CT2CC;
WT2CC;
TW2CC;
CT2TW;
WT2TW;
TW2TW;

######## remove WC

TC2CC := TC2WC join WC2CC;
TC2WT := TC2WC join WC2WT;
TW2CC := TW2CC union TW2WC join WC2CC;
TW2WT := TW2WC join WC2WT;
WT2CC := WT2CC union WT2WC join WC2CC;
WT2WT := WT2WC join WC2WT;

TC2CC;
TC2WT;
TW2CC;
TW2WT;
WT2CC;
WT2WT;

###### remove TC

TW2TT := TW2TC join TC2TT;
TW2CC := TW2CC union TW2TC join TC2CC;
TW2WT := TW2WT union TW2TC join TC2WT;

###### remove CT

WT2TT := WT2CT join CT2TT;
WT2CC := WT2CC union WT2CT join CT2CC;
WT2TW := WT2TW union WT2CT join CT2TW;


TT2TW;
TW2TW;
TW2WT;
TW2CC;


#### remove TW


TT2CC := TT2TW join (TW2TW+) join TW2CC union 
	TT2TW join  TW2CC;
TT2WT := TT2WT union
	TT2TW join (TW2TW+) join TW2WT union 
	TT2TW join  TW2WT;
WT2WT := WT2WT union
	WT2TW join TW2WT union
	WT2TW join (TW2TW+) join TW2WT;

TT2TT := (TT2TW join TW2TT union
		TT2TW join (TW2TW+) join TW2TT);

TT2WT;
WT2WT;
WT2CC;
TT2CC;
TT2TT;

WT2WT;
WT2WT_TC := WT2WT+;
WT2WT_TC;



#### remove WT

TT2CC := TT2CC
	union TT2WT join WT2CC
	union TT2WT join (WT2WT_TC) join WT2CC;

TT2TT := TT2TT union TT2WT join TW2TT
		union TT2WT join (WT2WT_TC) join WT2TT;


TT2CC;
TT2TT;

TT2TT_TC := TT2TT+;
(TT2CC union (TT2TT_TC join TT2CC)) \{[0,0]};

