Z3
src/api/dotnet/Context.cs
Go to the documentation of this file.
00001 /*++
00002 Copyright (c) 2012 Microsoft Corporation
00003 
00004 Module Name:
00005 
00006     Context.cs
00007 
00008 Abstract:
00009 
00010     Z3 Managed API: Context
00011 
00012 Author:
00013 
00014     Christoph Wintersteiger (cwinter) 2012-03-15
00015 
00016 Notes:
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         //public delegate void ErrorHandler(Context ctx, Z3_error_code errorCode, string errorString);
04357 
04361         //public event ErrorHandler OnError = null;
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             // Do-nothing error handler. The wrappers in Z3.Native will throw exceptions upon errors.            
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); // keep reference so it doesn't get collected.
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); // It was an assume, now we added the precondition, and we made it into an assert
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             // Console.WriteLine("Context Finalizer from " + System.Threading.Thread.CurrentThread.ManagedThreadId);
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             // Console.WriteLine("Context Dispose from " + System.Threading.Thread.CurrentThread.ManagedThreadId);
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 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines