示例#1
0
        public Z3BoolExpr MkTest(Z3Expr t, Term type)
        {
            Term intr;
            var  unn = Owner.GetIntersection(Type, type, out intr);
            var  it  = (Z3IntExpr)UnboxingFun.Apply(t);

            if (intr == null)
            {
                return(Context.MkFalse());
            }
            else if (intr == Type)
            {
                return(Context.MkTrue());
            }

            Z3BoolExpr test = null;
            var        iPos = MkIntCoercion(t);

            foreach (var r in unn.RangeMembers)
            {
                test = test.Or(
                    Context,
                    iPos.Ge(
                        Context,
                        Context.MkInt(r.Key.ToString())).And(
                        Context,
                        iPos.Le(Context, Context.MkInt(r.Value.ToString()))));
            }

            return(test);
        }
示例#2
0
        public Z3BoolExpr MkTest(Z3Expr t, Term type)
        {
            Term intr;
            var  unn = Owner.GetIntersection(Type, type, out intr);
            var  bt  = (Z3BVExpr)UnboxingFun.Apply(t);

            if (intr == null)
            {
                return(Context.MkFalse());
            }
            else if (intr == Type)
            {
                return(Context.MkTrue());
            }

            Z3BoolExpr test = null;

            foreach (var i in unn.RangeMembers)
            {
                var istart = Context.MkBV((i.Key - Lower).ToString(), bvSort.Size);
                var iend   = Context.MkBV((i.Value - Lower).ToString(), bvSort.Size);
                test = test.Or(Context, bt.UGe(Context, istart).And(Context, bt.ULe(Context, iend)));
            }

            return(test);
        }
示例#3
0
        public Z3BoolExpr MkTest(Z3Expr t, Term type)
        {
            Term intr;
            var  unn = Owner.GetIntersection(Type, type, out intr);
            var  bt  = (Z3BVExpr)UnboxingFun.Apply(t);

            if (intr == null)
            {
                return(Context.MkFalse());
            }
            else if (intr == Type)
            {
                return(Context.MkTrue());
            }

            Z3BoolExpr test = null;

            foreach (var m in unn.NonRangeMembers)
            {
                if (m.Kind != SymbolKind.BaseCnstSymb && m.Kind != SymbolKind.UserCnstSymb)
                {
                    continue;
                }

                test = test.Or(Context, bt.Eq(Context, Context.MkBV(symbToVal[m], bvSort.Size)));
            }

            return(test);
        }
示例#4
0
        public Z3BoolExpr MkTest(Z3Expr t, Term type)
        {
            Term intr;
            var  unn = Owner.GetIntersection(Type, type, out intr);
            var  rt  = (Z3RealExpr)t;

            if (intr == null)
            {
                return(Context.MkFalse());
            }
            else if (intr == Type)
            {
                return(Context.MkTrue());
            }

            Z3BoolExpr test = null;

            if (unn.Contains(Index.SymbolTable.GetSortSymbol(BaseSortKind.Integer)))
            {
                test = test.Or(Context, Context.MkIsInteger(rt));
            }
            else
            {
                if (unn.Contains(Index.SymbolTable.GetSortSymbol(BaseSortKind.Natural)))
                {
                    test = test.Or(Context, Context.MkIsInteger(rt).And(Context, rt.Ge(Context, Context.MkReal(0))));
                }
                else if (unn.Contains(Index.SymbolTable.GetSortSymbol(BaseSortKind.PosInteger)))
                {
                    test = test.Or(Context, Context.MkIsInteger(rt).And(Context, rt.Ge(Context, Context.MkReal(1))));
                }

                if (unn.Contains(Index.SymbolTable.GetSortSymbol(BaseSortKind.NegInteger)))
                {
                    test = test.Or(Context, Context.MkIsInteger(rt).And(Context, rt.Lt(Context, Context.MkReal(0))));
                }
            }

            Rational r;

            foreach (var e in unn.NonRangeMembers)
            {
                if (e.Kind != SymbolKind.BaseCnstSymb)
                {
                    continue;
                }

                r    = (Rational)((BaseCnstSymb)e).Raw;
                test = test.Or(Context, rt.Eq(Context, Context.MkReal(string.Format("{0}/{1}", r.Numerator, r.Denominator))));
            }

            foreach (var i in unn.RangeMembers)
            {
                test = test.Or(Context, rt.Ge(Context, Context.MkReal(i.Key.ToString())).
                               And(Context, rt.Le(Context, Context.MkReal(i.Value.ToString()))).
                               And(Context, Context.MkIsInteger(rt)));
            }

            return(test);
        }
示例#5
0
        public Z3BoolExpr MkTest(Z3Expr t, Term type)
        {
            Term intr;
            var  unn = Owner.GetIntersection(Type, type, out intr);
            var  it  = (Z3IntExpr)t;

            if (intr == null)
            {
                return(Context.MkFalse());
            }
            else if (intr == Type)
            {
                return(Context.MkTrue());
            }

            Z3BoolExpr test = null;

            if (unn.Contains(Index.SymbolTable.GetSortSymbol(BaseSortKind.Natural)))
            {
                test = test.Or(Context, it.Ge(Context, Context.MkInt(0)));
            }
            else if (unn.Contains(Index.SymbolTable.GetSortSymbol(BaseSortKind.PosInteger)))
            {
                test = test.Or(Context, it.Ge(Context, Context.MkInt(1)));
            }

            if (unn.Contains(Index.SymbolTable.GetSortSymbol(BaseSortKind.NegInteger)))
            {
                test = test.Or(Context, it.Lt(Context, Context.MkInt(0)));
            }

            foreach (var i in unn.RangeMembers)
            {
                test = test.Or(Context, it.Ge(Context, Context.MkInt(i.Key.ToString())).
                               And(Context, it.Le(Context, Context.MkInt(i.Value.ToString()))));
            }

            return(test);
        }
示例#6
0
        public Z3BoolExpr MkTest(Z3Expr t, Term type)
        {
            Contract.Assert(t != null && t.Sort.Equals(Representation));

            Term intr;
            var  unn = Owner.GetIntersection(Type, type, out intr);

            if (intr == null)
            {
                return(Context.MkFalse());
            }
            else if (intr == Type)
            {
                return(Context.MkTrue());
            }

            Z3BoolExpr test = null;
            var        nat  = (Z3IntExpr)UnboxingFun.Apply(t);

            if (unn.Contains(Index.SymbolTable.GetSortSymbol(BaseSortKind.PosInteger)))
            {
                test = test.Or(Context, nat.NEq(Context, Context.MkInt(0)));
            }

            var iNat = MkIntCoercion(t);

            foreach (var r in unn.RangeMembers)
            {
                test = test.Or(
                    Context,
                    iNat.Ge(
                        Context,
                        Context.MkInt(r.Key.ToString())).And(
                        Context,
                        iNat.Le(Context, Context.MkInt(r.Value.ToString()))));
            }

            return(test);
        }
示例#7
0
        public Z3BoolExpr MkTest(Z3Expr t, Term type)
        {
            Term intr;
            var  unn = Owner.GetIntersection(Type, type, out intr);
            var  st  = (Z3Expr)t;

            if (intr == null)
            {
                return(Context.MkFalse());
            }
            else if (intr == Type)
            {
                return(Context.MkTrue());
            }


            Z3BoolExpr   test = null;
            BaseCnstSymb bc;

            foreach (var e in unn.NonRangeMembers)
            {
                if (e.Kind != SymbolKind.BaseCnstSymb)
                {
                    continue;
                }

                bc = (BaseCnstSymb)e;
                if (bc.CnstKind != CnstKind.String)
                {
                    continue;
                }

                test = test.Or(Context, st.Eq(Context, MkGround(e, null)));
            }

            return(test);
        }