#define p 1
#define v 0
#define NP 4
byte incrit,counter;
chan sema = [0] of {int};


bool ain,bin;

inline swap(in,out,k){
  in!k;
  out?k;
}

proctype A()
{

   sema?p;
progress:
   incrit=incrit+1;
   skip;
   incrit=incrit-1;
   sema!v;
}


proctype dijkstra(){
end: do
      :: sema!p->
         counter=counter-1;
         sema?v;
         counter=counter+1;
     od;
}  

proctype monitor(){
  assert (incrit == 0 || incrit == 1);
}

init
{
  counter=1;
  incrit=0;
  atomic{
    int j;
    j=0;
    do
     :: j<4->run A(); j++;
     :: else break;
    od;
    run dijkstra();
    run monitor();
  }
}
