/// <summary>
        /// Combine all the constraints in only one constraint.
        /// </summary>
        /// <param name="expression">The expression, in the form of a list
        /// of constraint in a postfix expression form</param>
        /// <returns></returns>
        public Constraint ResolveExpression(IList <Constraint> expression)
        {
            Stack <Constraint> stack  = new Stack <Constraint>();
            StringBuilder      errors = new StringBuilder();

            foreach (Constraint constraint in expression)
            {
                if (constraint is BinaryOperator)
                {
                    BinaryOperator binop = constraint as BinaryOperator;
                    Constraint     right = stack.Pop();
                    Constraint     left  = stack.Pop();
                    stack.Push(binop.SetConstraint(left, right));
                }
                else if (constraint is UnaryOperator)
                {
                    Debug.Assert(stack.Count > 0, "trying to apply an unary constraint on a null object");
                    UnaryOperator unop = constraint as UnaryOperator;
                    stack.Push(unop.SetConstraint(stack.Pop()));
                }
                else
                {
                    stack.Push(constraint);
                }
            }
            return(stack.Pop());
        }