Пример #1
0
        public void BottomUpRewriter_NumToArith_Partial_FallbackUnconditional()
        {
            var logger = new StringWriter();

            var burw = new BottomUpRewriter <NumExpr, NumNodeType, ArithExpr, NumWildcardFactory>
            {
                // Leaf nodes
                Leaves =
                {
                    { (Val c) => new Const(c.Value), 1 },
                },

                // Tree patterns
                Rules =
                {
                    { (l,              r) => new Plus(l, r),                    (l, r) => new Add(l, r), 2 },
                    { (a,              b,                c) => new TimesPlus(a, b,  c),              (a, b, c) => new Add(new Mul(a, b), c), 2},
                    { x => new Inc(x), x => new Add(x,   new Const(1)),        2 },
                },

                // Fallback rules
                Fallbacks =
                {
                    { n => new Lazy(() => n.Eval()), 1 },
                },

                Log = logger
            };

            // Internal tables
            var debugView = burw.DebugView;

            Assert.IsTrue(!string.IsNullOrEmpty(debugView));

            var e = new TimesPlus(
                new Inc(
                    new Times(
                        new Val(2),
                        new Val(3)
                        )
                    ),
                new Times(
                    new Val(4),
                    new Val(5)
                    ),
                new Val(6)
                );

            var res = burw.Rewrite(e);

            Assert.IsTrue(res.ToString().Contains("Lazy"));
            Assert.AreEqual(e.Eval(), res.Eval());
        }
Пример #2
0
        public void BottomUpRewriter_NumToArith_Partial_FallbackWithPredicate()
        {
            var logger = new StringWriter();

            var burw = new BottomUpRewriter <NumExpr, NumNodeType, ArithExpr, NumWildcardFactory>
            {
                // Leaf nodes
                Leaves =
                {
                    { (Val c) => new Const(c.Value), 1 },
                },

                // Tree patterns
                Rules =
                {
                    { (l,              r) => new Plus(l, r),                    (l, r) => new Add(l, r), 2 },
                    { (a,              b,                c) => new TimesPlus(a, b,  c),              (a, b, c) => new Add(new Mul(a, b), c), 2},
                    { x => new Inc(x), x => new Add(x,   new Const(1)),        2 },
                },

                // Fallback rules
                Fallbacks =
                {
                    { n => new Const(((Times)n).Let(t => t.Left.Eval() * t.Right.Eval())), n => n.Value == NumNodeType.Times, 1 },
                },

                Log = logger
            };

            // Internal tables
            var debugView = burw.DebugView;

            Assert.IsTrue(!string.IsNullOrEmpty(debugView));

            var e = new TimesPlus(
                new Inc(
                    new Times(
                        new Val(2),
                        new Val(3)
                        )
                    ),
                new Times(
                    new Val(4),
                    new Val(5)
                    ),
                new Val(6)
                );

            var res = burw.Rewrite(e);

            Assert.AreEqual("Add(Mul(Add(Const(6), Const(1)), Const(20)), Const(6))", res.ToString());
            Assert.AreEqual(e.Eval(), res.Eval());
        }
Пример #3
0
        public void BottomUpRewriter_NumToArith_Partial_Irreducible()
        {
            var logger = new StringWriter();

            var burw = new BottomUpRewriter <NumExpr, NumNodeType, ArithExpr, NumWildcardFactory>
            {
                // Leaf nodes
                Leaves =
                {
                    { (Val c) => new Const(c.Value), 1 },
                },

                // Tree patterns
                Rules =
                {
                    { (l,              r) => new Plus(l, r),                    (l, r) => new Add(l, r), 2 },
                    { (a,              b,                c) => new TimesPlus(a, b,  c),              (a, b, c) => new Add(new Mul(a, b), c), 2},
                    { x => new Inc(x), x => new Add(x,   new Const(1)),        2 },
                },

                Log = logger
            };

            // Internal tables
            var debugView = burw.DebugView;

            Assert.IsTrue(!string.IsNullOrEmpty(debugView));

            var e = new TimesPlus(
                new Inc(
                    new Times(
                        new Val(2),
                        new Val(3)
                        )
                    ),
                new Times(
                    new Val(4),
                    new Val(5)
                    ),
                new Val(6)
                );

            Assert.ThrowsException <InvalidOperationException>(() => burw.Rewrite(e));
        }