mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
Merge branch 'master' of https://github.com/Z3Prover/z3 into new-ml-api
This commit is contained in:
commit
86126e2c01
67 changed files with 3264 additions and 1103 deletions
|
@ -131,7 +131,7 @@ namespace api {
|
|||
}
|
||||
|
||||
char * context::mk_external_string(char const * str) {
|
||||
m_string_buffer = str;
|
||||
m_string_buffer = str?str:"";
|
||||
return const_cast<char *>(m_string_buffer.c_str());
|
||||
}
|
||||
|
||||
|
|
|
@ -876,7 +876,7 @@ namespace z3 {
|
|||
unsigned lo() const { assert (is_app() && Z3_get_decl_num_parameters(ctx(), decl()) == 2); return static_cast<unsigned>(Z3_get_decl_int_parameter(ctx(), decl(), 1)); }
|
||||
unsigned hi() const { assert (is_app() && Z3_get_decl_num_parameters(ctx(), decl()) == 2); return static_cast<unsigned>(Z3_get_decl_int_parameter(ctx(), decl(), 0)); }
|
||||
|
||||
/**
|
||||
/**
|
||||
\brief sequence and regular expression operations.
|
||||
+ is overloaeded as sequence concatenation and regular expression union.
|
||||
concat is overloaded to handle sequences and regular expressions
|
||||
|
@ -1275,6 +1275,51 @@ namespace z3 {
|
|||
inline expr udiv(expr const & a, int b) { return udiv(a, a.ctx().num_val(b, a.get_sort())); }
|
||||
inline expr udiv(int a, expr const & b) { return udiv(b.ctx().num_val(a, b.get_sort()), b); }
|
||||
|
||||
/**
|
||||
\brief signed reminder operator for bitvectors
|
||||
*/
|
||||
inline expr srem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsrem(a.ctx(), a, b)); }
|
||||
inline expr srem(expr const & a, int b) { return srem(a, a.ctx().num_val(b, a.get_sort())); }
|
||||
inline expr srem(int a, expr const & b) { return srem(b.ctx().num_val(a, b.get_sort()), b); }
|
||||
|
||||
/**
|
||||
\brief unsigned reminder operator for bitvectors
|
||||
*/
|
||||
inline expr urem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvurem(a.ctx(), a, b)); }
|
||||
inline expr urem(expr const & a, int b) { return urem(a, a.ctx().num_val(b, a.get_sort())); }
|
||||
inline expr urem(int a, expr const & b) { return urem(b.ctx().num_val(a, b.get_sort()), b); }
|
||||
|
||||
/**
|
||||
\brief shift left operator for bitvectors
|
||||
*/
|
||||
inline expr shl(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvshl(a.ctx(), a, b)); }
|
||||
inline expr shl(expr const & a, int b) { return shl(a, a.ctx().num_val(b, a.get_sort())); }
|
||||
inline expr shl(int a, expr const & b) { return shl(b.ctx().num_val(a, b.get_sort()), b); }
|
||||
|
||||
/**
|
||||
\brief logic shift right operator for bitvectors
|
||||
*/
|
||||
inline expr lshr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvlshr(a.ctx(), a, b)); }
|
||||
inline expr lshr(expr const & a, int b) { return lshr(a, a.ctx().num_val(b, a.get_sort())); }
|
||||
inline expr lshr(int a, expr const & b) { return lshr(b.ctx().num_val(a, b.get_sort()), b); }
|
||||
|
||||
/**
|
||||
\brief arithmetic shift right operator for bitvectors
|
||||
*/
|
||||
inline expr ashr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvashr(a.ctx(), a, b)); }
|
||||
inline expr ashr(expr const & a, int b) { return ashr(a, a.ctx().num_val(b, a.get_sort())); }
|
||||
inline expr ashr(int a, expr const & b) { return ashr(b.ctx().num_val(a, b.get_sort()), b); }
|
||||
|
||||
/**
|
||||
\brief Extend the given bit-vector with zeros to the (unsigned) equivalent bitvector of size m+i, where m is the size of the given bit-vector.
|
||||
*/
|
||||
inline expr zext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_zero_ext(a.ctx(), i, a)); }
|
||||
|
||||
/**
|
||||
\brief Sign-extend of the given bit-vector to the (signed) equivalent bitvector of size m+i, where m is the size of the given bit-vector.
|
||||
*/
|
||||
inline expr sext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_sign_ext(a.ctx(), i, a)); }
|
||||
|
||||
template<typename T> class cast_ast;
|
||||
|
||||
template<> class cast_ast<ast> {
|
||||
|
|
|
@ -38,5 +38,136 @@ namespace Microsoft.Z3
|
|||
Contract.Requires(ctx != null);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Operators
|
||||
|
||||
private static ArithExpr MkNum(ArithExpr e, int i) { return (ArithExpr)e.Context.MkNumeral(i, e.Context.MkIntSort()); }
|
||||
|
||||
private static ArithExpr MkNum(ArithExpr e, double d) { return (ArithExpr)e.Context.MkNumeral(d.ToString(), e.Context.MkRealSort()); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical divsion operator (over reals) </summary>
|
||||
public static ArithExpr operator /(ArithExpr a, ArithExpr b) { return a.Context.MkDiv(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator /(ArithExpr a, int b) { return a / MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator /(ArithExpr a, double b) { return a / MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator /(int a, ArithExpr b) { return MkNum(b, a) / b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator /(double a, ArithExpr b) { return MkNum(b, a) / b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator -(ArithExpr a) { return a.Context.MkUnaryMinus(a); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator -(ArithExpr a, ArithExpr b) { return a.Context.MkSub(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator -(ArithExpr a, int b) { return a - MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator -(ArithExpr a, double b) { return a - MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator -(int a, ArithExpr b) { return MkNum(b, a) - b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator -(double a, ArithExpr b) { return MkNum(b, a) - b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator +(ArithExpr a, ArithExpr b) { return a.Context.MkAdd(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator +(ArithExpr a, int b) { return a + MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator +(ArithExpr a, double b) { return a + MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator +(int a, ArithExpr b) { return MkNum(b, a) + b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator +(double a, ArithExpr b) { return MkNum(b, a) + b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator *(ArithExpr a, ArithExpr b) { return a.Context.MkMul(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator *(ArithExpr a, int b) { return a * MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator *(ArithExpr a, double b) { return a * MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator *(int a, ArithExpr b) { return MkNum(b, a) * b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static ArithExpr operator *(double a, ArithExpr b) { return MkNum(b, a) * b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator <=(ArithExpr a, ArithExpr b) { return a.Context.MkLe(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator <=(ArithExpr a, int b) { return a <= MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator <=(ArithExpr a, double b) { return a <= MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator <=(int a, ArithExpr b) { return MkNum(b, a) <= b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator <=(double a, ArithExpr b) { return MkNum(b, a) <= b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator <(ArithExpr a, ArithExpr b) { return a.Context.MkLt(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator <(ArithExpr a, int b) { return a < MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator <(ArithExpr a, double b) { return a < MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator <(int a, ArithExpr b) { return MkNum(b, a) < b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator <(double a, ArithExpr b) { return MkNum(b, a) < b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator >(ArithExpr a, ArithExpr b) { return a.Context.MkGt(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator >(ArithExpr a, int b) { return a > MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator >(ArithExpr a, double b) { return a > MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator >(int a, ArithExpr b) { return MkNum(b, a) > b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator >(double a, ArithExpr b) { return MkNum(b, a) > b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator >=(ArithExpr a, ArithExpr b) { return a.Context.MkGe(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator >=(ArithExpr a, int b) { return a >= MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator >=(ArithExpr a, double b) { return a >= MkNum(a, b); }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator >=(int a, ArithExpr b) { return MkNum(b, a) >= b; }
|
||||
|
||||
/// <summary> Operator overloading for arithmetical operator </summary>
|
||||
public static BoolExpr operator >=(double a, ArithExpr b) { return MkNum(b, a) >= b; }
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,5 +34,20 @@ namespace Microsoft.Z3
|
|||
/// <summary> Constructor for BoolExpr </summary>
|
||||
internal BoolExpr(Context ctx, IntPtr obj) : base(ctx, obj) { Contract.Requires(ctx != null); }
|
||||
#endregion
|
||||
|
||||
#region Operators
|
||||
/// <summary> Disjunction of Boolean expressions </summary>
|
||||
public static BoolExpr operator|(BoolExpr a, BoolExpr b) { return a.Context.MkOr(a, b); }
|
||||
|
||||
/// <summary> Conjunction of Boolean expressions </summary>
|
||||
public static BoolExpr operator &(BoolExpr a, BoolExpr b) { return a.Context.MkAnd(a, b); }
|
||||
|
||||
/// <summary> Xor of Boolean expressions </summary>
|
||||
public static BoolExpr operator ^(BoolExpr a, BoolExpr b) { return a.Context.MkXor(a, b); }
|
||||
|
||||
/// <summary> Negation </summary>
|
||||
public static BoolExpr operator !(BoolExpr a) { return a.Context.MkNot(a); }
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Diagnostics.Contracts;
|
||||
using System.Linq;
|
||||
|
||||
namespace Microsoft.Z3
|
||||
{
|
||||
|
@ -814,6 +815,20 @@ namespace Microsoft.Z3
|
|||
return Expr.Create(this, f, args);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a new function application.
|
||||
/// </summary>
|
||||
public Expr MkApp(FuncDecl f, IEnumerable<Expr> args)
|
||||
{
|
||||
Contract.Requires(f != null);
|
||||
Contract.Requires(args == null || Contract.ForAll(args, a => a != null));
|
||||
Contract.Ensures(Contract.Result<Expr>() != null);
|
||||
|
||||
CheckContextMatch(f);
|
||||
CheckContextMatch(args);
|
||||
return Expr.Create(this, f, args.ToArray());
|
||||
}
|
||||
|
||||
#region Propositional
|
||||
/// <summary>
|
||||
/// The true Term.
|
||||
|
@ -959,6 +974,18 @@ namespace Microsoft.Z3
|
|||
return new BoolExpr(this, Native.Z3_mk_and(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an expression representing <c>t[0] and t[1] and ...</c>.
|
||||
/// </summary>
|
||||
public BoolExpr MkAnd(IEnumerable<BoolExpr> t)
|
||||
{
|
||||
Contract.Requires(t != null);
|
||||
Contract.Requires(Contract.ForAll(t, a => a != null));
|
||||
Contract.Ensures(Contract.Result<BoolExpr>() != null);
|
||||
CheckContextMatch(t);
|
||||
return new BoolExpr(this, Native.Z3_mk_and(nCtx, (uint)t.Count(), AST.EnumToNative(t)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an expression representing <c>t[0] or t[1] or ...</c>.
|
||||
/// </summary>
|
||||
|
@ -973,6 +1000,19 @@ namespace Microsoft.Z3
|
|||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Create an expression representing <c>t[0] or t[1] or ...</c>.
|
||||
/// </summary>
|
||||
public BoolExpr MkOr(IEnumerable<BoolExpr> t)
|
||||
{
|
||||
Contract.Requires(t != null);
|
||||
Contract.Requires(Contract.ForAll(t, a => a != null));
|
||||
Contract.Ensures(Contract.Result<BoolExpr>() != null);
|
||||
|
||||
CheckContextMatch(t);
|
||||
return new BoolExpr(this, Native.Z3_mk_or(nCtx, (uint)t.Count(), AST.EnumToNative(t)));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Arithmetic
|
||||
|
@ -989,6 +1029,19 @@ namespace Microsoft.Z3
|
|||
return (ArithExpr)Expr.Create(this, Native.Z3_mk_add(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an expression representing <c>t[0] + t[1] + ...</c>.
|
||||
/// </summary>
|
||||
public ArithExpr MkAdd(IEnumerable<ArithExpr> t)
|
||||
{
|
||||
Contract.Requires(t != null);
|
||||
Contract.Requires(Contract.ForAll(t, a => a != null));
|
||||
Contract.Ensures(Contract.Result<ArithExpr>() != null);
|
||||
|
||||
CheckContextMatch(t);
|
||||
return (ArithExpr)Expr.Create(this, Native.Z3_mk_add(nCtx, (uint)t.Count(), AST.EnumToNative(t)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an expression representing <c>t[0] * t[1] * ...</c>.
|
||||
/// </summary>
|
||||
|
@ -4743,6 +4796,21 @@ namespace Microsoft.Z3
|
|||
}
|
||||
}
|
||||
|
||||
[Pure]
|
||||
internal void CheckContextMatch(IEnumerable<Z3Object> arr)
|
||||
{
|
||||
Contract.Requires(arr == null || Contract.ForAll(arr, a => a != null));
|
||||
|
||||
if (arr != null)
|
||||
{
|
||||
foreach (Z3Object a in arr)
|
||||
{
|
||||
Contract.Assert(a != null); // It was an assume, now we added the precondition, and we made it into an assert
|
||||
CheckContextMatch(a);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[ContractInvariantMethod]
|
||||
private void ObjectInvariant()
|
||||
{
|
||||
|
|
|
@ -66,6 +66,38 @@ namespace Microsoft.Z3
|
|||
/// Assert a constraint (or multiple) into the optimize solver.
|
||||
/// </summary>
|
||||
public void Assert(params BoolExpr[] constraints)
|
||||
{
|
||||
AddConstraints(constraints);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Assert a constraint (or multiple) into the optimize solver.
|
||||
/// </summary>
|
||||
public void Assert(IEnumerable<BoolExpr> constraints)
|
||||
{
|
||||
AddConstraints(constraints);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Alias for Assert.
|
||||
/// </summary>
|
||||
public void Add(params BoolExpr[] constraints)
|
||||
{
|
||||
AddConstraints(constraints);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Alias for Assert.
|
||||
/// </summary>
|
||||
public void Add(IEnumerable<BoolExpr> constraints)
|
||||
{
|
||||
AddConstraints(constraints);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Assert a constraint (or multiple) into the optimize solver.
|
||||
/// </summary>
|
||||
private void AddConstraints(IEnumerable<BoolExpr> constraints)
|
||||
{
|
||||
Contract.Requires(constraints != null);
|
||||
Contract.Requires(Contract.ForAll(constraints, c => c != null));
|
||||
|
@ -76,15 +108,6 @@ namespace Microsoft.Z3
|
|||
Native.Z3_optimize_assert(Context.nCtx, NativeObject, a.NativeObject);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Alias for Assert.
|
||||
/// </summary>
|
||||
public void Add(params BoolExpr[] constraints)
|
||||
{
|
||||
Assert(constraints);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handle to objectives returned by objective functions.
|
||||
/// </summary>
|
||||
|
|
|
@ -20,6 +20,8 @@ Notes:
|
|||
using System;
|
||||
using System.Diagnostics.Contracts;
|
||||
using System.Threading;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Microsoft.Z3
|
||||
{
|
||||
|
@ -135,6 +137,23 @@ namespace Microsoft.Z3
|
|||
return an;
|
||||
}
|
||||
|
||||
[Pure]
|
||||
internal static IntPtr[] EnumToNative(IEnumerable<Z3Object> a)
|
||||
{
|
||||
Contract.Ensures(a == null || Contract.Result<IntPtr[]>() != null);
|
||||
Contract.Ensures(a == null || Contract.Result<IntPtr[]>().Length == a.Count());
|
||||
|
||||
if (a == null) return null;
|
||||
IntPtr[] an = new IntPtr[a.Count()];
|
||||
int i = 0;
|
||||
foreach (var ai in a)
|
||||
{
|
||||
if (ai != null) an[i] = ai.NativeObject;
|
||||
++i;
|
||||
}
|
||||
return an;
|
||||
}
|
||||
|
||||
[Pure]
|
||||
internal static uint ArrayLength(Z3Object[] a)
|
||||
{
|
||||
|
|
|
@ -52,7 +52,7 @@ import math
|
|||
|
||||
if sys.version < '3':
|
||||
def _is_int(v):
|
||||
return isinstance(v, int) or isinstance(v, long)
|
||||
return isinstance(v, (int, long))
|
||||
else:
|
||||
def _is_int(v):
|
||||
return isinstance(v, int)
|
||||
|
@ -95,7 +95,7 @@ def append_log(s):
|
|||
|
||||
def to_symbol(s, ctx=None):
|
||||
"""Convert an integer or string into a Z3 symbol."""
|
||||
if isinstance(s, int):
|
||||
if _is_int(s):
|
||||
return Z3_mk_int_symbol(_get_ctx(ctx).ref(), s)
|
||||
else:
|
||||
return Z3_mk_string_symbol(_get_ctx(ctx).ref(), s)
|
||||
|
@ -3627,7 +3627,7 @@ def Extract(high, low, a):
|
|||
return SeqRef(Z3_mk_seq_extract(s.ctx_ref(), s.as_ast(), offset.as_ast(), length.as_ast()), s.ctx)
|
||||
if __debug__:
|
||||
_z3_assert(low <= high, "First argument must be greater than or equal to second argument")
|
||||
_z3_assert(isinstance(high, int) and high >= 0 and isinstance(low, int) and low >= 0, "First and second arguments must be non negative integers")
|
||||
_z3_assert(_is_int(high) and high >= 0 and _is_int(low) and low >= 0, "First and second arguments must be non negative integers")
|
||||
_z3_assert(is_bv(a), "Third argument must be a Z3 Bitvector expression")
|
||||
return BitVecRef(Z3_mk_extract(a.ctx_ref(), high, low, a.as_ast()), a.ctx)
|
||||
|
||||
|
@ -3849,7 +3849,7 @@ def SignExt(n, a):
|
|||
fe
|
||||
"""
|
||||
if __debug__:
|
||||
_z3_assert(isinstance(n, int), "First argument must be an integer")
|
||||
_z3_assert(_is_int(n), "First argument must be an integer")
|
||||
_z3_assert(is_bv(a), "Second argument must be a Z3 Bitvector expression")
|
||||
return BitVecRef(Z3_mk_sign_ext(a.ctx_ref(), n, a.as_ast()), a.ctx)
|
||||
|
||||
|
@ -3876,7 +3876,7 @@ def ZeroExt(n, a):
|
|||
8
|
||||
"""
|
||||
if __debug__:
|
||||
_z3_assert(isinstance(n, int), "First argument must be an integer")
|
||||
_z3_assert(_is_int(n), "First argument must be an integer")
|
||||
_z3_assert(is_bv(a), "Second argument must be a Z3 Bitvector expression")
|
||||
return BitVecRef(Z3_mk_zero_ext(a.ctx_ref(), n, a.as_ast()), a.ctx)
|
||||
|
||||
|
@ -3899,7 +3899,7 @@ def RepeatBitVec(n, a):
|
|||
aaaa
|
||||
"""
|
||||
if __debug__:
|
||||
_z3_assert(isinstance(n, int), "First argument must be an integer")
|
||||
_z3_assert(_is_int(n), "First argument must be an integer")
|
||||
_z3_assert(is_bv(a), "Second argument must be a Z3 Bitvector expression")
|
||||
return BitVecRef(Z3_mk_repeat(a.ctx_ref(), n, a.as_ast()), a.ctx)
|
||||
|
||||
|
@ -4580,7 +4580,7 @@ class ParamsRef:
|
|||
name_sym = to_symbol(name, self.ctx)
|
||||
if isinstance(val, bool):
|
||||
Z3_params_set_bool(self.ctx.ref(), self.params, name_sym, val)
|
||||
elif isinstance(val, int):
|
||||
elif _is_int(val):
|
||||
Z3_params_set_uint(self.ctx.ref(), self.params, name_sym, val)
|
||||
elif isinstance(val, float):
|
||||
Z3_params_set_double(self.ctx.ref(), self.params, name_sym, val)
|
||||
|
@ -5627,7 +5627,7 @@ class ModelRef(Z3PPObject):
|
|||
x -> 1
|
||||
f -> [1 -> 0, else -> 0]
|
||||
"""
|
||||
if isinstance(idx, int):
|
||||
if _is_int(idx):
|
||||
if idx >= len(self):
|
||||
raise IndexError
|
||||
num_consts = Z3_model_get_num_consts(self.ctx.ref(), self.model)
|
||||
|
@ -9310,7 +9310,7 @@ def IndexOf(s, substr, offset):
|
|||
ctx = _get_ctx2(s, substr, ctx)
|
||||
s = _coerce_seq(s, ctx)
|
||||
substr = _coerce_seq(substr, ctx)
|
||||
if isinstance(offset, int):
|
||||
if _is_int(offset):
|
||||
offset = IntVal(offset, ctx)
|
||||
return SeqRef(Z3_mk_seq_index(s.ctx_ref(), s.as_ast(), substr.as_ast(), offset.as_ast()), s.ctx)
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ Notes:
|
|||
#include"symbol.h"
|
||||
#include"trace.h"
|
||||
#include<sstream>
|
||||
#include<vector>
|
||||
|
||||
void register_z3_replayer_cmds(z3_replayer & in);
|
||||
|
||||
|
@ -46,7 +47,7 @@ struct z3_replayer::imp {
|
|||
size_t m_ptr;
|
||||
size_t_map<void *> m_heap;
|
||||
svector<z3_replayer_cmd> m_cmds;
|
||||
vector<std::string> m_cmds_names;
|
||||
std::vector<std::string> m_cmds_names;
|
||||
|
||||
enum value_kind { INT64, UINT64, DOUBLE, STRING, SYMBOL, OBJECT, UINT_ARRAY, INT_ARRAY, SYMBOL_ARRAY, OBJECT_ARRAY, FLOAT };
|
||||
|
||||
|
@ -676,7 +677,9 @@ struct z3_replayer::imp {
|
|||
|
||||
void register_cmd(unsigned id, z3_replayer_cmd cmd, char const* name) {
|
||||
m_cmds.reserve(id+1, 0);
|
||||
m_cmds_names.reserve(id+1, "");
|
||||
while (static_cast<unsigned>(m_cmds_names.size()) <= id+1) {
|
||||
m_cmds_names.push_back("");
|
||||
}
|
||||
m_cmds[id] = cmd;
|
||||
m_cmds_names[id] = name;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue