/* Binary shared variable */ Process V[2] // two states of variable Event fetchA0, fetchA1, loadA0, loadA1 // access by worker A Event fetchB0, fetchB1, loadB0, loadB1 // access by worker B Event varEvents varEvents = fetchA0 fetchA1 loadA0 loadA1 fetchB0 fetchB1 loadB0 loadB1 V[0] <- fetchA0 V[0] + fetchB0 V[0] + loadA0 V[0] + loadB0 V[0] + loadA1 V[1] + loadB1 V[1] V[1] <- fetchA1 V[1] + fetchB1 V[1] + loadA0 V[0] + loadB0 V[0] + loadA1 V[1] + loadB1 V[1] // display V[0] /* Two mutual-exclusion worker processes */ Process A, AWaiting, B, BWaiting Event nonCriticalA, startCriticalA, finishCriticalA Event nonCriticalB, startCriticalB, finishCriticalB Event nonCriticals nonCriticals = nonCriticalA nonCriticalB A <- nonCriticalA AWaiting AWaiting <- fetchA1 AWaiting + fetchA0 loadA1 startCriticalA finishCriticalA loadA0 A B <- nonCriticalB BWaiting BWaiting <- fetchB1 BWaiting + fetchB0 loadB1 startCriticalB finishCriticalB loadB0 B /* System */ Process System System <- A*B*V[0] display ~System /* Mutual exclusion property */ Process Mutex Mutex <- startCriticalA finishCriticalA Mutex + startCriticalB finishCriticalB Mutex print "System*Mutex == System ? " print (System*Mutex == System) print "\n" print "(System - varEvents - nonCriticals) ==may Mutex ? " print (may_eq((System - varEvents - nonCriticals),Mutex)) print "\n" //print (may_eq(System*Mutex,System))