Ejemplo n.º 1
0
        /// <summary>
        /// Returns true if the union accepts all constants in the range [end1, end2]
        /// </summary>
        internal bool AcceptsConstants(BigInteger end1, BigInteger end2)
        {
            if (!ContainsConstants)
            {
                return(false);
            }

            BigInteger lower, upper;

            if (end1 <= end2)
            {
                lower = end1;
                upper = end2;
            }
            else
            {
                lower = end2;
                upper = end1;
            }

            if (elements.Contains(table.GetSortSymbol(BaseSortKind.Real)) ||
                elements.Contains(table.GetSortSymbol(BaseSortKind.Integer)))
            {
                return(true);
            }

            if (elements.Contains(table.GetSortSymbol(BaseSortKind.NegInteger)))
            {
                if (lower.Sign < 0 && upper.Sign < 0)
                {
                    return(true);
                }
                else if (lower.Sign < 0)
                {
                    lower = BigInteger.Zero;
                }
            }

            if (elements.Contains(table.GetSortSymbol(BaseSortKind.Natural)))
            {
                if (lower.Sign >= 0 && upper.Sign >= 0)
                {
                    return(true);
                }
                else if (upper.Sign >= 0)
                {
                    upper = BigInteger.MinusOne;
                }
            }
            else if (elements.Contains(table.GetSortSymbol(BaseSortKind.PosInteger)))
            {
                if (lower.Sign > 0 && upper.Sign > 0)
                {
                    return(true);
                }
                else if (upper.Sign > 0)
                {
                    upper = BigInteger.Zero;
                }
            }

            return(intervals.Contains(lower, upper));
        }