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

TestLanguageIntersectionClassicalCase() private method

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

            var zero = A.MkTree("zero", Z.UnitConst);
            Func<Expr, Expr> one = x =>
            {
                return A.MkTree("one", Z.UnitConst, x);
            };
            Func<Expr, Expr, Expr> two = (x, y) =>
            {
                return A.MkTree("two", Z.UnitConst, x, y);
            };

            //the left child has no ones
            var a_rule2 = A.MkAcceptorRule(0, "two", 1, 0);
            var a_rule1 = A.MkAcceptorRule(0, "one", 0);
            var a_rule0 = A.MkAcceptorRule(0, "zero");
            var a_rule3 = A.MkAcceptorRule(1, "two", 1, 1);
            var a_rule4 = A.MkAcceptorRule(1, "zero");

            //the right child has no ones
            var b_rule2 = A.MkAcceptorRule(0, "two", 0, 1);
            var b_rule1 = A.MkAcceptorRule(0, "one", 0);
            var b_rule0 = A.MkAcceptorRule(0, "zero");
            var b_rule3 = A.MkAcceptorRule(1, "two", 1, 1);
            var b_rule4 = A.MkAcceptorRule(1, "zero");

            var a = A.MkTreeAcceptor(a_rule2, a_rule1, a_rule0, a_rule3, a_rule4);
            var b = A.MkTreeAcceptor(b_rule2, b_rule1, b_rule0, b_rule3, b_rule4);

            //left and right subtrees have no ones
            var ab = a.Intersect(b);

            Assert.IsTrue(ab.Accepts(two(two(zero, zero), zero)));
            Assert.IsTrue(ab.Accepts(one(one(two(zero, zero)))));
            Assert.IsFalse(ab.Accepts(two(two(zero, one(zero)), zero)));
        }