示例#1
0
        public Z3IntExpr MkIntCoercion(Z3Expr rng)
        {
            Contract.Requires(rng.Sort.Equals(Representation));
            var i = (Z3BVExpr)UnboxingFun.Apply(rng);
            var c = (Z3IntExpr)z3Lower.Add(Context, i.BV2Int(Context));

            return(c);
        }
示例#2
0
        /// <summary>
        /// Coerces an integer into a natural.
        /// </summary>
        public Z3Expr MkNegCoercion(Z3IntExpr i)
        {
            var zero = Context.MkInt(0);
            var one  = Context.MkInt(1);
            var two  = Context.MkInt(2);

            var oddCase = BoxingFun.Apply(i.Add(Context, one).Div(Context, two));

            var coercion = i.IsEven(Context).Ite(
                Context,
                BoxingFun.Apply(i.Neg(Context).Div(Context, two)),
                oddCase);

            return(coercion);
        }
示例#3
0
        /// <summary>
        /// Coerces an integer into a natural.
        /// </summary>
        public Z3Expr MkNatCoercion(Z3IntExpr i)
        {
            var zero = Context.MkInt(0);
            var one  = Context.MkInt(1);
            var two  = Context.MkInt(2);

            var evenCase = BoxingFun.Apply(i.Neg(Context).Div(Context, two));

            var coercion = i.IsEven(Context).Not(Context).Ite(
                Context,
                BoxingFun.Apply(i.Add(Context, one).Div(Context, two)),
                evenCase);

            coercion = i.Eq(Context, zero).Ite(
                Context,
                BoxingFun.Apply(zero),
                coercion);
            return(coercion);
        }