MODULE phil(leftfork, rightfork) VAR state: {none, left, both}; ASSIGN init(state) := none; next(state) := case state=none: case leftfork=inuse: none; TRUE: left; esac; state=left: case rightfork=inuse: left; TRUE: both; esac; TRUE: none; esac; MODULE main VAR f: array 0..6 of {free, inuse}; ph0: phil(f[6], f[1]); ph1: phil(f[0], f[2]); ph2: phil(f[1], f[3]); ph3: phil(f[2], f[4]); ph4: phil(f[3], f[5]); ph5: phil(f[4], f[6]); ph6: phil(f[5], f[0]); ASSIGN init(f[0]):=free; init(f[1]):=free; init(f[2]):=free; init(f[3]):=free; init(f[4]):=free; init(f[5]):=free; init(f[6]):=free; next(f[0]) := case ph6.state=both | ph1.state=left | ph0.state=both: inuse; TRUE: free; esac; next(f[1]) := case ph0.state=both | ph2.state=left | ph2.state=both: inuse; TRUE: free; esac; next(f[2]) := case ph1.state=both | ph3.state=left | ph3.state=both: inuse; TRUE: free; esac; next(f[3]) := case ph2.state=both | ph4.state=left | ph4.state=both: inuse; TRUE: free; esac; next(f[4]) := case ph3.state=both | ph5.state=left | ph5.state=both: inuse; TRUE: free; esac; next(f[5]) := case ph4.state=both | ph6.state=left | ph6.state=both: inuse; TRUE: free; esac; next(f[6]) := case ph5.state=both | ph0.state=left | ph0.state=both: inuse; TRUE: free; esac; LTLSPEC F( G(ph0.state=left) | G(ph1.state=left) | G(ph2.state=left) | G(ph3.state=left) | G(ph4.state=left) | G(ph5.state=left) | G(ph6.state=left)) --LTLSPEC G( -- (F (ph0.state=both)) & (F (ph1.state=both)) & (F (ph2.state=both)) & -- (F (ph3.state=both)) & (F (ph4.state=both)) & (F (ph5.state=both)) & -- (F (ph6.state=both)))