21 using System.Diagnostics.Contracts;
23 namespace Microsoft.Z3
28 [ContractVerification(
true)]
38 Contract.Ensures(Contract.Result<
Expr>() != null);
53 Contract.Ensures(Contract.Result<
FuncDecl>() != null);
82 Contract.Ensures(Contract.Result<
Expr[]>() != null);
86 for (uint i = 0; i < n; i++)
98 Contract.Requires(args != null);
99 Contract.Requires(Contract.ForAll(args, a => a != null));
101 Context.CheckContextMatch(args);
102 if (args.Length != NumArgs)
103 throw new Z3Exception(
"Number of arguments does not match");
117 Contract.Requires(from != null);
118 Contract.Requires(to != null);
119 Contract.Requires(Contract.ForAll(from, f => f != null));
120 Contract.Requires(Contract.ForAll(to, t => t != null));
121 Contract.Ensures(Contract.Result<
Expr>() != null);
123 Context.CheckContextMatch(from);
125 if (from.Length != to.Length)
126 throw new Z3Exception(
"Argument sizes do not match");
136 Contract.Requires(from != null);
137 Contract.Requires(to != null);
138 Contract.Ensures(Contract.Result<
Expr>() != null);
140 return Substitute(
new Expr[] { from },
new Expr[] { to });
151 Contract.Requires(to != null);
152 Contract.Requires(Contract.ForAll(to, t => t != null));
153 Contract.Ensures(Contract.Result<
Expr>() != null);
166 Contract.Requires(ctx != null);
167 Contract.Ensures(Contract.Result<
Expr>() != null);
169 if (ReferenceEquals(
Context, ctx))
178 public override string ToString()
186 public bool IsNumeral
195 public bool IsWellSorted
207 Contract.Ensures(Contract.Result<
Sort>() != null);
222 #region Integer Numerals
228 get {
return IsNumeral &&
IsInt; }
232 #region Real Numerals
238 get {
return IsNumeral && IsReal; }
242 #region Algebraic Numbers
246 public bool IsAlgebraicNumber
252 #region Term Kind Tests
254 #region Boolean Terms
325 #region Arithmetic Terms
505 #region Bit-vector terms
582 internal bool IsBVUDiv0 {
get {
return FuncDecl.DeclKind ==
Z3_decl_kind.Z3_OP_BUDIV0; } }
587 internal bool IsBVSRem0 {
get {
return FuncDecl.DeclKind ==
Z3_decl_kind.Z3_OP_BSREM0; } }
592 internal bool IsBVURem0 {
get {
return FuncDecl.DeclKind ==
Z3_decl_kind.Z3_OP_BUREM0; } }
597 internal bool IsBVSMod0 {
get {
return FuncDecl.DeclKind ==
Z3_decl_kind.Z3_OP_BSMOD0; } }
1302 #region Relational Terms
1306 public bool IsRelation
1423 #region Finite domain terms
1427 public bool IsFiniteDomain
1443 #region Bound Variables
1468 throw new Z3Exception(
"Term is not a bound variable.");
1470 Contract.EndContractBlock();
1481 internal protected Expr(
Context ctx) : base(ctx) { Contract.Requires(ctx != null); }
1485 internal protected Expr(
Context ctx, IntPtr obj) : base(ctx, obj) { Contract.Requires(ctx != null); }
1489 internal override void CheckNativeObject(IntPtr obj)
1494 throw new Z3Exception(
"Underlying object is not a term");
1495 base.CheckNativeObject(obj);
1500 internal static Expr Create(Context ctx, FuncDecl f, params Expr[] arguments)
1502 Contract.Requires(ctx != null);
1503 Contract.Requires(f != null);
1504 Contract.Ensures(Contract.Result<Expr>() != null);
1506 IntPtr obj = Native.Z3_mk_app(ctx.nCtx, f.NativeObject,
1507 AST.ArrayLength(arguments),
1508 AST.ArrayToNative(arguments));
1509 return Create(ctx, obj);
1513 new internal static Expr Create(Context ctx, IntPtr obj)
1515 Contract.Requires(ctx != null);
1516 Contract.Ensures(Contract.Result<Expr>() != null);
1520 return new Quantifier(ctx, obj);
1521 IntPtr s = Native.Z3_get_sort(ctx.nCtx, obj);
1524 if (Native.Z3_is_algebraic_number(ctx.nCtx, obj) != 0)
1525 return new AlgebraicNum(ctx, obj);
1527 if (Native.Z3_is_numeral_ast(ctx.nCtx, obj) != 0)
1531 case Z3_sort_kind.Z3_INT_SORT:
return new IntNum(ctx, obj);
1532 case Z3_sort_kind.Z3_REAL_SORT:
return new RatNum(ctx, obj);
1533 case Z3_sort_kind.Z3_BV_SORT:
return new BitVecNum(ctx, obj);
1539 case Z3_sort_kind.Z3_BOOL_SORT:
return new BoolExpr(ctx, obj);
1540 case Z3_sort_kind.Z3_INT_SORT:
return new IntExpr(ctx, obj);
1541 case Z3_sort_kind.Z3_REAL_SORT:
return new RealExpr(ctx, obj);
1542 case Z3_sort_kind.Z3_BV_SORT:
return new BitVecExpr(ctx, obj);
1543 case Z3_sort_kind.Z3_ARRAY_SORT:
return new ArrayExpr(ctx, obj);
1544 case Z3_sort_kind.Z3_DATATYPE_SORT:
return new DatatypeExpr(ctx, obj);
1547 return new Expr(ctx, obj);
1561 internal BoolExpr(
Context ctx, IntPtr obj) : base(ctx, obj) { Contract.Requires(ctx != null); }
1575 Contract.Requires(ctx != null);
1580 Contract.Requires(ctx != null);
1595 Contract.Requires(ctx != null);
1600 Contract.Requires(ctx != null);
1615 Contract.Requires(ctx != null);
1620 Contract.Requires(ctx != null);
1634 public uint SortSize
1642 internal BitVecExpr(
Context ctx, IntPtr obj) : base(ctx, obj) { Contract.Requires(ctx != null); }
1656 Contract.Requires(ctx != null);
1661 Contract.Requires(ctx != null);
1676 Contract.Requires(ctx != null);
1681 Contract.Requires(ctx != null);