int level[3]   = {0,0,0};
int victim[2] = {0,0};


proctype p1 {
int i = 1;
int N = 3;

int j = 1;

do
:: true ->
	j = 1;
	do
	:: j < N ->
		store(level[i-1],j);
		store(victim[j-1],i);
		
		do
		:: load(victim[j-1],i+1) -> break;
		:: load(victim[j-1],i+2) -> break;
		:: j == 1 && load(level[i+1-1],0) ->
    if
    :: load(level[i+2-1],0) -> break;
    :: !load(level[i+2-1],0) -> skip;
    fi;
		:: j == 2 && (load(level[i+1-1],0) || load(level[i+1-1],1)) ->
    if
    :: load(level[i+2-1],0) || load(level[i+2-1],1) -> break;
    :: !load(level[i+2-1],0) && !load(level[i+2-1],1) -> skip;
    fi;
		od;
		
		j = j+1;
	:: j == N -> break;
	od;
	
	store(level[i-1],0);
od;
}


proctype p2 {
int i = 2;
int N = 3;

int j = 1;
	
do
:: true ->
	j = 1;
	do
	:: j < N ->
		store(level[i-1],j);
		store(victim[j-1],i);
		do
		:: load(victim[j-1],i-1) -> break;
		:: load(victim[j-1],i+1) -> break;
		:: j == 1 && load(level[i-1-1],0) ->
    if
    :: load(level[i+1-1],0) -> skip;
    :: !load(level[i+1-1],0) -> break;
    fi;
		:: j == 2 && (load(level[i-1-1],0) || load(level[i-1-1],1)) ->
    if
    :: load(level[i+1-1],0) || load(level[i+1-1],1) -> break;
    :: !load(level[i+1-1],0) && !load(level[i+1-1],1) -> skip;
		  fi;
  od;
		
		j = j+1;
	:: j == N -> break;
	od;
	
	store(level[i-1],0);
od;
}

proctype p3 {
int i = 3;
int N = 3;

int j = 1;

do
:: true ->
	j = 1;
	do
	:: j < N ->
		store(level[i-1],j);
		store(victim[j-1],i);
		do
		:: load(victim[j-1],i-1) -> break;
		:: load(victim[j-1],i-2) -> break;
		:: j == 1 && load(level[i-2-1],0) ->
    if
    :: load(level[i-1-1],0) -> break;
    :: !load(level[i-1-1],0) -> skip;
    fi;
		:: j == 2 && (load(level[i-2-1],0) || load(level[i-2-1],1)) ->
    if
    :: load(level[i-1-1],0) || load(level[i-1-1],1) -> break;
    :: !load(level[i-1-1],0) && !load(level[i-1-1],1) -> skip;
    fi;
		od;
		
		j = j+1;
	:: j == N -> break;
	od;
	
	store(level[i-1],0);
od;
}
