/* OR - 2019 Adapted by Jovian HERSEMEULE - 2020 */ const int NAB = 3; const int NBA = 3; const int N = 6; typedef int[0,NAB-1] id_tAB; typedef int[0,NBA-1] id_tBA; int ab=0, ba=0; chan accesAB[NAB], accesBA[NBA], libAB[NAB], libBA[NBA], requestAB[NAB], requestBA[NBA]; system TrainAB, TrainBA, CTRL; E<> TrainBA(1).BA E<> TrainBA(2).BA A[] forall (i : id_tBA) forall (j : id_tAB) TrainBA(i).BA && TrainAB(j).AB imply i == j TrainBA(1).B --> TrainBA(1).BA A<> TrainBA(1).BA A[] not deadlock E<> TrainBA(1).BA & TrainBA(2).BA