예제 #1
0
            public override FlatAbstractDomain <bool> VisitEqual(Expression left, Expression right, Expression original,
                                                                 FlatAbstractDomain <bool> data)
            {
                ExpressionType leftType  = Decoder.TypeOf(left);
                ExpressionType rightType = Decoder.TypeOf(right);

                if (!leftType.IsFloatingPointType() && !rightType.IsFloatingPointType())
                {
                    if (left.Equals(right) && !Decoder.IsNaN(left) && !Decoder.IsNaN(right))
                    {
                        return(CheckOutcome.True);
                    }
                }

                evalConstant.Visit(left);

                Variable rightVar = Decoder.UnderlyingVariable(right);

                if (evalConstant.HasValue && Domain.ContainsKey(rightVar) && Domain[rightVar].IsNormal())
                {
                    if (Domain[rightVar].Contains(evalConstant.Result))
                    {
                        return(CheckOutcome.False);
                    }
                }

                evalConstant.Visit(right);

                Variable leftVar = Decoder.UnderlyingVariable(right);

                if (evalConstant.HasValue && Domain.ContainsKey(leftVar) && Domain[leftVar].IsNormal())
                {
                    if (Domain[leftVar].Contains(evalConstant.Result))
                    {
                        return(CheckOutcome.False);
                    }
                }

                return(CheckOutcome.Top);
            }