00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 using System;
00021 using System.Collections.Generic;
00022 using System.Runtime.InteropServices;
00023 using System.Diagnostics.Contracts;
00024
00025 namespace Microsoft.Z3
00026 {
00030 [ContractVerification(true)]
00031 public class Context : IDisposable
00032 {
00033 #region Constructors
00034
00035
00036
00037 public Context()
00038 : base()
00039 {
00040 m_ctx = Native.Z3_mk_context_rc(IntPtr.Zero);
00041 InitContext();
00042 }
00043
00062 public Context(Dictionary<string, string> settings)
00063 : base()
00064 {
00065 Contract.Requires(settings != null);
00066
00067 IntPtr cfg = Native.Z3_mk_config();
00068 foreach (KeyValuePair<string, string> kv in settings)
00069 Native.Z3_set_param_value(cfg, kv.Key, kv.Value);
00070 m_ctx = Native.Z3_mk_context_rc(cfg);
00071 Native.Z3_del_config(cfg);
00072 InitContext();
00073 }
00074 #endregion
00075
00076 #region Symbols
00077
00078
00079
00080
00081
00082
00083
00084 public IntSymbol MkSymbol(int i)
00085 {
00086 Contract.Ensures(Contract.Result<IntSymbol>() != null);
00087
00088 return new IntSymbol(this, i);
00089 }
00090
00094 public StringSymbol MkSymbol(string name)
00095 {
00096 Contract.Ensures(Contract.Result<StringSymbol>() != null);
00097
00098 return new StringSymbol(this, name);
00099 }
00100
00104 internal Symbol[] MkSymbols(string[] names)
00105 {
00106 Contract.Ensures(names == null || Contract.Result<Symbol[]>() != null);
00107 Contract.Ensures(names != null || Contract.Result<Symbol[]>() == null);
00108 Contract.Ensures(Contract.Result<Symbol[]>() == null || Contract.Result<Symbol[]>().Length == names.Length);
00109 Contract.Ensures(Contract.Result<Symbol[]>() == null || Contract.ForAll(Contract.Result<Symbol[]>(), s => s != null));
00110
00111 if (names == null) return null;
00112 Symbol[] result = new Symbol[names.Length];
00113 for (int i = 0; i < names.Length; ++i) result[i] = MkSymbol(names[i]);
00114 return result;
00115 }
00116 #endregion
00117
00118 #region Sorts
00119 private BoolSort m_boolSort = null;
00120 private IntSort m_intSort = null;
00121 private RealSort m_realSort = null;
00122
00126 public BoolSort BoolSort
00127 {
00128 get
00129 {
00130 Contract.Ensures(Contract.Result<BoolSort>() != null);
00131 if (m_boolSort == null) m_boolSort = new BoolSort(this); return m_boolSort;
00132 }
00133 }
00134
00138 public IntSort IntSort
00139 {
00140 get
00141 {
00142 Contract.Ensures(Contract.Result<IntSort>() != null);
00143 if (m_intSort == null) m_intSort = new IntSort(this); return m_intSort;
00144 }
00145 }
00146
00147
00151 public RealSort RealSort
00152 {
00153 get
00154 {
00155 Contract.Ensures(Contract.Result<RealSort>() != null);
00156 if (m_realSort == null) m_realSort = new RealSort(this); return m_realSort;
00157 }
00158 }
00159
00163 public BoolSort MkBoolSort()
00164 {
00165 Contract.Ensures(Contract.Result<BoolSort>() != null);
00166 return new BoolSort(this);
00167 }
00168
00172 public UninterpretedSort MkUninterpretedSort(Symbol s)
00173 {
00174 Contract.Requires(s != null);
00175 Contract.Ensures(Contract.Result<UninterpretedSort>() != null);
00176
00177 CheckContextMatch(s);
00178 return new UninterpretedSort(this, s);
00179 }
00180
00184 public UninterpretedSort MkUninterpretedSort(string str)
00185 {
00186 Contract.Ensures(Contract.Result<UninterpretedSort>() != null);
00187
00188 return MkUninterpretedSort(MkSymbol(str));
00189 }
00190
00194 public IntSort MkIntSort()
00195 {
00196 Contract.Ensures(Contract.Result<IntSort>() != null);
00197
00198 return new IntSort(this);
00199 }
00200
00204 public RealSort MkRealSort()
00205 {
00206 Contract.Ensures(Contract.Result<RealSort>() != null);
00207 return new RealSort(this);
00208 }
00209
00213 public BitVecSort MkBitVecSort(uint size)
00214 {
00215 Contract.Ensures(Contract.Result<BitVecSort>() != null);
00216
00217 return new BitVecSort(this, Native.Z3_mk_bv_sort(nCtx, size));
00218 }
00219
00223 public ArraySort MkArraySort(Sort domain, Sort range)
00224 {
00225 Contract.Requires(domain != null);
00226 Contract.Requires(range != null);
00227 Contract.Ensures(Contract.Result<ArraySort>() != null);
00228
00229 CheckContextMatch(domain);
00230 CheckContextMatch(range);
00231 return new ArraySort(this, domain, range);
00232 }
00233
00237 public TupleSort MkTupleSort(Symbol name, Symbol[] fieldNames, Sort[] fieldSorts)
00238 {
00239 Contract.Requires(name != null);
00240 Contract.Requires(fieldNames != null);
00241 Contract.Requires(Contract.ForAll(fieldNames, fn => fn != null));
00242 Contract.Requires(fieldSorts == null || Contract.ForAll(fieldSorts, fs => fs != null));
00243 Contract.Ensures(Contract.Result<TupleSort>() != null);
00244
00245 CheckContextMatch(name);
00246 CheckContextMatch(fieldNames);
00247 CheckContextMatch(fieldSorts);
00248 return new TupleSort(this, name, (uint)fieldNames.Length, fieldNames, fieldSorts);
00249 }
00250
00254 public EnumSort MkEnumSort(Symbol name, params Symbol[] enumNames)
00255 {
00256 Contract.Requires(name != null);
00257 Contract.Requires(enumNames != null);
00258 Contract.Requires(Contract.ForAll(enumNames, f => f != null));
00259
00260 Contract.Ensures(Contract.Result<EnumSort>() != null);
00261
00262 CheckContextMatch(name);
00263 CheckContextMatch(enumNames);
00264 return new EnumSort(this, name, enumNames);
00265 }
00266
00270 public EnumSort MkEnumSort(string name, params string[] enumNames)
00271 {
00272 Contract.Requires(enumNames != null);
00273 Contract.Ensures(Contract.Result<EnumSort>() != null);
00274
00275 return new EnumSort(this, MkSymbol(name), MkSymbols(enumNames));
00276 }
00277
00281 public ListSort MkListSort(Symbol name, Sort elemSort)
00282 {
00283 Contract.Requires(name != null);
00284 Contract.Requires(elemSort != null);
00285 Contract.Ensures(Contract.Result<ListSort>() != null);
00286
00287 CheckContextMatch(name);
00288 CheckContextMatch(elemSort);
00289 return new ListSort(this, name, elemSort);
00290 }
00291
00295 public ListSort MkListSort(string name, Sort elemSort)
00296 {
00297 Contract.Requires(elemSort != null);
00298 Contract.Ensures(Contract.Result<ListSort>() != null);
00299
00300 CheckContextMatch(elemSort);
00301 return new ListSort(this, MkSymbol(name), elemSort);
00302 }
00303
00310 public FiniteDomainSort MkFiniteDomainSort(Symbol name, ulong size)
00311 {
00312 Contract.Requires(name != null);
00313 Contract.Ensures(Contract.Result<FiniteDomainSort>() != null);
00314
00315 CheckContextMatch(name);
00316 return new FiniteDomainSort(this, name, size);
00317 }
00318
00327 public FiniteDomainSort MkFiniteDomainSort(string name, ulong size)
00328 {
00329 Contract.Ensures(Contract.Result<FiniteDomainSort>() != null);
00330
00331 return new FiniteDomainSort(this, MkSymbol(name), size);
00332 }
00333
00334
00335 #region Datatypes
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346 public Constructor MkConstructor(Symbol name, Symbol recognizer, Symbol[] fieldNames = null, Sort[] sorts = null, uint[] sortRefs = null)
00347 {
00348 Contract.Requires(name != null);
00349 Contract.Requires(recognizer != null);
00350 Contract.Ensures(Contract.Result<Constructor>() != null);
00351
00352 return new Constructor(this, name, recognizer, fieldNames, sorts, sortRefs);
00353 }
00354
00364 public Constructor MkConstructor(string name, string recognizer, string[] fieldNames = null, Sort[] sorts = null, uint[] sortRefs = null)
00365 {
00366 Contract.Ensures(Contract.Result<Constructor>() != null);
00367
00368 return new Constructor(this, MkSymbol(name), MkSymbol(recognizer), MkSymbols(fieldNames), sorts, sortRefs);
00369 }
00370
00374 public DatatypeSort MkDatatypeSort(Symbol name, Constructor[] constructors)
00375 {
00376 Contract.Requires(name != null);
00377 Contract.Requires(constructors != null);
00378 Contract.Requires(Contract.ForAll(constructors, c => c != null));
00379
00380 Contract.Ensures(Contract.Result<DatatypeSort>() != null);
00381
00382 CheckContextMatch(name);
00383 CheckContextMatch(constructors);
00384 return new DatatypeSort(this, name, constructors);
00385 }
00386
00390 public DatatypeSort MkDatatypeSort(string name, Constructor[] constructors)
00391 {
00392 Contract.Requires(constructors != null);
00393 Contract.Requires(Contract.ForAll(constructors, c => c != null));
00394 Contract.Ensures(Contract.Result<DatatypeSort>() != null);
00395
00396 CheckContextMatch(constructors);
00397 return new DatatypeSort(this, MkSymbol(name), constructors);
00398 }
00399
00405 public DatatypeSort[] MkDatatypeSorts(Symbol[] names, Constructor[][] c)
00406 {
00407 Contract.Requires(names != null);
00408 Contract.Requires(c != null);
00409 Contract.Requires(names.Length == c.Length);
00410 Contract.Requires(Contract.ForAll(0, c.Length, j => c[j] != null));
00411 Contract.Requires(Contract.ForAll(names, name => name != null));
00412 Contract.Ensures(Contract.Result<DatatypeSort[]>() != null);
00413
00414 CheckContextMatch(names);
00415 uint n = (uint)names.Length;
00416 ConstructorList[] cla = new ConstructorList[n];
00417 IntPtr[] n_constr = new IntPtr[n];
00418 for (uint i = 0; i < n; i++)
00419 {
00420 Constructor[] constructor = c[i];
00421 Contract.Assume(Contract.ForAll(constructor, arr => arr != null), "Clousot does not support yet quantified formula on multidimensional arrays");
00422 CheckContextMatch(constructor);
00423 cla[i] = new ConstructorList(this, constructor);
00424 n_constr[i] = cla[i].NativeObject;
00425 }
00426 IntPtr[] n_res = new IntPtr[n];
00427 Native.Z3_mk_datatypes(nCtx, n, Symbol.ArrayToNative(names), n_res, n_constr);
00428 DatatypeSort[] res = new DatatypeSort[n];
00429 for (uint i = 0; i < n; i++)
00430 res[i] = new DatatypeSort(this, n_res[i]);
00431 return res;
00432 }
00433
00440 public DatatypeSort[] MkDatatypeSorts(string[] names, Constructor[][] c)
00441 {
00442 Contract.Requires(names != null);
00443 Contract.Requires(c != null);
00444 Contract.Requires(names.Length == c.Length);
00445 Contract.Requires(Contract.ForAll(0, c.Length, j => c[j] != null));
00446 Contract.Requires(Contract.ForAll(names, name => name != null));
00447 Contract.Ensures(Contract.Result<DatatypeSort[]>() != null);
00448
00449 return MkDatatypeSorts(MkSymbols(names), c);
00450 }
00451
00458 public Expr MkUpdateField(FuncDecl field, Expr t, Expr v)
00459 {
00460 return Expr.Create(this, Native.Z3_datatype_update_field(
00461 nCtx, field.NativeObject,
00462 t.NativeObject, v.NativeObject));
00463 }
00464
00465 #endregion
00466 #endregion
00467
00468 #region Function Declarations
00469
00470
00471
00472 public FuncDecl MkFuncDecl(Symbol name, Sort[] domain, Sort range)
00473 {
00474 Contract.Requires(name != null);
00475 Contract.Requires(range != null);
00476 Contract.Requires(Contract.ForAll(domain, d => d != null));
00477 Contract.Ensures(Contract.Result<FuncDecl>() != null);
00478
00479 CheckContextMatch(name);
00480 CheckContextMatch(domain);
00481 CheckContextMatch(range);
00482 return new FuncDecl(this, name, domain, range);
00483 }
00484
00488 public FuncDecl MkFuncDecl(Symbol name, Sort domain, Sort range)
00489 {
00490 Contract.Requires(name != null);
00491 Contract.Requires(domain != null);
00492 Contract.Requires(range != null);
00493 Contract.Ensures(Contract.Result<FuncDecl>() != null);
00494
00495 CheckContextMatch(name);
00496 CheckContextMatch(domain);
00497 CheckContextMatch(range);
00498 Sort[] q = new Sort[] { domain };
00499 return new FuncDecl(this, name, q, range);
00500 }
00501
00505 public FuncDecl MkFuncDecl(string name, Sort[] domain, Sort range)
00506 {
00507 Contract.Requires(range != null);
00508 Contract.Requires(Contract.ForAll(domain, d => d != null));
00509 Contract.Ensures(Contract.Result<FuncDecl>() != null);
00510
00511 CheckContextMatch(domain);
00512 CheckContextMatch(range);
00513 return new FuncDecl(this, MkSymbol(name), domain, range);
00514 }
00515
00519 public FuncDecl MkFuncDecl(string name, Sort domain, Sort range)
00520 {
00521 Contract.Requires(range != null);
00522 Contract.Requires(domain != null);
00523 Contract.Ensures(Contract.Result<FuncDecl>() != null);
00524
00525 CheckContextMatch(domain);
00526 CheckContextMatch(range);
00527 Sort[] q = new Sort[] { domain };
00528 return new FuncDecl(this, MkSymbol(name), q, range);
00529 }
00530
00536 public FuncDecl MkFreshFuncDecl(string prefix, Sort[] domain, Sort range)
00537 {
00538 Contract.Requires(range != null);
00539 Contract.Requires(Contract.ForAll(domain, d => d != null));
00540 Contract.Ensures(Contract.Result<FuncDecl>() != null);
00541
00542 CheckContextMatch(domain);
00543 CheckContextMatch(range);
00544 return new FuncDecl(this, prefix, domain, range);
00545 }
00546
00550 public FuncDecl MkConstDecl(Symbol name, Sort range)
00551 {
00552 Contract.Requires(name != null);
00553 Contract.Requires(range != null);
00554 Contract.Ensures(Contract.Result<FuncDecl>() != null);
00555
00556 CheckContextMatch(name);
00557 CheckContextMatch(range);
00558 return new FuncDecl(this, name, null, range);
00559 }
00560
00564 public FuncDecl MkConstDecl(string name, Sort range)
00565 {
00566 Contract.Requires(range != null);
00567 Contract.Ensures(Contract.Result<FuncDecl>() != null);
00568
00569 CheckContextMatch(range);
00570 return new FuncDecl(this, MkSymbol(name), null, range);
00571 }
00572
00578 public FuncDecl MkFreshConstDecl(string prefix, Sort range)
00579 {
00580 Contract.Requires(range != null);
00581 Contract.Ensures(Contract.Result<FuncDecl>() != null);
00582
00583 CheckContextMatch(range);
00584 return new FuncDecl(this, prefix, null, range);
00585 }
00586 #endregion
00587
00588 #region Bound Variables
00589
00590
00591
00592
00593
00594 public Expr MkBound(uint index, Sort ty)
00595 {
00596 Contract.Requires(ty != null);
00597 Contract.Ensures(Contract.Result<Expr>() != null);
00598
00599 return Expr.Create(this, Native.Z3_mk_bound(nCtx, index, ty.NativeObject));
00600 }
00601 #endregion
00602
00603 #region Quantifier Patterns
00604
00605
00606
00607 public Pattern MkPattern(params Expr[] terms)
00608 {
00609 Contract.Requires(terms != null);
00610 if (terms.Length == 0)
00611 throw new Z3Exception("Cannot create a pattern from zero terms");
00612
00613 Contract.Ensures(Contract.Result<Pattern>() != null);
00614
00615 Contract.EndContractBlock();
00616
00617 IntPtr[] termsNative = AST.ArrayToNative(terms);
00618 return new Pattern(this, Native.Z3_mk_pattern(nCtx, (uint)terms.Length, termsNative));
00619 }
00620 #endregion
00621
00622 #region Constants
00623
00624
00625
00626 public Expr MkConst(Symbol name, Sort range)
00627 {
00628 Contract.Requires(name != null);
00629 Contract.Requires(range != null);
00630 Contract.Ensures(Contract.Result<Expr>() != null);
00631
00632 CheckContextMatch(name);
00633 CheckContextMatch(range);
00634
00635 return Expr.Create(this, Native.Z3_mk_const(nCtx, name.NativeObject, range.NativeObject));
00636 }
00637
00641 public Expr MkConst(string name, Sort range)
00642 {
00643 Contract.Requires(range != null);
00644 Contract.Ensures(Contract.Result<Expr>() != null);
00645
00646 return MkConst(MkSymbol(name), range);
00647 }
00648
00653 public Expr MkFreshConst(string prefix, Sort range)
00654 {
00655 Contract.Requires(range != null);
00656 Contract.Ensures(Contract.Result<Expr>() != null);
00657
00658 CheckContextMatch(range);
00659 return Expr.Create(this, Native.Z3_mk_fresh_const(nCtx, prefix, range.NativeObject));
00660 }
00661
00666 public Expr MkConst(FuncDecl f)
00667 {
00668 Contract.Requires(f != null);
00669 Contract.Ensures(Contract.Result<Expr>() != null);
00670
00671 return MkApp(f);
00672 }
00673
00677 public BoolExpr MkBoolConst(Symbol name)
00678 {
00679 Contract.Requires(name != null);
00680 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00681
00682 return (BoolExpr)MkConst(name, BoolSort);
00683 }
00684
00688 public BoolExpr MkBoolConst(string name)
00689 {
00690 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00691
00692 return (BoolExpr)MkConst(MkSymbol(name), BoolSort);
00693 }
00694
00698 public IntExpr MkIntConst(Symbol name)
00699 {
00700 Contract.Requires(name != null);
00701 Contract.Ensures(Contract.Result<IntExpr>() != null);
00702
00703 return (IntExpr)MkConst(name, IntSort);
00704 }
00705
00709 public IntExpr MkIntConst(string name)
00710 {
00711 Contract.Requires(name != null);
00712 Contract.Ensures(Contract.Result<IntExpr>() != null);
00713
00714 return (IntExpr)MkConst(name, IntSort);
00715 }
00716
00720 public RealExpr MkRealConst(Symbol name)
00721 {
00722 Contract.Requires(name != null);
00723 Contract.Ensures(Contract.Result<RealExpr>() != null);
00724
00725 return (RealExpr)MkConst(name, RealSort);
00726 }
00727
00731 public RealExpr MkRealConst(string name)
00732 {
00733 Contract.Ensures(Contract.Result<RealExpr>() != null);
00734
00735 return (RealExpr)MkConst(name, RealSort);
00736 }
00737
00741 public BitVecExpr MkBVConst(Symbol name, uint size)
00742 {
00743 Contract.Requires(name != null);
00744 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
00745
00746 return (BitVecExpr)MkConst(name, MkBitVecSort(size));
00747 }
00748
00752 public BitVecExpr MkBVConst(string name, uint size)
00753 {
00754 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
00755
00756 return (BitVecExpr)MkConst(name, MkBitVecSort(size));
00757 }
00758 #endregion
00759
00760 #region Terms
00761
00762
00763
00764 public Expr MkApp(FuncDecl f, params Expr[] args)
00765 {
00766 Contract.Requires(f != null);
00767 Contract.Requires(args == null || Contract.ForAll(args, a => a != null));
00768 Contract.Ensures(Contract.Result<Expr>() != null);
00769
00770 CheckContextMatch(f);
00771 CheckContextMatch(args);
00772 return Expr.Create(this, f, args);
00773 }
00774
00775 #region Propositional
00776
00777
00778
00779 public BoolExpr MkTrue()
00780 {
00781 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00782
00783 return new BoolExpr(this, Native.Z3_mk_true(nCtx));
00784 }
00785
00789 public BoolExpr MkFalse()
00790 {
00791 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00792
00793 return new BoolExpr(this, Native.Z3_mk_false(nCtx));
00794 }
00795
00799 public BoolExpr MkBool(bool value)
00800 {
00801 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00802
00803 return value ? MkTrue() : MkFalse();
00804 }
00805
00809 public BoolExpr MkEq(Expr x, Expr y)
00810 {
00811 Contract.Requires(x != null);
00812 Contract.Requires(y != null);
00813 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00814
00815 CheckContextMatch(x);
00816 CheckContextMatch(y);
00817 return new BoolExpr(this, Native.Z3_mk_eq(nCtx, x.NativeObject, y.NativeObject));
00818 }
00819
00823 public BoolExpr MkDistinct(params Expr[] args)
00824 {
00825 Contract.Requires(args != null);
00826 Contract.Requires(Contract.ForAll(args, a => a != null));
00827
00828 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00829
00830 CheckContextMatch(args);
00831 return new BoolExpr(this, Native.Z3_mk_distinct(nCtx, (uint)args.Length, AST.ArrayToNative(args)));
00832 }
00833
00837 public BoolExpr MkNot(BoolExpr a)
00838 {
00839 Contract.Requires(a != null);
00840 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00841
00842 CheckContextMatch(a);
00843 return new BoolExpr(this, Native.Z3_mk_not(nCtx, a.NativeObject));
00844 }
00845
00852 public Expr MkITE(BoolExpr t1, Expr t2, Expr t3)
00853 {
00854 Contract.Requires(t1 != null);
00855 Contract.Requires(t2 != null);
00856 Contract.Requires(t3 != null);
00857 Contract.Ensures(Contract.Result<Expr>() != null);
00858
00859 CheckContextMatch(t1);
00860 CheckContextMatch(t2);
00861 CheckContextMatch(t3);
00862 return Expr.Create(this, Native.Z3_mk_ite(nCtx, t1.NativeObject, t2.NativeObject, t3.NativeObject));
00863 }
00864
00868 public BoolExpr MkIff(BoolExpr t1, BoolExpr t2)
00869 {
00870 Contract.Requires(t1 != null);
00871 Contract.Requires(t2 != null);
00872 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00873
00874 CheckContextMatch(t1);
00875 CheckContextMatch(t2);
00876 return new BoolExpr(this, Native.Z3_mk_iff(nCtx, t1.NativeObject, t2.NativeObject));
00877 }
00878
00882 public BoolExpr MkImplies(BoolExpr t1, BoolExpr t2)
00883 {
00884 Contract.Requires(t1 != null);
00885 Contract.Requires(t2 != null);
00886 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00887
00888 CheckContextMatch(t1);
00889 CheckContextMatch(t2);
00890 return new BoolExpr(this, Native.Z3_mk_implies(nCtx, t1.NativeObject, t2.NativeObject));
00891 }
00892
00896 public BoolExpr MkXor(BoolExpr t1, BoolExpr t2)
00897 {
00898 Contract.Requires(t1 != null);
00899 Contract.Requires(t2 != null);
00900 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00901
00902 CheckContextMatch(t1);
00903 CheckContextMatch(t2);
00904 return new BoolExpr(this, Native.Z3_mk_xor(nCtx, t1.NativeObject, t2.NativeObject));
00905 }
00906
00910 public BoolExpr MkAnd(params BoolExpr[] t)
00911 {
00912 Contract.Requires(t != null);
00913 Contract.Requires(Contract.ForAll(t, a => a != null));
00914 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00915
00916 CheckContextMatch(t);
00917 return new BoolExpr(this, Native.Z3_mk_and(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
00918 }
00919
00923 public BoolExpr MkOr(params BoolExpr[] t)
00924 {
00925 Contract.Requires(t != null);
00926 Contract.Requires(Contract.ForAll(t, a => a != null));
00927 Contract.Ensures(Contract.Result<BoolExpr>() != null);
00928
00929 CheckContextMatch(t);
00930 return new BoolExpr(this, Native.Z3_mk_or(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
00931 }
00932
00933
00934 #endregion
00935
00936 #region Arithmetic
00937
00938
00939
00940 public ArithExpr MkAdd(params ArithExpr[] t)
00941 {
00942 Contract.Requires(t != null);
00943 Contract.Requires(Contract.ForAll(t, a => a != null));
00944 Contract.Ensures(Contract.Result<ArithExpr>() != null);
00945
00946 CheckContextMatch(t);
00947 return (ArithExpr)Expr.Create(this, Native.Z3_mk_add(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
00948 }
00949
00953 public ArithExpr MkMul(params ArithExpr[] t)
00954 {
00955 Contract.Requires(t != null);
00956 Contract.Requires(Contract.ForAll(t, a => a != null));
00957 Contract.Ensures(Contract.Result<ArithExpr>() != null);
00958
00959 CheckContextMatch(t);
00960 return (ArithExpr)Expr.Create(this, Native.Z3_mk_mul(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
00961 }
00962
00966 public ArithExpr MkSub(params ArithExpr[] t)
00967 {
00968 Contract.Requires(t != null);
00969 Contract.Requires(Contract.ForAll(t, a => a != null));
00970 Contract.Ensures(Contract.Result<ArithExpr>() != null);
00971
00972 CheckContextMatch(t);
00973 return (ArithExpr)Expr.Create(this, Native.Z3_mk_sub(nCtx, (uint)t.Length, AST.ArrayToNative(t)));
00974 }
00975
00979 public ArithExpr MkUnaryMinus(ArithExpr t)
00980 {
00981 Contract.Requires(t != null);
00982 Contract.Ensures(Contract.Result<ArithExpr>() != null);
00983
00984 CheckContextMatch(t);
00985 return (ArithExpr)Expr.Create(this, Native.Z3_mk_unary_minus(nCtx, t.NativeObject));
00986 }
00987
00991 public ArithExpr MkDiv(ArithExpr t1, ArithExpr t2)
00992 {
00993 Contract.Requires(t1 != null);
00994 Contract.Requires(t2 != null);
00995 Contract.Ensures(Contract.Result<ArithExpr>() != null);
00996
00997 CheckContextMatch(t1);
00998 CheckContextMatch(t2);
00999 return (ArithExpr)Expr.Create(this, Native.Z3_mk_div(nCtx, t1.NativeObject, t2.NativeObject));
01000 }
01001
01006 public IntExpr MkMod(IntExpr t1, IntExpr t2)
01007 {
01008 Contract.Requires(t1 != null);
01009 Contract.Requires(t2 != null);
01010 Contract.Ensures(Contract.Result<IntExpr>() != null);
01011
01012 CheckContextMatch(t1);
01013 CheckContextMatch(t2);
01014 return new IntExpr(this, Native.Z3_mk_mod(nCtx, t1.NativeObject, t2.NativeObject));
01015 }
01016
01021 public IntExpr MkRem(IntExpr t1, IntExpr t2)
01022 {
01023 Contract.Requires(t1 != null);
01024 Contract.Requires(t2 != null);
01025 Contract.Ensures(Contract.Result<IntExpr>() != null);
01026
01027 CheckContextMatch(t1);
01028 CheckContextMatch(t2);
01029 return new IntExpr(this, Native.Z3_mk_rem(nCtx, t1.NativeObject, t2.NativeObject));
01030 }
01031
01035 public ArithExpr MkPower(ArithExpr t1, ArithExpr t2)
01036 {
01037 Contract.Requires(t1 != null);
01038 Contract.Requires(t2 != null);
01039 Contract.Ensures(Contract.Result<ArithExpr>() != null);
01040
01041 CheckContextMatch(t1);
01042 CheckContextMatch(t2);
01043 return (ArithExpr)Expr.Create(this, Native.Z3_mk_power(nCtx, t1.NativeObject, t2.NativeObject));
01044 }
01045
01049 public BoolExpr MkLt(ArithExpr t1, ArithExpr t2)
01050 {
01051 Contract.Requires(t1 != null);
01052 Contract.Requires(t2 != null);
01053 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01054
01055 CheckContextMatch(t1);
01056 CheckContextMatch(t2);
01057 return new BoolExpr(this, Native.Z3_mk_lt(nCtx, t1.NativeObject, t2.NativeObject));
01058 }
01059
01063 public BoolExpr MkLe(ArithExpr t1, ArithExpr t2)
01064 {
01065 Contract.Requires(t1 != null);
01066 Contract.Requires(t2 != null);
01067 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01068
01069 CheckContextMatch(t1);
01070 CheckContextMatch(t2);
01071 return new BoolExpr(this, Native.Z3_mk_le(nCtx, t1.NativeObject, t2.NativeObject));
01072 }
01073
01077 public BoolExpr MkGt(ArithExpr t1, ArithExpr t2)
01078 {
01079 Contract.Requires(t1 != null);
01080 Contract.Requires(t2 != null);
01081 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01082
01083 CheckContextMatch(t1);
01084 CheckContextMatch(t2);
01085 return new BoolExpr(this, Native.Z3_mk_gt(nCtx, t1.NativeObject, t2.NativeObject));
01086 }
01087
01091 public BoolExpr MkGe(ArithExpr t1, ArithExpr t2)
01092 {
01093 Contract.Requires(t1 != null);
01094 Contract.Requires(t2 != null);
01095 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01096
01097 CheckContextMatch(t1);
01098 CheckContextMatch(t2);
01099 return new BoolExpr(this, Native.Z3_mk_ge(nCtx, t1.NativeObject, t2.NativeObject));
01100 }
01101
01112 public RealExpr MkInt2Real(IntExpr t)
01113 {
01114 Contract.Requires(t != null);
01115 Contract.Ensures(Contract.Result<RealExpr>() != null);
01116
01117 CheckContextMatch(t);
01118 return new RealExpr(this, Native.Z3_mk_int2real(nCtx, t.NativeObject));
01119 }
01120
01128 public IntExpr MkReal2Int(RealExpr t)
01129 {
01130 Contract.Requires(t != null);
01131 Contract.Ensures(Contract.Result<IntExpr>() != null);
01132
01133 CheckContextMatch(t);
01134 return new IntExpr(this, Native.Z3_mk_real2int(nCtx, t.NativeObject));
01135 }
01136
01140 public BoolExpr MkIsInteger(RealExpr t)
01141 {
01142 Contract.Requires(t != null);
01143 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01144
01145 CheckContextMatch(t);
01146 return new BoolExpr(this, Native.Z3_mk_is_int(nCtx, t.NativeObject));
01147 }
01148 #endregion
01149
01150 #region Bit-vectors
01151
01152
01153
01154
01155 public BitVecExpr MkBVNot(BitVecExpr t)
01156 {
01157 Contract.Requires(t != null);
01158 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01159
01160 CheckContextMatch(t);
01161 return new BitVecExpr(this, Native.Z3_mk_bvnot(nCtx, t.NativeObject));
01162 }
01163
01168 public BitVecExpr MkBVRedAND(BitVecExpr t)
01169 {
01170 Contract.Requires(t != null);
01171 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01172
01173 CheckContextMatch(t);
01174 return new BitVecExpr(this, Native.Z3_mk_bvredand(nCtx, t.NativeObject));
01175 }
01176
01181 public BitVecExpr MkBVRedOR(BitVecExpr t)
01182 {
01183 Contract.Requires(t != null);
01184 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01185
01186 CheckContextMatch(t);
01187 return new BitVecExpr(this, Native.Z3_mk_bvredor(nCtx, t.NativeObject));
01188 }
01189
01194 public BitVecExpr MkBVAND(BitVecExpr t1, BitVecExpr t2)
01195 {
01196 Contract.Requires(t1 != null);
01197 Contract.Requires(t2 != null);
01198 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01199
01200 CheckContextMatch(t1);
01201 CheckContextMatch(t2);
01202 return new BitVecExpr(this, Native.Z3_mk_bvand(nCtx, t1.NativeObject, t2.NativeObject));
01203 }
01204
01209 public BitVecExpr MkBVOR(BitVecExpr t1, BitVecExpr t2)
01210 {
01211 Contract.Requires(t1 != null);
01212 Contract.Requires(t2 != null);
01213 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01214
01215 CheckContextMatch(t1);
01216 CheckContextMatch(t2);
01217 return new BitVecExpr(this, Native.Z3_mk_bvor(nCtx, t1.NativeObject, t2.NativeObject));
01218 }
01219
01224 public BitVecExpr MkBVXOR(BitVecExpr t1, BitVecExpr t2)
01225 {
01226 Contract.Requires(t1 != null);
01227 Contract.Requires(t2 != null);
01228 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01229
01230 CheckContextMatch(t1);
01231 CheckContextMatch(t2);
01232 return new BitVecExpr(this, Native.Z3_mk_bvxor(nCtx, t1.NativeObject, t2.NativeObject));
01233 }
01234
01239 public BitVecExpr MkBVNAND(BitVecExpr t1, BitVecExpr t2)
01240 {
01241 Contract.Requires(t1 != null);
01242 Contract.Requires(t2 != null);
01243 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01244
01245 CheckContextMatch(t1);
01246 CheckContextMatch(t2);
01247 return new BitVecExpr(this, Native.Z3_mk_bvnand(nCtx, t1.NativeObject, t2.NativeObject));
01248 }
01249
01254 public BitVecExpr MkBVNOR(BitVecExpr t1, BitVecExpr t2)
01255 {
01256 Contract.Requires(t1 != null);
01257 Contract.Requires(t2 != null);
01258 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01259
01260 CheckContextMatch(t1);
01261 CheckContextMatch(t2);
01262 return new BitVecExpr(this, Native.Z3_mk_bvnor(nCtx, t1.NativeObject, t2.NativeObject));
01263 }
01264
01269 public BitVecExpr MkBVXNOR(BitVecExpr t1, BitVecExpr t2)
01270 {
01271 Contract.Requires(t1 != null);
01272 Contract.Requires(t2 != null);
01273 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01274
01275 CheckContextMatch(t1);
01276 CheckContextMatch(t2);
01277 return new BitVecExpr(this, Native.Z3_mk_bvxnor(nCtx, t1.NativeObject, t2.NativeObject));
01278 }
01279
01284 public BitVecExpr MkBVNeg(BitVecExpr t)
01285 {
01286 Contract.Requires(t != null);
01287 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01288
01289 CheckContextMatch(t);
01290 return new BitVecExpr(this, Native.Z3_mk_bvneg(nCtx, t.NativeObject));
01291 }
01292
01297 public BitVecExpr MkBVAdd(BitVecExpr t1, BitVecExpr t2)
01298 {
01299 Contract.Requires(t1 != null);
01300 Contract.Requires(t2 != null);
01301 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01302
01303 CheckContextMatch(t1);
01304 CheckContextMatch(t2);
01305 return new BitVecExpr(this, Native.Z3_mk_bvadd(nCtx, t1.NativeObject, t2.NativeObject));
01306 }
01307
01312 public BitVecExpr MkBVSub(BitVecExpr t1, BitVecExpr t2)
01313 {
01314 Contract.Requires(t1 != null);
01315 Contract.Requires(t2 != null);
01316 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01317
01318 CheckContextMatch(t1);
01319 CheckContextMatch(t2);
01320 return new BitVecExpr(this, Native.Z3_mk_bvsub(nCtx, t1.NativeObject, t2.NativeObject));
01321 }
01322
01327 public BitVecExpr MkBVMul(BitVecExpr t1, BitVecExpr t2)
01328 {
01329 Contract.Requires(t1 != null);
01330 Contract.Requires(t2 != null);
01331 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01332
01333 CheckContextMatch(t1);
01334 CheckContextMatch(t2);
01335 return new BitVecExpr(this, Native.Z3_mk_bvmul(nCtx, t1.NativeObject, t2.NativeObject));
01336 }
01337
01347 public BitVecExpr MkBVUDiv(BitVecExpr t1, BitVecExpr t2)
01348 {
01349 Contract.Requires(t1 != null);
01350 Contract.Requires(t2 != null);
01351 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01352
01353 CheckContextMatch(t1);
01354 CheckContextMatch(t2);
01355 return new BitVecExpr(this, Native.Z3_mk_bvudiv(nCtx, t1.NativeObject, t2.NativeObject));
01356 }
01357
01371 public BitVecExpr MkBVSDiv(BitVecExpr t1, BitVecExpr t2)
01372 {
01373 Contract.Requires(t1 != null);
01374 Contract.Requires(t2 != null);
01375 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01376
01377 CheckContextMatch(t1);
01378 CheckContextMatch(t2);
01379 return new BitVecExpr(this, Native.Z3_mk_bvsdiv(nCtx, t1.NativeObject, t2.NativeObject));
01380 }
01381
01390 public BitVecExpr MkBVURem(BitVecExpr t1, BitVecExpr t2)
01391 {
01392 Contract.Requires(t1 != null);
01393 Contract.Requires(t2 != null);
01394 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01395
01396 CheckContextMatch(t1);
01397 CheckContextMatch(t2);
01398 return new BitVecExpr(this, Native.Z3_mk_bvurem(nCtx, t1.NativeObject, t2.NativeObject));
01399 }
01400
01411 public BitVecExpr MkBVSRem(BitVecExpr t1, BitVecExpr t2)
01412 {
01413 Contract.Requires(t1 != null);
01414 Contract.Requires(t2 != null);
01415 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01416
01417 CheckContextMatch(t1);
01418 CheckContextMatch(t2);
01419 return new BitVecExpr(this, Native.Z3_mk_bvsrem(nCtx, t1.NativeObject, t2.NativeObject));
01420 }
01421
01429 public BitVecExpr MkBVSMod(BitVecExpr t1, BitVecExpr t2)
01430 {
01431 Contract.Requires(t1 != null);
01432 Contract.Requires(t2 != null);
01433 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01434
01435 CheckContextMatch(t1);
01436 CheckContextMatch(t2);
01437 return new BitVecExpr(this, Native.Z3_mk_bvsmod(nCtx, t1.NativeObject, t2.NativeObject));
01438 }
01439
01446 public BoolExpr MkBVULT(BitVecExpr t1, BitVecExpr t2)
01447 {
01448 Contract.Requires(t1 != null);
01449 Contract.Requires(t2 != null);
01450 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01451
01452 CheckContextMatch(t1);
01453 CheckContextMatch(t2);
01454 return new BoolExpr(this, Native.Z3_mk_bvult(nCtx, t1.NativeObject, t2.NativeObject));
01455 }
01456
01463 public BoolExpr MkBVSLT(BitVecExpr t1, BitVecExpr t2)
01464 {
01465 Contract.Requires(t1 != null);
01466 Contract.Requires(t2 != null);
01467 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01468
01469 CheckContextMatch(t1);
01470 CheckContextMatch(t2);
01471 return new BoolExpr(this, Native.Z3_mk_bvslt(nCtx, t1.NativeObject, t2.NativeObject));
01472 }
01473
01480 public BoolExpr MkBVULE(BitVecExpr t1, BitVecExpr t2)
01481 {
01482 Contract.Requires(t1 != null);
01483 Contract.Requires(t2 != null);
01484 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01485
01486 CheckContextMatch(t1);
01487 CheckContextMatch(t2);
01488 return new BoolExpr(this, Native.Z3_mk_bvule(nCtx, t1.NativeObject, t2.NativeObject));
01489 }
01490
01497 public BoolExpr MkBVSLE(BitVecExpr t1, BitVecExpr t2)
01498 {
01499 Contract.Requires(t1 != null);
01500 Contract.Requires(t2 != null);
01501 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01502
01503 CheckContextMatch(t1);
01504 CheckContextMatch(t2);
01505 return new BoolExpr(this, Native.Z3_mk_bvsle(nCtx, t1.NativeObject, t2.NativeObject));
01506 }
01507
01514 public BoolExpr MkBVUGE(BitVecExpr t1, BitVecExpr t2)
01515 {
01516 Contract.Requires(t1 != null);
01517 Contract.Requires(t2 != null);
01518 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01519
01520 CheckContextMatch(t1);
01521 CheckContextMatch(t2);
01522 return new BoolExpr(this, Native.Z3_mk_bvuge(nCtx, t1.NativeObject, t2.NativeObject));
01523 }
01524
01531 public BoolExpr MkBVSGE(BitVecExpr t1, BitVecExpr t2)
01532 {
01533 Contract.Requires(t1 != null);
01534 Contract.Requires(t2 != null);
01535 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01536
01537 CheckContextMatch(t1);
01538 CheckContextMatch(t2);
01539 return new BoolExpr(this, Native.Z3_mk_bvsge(nCtx, t1.NativeObject, t2.NativeObject));
01540 }
01541
01548 public BoolExpr MkBVUGT(BitVecExpr t1, BitVecExpr t2)
01549 {
01550 Contract.Requires(t1 != null);
01551 Contract.Requires(t2 != null);
01552 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01553
01554 CheckContextMatch(t1);
01555 CheckContextMatch(t2);
01556 return new BoolExpr(this, Native.Z3_mk_bvugt(nCtx, t1.NativeObject, t2.NativeObject));
01557 }
01558
01565 public BoolExpr MkBVSGT(BitVecExpr t1, BitVecExpr t2)
01566 {
01567 Contract.Requires(t1 != null);
01568 Contract.Requires(t2 != null);
01569 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01570
01571 CheckContextMatch(t1);
01572 CheckContextMatch(t2);
01573 return new BoolExpr(this, Native.Z3_mk_bvsgt(nCtx, t1.NativeObject, t2.NativeObject));
01574 }
01575
01586 public BitVecExpr MkConcat(BitVecExpr t1, BitVecExpr t2)
01587 {
01588 Contract.Requires(t1 != null);
01589 Contract.Requires(t2 != null);
01590 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01591
01592 CheckContextMatch(t1);
01593 CheckContextMatch(t2);
01594 return new BitVecExpr(this, Native.Z3_mk_concat(nCtx, t1.NativeObject, t2.NativeObject));
01595 }
01596
01606 public BitVecExpr MkExtract(uint high, uint low, BitVecExpr t)
01607 {
01608 Contract.Requires(t != null);
01609 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01610
01611 CheckContextMatch(t);
01612 return new BitVecExpr(this, Native.Z3_mk_extract(nCtx, high, low, t.NativeObject));
01613 }
01614
01623 public BitVecExpr MkSignExt(uint i, BitVecExpr t)
01624 {
01625 Contract.Requires(t != null);
01626 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01627
01628 CheckContextMatch(t);
01629 return new BitVecExpr(this, Native.Z3_mk_sign_ext(nCtx, i, t.NativeObject));
01630 }
01631
01641 public BitVecExpr MkZeroExt(uint i, BitVecExpr t)
01642 {
01643 Contract.Requires(t != null);
01644 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01645
01646 CheckContextMatch(t);
01647 return new BitVecExpr(this, Native.Z3_mk_zero_ext(nCtx, i, t.NativeObject));
01648 }
01649
01656 public BitVecExpr MkRepeat(uint i, BitVecExpr t)
01657 {
01658 Contract.Requires(t != null);
01659 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01660
01661 CheckContextMatch(t);
01662 return new BitVecExpr(this, Native.Z3_mk_repeat(nCtx, i, t.NativeObject));
01663 }
01664
01677 public BitVecExpr MkBVSHL(BitVecExpr t1, BitVecExpr t2)
01678 {
01679 Contract.Requires(t1 != null);
01680 Contract.Requires(t2 != null);
01681 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01682
01683 CheckContextMatch(t1);
01684 CheckContextMatch(t2);
01685 return new BitVecExpr(this, Native.Z3_mk_bvshl(nCtx, t1.NativeObject, t2.NativeObject));
01686 }
01687
01700 public BitVecExpr MkBVLSHR(BitVecExpr t1, BitVecExpr t2)
01701 {
01702 Contract.Requires(t1 != null);
01703 Contract.Requires(t2 != null);
01704 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01705
01706 CheckContextMatch(t1);
01707 CheckContextMatch(t2);
01708 return new BitVecExpr(this, Native.Z3_mk_bvlshr(nCtx, t1.NativeObject, t2.NativeObject));
01709 }
01710
01725 public BitVecExpr MkBVASHR(BitVecExpr t1, BitVecExpr t2)
01726 {
01727 Contract.Requires(t1 != null);
01728 Contract.Requires(t2 != null);
01729 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01730
01731 CheckContextMatch(t1);
01732 CheckContextMatch(t2);
01733 return new BitVecExpr(this, Native.Z3_mk_bvashr(nCtx, t1.NativeObject, t2.NativeObject));
01734 }
01735
01743 public BitVecExpr MkBVRotateLeft(uint i, BitVecExpr t)
01744 {
01745 Contract.Requires(t != null);
01746 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01747
01748 CheckContextMatch(t);
01749 return new BitVecExpr(this, Native.Z3_mk_rotate_left(nCtx, i, t.NativeObject));
01750 }
01751
01759 public BitVecExpr MkBVRotateRight(uint i, BitVecExpr t)
01760 {
01761 Contract.Requires(t != null);
01762 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01763
01764 CheckContextMatch(t);
01765 return new BitVecExpr(this, Native.Z3_mk_rotate_right(nCtx, i, t.NativeObject));
01766 }
01767
01775 public BitVecExpr MkBVRotateLeft(BitVecExpr t1, BitVecExpr t2)
01776 {
01777 Contract.Requires(t1 != null);
01778 Contract.Requires(t2 != null);
01779 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01780
01781 CheckContextMatch(t1);
01782 CheckContextMatch(t2);
01783 return new BitVecExpr(this, Native.Z3_mk_ext_rotate_left(nCtx, t1.NativeObject, t2.NativeObject));
01784 }
01785
01793 public BitVecExpr MkBVRotateRight(BitVecExpr t1, BitVecExpr t2)
01794 {
01795 Contract.Requires(t1 != null);
01796 Contract.Requires(t2 != null);
01797 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01798
01799 CheckContextMatch(t1);
01800 CheckContextMatch(t2);
01801 return new BitVecExpr(this, Native.Z3_mk_ext_rotate_right(nCtx, t1.NativeObject, t2.NativeObject));
01802 }
01803
01814 public BitVecExpr MkInt2BV(uint n, IntExpr t)
01815 {
01816 Contract.Requires(t != null);
01817 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
01818
01819 CheckContextMatch(t);
01820 return new BitVecExpr(this, Native.Z3_mk_int2bv(nCtx, n, t.NativeObject));
01821 }
01822
01838 public IntExpr MkBV2Int(BitVecExpr t, bool signed)
01839 {
01840 Contract.Requires(t != null);
01841 Contract.Ensures(Contract.Result<IntExpr>() != null);
01842
01843 CheckContextMatch(t);
01844 return new IntExpr(this, Native.Z3_mk_bv2int(nCtx, t.NativeObject, (signed) ? 1 : 0));
01845 }
01846
01853 public BoolExpr MkBVAddNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
01854 {
01855 Contract.Requires(t1 != null);
01856 Contract.Requires(t2 != null);
01857 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01858
01859 CheckContextMatch(t1);
01860 CheckContextMatch(t2);
01861 return new BoolExpr(this, Native.Z3_mk_bvadd_no_overflow(nCtx, t1.NativeObject, t2.NativeObject, (isSigned) ? 1 : 0));
01862 }
01863
01870 public BoolExpr MkBVAddNoUnderflow(BitVecExpr t1, BitVecExpr t2)
01871 {
01872 Contract.Requires(t1 != null);
01873 Contract.Requires(t2 != null);
01874 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01875
01876 CheckContextMatch(t1);
01877 CheckContextMatch(t2);
01878 return new BoolExpr(this, Native.Z3_mk_bvadd_no_underflow(nCtx, t1.NativeObject, t2.NativeObject));
01879 }
01880
01887 public BoolExpr MkBVSubNoOverflow(BitVecExpr t1, BitVecExpr t2)
01888 {
01889 Contract.Requires(t1 != null);
01890 Contract.Requires(t2 != null);
01891 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01892
01893 CheckContextMatch(t1);
01894 CheckContextMatch(t2);
01895 return new BoolExpr(this, Native.Z3_mk_bvsub_no_overflow(nCtx, t1.NativeObject, t2.NativeObject));
01896 }
01897
01904 public BoolExpr MkBVSubNoUnderflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
01905 {
01906 Contract.Requires(t1 != null);
01907 Contract.Requires(t2 != null);
01908 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01909
01910 CheckContextMatch(t1);
01911 CheckContextMatch(t2);
01912 return new BoolExpr(this, Native.Z3_mk_bvsub_no_underflow(nCtx, t1.NativeObject, t2.NativeObject, (isSigned) ? 1 : 0));
01913 }
01914
01921 public BoolExpr MkBVSDivNoOverflow(BitVecExpr t1, BitVecExpr t2)
01922 {
01923 Contract.Requires(t1 != null);
01924 Contract.Requires(t2 != null);
01925 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01926
01927 CheckContextMatch(t1);
01928 CheckContextMatch(t2);
01929 return new BoolExpr(this, Native.Z3_mk_bvsdiv_no_overflow(nCtx, t1.NativeObject, t2.NativeObject));
01930 }
01931
01938 public BoolExpr MkBVNegNoOverflow(BitVecExpr t)
01939 {
01940 Contract.Requires(t != null);
01941 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01942
01943 CheckContextMatch(t);
01944 return new BoolExpr(this, Native.Z3_mk_bvneg_no_overflow(nCtx, t.NativeObject));
01945 }
01946
01953 public BoolExpr MkBVMulNoOverflow(BitVecExpr t1, BitVecExpr t2, bool isSigned)
01954 {
01955 Contract.Requires(t1 != null);
01956 Contract.Requires(t2 != null);
01957 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01958
01959 CheckContextMatch(t1);
01960 CheckContextMatch(t2);
01961 return new BoolExpr(this, Native.Z3_mk_bvmul_no_overflow(nCtx, t1.NativeObject, t2.NativeObject, (isSigned) ? 1 : 0));
01962 }
01963
01970 public BoolExpr MkBVMulNoUnderflow(BitVecExpr t1, BitVecExpr t2)
01971 {
01972 Contract.Requires(t1 != null);
01973 Contract.Requires(t2 != null);
01974 Contract.Ensures(Contract.Result<BoolExpr>() != null);
01975
01976 CheckContextMatch(t1);
01977 CheckContextMatch(t2);
01978 return new BoolExpr(this, Native.Z3_mk_bvmul_no_underflow(nCtx, t1.NativeObject, t2.NativeObject));
01979 }
01980 #endregion
01981
01982 #region Arrays
01983
01984
01985
01986 public ArrayExpr MkArrayConst(Symbol name, Sort domain, Sort range)
01987 {
01988 Contract.Requires(name != null);
01989 Contract.Requires(domain != null);
01990 Contract.Requires(range != null);
01991 Contract.Ensures(Contract.Result<ArrayExpr>() != null);
01992
01993 return (ArrayExpr)MkConst(name, MkArraySort(domain, range));
01994 }
01995
01999 public ArrayExpr MkArrayConst(string name, Sort domain, Sort range)
02000 {
02001 Contract.Requires(domain != null);
02002 Contract.Requires(range != null);
02003 Contract.Ensures(Contract.Result<ArrayExpr>() != null);
02004
02005 return (ArrayExpr)MkConst(MkSymbol(name), MkArraySort(domain, range));
02006 }
02007
02021 public Expr MkSelect(ArrayExpr a, Expr i)
02022 {
02023 Contract.Requires(a != null);
02024 Contract.Requires(i != null);
02025 Contract.Ensures(Contract.Result<Expr>() != null);
02026
02027 CheckContextMatch(a);
02028 CheckContextMatch(i);
02029 return Expr.Create(this, Native.Z3_mk_select(nCtx, a.NativeObject, i.NativeObject));
02030 }
02031
02049 public ArrayExpr MkStore(ArrayExpr a, Expr i, Expr v)
02050 {
02051 Contract.Requires(a != null);
02052 Contract.Requires(i != null);
02053 Contract.Requires(v != null);
02054 Contract.Ensures(Contract.Result<ArrayExpr>() != null);
02055
02056 CheckContextMatch(a);
02057 CheckContextMatch(i);
02058 CheckContextMatch(v);
02059 return new ArrayExpr(this, Native.Z3_mk_store(nCtx, a.NativeObject, i.NativeObject, v.NativeObject));
02060 }
02061
02071 public ArrayExpr MkConstArray(Sort domain, Expr v)
02072 {
02073 Contract.Requires(domain != null);
02074 Contract.Requires(v != null);
02075 Contract.Ensures(Contract.Result<ArrayExpr>() != null);
02076
02077 CheckContextMatch(domain);
02078 CheckContextMatch(v);
02079 return new ArrayExpr(this, Native.Z3_mk_const_array(nCtx, domain.NativeObject, v.NativeObject));
02080 }
02081
02093 public ArrayExpr MkMap(FuncDecl f, params ArrayExpr[] args)
02094 {
02095 Contract.Requires(f != null);
02096 Contract.Requires(args == null || Contract.ForAll(args, a => a != null));
02097 Contract.Ensures(Contract.Result<ArrayExpr>() != null);
02098
02099 CheckContextMatch(f);
02100 CheckContextMatch(args);
02101 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_map(nCtx, f.NativeObject, AST.ArrayLength(args), AST.ArrayToNative(args)));
02102 }
02103
02111 public Expr MkTermArray(ArrayExpr array)
02112 {
02113 Contract.Requires(array != null);
02114 Contract.Ensures(Contract.Result<Expr>() != null);
02115
02116 CheckContextMatch(array);
02117 return Expr.Create(this, Native.Z3_mk_array_default(nCtx, array.NativeObject));
02118 }
02119 #endregion
02120
02121 #region Sets
02122
02123
02124
02125 public SetSort MkSetSort(Sort ty)
02126 {
02127 Contract.Requires(ty != null);
02128 Contract.Ensures(Contract.Result<SetSort>() != null);
02129
02130 CheckContextMatch(ty);
02131 return new SetSort(this, ty);
02132 }
02133
02137 public ArrayExpr MkEmptySet(Sort domain)
02138 {
02139 Contract.Requires(domain != null);
02140 Contract.Ensures(Contract.Result<Expr>() != null);
02141
02142 CheckContextMatch(domain);
02143 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_empty_set(nCtx, domain.NativeObject));
02144 }
02145
02149 public ArrayExpr MkFullSet(Sort domain)
02150 {
02151 Contract.Requires(domain != null);
02152 Contract.Ensures(Contract.Result<Expr>() != null);
02153
02154 CheckContextMatch(domain);
02155 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_full_set(nCtx, domain.NativeObject));
02156 }
02157
02161 public ArrayExpr MkSetAdd(ArrayExpr set, Expr element)
02162 {
02163 Contract.Requires(set != null);
02164 Contract.Requires(element != null);
02165 Contract.Ensures(Contract.Result<Expr>() != null);
02166
02167 CheckContextMatch(set);
02168 CheckContextMatch(element);
02169 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_add(nCtx, set.NativeObject, element.NativeObject));
02170 }
02171
02172
02176 public ArrayExpr MkSetDel(ArrayExpr set, Expr element)
02177 {
02178 Contract.Requires(set != null);
02179 Contract.Requires(element != null);
02180 Contract.Ensures(Contract.Result<Expr>() != null);
02181
02182 CheckContextMatch(set);
02183 CheckContextMatch(element);
02184 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_del(nCtx, set.NativeObject, element.NativeObject));
02185 }
02186
02190 public ArrayExpr MkSetUnion(params ArrayExpr[] args)
02191 {
02192 Contract.Requires(args != null);
02193 Contract.Requires(Contract.ForAll(args, a => a != null));
02194
02195 CheckContextMatch(args);
02196 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_union(nCtx, (uint)args.Length, AST.ArrayToNative(args)));
02197 }
02198
02202 public ArrayExpr MkSetIntersection(params ArrayExpr[] args)
02203 {
02204 Contract.Requires(args != null);
02205 Contract.Requires(Contract.ForAll(args, a => a != null));
02206 Contract.Ensures(Contract.Result<Expr>() != null);
02207
02208 CheckContextMatch(args);
02209 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_intersect(nCtx, (uint)args.Length, AST.ArrayToNative(args)));
02210 }
02211
02215 public ArrayExpr MkSetDifference(ArrayExpr arg1, ArrayExpr arg2)
02216 {
02217 Contract.Requires(arg1 != null);
02218 Contract.Requires(arg2 != null);
02219 Contract.Ensures(Contract.Result<Expr>() != null);
02220
02221 CheckContextMatch(arg1);
02222 CheckContextMatch(arg2);
02223 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_difference(nCtx, arg1.NativeObject, arg2.NativeObject));
02224 }
02225
02229 public ArrayExpr MkSetComplement(ArrayExpr arg)
02230 {
02231 Contract.Requires(arg != null);
02232 Contract.Ensures(Contract.Result<Expr>() != null);
02233
02234 CheckContextMatch(arg);
02235 return (ArrayExpr)Expr.Create(this, Native.Z3_mk_set_complement(nCtx, arg.NativeObject));
02236 }
02237
02241 public BoolExpr MkSetMembership(Expr elem, ArrayExpr set)
02242 {
02243 Contract.Requires(elem != null);
02244 Contract.Requires(set != null);
02245 Contract.Ensures(Contract.Result<Expr>() != null);
02246
02247 CheckContextMatch(elem);
02248 CheckContextMatch(set);
02249 return (BoolExpr) Expr.Create(this, Native.Z3_mk_set_member(nCtx, elem.NativeObject, set.NativeObject));
02250 }
02251
02255 public BoolExpr MkSetSubset(ArrayExpr arg1, ArrayExpr arg2)
02256 {
02257 Contract.Requires(arg1 != null);
02258 Contract.Requires(arg2 != null);
02259 Contract.Ensures(Contract.Result<Expr>() != null);
02260
02261 CheckContextMatch(arg1);
02262 CheckContextMatch(arg2);
02263 return (BoolExpr) Expr.Create(this, Native.Z3_mk_set_subset(nCtx, arg1.NativeObject, arg2.NativeObject));
02264 }
02265 #endregion
02266
02267 #region Pseudo-Boolean constraints
02268
02272 public BoolExpr MkAtMost(BoolExpr[] args, uint k)
02273 {
02274 Contract.Requires(args != null);
02275 Contract.Requires(Contract.Result<BoolExpr[]>() != null);
02276 CheckContextMatch(args);
02277 return new BoolExpr(this, Native.Z3_mk_atmost(nCtx, (uint) args.Length,
02278 AST.ArrayToNative(args), k));
02279 }
02280
02284 public BoolExpr MkPBLe(int[] coeffs, BoolExpr[] args, int k)
02285 {
02286 Contract.Requires(args != null);
02287 Contract.Requires(coeffs != null);
02288 Contract.Requires(args.Length == coeffs.Length);
02289 Contract.Requires(Contract.Result<BoolExpr[]>() != null);
02290 CheckContextMatch(args);
02291 return new BoolExpr(this, Native.Z3_mk_pble(nCtx, (uint) args.Length,
02292 AST.ArrayToNative(args),
02293 coeffs, k));
02294 }
02295 #endregion
02296
02297 #region Numerals
02298
02299 #region General Numerals
02300
02301
02302
02303
02304
02305
02306 public Expr MkNumeral(string v, Sort ty)
02307 {
02308 Contract.Requires(ty != null);
02309 Contract.Ensures(Contract.Result<Expr>() != null);
02310
02311 CheckContextMatch(ty);
02312 return Expr.Create(this, Native.Z3_mk_numeral(nCtx, v, ty.NativeObject));
02313 }
02314
02322 public Expr MkNumeral(int v, Sort ty)
02323 {
02324 Contract.Requires(ty != null);
02325 Contract.Ensures(Contract.Result<Expr>() != null);
02326
02327 CheckContextMatch(ty);
02328 return Expr.Create(this, Native.Z3_mk_int(nCtx, v, ty.NativeObject));
02329 }
02330
02338 public Expr MkNumeral(uint v, Sort ty)
02339 {
02340 Contract.Requires(ty != null);
02341 Contract.Ensures(Contract.Result<Expr>() != null);
02342
02343 CheckContextMatch(ty);
02344 return Expr.Create(this, Native.Z3_mk_unsigned_int(nCtx, v, ty.NativeObject));
02345 }
02346
02354 public Expr MkNumeral(long v, Sort ty)
02355 {
02356 Contract.Requires(ty != null);
02357 Contract.Ensures(Contract.Result<Expr>() != null);
02358
02359 CheckContextMatch(ty);
02360 return Expr.Create(this, Native.Z3_mk_int64(nCtx, v, ty.NativeObject));
02361 }
02362
02370 public Expr MkNumeral(ulong v, Sort ty)
02371 {
02372 Contract.Requires(ty != null);
02373 Contract.Ensures(Contract.Result<Expr>() != null);
02374
02375 CheckContextMatch(ty);
02376 return Expr.Create(this, Native.Z3_mk_unsigned_int64(nCtx, v, ty.NativeObject));
02377 }
02378 #endregion
02379
02380 #region Reals
02381
02382
02383
02384
02385
02386
02387
02388 public RatNum MkReal(int num, int den)
02389 {
02390 if (den == 0)
02391 throw new Z3Exception("Denominator is zero");
02392
02393 Contract.Ensures(Contract.Result<RatNum>() != null);
02394 Contract.EndContractBlock();
02395
02396 return new RatNum(this, Native.Z3_mk_real(nCtx, num, den));
02397 }
02398
02404 public RatNum MkReal(string v)
02405 {
02406 Contract.Ensures(Contract.Result<RatNum>() != null);
02407
02408 return new RatNum(this, Native.Z3_mk_numeral(nCtx, v, RealSort.NativeObject));
02409 }
02410
02416 public RatNum MkReal(int v)
02417 {
02418 Contract.Ensures(Contract.Result<RatNum>() != null);
02419
02420 return new RatNum(this, Native.Z3_mk_int(nCtx, v, RealSort.NativeObject));
02421 }
02422
02428 public RatNum MkReal(uint v)
02429 {
02430 Contract.Ensures(Contract.Result<RatNum>() != null);
02431
02432 return new RatNum(this, Native.Z3_mk_unsigned_int(nCtx, v, RealSort.NativeObject));
02433 }
02434
02440 public RatNum MkReal(long v)
02441 {
02442 Contract.Ensures(Contract.Result<RatNum>() != null);
02443
02444 return new RatNum(this, Native.Z3_mk_int64(nCtx, v, RealSort.NativeObject));
02445 }
02446
02452 public RatNum MkReal(ulong v)
02453 {
02454 Contract.Ensures(Contract.Result<RatNum>() != null);
02455
02456 return new RatNum(this, Native.Z3_mk_unsigned_int64(nCtx, v, RealSort.NativeObject));
02457 }
02458 #endregion
02459
02460 #region Integers
02461
02462
02463
02464
02465 public IntNum MkInt(string v)
02466 {
02467 Contract.Ensures(Contract.Result<IntNum>() != null);
02468
02469 return new IntNum(this, Native.Z3_mk_numeral(nCtx, v, IntSort.NativeObject));
02470 }
02471
02477 public IntNum MkInt(int v)
02478 {
02479 Contract.Ensures(Contract.Result<IntNum>() != null);
02480
02481 return new IntNum(this, Native.Z3_mk_int(nCtx, v, IntSort.NativeObject));
02482 }
02483
02489 public IntNum MkInt(uint v)
02490 {
02491 Contract.Ensures(Contract.Result<IntNum>() != null);
02492
02493 return new IntNum(this, Native.Z3_mk_unsigned_int(nCtx, v, IntSort.NativeObject));
02494 }
02495
02501 public IntNum MkInt(long v)
02502 {
02503 Contract.Ensures(Contract.Result<IntNum>() != null);
02504
02505 return new IntNum(this, Native.Z3_mk_int64(nCtx, v, IntSort.NativeObject));
02506 }
02507
02513 public IntNum MkInt(ulong v)
02514 {
02515 Contract.Ensures(Contract.Result<IntNum>() != null);
02516
02517 return new IntNum(this, Native.Z3_mk_unsigned_int64(nCtx, v, IntSort.NativeObject));
02518 }
02519 #endregion
02520
02521 #region Bit-vectors
02522
02523
02524
02525
02526
02527 public BitVecNum MkBV(string v, uint size)
02528 {
02529 Contract.Ensures(Contract.Result<BitVecNum>() != null);
02530
02531 return (BitVecNum)MkNumeral(v, MkBitVecSort(size));
02532 }
02533
02539 public BitVecNum MkBV(int v, uint size)
02540 {
02541 Contract.Ensures(Contract.Result<BitVecNum>() != null);
02542
02543 return (BitVecNum)MkNumeral(v, MkBitVecSort(size));
02544 }
02545
02551 public BitVecNum MkBV(uint v, uint size)
02552 {
02553 Contract.Ensures(Contract.Result<BitVecNum>() != null);
02554
02555 return (BitVecNum)MkNumeral(v, MkBitVecSort(size));
02556 }
02557
02563 public BitVecNum MkBV(long v, uint size)
02564 {
02565 Contract.Ensures(Contract.Result<BitVecNum>() != null);
02566
02567 return (BitVecNum)MkNumeral(v, MkBitVecSort(size));
02568 }
02569
02575 public BitVecNum MkBV(ulong v, uint size)
02576 {
02577 Contract.Ensures(Contract.Result<BitVecNum>() != null);
02578
02579 return (BitVecNum)MkNumeral(v, MkBitVecSort(size));
02580 }
02581 #endregion
02582
02583 #endregion // Numerals
02584
02585 #region Quantifiers
02586
02587
02588
02589
02590
02591
02592
02593
02594
02595
02596
02597
02598
02599
02600
02601
02602
02603
02604
02605 public Quantifier MkForall(Sort[] sorts, Symbol[] names, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
02606 {
02607 Contract.Requires(sorts != null);
02608 Contract.Requires(names != null);
02609 Contract.Requires(body != null);
02610 Contract.Requires(sorts.Length == names.Length);
02611 Contract.Requires(Contract.ForAll(sorts, s => s != null));
02612 Contract.Requires(Contract.ForAll(names, n => n != null));
02613 Contract.Requires(patterns == null || Contract.ForAll(patterns, p => p != null));
02614 Contract.Requires(noPatterns == null || Contract.ForAll(noPatterns, np => np != null));
02615
02616 Contract.Ensures(Contract.Result<Quantifier>() != null);
02617
02618 return new Quantifier(this, true, sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
02619 }
02620
02621
02625 public Quantifier MkForall(Expr[] boundConstants, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
02626 {
02627 Contract.Requires(body != null);
02628 Contract.Requires(boundConstants == null || Contract.ForAll(boundConstants, b => b != null));
02629 Contract.Requires(patterns == null || Contract.ForAll(patterns, p => p != null));
02630 Contract.Requires(noPatterns == null || Contract.ForAll(noPatterns, np => np != null));
02631
02632 Contract.Ensures(Contract.Result<Quantifier>() != null);
02633
02634 return new Quantifier(this, true, boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
02635 }
02636
02641 public Quantifier MkExists(Sort[] sorts, Symbol[] names, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
02642 {
02643 Contract.Requires(sorts != null);
02644 Contract.Requires(names != null);
02645 Contract.Requires(body != null);
02646 Contract.Requires(sorts.Length == names.Length);
02647 Contract.Requires(Contract.ForAll(sorts, s => s != null));
02648 Contract.Requires(Contract.ForAll(names, n => n != null));
02649 Contract.Requires(patterns == null || Contract.ForAll(patterns, p => p != null));
02650 Contract.Requires(noPatterns == null || Contract.ForAll(noPatterns, np => np != null));
02651 Contract.Ensures(Contract.Result<Quantifier>() != null);
02652
02653 return new Quantifier(this, false, sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
02654 }
02655
02659 public Quantifier MkExists(Expr[] boundConstants, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
02660 {
02661 Contract.Requires(body != null);
02662 Contract.Requires(boundConstants == null || Contract.ForAll(boundConstants, n => n != null));
02663 Contract.Requires(patterns == null || Contract.ForAll(patterns, p => p != null));
02664 Contract.Requires(noPatterns == null || Contract.ForAll(noPatterns, np => np != null));
02665 Contract.Ensures(Contract.Result<Quantifier>() != null);
02666
02667 return new Quantifier(this, false, boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
02668 }
02669
02670
02674 public Quantifier MkQuantifier(bool universal, Sort[] sorts, Symbol[] names, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
02675 {
02676 Contract.Requires(body != null);
02677 Contract.Requires(names != null);
02678 Contract.Requires(sorts != null);
02679 Contract.Requires(sorts.Length == names.Length);
02680 Contract.Requires(Contract.ForAll(sorts, s => s != null));
02681 Contract.Requires(Contract.ForAll(names, n => n != null));
02682 Contract.Requires(patterns == null || Contract.ForAll(patterns, p => p != null));
02683 Contract.Requires(noPatterns == null || Contract.ForAll(noPatterns, np => np != null));
02684
02685 Contract.Ensures(Contract.Result<Quantifier>() != null);
02686
02687 if (universal)
02688 return MkForall(sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
02689 else
02690 return MkExists(sorts, names, body, weight, patterns, noPatterns, quantifierID, skolemID);
02691 }
02692
02693
02697 public Quantifier MkQuantifier(bool universal, Expr[] boundConstants, Expr body, uint weight = 1, Pattern[] patterns = null, Expr[] noPatterns = null, Symbol quantifierID = null, Symbol skolemID = null)
02698 {
02699 Contract.Requires(body != null);
02700 Contract.Requires(boundConstants == null || Contract.ForAll(boundConstants, n => n != null));
02701 Contract.Requires(patterns == null || Contract.ForAll(patterns, p => p != null));
02702 Contract.Requires(noPatterns == null || Contract.ForAll(noPatterns, np => np != null));
02703
02704 Contract.Ensures(Contract.Result<Quantifier>() != null);
02705
02706 if (universal)
02707 return MkForall(boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
02708 else
02709 return MkExists(boundConstants, body, weight, patterns, noPatterns, quantifierID, skolemID);
02710 }
02711
02712 #endregion
02713
02714 #endregion // Expr
02715
02716 #region Options
02717
02718
02719
02720
02721
02722
02723
02724
02725
02726
02727
02728
02729
02730
02731
02732
02733 public Z3_ast_print_mode PrintMode
02734 {
02735 set { Native.Z3_set_ast_print_mode(nCtx, (uint)value); }
02736 }
02737 #endregion
02738
02739 #region SMT Files & Strings
02740
02741
02742
02743
02744
02745
02746
02747
02748
02749
02750 public string BenchmarkToSMTString(string name, string logic, string status, string attributes,
02751 BoolExpr[] assumptions, BoolExpr formula)
02752 {
02753 Contract.Requires(assumptions != null);
02754 Contract.Requires(formula != null);
02755 Contract.Ensures(Contract.Result<string>() != null);
02756
02757 return Native.Z3_benchmark_to_smtlib_string(nCtx, name, logic, status, attributes,
02758 (uint)assumptions.Length, AST.ArrayToNative(assumptions),
02759 formula.NativeObject);
02760 }
02761
02772 public void ParseSMTLIBString(string str, Symbol[] sortNames = null, Sort[] sorts = null, Symbol[] declNames = null, FuncDecl[] decls = null)
02773 {
02774 uint csn = Symbol.ArrayLength(sortNames);
02775 uint cs = Sort.ArrayLength(sorts);
02776 uint cdn = Symbol.ArrayLength(declNames);
02777 uint cd = AST.ArrayLength(decls);
02778 if (csn != cs || cdn != cd)
02779 throw new Z3Exception("Argument size mismatch");
02780 Native.Z3_parse_smtlib_string(nCtx, str,
02781 AST.ArrayLength(sorts), Symbol.ArrayToNative(sortNames), AST.ArrayToNative(sorts),
02782 AST.ArrayLength(decls), Symbol.ArrayToNative(declNames), AST.ArrayToNative(decls));
02783 }
02784
02789 public void ParseSMTLIBFile(string fileName, Symbol[] sortNames = null, Sort[] sorts = null, Symbol[] declNames = null, FuncDecl[] decls = null)
02790 {
02791 uint csn = Symbol.ArrayLength(sortNames);
02792 uint cs = Sort.ArrayLength(sorts);
02793 uint cdn = Symbol.ArrayLength(declNames);
02794 uint cd = AST.ArrayLength(decls);
02795 if (csn != cs || cdn != cd)
02796 throw new Z3Exception("Argument size mismatch");
02797 Native.Z3_parse_smtlib_file(nCtx, fileName,
02798 AST.ArrayLength(sorts), Symbol.ArrayToNative(sortNames), AST.ArrayToNative(sorts),
02799 AST.ArrayLength(decls), Symbol.ArrayToNative(declNames), AST.ArrayToNative(decls));
02800 }
02801
02805 public uint NumSMTLIBFormulas { get { return Native.Z3_get_smtlib_num_formulas(nCtx); } }
02806
02810 public BoolExpr[] SMTLIBFormulas
02811 {
02812 get
02813 {
02814 Contract.Ensures(Contract.Result<BoolExpr[]>() != null);
02815
02816 uint n = NumSMTLIBFormulas;
02817 BoolExpr[] res = new BoolExpr[n];
02818 for (uint i = 0; i < n; i++)
02819 res[i] = (BoolExpr)Expr.Create(this, Native.Z3_get_smtlib_formula(nCtx, i));
02820 return res;
02821 }
02822 }
02823
02827 public uint NumSMTLIBAssumptions { get { return Native.Z3_get_smtlib_num_assumptions(nCtx); } }
02828
02832 public BoolExpr[] SMTLIBAssumptions
02833 {
02834 get
02835 {
02836 Contract.Ensures(Contract.Result<BoolExpr[]>() != null);
02837
02838 uint n = NumSMTLIBAssumptions;
02839 BoolExpr[] res = new BoolExpr[n];
02840 for (uint i = 0; i < n; i++)
02841 res[i] = (BoolExpr)Expr.Create(this, Native.Z3_get_smtlib_assumption(nCtx, i));
02842 return res;
02843 }
02844 }
02845
02849 public uint NumSMTLIBDecls { get { return Native.Z3_get_smtlib_num_decls(nCtx); } }
02850
02854 public FuncDecl[] SMTLIBDecls
02855 {
02856 get
02857 {
02858 Contract.Ensures(Contract.Result<FuncDecl[]>() != null);
02859
02860 uint n = NumSMTLIBDecls;
02861 FuncDecl[] res = new FuncDecl[n];
02862 for (uint i = 0; i < n; i++)
02863 res[i] = new FuncDecl(this, Native.Z3_get_smtlib_decl(nCtx, i));
02864 return res;
02865 }
02866 }
02867
02871 public uint NumSMTLIBSorts { get { return Native.Z3_get_smtlib_num_sorts(nCtx); } }
02872
02876 public Sort[] SMTLIBSorts
02877 {
02878 get
02879 {
02880 Contract.Ensures(Contract.Result<Sort[]>() != null);
02881
02882 uint n = NumSMTLIBSorts;
02883 Sort[] res = new Sort[n];
02884 for (uint i = 0; i < n; i++)
02885 res[i] = Sort.Create(this, Native.Z3_get_smtlib_sort(nCtx, i));
02886 return res;
02887 }
02888 }
02889
02895 public BoolExpr ParseSMTLIB2String(string str, Symbol[] sortNames = null, Sort[] sorts = null, Symbol[] declNames = null, FuncDecl[] decls = null)
02896 {
02897 Contract.Ensures(Contract.Result<BoolExpr>() != null);
02898
02899 uint csn = Symbol.ArrayLength(sortNames);
02900 uint cs = Sort.ArrayLength(sorts);
02901 uint cdn = Symbol.ArrayLength(declNames);
02902 uint cd = AST.ArrayLength(decls);
02903 if (csn != cs || cdn != cd)
02904 throw new Z3Exception("Argument size mismatch");
02905 return (BoolExpr)Expr.Create(this, Native.Z3_parse_smtlib2_string(nCtx, str,
02906 AST.ArrayLength(sorts), Symbol.ArrayToNative(sortNames), AST.ArrayToNative(sorts),
02907 AST.ArrayLength(decls), Symbol.ArrayToNative(declNames), AST.ArrayToNative(decls)));
02908 }
02909
02914 public BoolExpr ParseSMTLIB2File(string fileName, Symbol[] sortNames = null, Sort[] sorts = null, Symbol[] declNames = null, FuncDecl[] decls = null)
02915 {
02916 Contract.Ensures(Contract.Result<BoolExpr>() != null);
02917
02918 uint csn = Symbol.ArrayLength(sortNames);
02919 uint cs = Sort.ArrayLength(sorts);
02920 uint cdn = Symbol.ArrayLength(declNames);
02921 uint cd = AST.ArrayLength(decls);
02922 if (csn != cs || cdn != cd)
02923 throw new Z3Exception("Argument size mismatch");
02924 return (BoolExpr)Expr.Create(this, Native.Z3_parse_smtlib2_file(nCtx, fileName,
02925 AST.ArrayLength(sorts), Symbol.ArrayToNative(sortNames), AST.ArrayToNative(sorts),
02926 AST.ArrayLength(decls), Symbol.ArrayToNative(declNames), AST.ArrayToNative(decls)));
02927 }
02928 #endregion
02929
02930 #region Goals
02931
02932
02933
02934
02935
02936
02937
02938
02939
02940
02941 public Goal MkGoal(bool models = true, bool unsatCores = false, bool proofs = false)
02942 {
02943 Contract.Ensures(Contract.Result<Goal>() != null);
02944
02945 return new Goal(this, models, unsatCores, proofs);
02946 }
02947 #endregion
02948
02949 #region ParameterSets
02950
02951
02952
02953 public Params MkParams()
02954 {
02955 Contract.Ensures(Contract.Result<Params>() != null);
02956
02957 return new Params(this);
02958 }
02959 #endregion
02960
02961 #region Tactics
02962
02963
02964
02965 public uint NumTactics
02966 {
02967 get { return Native.Z3_get_num_tactics(nCtx); }
02968 }
02969
02973 public string[] TacticNames
02974 {
02975 get
02976 {
02977 Contract.Ensures(Contract.Result<string[]>() != null);
02978
02979 uint n = NumTactics;
02980 string[] res = new string[n];
02981 for (uint i = 0; i < n; i++)
02982 res[i] = Native.Z3_get_tactic_name(nCtx, i);
02983 return res;
02984 }
02985 }
02986
02990 public string TacticDescription(string name)
02991 {
02992 Contract.Ensures(Contract.Result<string>() != null);
02993
02994 return Native.Z3_tactic_get_descr(nCtx, name);
02995 }
02996
03000 public Tactic MkTactic(string name)
03001 {
03002 Contract.Ensures(Contract.Result<Tactic>() != null);
03003
03004 return new Tactic(this, name);
03005 }
03006
03011 public Tactic AndThen(Tactic t1, Tactic t2, params Tactic[] ts)
03012 {
03013 Contract.Requires(t1 != null);
03014 Contract.Requires(t2 != null);
03015 Contract.Requires(ts == null || Contract.ForAll(0, ts.Length, j => ts[j] != null));
03016 Contract.Ensures(Contract.Result<Tactic>() != null);
03017
03018
03019 CheckContextMatch(t1);
03020 CheckContextMatch(t2);
03021 CheckContextMatch(ts);
03022
03023 IntPtr last = IntPtr.Zero;
03024 if (ts != null && ts.Length > 0)
03025 {
03026 last = ts[ts.Length - 1].NativeObject;
03027 for (int i = ts.Length - 2; i >= 0; i--)
03028 last = Native.Z3_tactic_and_then(nCtx, ts[i].NativeObject, last);
03029 }
03030 if (last != IntPtr.Zero)
03031 {
03032 last = Native.Z3_tactic_and_then(nCtx, t2.NativeObject, last);
03033 return new Tactic(this, Native.Z3_tactic_and_then(nCtx, t1.NativeObject, last));
03034 }
03035 else
03036 return new Tactic(this, Native.Z3_tactic_and_then(nCtx, t1.NativeObject, t2.NativeObject));
03037 }
03038
03046 public Tactic Then(Tactic t1, Tactic t2, params Tactic[] ts)
03047 {
03048 Contract.Requires(t1 != null);
03049 Contract.Requires(t2 != null);
03050 Contract.Requires(ts == null || Contract.ForAll(0, ts.Length, j => ts[j] != null));
03051 Contract.Ensures(Contract.Result<Tactic>() != null);
03052
03053 return AndThen(t1, t2, ts);
03054 }
03055
03060 public Tactic OrElse(Tactic t1, Tactic t2)
03061 {
03062 Contract.Requires(t1 != null);
03063 Contract.Requires(t2 != null);
03064 Contract.Ensures(Contract.Result<Tactic>() != null);
03065
03066 CheckContextMatch(t1);
03067 CheckContextMatch(t2);
03068 return new Tactic(this, Native.Z3_tactic_or_else(nCtx, t1.NativeObject, t2.NativeObject));
03069 }
03070
03077 public Tactic TryFor(Tactic t, uint ms)
03078 {
03079 Contract.Requires(t != null);
03080 Contract.Ensures(Contract.Result<Tactic>() != null);
03081
03082 CheckContextMatch(t);
03083 return new Tactic(this, Native.Z3_tactic_try_for(nCtx, t.NativeObject, ms));
03084 }
03085
03093 public Tactic When(Probe p, Tactic t)
03094 {
03095 Contract.Requires(p != null);
03096 Contract.Requires(t != null);
03097 Contract.Ensures(Contract.Result<Tactic>() != null);
03098
03099 CheckContextMatch(t);
03100 CheckContextMatch(p);
03101 return new Tactic(this, Native.Z3_tactic_when(nCtx, p.NativeObject, t.NativeObject));
03102 }
03103
03108 public Tactic Cond(Probe p, Tactic t1, Tactic t2)
03109 {
03110 Contract.Requires(p != null);
03111 Contract.Requires(t1 != null);
03112 Contract.Requires(t2 != null);
03113 Contract.Ensures(Contract.Result<Tactic>() != null);
03114
03115 CheckContextMatch(p);
03116 CheckContextMatch(t1);
03117 CheckContextMatch(t2);
03118 return new Tactic(this, Native.Z3_tactic_cond(nCtx, p.NativeObject, t1.NativeObject, t2.NativeObject));
03119 }
03120
03125 public Tactic Repeat(Tactic t, uint max = uint.MaxValue)
03126 {
03127 Contract.Requires(t != null);
03128 Contract.Ensures(Contract.Result<Tactic>() != null);
03129
03130 CheckContextMatch(t);
03131 return new Tactic(this, Native.Z3_tactic_repeat(nCtx, t.NativeObject, max));
03132 }
03133
03137 public Tactic Skip()
03138 {
03139 Contract.Ensures(Contract.Result<Tactic>() != null);
03140
03141 return new Tactic(this, Native.Z3_tactic_skip(nCtx));
03142 }
03143
03147 public Tactic Fail()
03148 {
03149 Contract.Ensures(Contract.Result<Tactic>() != null);
03150
03151 return new Tactic(this, Native.Z3_tactic_fail(nCtx));
03152 }
03153
03157 public Tactic FailIf(Probe p)
03158 {
03159 Contract.Requires(p != null);
03160 Contract.Ensures(Contract.Result<Tactic>() != null);
03161
03162 CheckContextMatch(p);
03163 return new Tactic(this, Native.Z3_tactic_fail_if(nCtx, p.NativeObject));
03164 }
03165
03170 public Tactic FailIfNotDecided()
03171 {
03172 Contract.Ensures(Contract.Result<Tactic>() != null);
03173
03174 return new Tactic(this, Native.Z3_tactic_fail_if_not_decided(nCtx));
03175 }
03176
03180 public Tactic UsingParams(Tactic t, Params p)
03181 {
03182 Contract.Requires(t != null);
03183 Contract.Requires(p != null);
03184 Contract.Ensures(Contract.Result<Tactic>() != null);
03185
03186 CheckContextMatch(t);
03187 CheckContextMatch(p);
03188 return new Tactic(this, Native.Z3_tactic_using_params(nCtx, t.NativeObject, p.NativeObject));
03189 }
03190
03195 public Tactic With(Tactic t, Params p)
03196 {
03197 Contract.Requires(t != null);
03198 Contract.Requires(p != null);
03199 Contract.Ensures(Contract.Result<Tactic>() != null);
03200
03201 return UsingParams(t, p);
03202 }
03203
03207 public Tactic ParOr(params Tactic[] t)
03208 {
03209 Contract.Requires(t == null || Contract.ForAll(t, tactic => tactic != null));
03210 Contract.Ensures(Contract.Result<Tactic>() != null);
03211
03212 CheckContextMatch(t);
03213 return new Tactic(this, Native.Z3_tactic_par_or(nCtx, Tactic.ArrayLength(t), Tactic.ArrayToNative(t)));
03214 }
03215
03220 public Tactic ParAndThen(Tactic t1, Tactic t2)
03221 {
03222 Contract.Requires(t1 != null);
03223 Contract.Requires(t2 != null);
03224 Contract.Ensures(Contract.Result<Tactic>() != null);
03225
03226 CheckContextMatch(t1);
03227 CheckContextMatch(t2);
03228 return new Tactic(this, Native.Z3_tactic_par_and_then(nCtx, t1.NativeObject, t2.NativeObject));
03229 }
03230
03235 public void Interrupt()
03236 {
03237 Native.Z3_interrupt(nCtx);
03238 }
03239 #endregion
03240
03241 #region Probes
03242
03243
03244
03245 public uint NumProbes
03246 {
03247 get { return Native.Z3_get_num_probes(nCtx); }
03248 }
03249
03253 public string[] ProbeNames
03254 {
03255 get
03256 {
03257 Contract.Ensures(Contract.Result<string[]>() != null);
03258
03259 uint n = NumProbes;
03260 string[] res = new string[n];
03261 for (uint i = 0; i < n; i++)
03262 res[i] = Native.Z3_get_probe_name(nCtx, i);
03263 return res;
03264 }
03265 }
03266
03270 public string ProbeDescription(string name)
03271 {
03272 Contract.Ensures(Contract.Result<string>() != null);
03273
03274 return Native.Z3_probe_get_descr(nCtx, name);
03275 }
03276
03280 public Probe MkProbe(string name)
03281 {
03282 Contract.Ensures(Contract.Result<Probe>() != null);
03283
03284 return new Probe(this, name);
03285 }
03286
03290 public Probe ConstProbe(double val)
03291 {
03292 Contract.Ensures(Contract.Result<Probe>() != null);
03293
03294 return new Probe(this, Native.Z3_probe_const(nCtx, val));
03295 }
03296
03301 public Probe Lt(Probe p1, Probe p2)
03302 {
03303 Contract.Requires(p1 != null);
03304 Contract.Requires(p2 != null);
03305 Contract.Ensures(Contract.Result<Probe>() != null);
03306
03307 CheckContextMatch(p1);
03308 CheckContextMatch(p2);
03309 return new Probe(this, Native.Z3_probe_lt(nCtx, p1.NativeObject, p2.NativeObject));
03310 }
03311
03316 public Probe Gt(Probe p1, Probe p2)
03317 {
03318 Contract.Requires(p1 != null);
03319 Contract.Requires(p2 != null);
03320 Contract.Ensures(Contract.Result<Probe>() != null);
03321
03322 CheckContextMatch(p1);
03323 CheckContextMatch(p2);
03324 return new Probe(this, Native.Z3_probe_gt(nCtx, p1.NativeObject, p2.NativeObject));
03325 }
03326
03331 public Probe Le(Probe p1, Probe p2)
03332 {
03333 Contract.Requires(p1 != null);
03334 Contract.Requires(p2 != null);
03335 Contract.Ensures(Contract.Result<Probe>() != null);
03336
03337 CheckContextMatch(p1);
03338 CheckContextMatch(p2);
03339 return new Probe(this, Native.Z3_probe_le(nCtx, p1.NativeObject, p2.NativeObject));
03340 }
03341
03346 public Probe Ge(Probe p1, Probe p2)
03347 {
03348 Contract.Requires(p1 != null);
03349 Contract.Requires(p2 != null);
03350 Contract.Ensures(Contract.Result<Probe>() != null);
03351
03352 CheckContextMatch(p1);
03353 CheckContextMatch(p2);
03354 return new Probe(this, Native.Z3_probe_ge(nCtx, p1.NativeObject, p2.NativeObject));
03355 }
03356
03361 public Probe Eq(Probe p1, Probe p2)
03362 {
03363 Contract.Requires(p1 != null);
03364 Contract.Requires(p2 != null);
03365 Contract.Ensures(Contract.Result<Probe>() != null);
03366
03367 CheckContextMatch(p1);
03368 CheckContextMatch(p2);
03369 return new Probe(this, Native.Z3_probe_eq(nCtx, p1.NativeObject, p2.NativeObject));
03370 }
03371
03376 public Probe And(Probe p1, Probe p2)
03377 {
03378 Contract.Requires(p1 != null);
03379 Contract.Requires(p2 != null);
03380 Contract.Ensures(Contract.Result<Probe>() != null);
03381
03382 CheckContextMatch(p1);
03383 CheckContextMatch(p2);
03384 return new Probe(this, Native.Z3_probe_and(nCtx, p1.NativeObject, p2.NativeObject));
03385 }
03386
03391 public Probe Or(Probe p1, Probe p2)
03392 {
03393 Contract.Requires(p1 != null);
03394 Contract.Requires(p2 != null);
03395 Contract.Ensures(Contract.Result<Probe>() != null);
03396
03397 CheckContextMatch(p1);
03398 CheckContextMatch(p2);
03399 return new Probe(this, Native.Z3_probe_or(nCtx, p1.NativeObject, p2.NativeObject));
03400 }
03401
03406 public Probe Not(Probe p)
03407 {
03408 Contract.Requires(p != null);
03409 Contract.Ensures(Contract.Result<Probe>() != null);
03410
03411 CheckContextMatch(p);
03412 return new Probe(this, Native.Z3_probe_not(nCtx, p.NativeObject));
03413 }
03414 #endregion
03415
03416 #region Solvers
03417
03418
03419
03420
03421
03422
03423
03424
03425 public Solver MkSolver(Symbol logic = null)
03426 {
03427 Contract.Ensures(Contract.Result<Solver>() != null);
03428
03429 if (logic == null)
03430 return new Solver(this, Native.Z3_mk_solver(nCtx));
03431 else
03432 return new Solver(this, Native.Z3_mk_solver_for_logic(nCtx, logic.NativeObject));
03433 }
03434
03439 public Solver MkSolver(string logic)
03440 {
03441 Contract.Ensures(Contract.Result<Solver>() != null);
03442
03443 return MkSolver(MkSymbol(logic));
03444 }
03445
03449 public Solver MkSimpleSolver()
03450 {
03451 Contract.Ensures(Contract.Result<Solver>() != null);
03452
03453 return new Solver(this, Native.Z3_mk_simple_solver(nCtx));
03454 }
03455
03463 public Solver MkSolver(Tactic t)
03464 {
03465 Contract.Requires(t != null);
03466 Contract.Ensures(Contract.Result<Solver>() != null);
03467
03468 return new Solver(this, Native.Z3_mk_solver_from_tactic(nCtx, t.NativeObject));
03469 }
03470 #endregion
03471
03472 #region Fixedpoints
03473
03474
03475
03476 public Fixedpoint MkFixedpoint()
03477 {
03478 Contract.Ensures(Contract.Result<Fixedpoint>() != null);
03479
03480 return new Fixedpoint(this);
03481 }
03482 #endregion
03483
03484 #region Optimization
03485
03486
03487
03488 public Optimize MkOptimize()
03489 {
03490 Contract.Ensures(Contract.Result<Optimize>() != null);
03491
03492 return new Optimize(this);
03493 }
03494 #endregion
03495
03496 #region Floating-Point Arithmetic
03497
03498 #region Rounding Modes
03499 #region RoundingMode Sort
03500
03501
03502
03503 public FPRMSort MkFPRoundingModeSort()
03504 {
03505 Contract.Ensures(Contract.Result<FPRMSort>() != null);
03506 return new FPRMSort(this);
03507 }
03508 #endregion
03509
03510 #region Numerals
03511
03512
03513
03514 public FPRMExpr MkFPRoundNearestTiesToEven()
03515 {
03516 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03517 return new FPRMExpr(this, Native.Z3_mk_fpa_round_nearest_ties_to_even(nCtx));
03518 }
03519
03523 public FPRMNum MkFPRNE()
03524 {
03525 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03526 return new FPRMNum(this, Native.Z3_mk_fpa_rne(nCtx));
03527 }
03528
03532 public FPRMNum MkFPRoundNearestTiesToAway()
03533 {
03534 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03535 return new FPRMNum(this, Native.Z3_mk_fpa_round_nearest_ties_to_away(nCtx));
03536 }
03537
03541 public FPRMNum MkFPRNA()
03542 {
03543 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03544 return new FPRMNum(this, Native.Z3_mk_fpa_rna(nCtx));
03545 }
03546
03550 public FPRMNum MkFPRoundTowardPositive()
03551 {
03552 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03553 return new FPRMNum(this, Native.Z3_mk_fpa_round_toward_positive(nCtx));
03554 }
03555
03559 public FPRMNum MkFPRTP()
03560 {
03561 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03562 return new FPRMNum(this, Native.Z3_mk_fpa_rtp(nCtx));
03563 }
03564
03568 public FPRMNum MkFPRoundTowardNegative()
03569 {
03570 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03571 return new FPRMNum(this, Native.Z3_mk_fpa_round_toward_negative(nCtx));
03572 }
03573
03577 public FPRMNum MkFPRTN()
03578 {
03579 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03580 return new FPRMNum(this, Native.Z3_mk_fpa_rtn(nCtx));
03581 }
03582
03586 public FPRMNum MkFPRoundTowardZero()
03587 {
03588 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03589 return new FPRMNum(this, Native.Z3_mk_fpa_round_toward_zero(nCtx));
03590 }
03591
03595 public FPRMNum MkFPRTZ()
03596 {
03597 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03598 return new FPRMNum(this, Native.Z3_mk_fpa_rtz(nCtx));
03599 }
03600 #endregion
03601 #endregion
03602
03603 #region FloatingPoint Sorts
03604
03605
03606
03607
03608
03609 public FPSort MkFPSort(uint ebits, uint sbits)
03610 {
03611 Contract.Ensures(Contract.Result<FPSort>() != null);
03612 return new FPSort(this, ebits, sbits);
03613 }
03614
03618 public FPSort MkFPSortHalf()
03619 {
03620 Contract.Ensures(Contract.Result<FPSort>() != null);
03621 return new FPSort(this, Native.Z3_mk_fpa_sort_half(nCtx));
03622 }
03623
03627 public FPSort MkFPSort16()
03628 {
03629 Contract.Ensures(Contract.Result<FPSort>() != null);
03630 return new FPSort(this, Native.Z3_mk_fpa_sort_16(nCtx));
03631 }
03632
03636 public FPSort MkFPSortSingle()
03637 {
03638 Contract.Ensures(Contract.Result<FPSort>() != null);
03639 return new FPSort(this, Native.Z3_mk_fpa_sort_single(nCtx));
03640 }
03641
03645 public FPSort MkFPSort32()
03646 {
03647 Contract.Ensures(Contract.Result<FPSort>() != null);
03648 return new FPSort(this, Native.Z3_mk_fpa_sort_32(nCtx));
03649 }
03650
03654 public FPSort MkFPSortDouble()
03655 {
03656 Contract.Ensures(Contract.Result<FPSort>() != null);
03657 return new FPSort(this, Native.Z3_mk_fpa_sort_double(nCtx));
03658 }
03659
03663 public FPSort MkFPSort64()
03664 {
03665 Contract.Ensures(Contract.Result<FPSort>() != null);
03666 return new FPSort(this, Native.Z3_mk_fpa_sort_64(nCtx));
03667 }
03668
03672 public FPSort MkFPSortQuadruple()
03673 {
03674 Contract.Ensures(Contract.Result<FPSort>() != null);
03675 return new FPSort(this, Native.Z3_mk_fpa_sort_quadruple(nCtx));
03676 }
03677
03681 public FPSort MkFPSort128()
03682 {
03683 Contract.Ensures(Contract.Result<FPSort>() != null);
03684 return new FPSort(this, Native.Z3_mk_fpa_sort_128(nCtx));
03685 }
03686 #endregion
03687
03688 #region Numerals
03689
03690
03691
03692
03693 public FPNum MkFPNaN(FPSort s)
03694 {
03695 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03696 return new FPNum(this, Native.Z3_mk_fpa_nan(nCtx, s.NativeObject));
03697 }
03698
03704 public FPNum MkFPInf(FPSort s, bool negative)
03705 {
03706 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03707 return new FPNum(this, Native.Z3_mk_fpa_inf(nCtx, s.NativeObject, negative ? 1 : 0));
03708 }
03709
03715 public FPNum MkFPZero(FPSort s, bool negative)
03716 {
03717 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03718 return new FPNum(this, Native.Z3_mk_fpa_zero(nCtx, s.NativeObject, negative ? 1 : 0));
03719 }
03720
03726 public FPNum MkFPNumeral(float v, FPSort s)
03727 {
03728 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03729 return new FPNum(this, Native.Z3_mk_fpa_numeral_float(nCtx, v, s.NativeObject));
03730 }
03731
03737 public FPNum MkFPNumeral(double v, FPSort s)
03738 {
03739 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03740 return new FPNum(this, Native.Z3_mk_fpa_numeral_double(nCtx, v, s.NativeObject));
03741 }
03742
03748 public FPNum MkFPNumeral(int v, FPSort s)
03749 {
03750 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03751 return new FPNum(this, Native.Z3_mk_fpa_numeral_int(nCtx, v, s.NativeObject));
03752 }
03753
03761 public FPNum MkFPNumeral(bool sgn, uint sig, int exp, FPSort s)
03762 {
03763 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03764 return new FPNum(this, Native.Z3_mk_fpa_numeral_int_uint(nCtx, sgn ? 1 : 0, exp, sig, s.NativeObject));
03765 }
03766
03774 public FPNum MkFPNumeral(bool sgn, Int64 exp, UInt64 sig, FPSort s)
03775 {
03776 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03777 return new FPNum(this, Native.Z3_mk_fpa_numeral_int64_uint64(nCtx, sgn ? 1 : 0, exp, sig, s.NativeObject));
03778 }
03779
03785 public FPNum MkFP(float v, FPSort s)
03786 {
03787 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03788 return MkFPNumeral(v, s);
03789 }
03790
03796 public FPNum MkFP(double v, FPSort s)
03797 {
03798 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03799 return MkFPNumeral(v, s);
03800 }
03801
03807 public FPNum MkFP(int v, FPSort s)
03808 {
03809 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03810 return MkFPNumeral(v, s);
03811 }
03812
03820 public FPNum MkFP(bool sgn, int exp, uint sig, FPSort s)
03821 {
03822 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03823 return MkFPNumeral(sgn, exp, sig, s);
03824 }
03825
03833 public FPNum MkFP(bool sgn, Int64 exp, UInt64 sig, FPSort s)
03834 {
03835 Contract.Ensures(Contract.Result<FPRMExpr>() != null);
03836 return MkFPNumeral(sgn, exp, sig, s);
03837 }
03838
03839 #endregion
03840
03841 #region Operators
03842
03843
03844
03845
03846 public FPExpr MkFPAbs(FPExpr t)
03847 {
03848 Contract.Ensures(Contract.Result<FPNum>() != null);
03849 return new FPExpr(this, Native.Z3_mk_fpa_abs(this.nCtx, t.NativeObject));
03850 }
03851
03856 public FPExpr MkFPNeg(FPExpr t)
03857 {
03858 Contract.Ensures(Contract.Result<FPNum>() != null);
03859 return new FPExpr(this, Native.Z3_mk_fpa_neg(this.nCtx, t.NativeObject));
03860 }
03861
03868 public FPExpr MkFPAdd(FPRMExpr rm, FPExpr t1, FPExpr t2)
03869 {
03870 Contract.Ensures(Contract.Result<FPNum>() != null);
03871 return new FPExpr(this, Native.Z3_mk_fpa_add(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
03872 }
03873
03880 public FPExpr MkFPSub(FPRMExpr rm, FPExpr t1, FPExpr t2)
03881 {
03882 Contract.Ensures(Contract.Result<FPNum>() != null);
03883 return new FPExpr(this, Native.Z3_mk_fpa_sub(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
03884 }
03885
03892 public FPExpr MkFPMul(FPRMExpr rm, FPExpr t1, FPExpr t2)
03893 {
03894 Contract.Ensures(Contract.Result<FPNum>() != null);
03895 return new FPExpr(this, Native.Z3_mk_fpa_mul(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
03896 }
03897
03904 public FPExpr MkFPDiv(FPRMExpr rm, FPExpr t1, FPExpr t2)
03905 {
03906 Contract.Ensures(Contract.Result<FPNum>() != null);
03907 return new FPExpr(this, Native.Z3_mk_fpa_div(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject));
03908 }
03909
03920 public FPExpr MkFPFMA(FPRMExpr rm, FPExpr t1, FPExpr t2, FPExpr t3)
03921 {
03922 Contract.Ensures(Contract.Result<FPNum>() != null);
03923 return new FPExpr(this, Native.Z3_mk_fpa_fma(this.nCtx, rm.NativeObject, t1.NativeObject, t2.NativeObject, t3.NativeObject));
03924 }
03925
03931 public FPExpr MkFPSqrt(FPRMExpr rm, FPExpr t)
03932 {
03933 Contract.Ensures(Contract.Result<FPNum>() != null);
03934 return new FPExpr(this, Native.Z3_mk_fpa_sqrt(this.nCtx, rm.NativeObject, t.NativeObject));
03935 }
03936
03942 public FPExpr MkFPRem(FPExpr t1, FPExpr t2)
03943 {
03944 Contract.Ensures(Contract.Result<FPNum>() != null);
03945 return new FPExpr(this, Native.Z3_mk_fpa_rem(this.nCtx, t1.NativeObject, t2.NativeObject));
03946 }
03947
03954 public FPExpr MkFPRoundToIntegral(FPRMExpr rm, FPExpr t)
03955 {
03956 Contract.Ensures(Contract.Result<FPNum>() != null);
03957 return new FPExpr(this, Native.Z3_mk_fpa_round_to_integral(this.nCtx, rm.NativeObject, t.NativeObject));
03958 }
03959
03965 public FPExpr MkFPMin(FPExpr t1, FPExpr t2)
03966 {
03967 Contract.Ensures(Contract.Result<FPNum>() != null);
03968 return new FPExpr(this, Native.Z3_mk_fpa_min(this.nCtx, t1.NativeObject, t2.NativeObject));
03969 }
03970
03976 public FPExpr MkFPMax(FPExpr t1, FPExpr t2)
03977 {
03978 Contract.Ensures(Contract.Result<FPNum>() != null);
03979 return new FPExpr(this, Native.Z3_mk_fpa_max(this.nCtx, t1.NativeObject, t2.NativeObject));
03980 }
03981
03987 public BoolExpr MkFPLEq(FPExpr t1, FPExpr t2)
03988 {
03989 Contract.Ensures(Contract.Result<BoolExpr>() != null);
03990 return new BoolExpr(this, Native.Z3_mk_fpa_leq(this.nCtx, t1.NativeObject, t2.NativeObject));
03991 }
03992
03998 public BoolExpr MkFPLt(FPExpr t1, FPExpr t2)
03999 {
04000 Contract.Ensures(Contract.Result<BoolExpr>() != null);
04001 return new BoolExpr(this, Native.Z3_mk_fpa_lt(this.nCtx, t1.NativeObject, t2.NativeObject));
04002 }
04003
04009 public BoolExpr MkFPGEq(FPExpr t1, FPExpr t2)
04010 {
04011 Contract.Ensures(Contract.Result<BoolExpr>() != null);
04012 return new BoolExpr(this, Native.Z3_mk_fpa_geq(this.nCtx, t1.NativeObject, t2.NativeObject));
04013 }
04014
04020 public BoolExpr MkFPGt(FPExpr t1, FPExpr t2)
04021 {
04022 Contract.Ensures(Contract.Result<BoolExpr>() != null);
04023 return new BoolExpr(this, Native.Z3_mk_fpa_gt(this.nCtx, t1.NativeObject, t2.NativeObject));
04024 }
04025
04034 public BoolExpr MkFPEq(FPExpr t1, FPExpr t2)
04035 {
04036 Contract.Ensures(Contract.Result<BoolExpr>() != null);
04037 return new BoolExpr(this, Native.Z3_mk_fpa_eq(this.nCtx, t1.NativeObject, t2.NativeObject));
04038 }
04039
04044 public BoolExpr MkFPIsNormal(FPExpr t)
04045 {
04046 Contract.Ensures(Contract.Result<BoolExpr>() != null);
04047 return new BoolExpr(this, Native.Z3_mk_fpa_is_normal(this.nCtx, t.NativeObject));
04048 }
04049
04054 public BoolExpr MkFPIsSubnormal(FPExpr t)
04055 {
04056 Contract.Ensures(Contract.Result<BoolExpr>() != null);
04057 return new BoolExpr(this, Native.Z3_mk_fpa_is_subnormal(this.nCtx, t.NativeObject));
04058 }
04059
04064 public BoolExpr MkFPIsZero(FPExpr t)
04065 {
04066 Contract.Ensures(Contract.Result<BoolExpr>() != null);
04067 return new BoolExpr(this, Native.Z3_mk_fpa_is_zero(this.nCtx, t.NativeObject));
04068 }
04069
04074 public BoolExpr MkFPIsInfinite(FPExpr t)
04075 {
04076 Contract.Ensures(Contract.Result<BoolExpr>() != null);
04077 return new BoolExpr(this, Native.Z3_mk_fpa_is_infinite(this.nCtx, t.NativeObject));
04078 }
04079
04084 public BoolExpr MkFPIsNaN(FPExpr t)
04085 {
04086 Contract.Ensures(Contract.Result<BoolExpr>() != null);
04087 return new BoolExpr(this, Native.Z3_mk_fpa_is_nan(this.nCtx, t.NativeObject));
04088 }
04089
04094 public BoolExpr MkFPIsNegative(FPExpr t)
04095 {
04096 Contract.Ensures(Contract.Result<BoolExpr>() != null);
04097 return new BoolExpr(this, Native.Z3_mk_fpa_is_negative(this.nCtx, t.NativeObject));
04098 }
04099
04104 public BoolExpr MkFPIsPositive(FPExpr t)
04105 {
04106 Contract.Ensures(Contract.Result<BoolExpr>() != null);
04107 return new BoolExpr(this, Native.Z3_mk_fpa_is_positive(this.nCtx, t.NativeObject));
04108 }
04109 #endregion
04110
04111 #region Conversions to FloatingPoint terms
04112
04113
04114
04115
04116
04117
04118
04119
04120
04121
04122
04123
04124
04125 public FPExpr MkFP(BitVecExpr sgn, BitVecExpr sig, BitVecExpr exp)
04126 {
04127 Contract.Ensures(Contract.Result<FPExpr>() != null);
04128 return new FPExpr(this, Native.Z3_mk_fpa_fp(this.nCtx, sgn.NativeObject, sig.NativeObject, exp.NativeObject));
04129 }
04130
04142 public FPExpr MkFPToFP(BitVecExpr bv, FPSort s)
04143 {
04144 Contract.Ensures(Contract.Result<FPExpr>() != null);
04145 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_bv(this.nCtx, bv.NativeObject, s.NativeObject));
04146 }
04147
04159 public FPExpr MkFPToFP(FPRMExpr rm, FPExpr t, FPSort s)
04160 {
04161 Contract.Ensures(Contract.Result<FPExpr>() != null);
04162 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_float(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
04163 }
04164
04176 public FPExpr MkFPToFP(FPRMExpr rm, RealExpr t, FPSort s)
04177 {
04178 Contract.Ensures(Contract.Result<FPExpr>() != null);
04179 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_real(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
04180 }
04181
04195 public FPExpr MkFPToFP(FPRMExpr rm, BitVecExpr t, FPSort s, bool signed)
04196 {
04197 Contract.Ensures(Contract.Result<FPExpr>() != null);
04198 if (signed)
04199 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_signed(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
04200 else
04201 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_unsigned(this.nCtx, rm.NativeObject, t.NativeObject, s.NativeObject));
04202 }
04203
04214 public FPExpr MkFPToFP(FPSort s, FPRMExpr rm, FPExpr t)
04215 {
04216 Contract.Ensures(Contract.Result<FPExpr>() != null);
04217 return new FPExpr(this, Native.Z3_mk_fpa_to_fp_float(this.nCtx, s.NativeObject, rm.NativeObject, t.NativeObject));
04218 }
04219 #endregion
04220
04221 #region Conversions from FloatingPoint terms
04222
04223
04224
04225
04226
04227
04228
04229
04230
04231
04232
04233
04234 public BitVecExpr MkFPToBV(FPRMExpr rm, FPExpr t, uint sz, bool signed)
04235 {
04236 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
04237 if (signed)
04238 return new BitVecExpr(this, Native.Z3_mk_fpa_to_sbv(this.nCtx, rm.NativeObject, t.NativeObject, sz));
04239 else
04240 return new BitVecExpr(this, Native.Z3_mk_fpa_to_ubv(this.nCtx, rm.NativeObject, t.NativeObject, sz));
04241 }
04242
04252 public RealExpr MkFPToReal(FPExpr t)
04253 {
04254 Contract.Ensures(Contract.Result<RealExpr>() != null);
04255 return new RealExpr(this, Native.Z3_mk_fpa_to_real(this.nCtx, t.NativeObject));
04256 }
04257 #endregion
04258
04259 #region Z3-specific extensions
04260
04261
04262
04263
04264
04265
04266
04267
04268
04269
04270 public BitVecExpr MkFPToIEEEBV(FPExpr t)
04271 {
04272 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
04273 return new BitVecExpr(this, Native.Z3_mk_fpa_to_ieee_bv(this.nCtx, t.NativeObject));
04274 }
04275
04288 public BitVecExpr MkFPToFP(FPRMExpr rm, IntExpr exp, RealExpr sig, FPSort s)
04289 {
04290 Contract.Ensures(Contract.Result<BitVecExpr>() != null);
04291 return new BitVecExpr(this, Native.Z3_mk_fpa_to_fp_int_real(this.nCtx, rm.NativeObject, exp.NativeObject, sig.NativeObject, s.NativeObject));
04292 }
04293 #endregion
04294 #endregion // Floating-point Arithmetic
04295
04296 #region Miscellaneous
04297
04298
04299
04300
04301
04302
04303
04304
04305
04306
04307 public AST WrapAST(IntPtr nativeObject)
04308 {
04309 Contract.Ensures(Contract.Result<AST>() != null);
04310 return AST.Create(this, nativeObject);
04311 }
04312
04324 public IntPtr UnwrapAST(AST a)
04325 {
04326 return a.NativeObject;
04327 }
04328
04332 public string SimplifyHelp()
04333 {
04334 Contract.Ensures(Contract.Result<string>() != null);
04335
04336 return Native.Z3_simplify_get_help(nCtx);
04337 }
04338
04342 public ParamDescrs SimplifyParameterDescriptions
04343 {
04344 get { return new ParamDescrs(this, Native.Z3_simplify_get_param_descrs(nCtx)); }
04345 }
04346 #endregion
04347
04348 #region Error Handling
04349
04350
04351
04352
04353
04354
04355
04356
04357
04361
04362 #endregion
04363
04364 #region Parameters
04365
04366
04367
04368
04369
04370
04371
04372
04373
04374 public void UpdateParamValue(string id, string value)
04375 {
04376 Native.Z3_update_param_value(nCtx, id, value);
04377 }
04378
04379 #endregion
04380
04381 #region Internal
04382 internal IntPtr m_ctx = IntPtr.Zero;
04383 internal Native.Z3_error_handler m_n_err_handler = null;
04384 internal IntPtr nCtx { get { return m_ctx; } }
04385
04386 internal void NativeErrorHandler(IntPtr ctx, Z3_error_code errorCode)
04387 {
04388
04389 }
04390
04391 internal void InitContext()
04392 {
04393 PrintMode = Z3_ast_print_mode.Z3_PRINT_SMTLIB2_COMPLIANT;
04394 m_n_err_handler = new Native.Z3_error_handler(NativeErrorHandler);
04395 Native.Z3_set_error_handler(m_ctx, m_n_err_handler);
04396 GC.SuppressFinalize(this);
04397 }
04398
04399 [Pure]
04400 internal void CheckContextMatch(Z3Object other)
04401 {
04402 Contract.Requires(other != null);
04403
04404 if (!ReferenceEquals(this, other.Context))
04405 throw new Z3Exception("Context mismatch");
04406 }
04407
04408 [Pure]
04409 internal void CheckContextMatch(Z3Object[] arr)
04410 {
04411 Contract.Requires(arr == null || Contract.ForAll(arr, a => a != null));
04412
04413 if (arr != null)
04414 {
04415 foreach (Z3Object a in arr)
04416 {
04417 Contract.Assert(a != null);
04418 CheckContextMatch(a);
04419 }
04420 }
04421 }
04422
04423 [ContractInvariantMethod]
04424 private void ObjectInvariant()
04425 {
04426 Contract.Invariant(m_AST_DRQ != null);
04427 Contract.Invariant(m_ASTMap_DRQ != null);
04428 Contract.Invariant(m_ASTVector_DRQ != null);
04429 Contract.Invariant(m_ApplyResult_DRQ != null);
04430 Contract.Invariant(m_FuncEntry_DRQ != null);
04431 Contract.Invariant(m_FuncInterp_DRQ != null);
04432 Contract.Invariant(m_Goal_DRQ != null);
04433 Contract.Invariant(m_Model_DRQ != null);
04434 Contract.Invariant(m_Params_DRQ != null);
04435 Contract.Invariant(m_ParamDescrs_DRQ != null);
04436 Contract.Invariant(m_Probe_DRQ != null);
04437 Contract.Invariant(m_Solver_DRQ != null);
04438 Contract.Invariant(m_Statistics_DRQ != null);
04439 Contract.Invariant(m_Tactic_DRQ != null);
04440 Contract.Invariant(m_Fixedpoint_DRQ != null);
04441 Contract.Invariant(m_Optimize_DRQ != null);
04442 }
04443
04444 readonly private AST.DecRefQueue m_AST_DRQ = new AST.DecRefQueue();
04445 readonly private ASTMap.DecRefQueue m_ASTMap_DRQ = new ASTMap.DecRefQueue(10);
04446 readonly private ASTVector.DecRefQueue m_ASTVector_DRQ = new ASTVector.DecRefQueue(10);
04447 readonly private ApplyResult.DecRefQueue m_ApplyResult_DRQ = new ApplyResult.DecRefQueue(10);
04448 readonly private FuncInterp.Entry.DecRefQueue m_FuncEntry_DRQ = new FuncInterp.Entry.DecRefQueue(10);
04449 readonly private FuncInterp.DecRefQueue m_FuncInterp_DRQ = new FuncInterp.DecRefQueue(10);
04450 readonly private Goal.DecRefQueue m_Goal_DRQ = new Goal.DecRefQueue(10);
04451 readonly private Model.DecRefQueue m_Model_DRQ = new Model.DecRefQueue(10);
04452 readonly private Params.DecRefQueue m_Params_DRQ = new Params.DecRefQueue(10);
04453 readonly private ParamDescrs.DecRefQueue m_ParamDescrs_DRQ = new ParamDescrs.DecRefQueue(10);
04454 readonly private Probe.DecRefQueue m_Probe_DRQ = new Probe.DecRefQueue(10);
04455 readonly private Solver.DecRefQueue m_Solver_DRQ = new Solver.DecRefQueue(10);
04456 readonly private Statistics.DecRefQueue m_Statistics_DRQ = new Statistics.DecRefQueue(10);
04457 readonly private Tactic.DecRefQueue m_Tactic_DRQ = new Tactic.DecRefQueue(10);
04458 readonly private Fixedpoint.DecRefQueue m_Fixedpoint_DRQ = new Fixedpoint.DecRefQueue(10);
04459 readonly private Optimize.DecRefQueue m_Optimize_DRQ = new Optimize.DecRefQueue(10);
04460
04464 public IDecRefQueue AST_DRQ { get { Contract.Ensures(Contract.Result<AST.DecRefQueue>() != null); return m_AST_DRQ; } }
04465
04469 public IDecRefQueue ASTMap_DRQ { get { Contract.Ensures(Contract.Result<ASTMap.DecRefQueue>() != null); return m_ASTMap_DRQ; } }
04470
04474 public IDecRefQueue ASTVector_DRQ { get { Contract.Ensures(Contract.Result<ASTVector.DecRefQueue>() != null); return m_ASTVector_DRQ; } }
04475
04479 public IDecRefQueue ApplyResult_DRQ { get { Contract.Ensures(Contract.Result<ApplyResult.DecRefQueue>() != null); return m_ApplyResult_DRQ; } }
04480
04484 public IDecRefQueue FuncEntry_DRQ { get { Contract.Ensures(Contract.Result<FuncInterp.Entry.DecRefQueue>() != null); return m_FuncEntry_DRQ; } }
04485
04489 public IDecRefQueue FuncInterp_DRQ { get { Contract.Ensures(Contract.Result<FuncInterp.DecRefQueue>() != null); return m_FuncInterp_DRQ; } }
04490
04494 public IDecRefQueue Goal_DRQ { get { Contract.Ensures(Contract.Result<Goal.DecRefQueue>() != null); return m_Goal_DRQ; } }
04495
04499 public IDecRefQueue Model_DRQ { get { Contract.Ensures(Contract.Result<Model.DecRefQueue>() != null); return m_Model_DRQ; } }
04500
04504 public IDecRefQueue Params_DRQ { get { Contract.Ensures(Contract.Result<Params.DecRefQueue>() != null); return m_Params_DRQ; } }
04505
04509 public IDecRefQueue ParamDescrs_DRQ { get { Contract.Ensures(Contract.Result<ParamDescrs.DecRefQueue>() != null); return m_ParamDescrs_DRQ; } }
04510
04514 public IDecRefQueue Probe_DRQ { get { Contract.Ensures(Contract.Result<Probe.DecRefQueue>() != null); return m_Probe_DRQ; } }
04515
04519 public IDecRefQueue Solver_DRQ { get { Contract.Ensures(Contract.Result<Solver.DecRefQueue>() != null); return m_Solver_DRQ; } }
04520
04524 public IDecRefQueue Statistics_DRQ { get { Contract.Ensures(Contract.Result<Statistics.DecRefQueue>() != null); return m_Statistics_DRQ; } }
04525
04529 public IDecRefQueue Tactic_DRQ { get { Contract.Ensures(Contract.Result<Tactic.DecRefQueue>() != null); return m_Tactic_DRQ; } }
04530
04534 public IDecRefQueue Fixedpoint_DRQ { get { Contract.Ensures(Contract.Result<Fixedpoint.DecRefQueue>() != null); return m_Fixedpoint_DRQ; } }
04535
04539 public IDecRefQueue Optimize_DRQ { get { Contract.Ensures(Contract.Result<Optimize.DecRefQueue>() != null); return m_Fixedpoint_DRQ; } }
04540
04541
04542 internal long refCount = 0;
04543
04547 ~Context()
04548 {
04549
04550 Dispose();
04551
04552 if (refCount == 0)
04553 {
04554 m_n_err_handler = null;
04555 Native.Z3_del_context(m_ctx);
04556 m_ctx = IntPtr.Zero;
04557 }
04558 else
04559 GC.ReRegisterForFinalize(this);
04560 }
04561
04565 public void Dispose()
04566 {
04567
04568 AST_DRQ.Clear(this);
04569 ASTMap_DRQ.Clear(this);
04570 ASTVector_DRQ.Clear(this);
04571 ApplyResult_DRQ.Clear(this);
04572 FuncEntry_DRQ.Clear(this);
04573 FuncInterp_DRQ.Clear(this);
04574 Goal_DRQ.Clear(this);
04575 Model_DRQ.Clear(this);
04576 Params_DRQ.Clear(this);
04577 ParamDescrs_DRQ.Clear(this);
04578 Probe_DRQ.Clear(this);
04579 Solver_DRQ.Clear(this);
04580 Statistics_DRQ.Clear(this);
04581 Tactic_DRQ.Clear(this);
04582 Fixedpoint_DRQ.Clear(this);
04583 Optimize_DRQ.Clear(this);
04584
04585 m_boolSort = null;
04586 m_intSort = null;
04587 m_realSort = null;
04588 }
04589 #endregion
04590 }
04591 }