Automata.Z3.Tests.Z3_TreeTransducerTests.TestCompositionCornerCase2 C# (CSharp) Method

TestCompositionCornerCase2() private method

private TestCompositionCornerCase2 ( ) : void
return void
        public void TestCompositionCornerCase2()
        {
            Z3Provider Z = new Z3Provider();
            var A = (Z.TT.MkRankedAlphabet("A", Z.IntSort, new string[] { "zero", "one", "two" }, new int[] { 0, 1, 2 }));

            var q0 = Z.MkInt(0);
            Func<int, int, Expr> q = (state, var) =>
            {
                return A.MkTrans(A, state, var);
            };

            //two(1+x0,one(x1),one(x2))
            var b = A.MkTree("two",
                        Z.MkAdd(Z.MkInt(1), A.AttrVar),
                        A.MkTree("one", Z.MkAdd(Z.MkInt(1), A.AttrVar), q(0,1)),
                        A.MkTree("one", Z.MkAdd(Z.MkInt(2), A.AttrVar), q(0,1)));

            //add 100 to the attribute of a zero-node
            var rule00 = Z.TT.MkTreeRule(A, A, 0, "zero", Z.True, A.MkTree("zero", Z.MkAdd(Z.MkInt(100),A.AttrVar)));
            //keep one-nodes unchanged
            var rule01 = Z.TT.MkTreeRule(A, A, 0, "one", Z.True, A.MkTree("one", A.AttrVar, q(1,1)));
            //apply transformation to the second child and swap it with the first child
            var rule02 = Z.TT.MkTreeRule(A, A, 0, "two", Z.True, A.MkTree("two", A.AttrVar, A.MkTrans(A, 0, 2), q(1,1)));

            //identity mapping
            var rule10 = Z.TT.MkTreeRule(A, A, 1, "zero", Z.True, A.MkTree("zero", A.AttrVar));
            var rule11 = Z.TT.MkTreeRule(A, A, 0, "one", Z.True, A.MkTree("one", A.AttrVar, q(1, 1)));
            var rule12 = Z.TT.MkTreeRule(A, A, 0, "two", Z.True, A.MkTree("two", A.AttrVar, q(1, 1), q(1, 2)));

            var F = Z.TT.MkTreeAutomaton(0, A, A, new TreeRule[] { rule00, rule01, rule02, rule10, rule11, rule12 });
            var FF = F.Compose(F);

            var t1 = A.MkTree("two", Z.MkInt(22), A.MkTree("zero", Z.MkInt(5)), A.MkTree("zero", Z.MkInt(6)));
            var t2 = A.MkTree("two", Z.MkInt(22), A.MkTree("zero", Z.MkInt(106)), A.MkTree("zero", Z.MkInt(5)));
            var t3 = A.MkTree("two", Z.MkInt(22), A.MkTree("zero", Z.MkInt(105)), A.MkTree("zero", Z.MkInt(106)));
            var t4 = A.MkTree("two", Z.MkInt(22), A.MkTree("zero", Z.MkInt(206)), A.MkTree("zero", Z.MkInt(105)));

            var FFF = FF.Compose(F);
            //Assert.AreEqual(3, FFF.Rules.Count);

            var s2 = F[t1][0];
            var s3 = FF[t1][0];
            var s4 = FFF[t1][0];

            Assert.AreEqual<Expr>(t2, s2);
            Assert.AreEqual<Expr>(t3, s3);
            Assert.AreEqual<Expr>(t4, s4);
        }