int flag[2] = {0,0};
int turn = 1;

proctype P1 {
	int i = 1;
	do
	:: true ->
		do
		:: true ->
			store(flag[i-1],1);
			do
			:: load(turn,i) -> break;
			:: load(turn,3-i) ->
				if
				:: load(flag[2-i],0) -> store(turn,i);
				:: load(flag[2-i],1) || load(flag[2-i],2) -> skip;
				fi;
			od;
			store(flag[i-1],2);
			
			if
			:: load(flag[2-i],2) -> skip;
			:: load(flag[2-i],1) || load(flag[2-i],0) -> break;
			fi;
		od;
		
		store(flag[i-1],0);
	od;
}

proctype P2 {
	int i = 2;
	do
	:: true ->
		do
		:: true ->
			store(flag[i-1],1);
			do
			:: load(turn,i) -> break;
			:: load(turn,3-i) ->
				if
				:: load(flag[2-i],0) -> store(turn,i);
				:: load(flag[2-i],1) || load(flag[2-i],2) -> skip;
				fi;
			od;
			store(flag[i-1],2);
			
			if
			:: load(flag[2-i],2) -> skip;
			:: load(flag[2-i],1) || load(flag[2-i],0) -> break;
			fi;
		od;
		
		store(flag[i-1],0);
	od;
}
