21 using System.Diagnostics.Contracts;
23 namespace Microsoft.Z3
28 [ContractVerification(
true)]
40 return Object.ReferenceEquals(a, b) ||
41 (!Object.ReferenceEquals(a, null) &&
42 !Object.ReferenceEquals(b, null) &&
43 a.Context == b.Context &&
64 public override bool Equals(
object o)
67 if (casted == null)
return false;
68 return this == casted;
75 public override int GetHashCode()
102 Contract.Ensures(Contract.Result<
Symbol>() != null);
109 public override string ToString()
118 internal protected Sort(
Context ctx) : base(ctx) { Contract.Requires(ctx != null); }
119 internal Sort(
Context ctx, IntPtr obj) : base(ctx, obj) { Contract.Requires(ctx != null); }
122 internal override void CheckNativeObject(IntPtr obj)
124 if (Native.Z3_get_ast_kind(Context.nCtx, obj) != (uint)
Z3_ast_kind.Z3_SORT_AST)
125 throw new Z3Exception(
"Underlying object is not a sort");
126 base.CheckNativeObject(obj);
130 [ContractVerification(
true)]
131 new internal static Sort Create(Context ctx, IntPtr obj)
133 Contract.Requires(ctx != null);
134 Contract.Ensures(Contract.Result<Sort>() != null);
136 switch ((
Z3_sort_kind)Native.Z3_get_sort_kind(ctx.nCtx, obj))
141 case Z3_sort_kind.Z3_DATATYPE_SORT:
return new DatatypeSort(ctx, obj);
144 case Z3_sort_kind.Z3_UNINTERPRETED_SORT:
return new UninterpretedSort(ctx, obj);
145 case Z3_sort_kind.Z3_FINITE_DOMAIN_SORT:
return new FiniteDomainSort(ctx, obj);
146 case Z3_sort_kind.Z3_RELATION_SORT:
return new RelationSort(ctx, obj);
148 throw new Z3Exception(
"Unknown sort kind");
160 internal BoolSort(
Context ctx, IntPtr obj) : base(ctx, obj) { Contract.Requires(ctx != null); }
171 internal ArithSort(
Context ctx, IntPtr obj) : base(ctx, obj) { Contract.Requires(ctx != null); }
184 Contract.Requires(ctx != null);
189 Contract.Requires(ctx != null);
203 Contract.Requires(ctx != null);
208 Contract.Requires(ctx != null);
227 internal BitVecSort(
Context ctx, IntPtr obj) : base(ctx, obj) { Contract.Requires(ctx != null); }
228 internal BitVecSort(Context ctx, uint size) : base(ctx, Native.
Z3_mk_bv_sort(ctx.nCtx, size)) { Contract.Requires(ctx != null); }
235 [ContractVerification(
true)]
244 Contract.Ensures(Contract.Result<
Sort>() != null);
255 Contract.Ensures(Contract.Result<
Sort>() != null);
261 internal ArraySort(
Context ctx, IntPtr obj) : base(ctx, obj) { Contract.Requires(ctx != null); }
262 internal ArraySort(Context ctx, Sort domain, Sort range)
263 : base(ctx, Native.
Z3_mk_array_sort(ctx.nCtx, domain.NativeObject, range.NativeObject))
265 Contract.Requires(ctx != null);
266 Contract.Requires(domain != null);
267 Contract.Requires(range != null);
275 [ContractVerification(
true)]
281 public uint NumConstructors
293 Contract.Ensures(Contract.Result<
FuncDecl[]>() != null);
295 uint n = NumConstructors;
297 for (uint i = 0; i < n; i++)
310 Contract.Ensures(Contract.Result<
FuncDecl[]>() != null);
312 uint n = NumConstructors;
314 for (uint i = 0; i < n; i++)
327 Contract.Ensures(Contract.Result<
FuncDecl[][]>() != null);
329 uint n = NumConstructors;
331 for (uint i = 0; i < n; i++)
336 for (uint j = 0; j < ds; j++)
345 internal DatatypeSort(
Context ctx, IntPtr obj) : base(ctx, obj) { Contract.Requires(ctx != null); }
347 internal DatatypeSort(Context ctx, Symbol name, Constructor[] constructors)
348 : base(ctx, Native.
Z3_mk_datatype(ctx.nCtx, name.NativeObject, (uint)constructors.Length, ArrayToNative(constructors)))
350 Contract.Requires(ctx != null);
351 Contract.Requires(name != null);
352 Contract.Requires(constructors != null);
366 Contract.Requires(ctx != null);
371 Contract.Requires(ctx != null);
372 Contract.Requires(s != null);
380 [ContractVerification(
true)]
389 Contract.Ensures(Contract.Result<
FuncDecl>() != null);
397 public uint NumFields
409 Contract.Ensures(Contract.Result<
FuncDecl[]>() != null);
413 for (uint i = 0; i < n; i++)
423 Contract.Requires(ctx != null);
424 Contract.Requires(name != null);
426 IntPtr t = IntPtr.Zero;
428 Symbol.ArrayToNative(fieldNames),
AST.ArrayToNative(fieldSorts),
429 ref t,
new IntPtr[numFields]);
437 [ContractVerification(
true)]
446 Contract.Ensures(Contract.Result<
FuncDecl[]>() != null);
448 return _constdecls; }
457 Contract.Ensures(Contract.Result<
Expr[]>() != null);
468 Contract.Ensures(Contract.Result<
FuncDecl[]>() != null);
474 #region Object Invariant
476 [ContractInvariantMethod]
477 private void ObjectInvariant()
479 Contract.Invariant(this._constdecls != null);
480 Contract.Invariant(this._testerdecls != null);
481 Contract.Invariant(this._consts != null);
488 readonly
private FuncDecl[] _constdecls = null, _testerdecls = null;
489 readonly
private Expr[] _consts = null;
491 internal EnumSort(Context ctx, Symbol name, Symbol[] enumNames)
494 Contract.Requires(ctx != null);
495 Contract.Requires(name != null);
496 Contract.Requires(enumNames != null);
498 int n = enumNames.Length;
499 IntPtr[] n_constdecls =
new IntPtr[n];
500 IntPtr[] n_testers =
new IntPtr[n];
501 NativeObject = Native.Z3_mk_enumeration_sort(ctx.nCtx, name.NativeObject, (uint)n,
502 Symbol.ArrayToNative(enumNames), n_constdecls, n_testers);
503 _constdecls =
new FuncDecl[n];
504 for (uint i = 0; i < n; i++)
505 _constdecls[i] =
new FuncDecl(ctx, n_constdecls[i]);
506 _testerdecls =
new FuncDecl[n];
507 for (uint i = 0; i < n; i++)
508 _testerdecls[i] =
new FuncDecl(ctx, n_testers[i]);
509 _consts =
new Expr[n];
510 for (uint i = 0; i < n; i++)
511 _consts[i] = ctx.MkApp(_constdecls[i]);
519 [ContractVerification(
true)]
526 Contract.Ensures(Contract.Result<
FuncDecl>() != null);
536 Contract.Ensures(Contract.Result<
Expr>() != null);
548 Contract.Ensures(Contract.Result<
FuncDecl>() != null);
560 Contract.Ensures(Contract.Result<
FuncDecl>() != null);
573 Contract.Ensures(Contract.Result<
FuncDecl>() != null);
585 Contract.Ensures(Contract.Result<
FuncDecl>() != null);
597 Contract.Ensures(Contract.Result<
FuncDecl>() != null);
602 #region Object Invariant
604 [ContractInvariantMethod]
605 private void ObjectInvariant()
607 Contract.Invariant(nilConst != null);
608 Contract.Invariant(nilDecl != null);
609 Contract.Invariant(isNilDecl != null);
610 Contract.Invariant(consDecl != null);
611 Contract.Invariant(isConsDecl != null);
612 Contract.Invariant(headDecl != null);
613 Contract.Invariant(tailDecl != null);
620 readonly
private FuncDecl nilDecl, isNilDecl, consDecl, isConsDecl, headDecl, tailDecl;
621 readonly
private Expr nilConst;
623 internal ListSort(Context ctx, Symbol name, Sort elemSort)
626 Contract.Requires(ctx != null);
627 Contract.Requires(name != null);
628 Contract.Requires(elemSort != null);
630 IntPtr inil = IntPtr.Zero,
631 iisnil = IntPtr.Zero,
633 iiscons = IntPtr.Zero,
637 NativeObject = Native.Z3_mk_list_sort(ctx.nCtx, name.NativeObject, elemSort.NativeObject,
638 ref inil, ref iisnil, ref icons, ref iiscons, ref ihead, ref itail);
639 nilDecl =
new FuncDecl(ctx, inil);
640 isNilDecl =
new FuncDecl(ctx, iisnil);
641 consDecl =
new FuncDecl(ctx, icons);
642 isConsDecl =
new FuncDecl(ctx, iiscons);
643 headDecl =
new FuncDecl(ctx, ihead);
644 tailDecl =
new FuncDecl(ctx, itail);
645 nilConst = ctx.MkConst(nilDecl);
653 [ContractVerification(
true)]
667 public Sort[] ColumnSorts
671 Contract.Ensures(Contract.Result<
Sort[]>() != null);
673 if (m_columnSorts != null)
674 return m_columnSorts;
678 for (uint i = 0; i < n; i++)
685 private Sort[] m_columnSorts = null;
690 Contract.Requires(ctx != null);
698 [ContractVerification(
true)]
713 Contract.Requires(ctx != null);
715 internal FiniteDomainSort(Context ctx, Symbol name, ulong size)
718 Contract.Requires(ctx != null);
719 Contract.Requires(name != null);
728 [ContractVerification(
true)]
735 Contract.Requires(ctx != null);
740 Contract.Requires(ctx != null);
741 Contract.Requires(ty != null);