public static Expression Power(Expression a, Expression b)
        {
            // TODO: automatic simplification
            TypeInference     type        = new TypeInference(a, b);
            List <Expression> expressions = type.CastToMaxNumericList();

            return(Expression.Power(expressions[0], expressions[1]));
        }
        public static Expression Divide(Expression a, Expression b)
        {
            if(Elementary.IsConstantZero(a))
            {
                return Arithmeric.Zero();
            }

            if(Elementary.IsConstantOne(b))
            {
                return a;
            }

            TypeInference type = new TypeInference(a, b);
            List<Expression> expressions = type.CastToMaxNumericList();
            return Expression.Divide(expressions[0], expressions[1]);
        }
        public static Expression Subtract(Expression a, Expression b)
        {
            if (Elementary.IsConstantZero(a))
            {
                return(Negate(b));
            }

            if (Elementary.IsConstantZero(b))
            {
                return(a);
            }

            TypeInference     type        = new TypeInference(a, b);
            List <Expression> expressions = type.CastToMaxNumericList();

            return(Expression.Subtract(expressions[0], expressions[1]));
        }
        public static Expression Divide(Expression a, Expression b)
        {
            if (Elementary.IsConstantZero(a))
            {
                return(Arithmeric.Zero());
            }

            if (Elementary.IsConstantOne(b))
            {
                return(a);
            }

            TypeInference     type        = new TypeInference(a, b);
            List <Expression> expressions = type.CastToMaxNumericList();

            return(Expression.Divide(expressions[0], expressions[1]));
        }
        public static Expression Subtract(Expression a, Expression b)
        {
            if(Elementary.IsConstantZero(a))
            {
                return Negate(b);
            }

            if(Elementary.IsConstantZero(b))
            {
                return a;
            }

            TypeInference type = new TypeInference(a, b);
            List<Expression> expressions = type.CastToMaxNumericList();
            return Expression.Subtract(expressions[0], expressions[1]);
        }
 public static Expression Power(Expression a, Expression b)
 {
     // TODO: automatic simplification
     TypeInference type = new TypeInference(a, b);
     List<Expression> expressions = type.CastToMaxNumericList();
     return Expression.Power(expressions[0], expressions[1]);
 }