#define true 1
#define false 0
bool choosing[4];
int number[4];
int procid[4];

inline try(i){
  choosing[i]=true;
  int j,mx;
  mx=number[0];
  j=0;
  do
   :: j==4 -> break;
   :: mx<number[j] -> mx=number[j];j=j+1;
   :: else -> j=j+1;
  od;
  number[i]=mx+1;
  choosing[i]=false
}

inline ticket(i,j){
  (number[i] < number[j]) || (number[i]==number[j] && i==j)
}

inline door(i){
  int j;
  j=0;
  do
   :: j<4 -> (j==i || !choosing[j]);
             (j==i || number[j] == 0 || number[i]<number[j] || (number[j]==number[i] && i== j));
            j=j+1;
   :: else -> break;
  od
}

inline exit(i){
  number[i]=0
}

proctype A(int i)
{
   try(i);
   door(i);

progress: 
   count=count+1;
   exit(i)
}

  

init
{
  atomic{
    run A(0);run A(1); run A(2); run A(3); 
  }
}
