public AllGlobalProposition(int numStates, IProposition f) { this.f = f; // AG(f) === !EF(!f) var notF = new NotProposition(f); this.existsFuture = new ExistsFutureProposition(numStates, notF); }
public void AlternatingBitProtocolSender() { // 0* --> 1 <-> 2 g* --> s <-> w // ^ | ^ | // | v | v // 5 <-> 4 <-- 3* bw <-> bs <-- bg* const int numNodes = 6; var ts = new TransitionSystem(numNodes); ts.AddTransition(0, 0); ts.AddTransition(0, 1); ts.AddTransition(1, 2); ts.AddTransition(2, 1); ts.AddTransition(2, 3); ts.AddTransition(3, 3); ts.AddTransition(3, 4); ts.AddTransition(4, 5); ts.AddTransition(5, 4); ts.AddTransition(5, 0); var initial = new[] { 0, 3 }; // initial states var g = new Proposition(numNodes, "g"); // getting data from user g.Set(0, 3); var s = new Proposition(numNodes, "s"); // sending message s.Set(1, 4); var w = new Proposition(numNodes, "w"); // waiting for acknowledgement w.Set(2, 5); var b = new Proposition(numNodes, "b"); // control bit b.Set(3, 4, 5); using (var writer = new StringWriter()) { ts.ExportToGraphviz(writer, new[] { g, s, w, b }); Debug.Log(writer); } // AG(s || w || g) -- the sender is always in one of these three states var or1 = new OrProposition(s, w); var or2 = new OrProposition(or1, g); var ag = new AllGlobalProposition(numNodes, or2); Debug.Log(ag); Assert.IsTrue(ag.Evaluate(ts, initial)); // EG(!s && !w) -- there is a path where the sender is never sending nor waiting var notS = new NotProposition(s); var notW = new NotProposition(w); var and = new AndProposition(notS, notW); var eg = new ExistsGlobalProposition(numNodes, and); Debug.Log(eg); Assert.IsTrue(eg.Evaluate(ts, initial)); }