#define N 4 byte Fork[N]; #define Think( I ) printf( "Think %d\n", I ) #define Eat( I ) printf( "Eat %d\n", I ) proctype Philosopher( byte I ) { do :: Think( I ) ; atomic { (Fork[I] > 0); Fork[I]-- } ; atomic { (Fork[(I+1)%N] > 0); Fork[(I+1)%N]-- } ; progress: Eat( I ) ; Fork[I]++; Fork[(I+1)%N]++; od } init { byte ind ; assert( N > 2 ) ; atomic { ind = 0; do :: (ind >= N) -> break; :: else -> Fork[ind] = 1; ind++; od; ind = 0; do :: (ind >= N) -> break; :: else -> run Philosopher( ind ); ind++; od; } }