/* Semaphore */
SEMA = (up->down->SEMA). // up is the V operation and down the P operation
property SEMASPEC(N=3) = S[0],
S[0] = (up -> S[1]),
S[i:1..N-1] = (up->S[i+1] | down->S[i-1]),
S[N] = (down -> S[N-1]).
MENU =(up->MENU| down->MENU).
/* demonstration that SEMASPEC is satisfied */
/* minimise and look at LTS */
||SEMAPHORE(N=4) = (sema[0..N-1]:SEMA(N) || SEMASPEC(N) || MENU)
/{sema[i:0..N-2].down/sema[i+1].up,
up/sema[0].up,
down/sema[N-1].down}@{up,down}.