예제 #1
0
    public AllGlobalProposition(int numStates, IProposition f)
    {
        this.f = f;

        // AG(f) === !EF(!f)
        var notF = new NotProposition(f);

        this.existsFuture = new ExistsFutureProposition(numStates, notF);
    }
예제 #2
0
    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));
    }