1. process medium const n var b : 0..1, k : 0..n-1 par i : 0..n-1 begin rcv bit(b) from p[i] --> k := 0; do k < n --> send bit(b) to p[k]; k := k+1; od end process p[i : 0..n-1] var rcvd : array[integer] of 0..1, x : integer, {index of rcvd, init. 0} b : 0..1, begin true --> {send next b to medium} b := any; send bit(b) to medium [] rcv bit(b) from medium --> rcvd[x],x := b, x+1 end Arrays "rcvd" in all the processes eventually become identical. 2. process p[i : 0..2] inp J : set { k | 0<=k<3 ^ k!=i } var round : array [integer] of 0..2, x : integer, {index of round; init. 0} y,z : 0..2, {init. 0} gen,rcvd: boolean {init. false} j : J {init. j = i +3 1 } begin ~gen --> y := random; z := z +3 y; send data(y) to p[i +3 1]; send data(y) to p[i +3 2]; gen : = true; if rcvd --> j := i+3 2 [] ~rcvd --> skip fi [] rcv data(y) from p[j] --> z := z +3 y; if j = i+3 1 --> rcvd := true; if gen --> j := i +3 2 [] ~gen --> skip fi [] j = i +3 2 --> round[x],x,gen,rcvd,j,z := z, x+1, false, false, i +3 1, 0 fi end 3. process p[i : 0..2] inp J : set { k | 0<=k y := random; z := z +n y; k := 0; do k < n --> if k = i --> skip [] k != i --> send data(y) to p[k] fi; k := k + 1 od gen : = true; if rcvd --> j := i+n 2 [] ~rcvd --> skip fi [] rcv data(y) from p[j] --> z := z +n y; if j = i +n 1 --> rcvd := true; if gen --> j := i +n 2 [] ~gen --> skip fi [] j != i +n 1 ^ j != i +n (n-1) --> j := j +n 1 [] j = i +n (n-1) --> round[x],x,gen,rcvd,j,z := z, x+1, false, false, i +n 1, 0 fi end