private static SymbolicTransform GenerateOneTimesXToXTransform()
        {
            var constraint = new BasicSymbolicConstraint(
                s => s.Type == SymbolType.Multiplication,
                new BasicSymbolicConstraint[] {
                new BasicSymbolicConstraint(
                    s => s.Type == SymbolType.Number && (Number)s == Numbers.One),
                new BasicSymbolicConstraint()
            }
                );
            var varName  = "value";
            var inputMap = new SymbolMap(
                new SymbolMap[]
            {
                new SymbolMap(),     // placeholder for left part
                new SymbolMap(new SymbolName(varName))
            }
                );
            var context = inputMap.GenerateContext();

            var outputExpression = new Variable(varName);
            var outputFunction   = new Function(outputExpression, context);

            return(SymbolicTransform.New(constraint, inputMap, outputFunction));
        }
        private static SymbolicTransform GenerateAdditionForceValuesLeftTransform()
        {
            // constraint where value is on the right, and
            // some non-left subtree is on the left
            var constraint = new BasicSymbolicConstraint(
                s => s.Type == SymbolType.Addition,
                new BasicSymbolicConstraint[] {
                new BasicSymbolicConstraint(
                    s => !s.Type.IsValue()
                    ),
                new BasicSymbolicConstraint(
                    s => s.Type.IsValue()
                    )
            }
                );

            var leftName  = "left";
            var rightName = "right";
            var inputMap  = new SymbolMap(new SymbolMap[]
            {
                new SymbolMap(new SymbolName(leftName)),
                new SymbolMap(new SymbolName(rightName))
            });
            var context = inputMap.GenerateContext();

            var outputExpression = new Addition(
                new Variable(rightName),
                new Variable(leftName)
                );
            var outputFunction = new Function(outputExpression, context);

            return(SymbolicTransform.New(constraint, inputMap, outputFunction));
        }