/// <summary>
        /// Build one or more arcs from the ternary constraint expression.
        /// </summary>
        /// <remarks>
        /// There will be more than one arc because binarization of the expression requires introducing an
        /// encapsulated variable between the two variables involved in the expression.
        /// </remarks>
        /// <param name="expressionConstraintNode">Expression constraint abstract syntax tree.</param>
        /// <returns>One or more arcs.</returns>
        private IReadOnlyCollection <Arc> BuildTernaryExpression(ConstraintExpressionNode expressionConstraintNode)
        {
            var arcAccumulator = new List <Arc>();

            if (!expressionConstraintNode.InnerExpression.RightExpression.IsLiteral)
            {
                var left  = CreateNodeFrom(expressionConstraintNode.InnerExpression.LeftExpression);
                var right = CreateNodeFrom(expressionConstraintNode.InnerExpression.RightExpression);
                var encapsulatedVariable     = new EncapsulatedVariable("U");
                var encapsulatedVariableNode = new EncapsulatedVariableNode(encapsulatedVariable);
                var arc1 = new Arc(left, encapsulatedVariableNode, new EncapsulatedVariableConnector(left, encapsulatedVariableNode, new EncapsulatedSelector(1)));
                arcAccumulator.Add(arc1);
                var arc2 = new Arc(right, encapsulatedVariableNode, new EncapsulatedVariableConnector(encapsulatedVariableNode, right, new EncapsulatedSelector(2)));
                arcAccumulator.Add(arc2);
                var ternaryConstraintExpression     = new TernaryConstraintExpression(expressionConstraintNode, encapsulatedVariableNode, arc1, arc2);
                var encapsulatedVariableDomainValue = ComputeEncapsulatedDomain(ternaryConstraintExpression);
                encapsulatedVariable.DomainValue = encapsulatedVariableDomainValue;
                var expressionSolution = new TernaryConstraintExpressionSolution(ternaryConstraintExpression, encapsulatedVariableDomainValue);
                _modelSolverMap.AddTernaryExpressionSolution(expressionSolution);
            }
            else
            {
                var left = CreateNodeFrom(expressionConstraintNode.InnerExpression.LeftExpression);
                var encapsulatedVariable     = new EncapsulatedVariable("U");
                var encapsulatedVariableNode = new EncapsulatedVariableNode(encapsulatedVariable);
                var arc1 = new Arc(left, encapsulatedVariableNode, new EncapsulatedVariableConnector(left, encapsulatedVariableNode, new EncapsulatedSelector(1)));
                arcAccumulator.Add(arc1);
                var ternaryConstraintExpression     = new TernaryConstraintExpression(expressionConstraintNode, encapsulatedVariableNode, arc1, arc1);
                var encapsulatedVariableDomainValue = ComputeEncapsulatedDomain(ternaryConstraintExpression);
                encapsulatedVariable.DomainValue = encapsulatedVariableDomainValue;
                var expressionSolution = new TernaryConstraintExpressionSolution(ternaryConstraintExpression, encapsulatedVariableDomainValue);
                _modelSolverMap.AddTernaryExpressionSolution(expressionSolution);
            }

            return(new ReadOnlyCollection <Arc>(arcAccumulator));
        }
 /// <summary>
 /// Initialize an encapsulated variable domain value with an encapsulated variable and value sets.
 /// </summary>
 internal EncapsulatedVariableDomainValue(EncapsulatedVariable encapsulatedVariable, IEnumerable <ValueSet> valueSets)
 {
     _encapsulatedVariable = encapsulatedVariable;
     _sets = new List <ValueSet>(valueSets);
 }