/** Alternating bit protocol (ABP)
 *  
 *  Gregor v. Bochmann, October 2015 */

property SERVICE = (s -> r -> SERVICE).

// good design of PE1:
PE1 = (s -> PE1_20),
PE1_20 = (sM0 -> PE1_30),
PE1_30 = (rAck0 -> s -> PE1_21 | rAckE -> PE1_20 | rAck1 -> PE1_20),
PE1_21 = (sM1 -> PE1_31),
PE1_31 = (rAck1 -> s -> PE1_20 | rAckE -> PE1_21 | rAck1 -> PE1_21).


// faulty design of PE1 - saftety problem:
// PE1 = (s -> XXX),
// XXX = (sM -> rAck -> PE1  |  s -> PE1).

// faulty design of PE1 - progress problem:
// PE1 = (s -> XXX),
// XXX = (sM -> rAck -> PE1  |  sM -> YYY),
// YYY = (dummy -> YYY).

PE2 = (rM0 -> r -> PE2_30 | rM1 -> PE2_31 | rME -> PE2_31),
PE2_31 = (sAck1 -> PE2),
PE2_11 = (rM1 -> r -> PE2_31 | rM1 -> PE2_30 | rME -> PE2_30),
PE2_30 = (sAck0 -> PE2_11).

M12 = (sM1 -> M12_M1 | sM0 -> M12_M0),
M12_M1 = (rM1 -> M12 | rME -> M12),
M12_M0 = (rM0 -> M12 | rME -> M12).

M21 = (sAck1 -> M21_M1 | sAck0 -> M21_M0),
M21_M1 = (rAck1 -> M21 | rAckE -> M21),
M21_M0 = (rAck0 -> M21 | rAckE -> M21).

||SYSTEM = (PE1 || PE2 || M12 || M21).

||SAFETYCHECK = (SYSTEM || SERVICE).



