Z3
src/api/java/Context.java
Go to the documentation of this file.
00001 
00018 package com.microsoft.z3;
00019 
00020 import java.util.Map;
00021 
00022 import com.microsoft.z3.enumerations.Z3_ast_print_mode;
00023 
00027 public class Context extends IDisposable
00028 {
00032     public Context()
00033     {
00034         super();
00035         m_ctx = Native.mkContextRc(0);
00036         initContext();
00037     }
00038 
00056     public Context(Map<String, String> settings)
00057     {
00058         super();
00059         long cfg = Native.mkConfig();
00060         for (Map.Entry<String, String> kv : settings.entrySet())
00061             Native.setParamValue(cfg, kv.getKey(), kv.getValue());
00062         m_ctx = Native.mkContextRc(cfg);
00063         Native.delConfig(cfg);
00064         initContext();
00065     }
00066 
00072     public IntSymbol mkSymbol(int i)
00073     {
00074         return new IntSymbol(this, i);
00075     }
00076 
00080     public StringSymbol mkSymbol(String name)
00081     {
00082         return new StringSymbol(this, name);
00083     }
00084 
00088     Symbol[] mkSymbols(String[] names)
00089     {
00090         if (names == null)
00091             return null;
00092         Symbol[] result = new Symbol[names.length];
00093         for (int i = 0; i < names.length; ++i)
00094             result[i] = mkSymbol(names[i]);
00095         return result;
00096     }
00097 
00098     private BoolSort m_boolSort = null;
00099     private IntSort m_intSort = null;
00100     private RealSort m_realSort = null;
00101 
00105     public BoolSort getBoolSort()
00106     {
00107         if (m_boolSort == null)
00108             m_boolSort = new BoolSort(this);
00109         return m_boolSort;
00110     }
00111 
00115     public IntSort getIntSort()
00116     {
00117         if (m_intSort == null)
00118             m_intSort = new IntSort(this);
00119         return m_intSort;
00120     }
00121 
00125     public RealSort getRealSort()
00126     {
00127         if (m_realSort == null)
00128             m_realSort = new RealSort(this);
00129         return m_realSort;
00130     }
00131 
00135     public BoolSort mkBoolSort()
00136     {
00137         return new BoolSort(this);
00138     }
00139 
00143     public UninterpretedSort mkUninterpretedSort(Symbol s)
00144     {
00145         checkContextMatch(s);
00146         return new UninterpretedSort(this, s);
00147     }
00148 
00152     public UninterpretedSort mkUninterpretedSort(String str)
00153     {
00154         return mkUninterpretedSort(mkSymbol(str));
00155     }
00156 
00160     public IntSort mkIntSort()
00161     {
00162         return new IntSort(this);
00163     }
00164 
00168     public RealSort mkRealSort()
00169     {
00170         return new RealSort(this);
00171     }
00172 
00176     public BitVecSort mkBitVecSort(int size)
00177     {
00178         return new BitVecSort(this, Native.mkBvSort(nCtx(), size));
00179     }
00180 
00184     public ArraySort mkArraySort(Sort domain, Sort range)
00185     {
00186         checkContextMatch(domain);
00187         checkContextMatch(range);
00188         return new ArraySort(this, domain, range);
00189     }
00190 
00194     public TupleSort mkTupleSort(Symbol name, Symbol[] fieldNames,
00195             Sort[] fieldSorts)
00196     {
00197         checkContextMatch(name);
00198         checkContextMatch(fieldNames);
00199         checkContextMatch(fieldSorts);
00200         return new TupleSort(this, name, (int) fieldNames.length, fieldNames,
00201                 fieldSorts);
00202     }
00203 
00207     public EnumSort mkEnumSort(Symbol name, Symbol... enumNames)
00208            
00209     {
00210         checkContextMatch(name);
00211         checkContextMatch(enumNames);
00212         return new EnumSort(this, name, enumNames);
00213     }
00214 
00218     public EnumSort mkEnumSort(String name, String... enumNames)
00219            
00220     {
00221         return new EnumSort(this, mkSymbol(name), mkSymbols(enumNames));
00222     }
00223 
00227     public ListSort mkListSort(Symbol name, Sort elemSort)
00228     {
00229         checkContextMatch(name);
00230         checkContextMatch(elemSort);
00231         return new ListSort(this, name, elemSort);
00232     }
00233 
00237     public ListSort mkListSort(String name, Sort elemSort)
00238     {
00239         checkContextMatch(elemSort);
00240         return new ListSort(this, mkSymbol(name), elemSort);
00241     }
00242 
00246     public FiniteDomainSort mkFiniteDomainSort(Symbol name, long size)
00247            
00248     {
00249         checkContextMatch(name);
00250         return new FiniteDomainSort(this, name, size);
00251     }
00252 
00256     public FiniteDomainSort mkFiniteDomainSort(String name, long size)
00257            
00258     {
00259         return new FiniteDomainSort(this, mkSymbol(name), size);
00260     }
00261 
00273     public Constructor mkConstructor(Symbol name, Symbol recognizer,
00274             Symbol[] fieldNames, Sort[] sorts, int[] sortRefs)
00275            
00276     {
00277 
00278         return new Constructor(this, name, recognizer, fieldNames, sorts,
00279                 sortRefs);
00280     }
00281 
00292     public Constructor mkConstructor(String name, String recognizer,
00293             String[] fieldNames, Sort[] sorts, int[] sortRefs)
00294            
00295     {
00296 
00297         return new Constructor(this, mkSymbol(name), mkSymbol(recognizer),
00298                 mkSymbols(fieldNames), sorts, sortRefs);
00299     }
00300 
00304     public DatatypeSort mkDatatypeSort(Symbol name, Constructor[] constructors)
00305            
00306     {
00307         checkContextMatch(name);
00308         checkContextMatch(constructors);
00309         return new DatatypeSort(this, name, constructors);
00310     }
00311 
00315     public DatatypeSort mkDatatypeSort(String name, Constructor[] constructors)
00316            
00317     {
00318         checkContextMatch(constructors);
00319         return new DatatypeSort(this, mkSymbol(name), constructors);
00320     }
00321 
00327     public DatatypeSort[] mkDatatypeSorts(Symbol[] names, Constructor[][] c)
00328            
00329     {
00330         checkContextMatch(names);
00331         int n = (int) names.length;
00332         ConstructorList[] cla = new ConstructorList[n];
00333         long[] n_constr = new long[n];
00334         for (int i = 0; i < n; i++)
00335         {
00336             Constructor[] constructor = c[i];
00337 
00338             checkContextMatch(constructor);
00339             cla[i] = new ConstructorList(this, constructor);
00340             n_constr[i] = cla[i].getNativeObject();
00341         }
00342         long[] n_res = new long[n];
00343         Native.mkDatatypes(nCtx(), n, Symbol.arrayToNative(names), n_res,
00344                 n_constr);
00345         DatatypeSort[] res = new DatatypeSort[n];
00346         for (int i = 0; i < n; i++)
00347             res[i] = new DatatypeSort(this, n_res[i]);
00348         return res;
00349     }
00350 
00358     public DatatypeSort[] mkDatatypeSorts(String[] names, Constructor[][] c)
00359            
00360     {
00361         return mkDatatypeSorts(mkSymbols(names), c);
00362     }
00363 
00370     public Expr MkUpdateField(FuncDecl field, Expr t, Expr v) 
00371             throws Z3Exception
00372     {
00373         return Expr.create
00374             (this, 
00375              Native.datatypeUpdateField
00376              (nCtx(), field.getNativeObject(),
00377               t.getNativeObject(), v.getNativeObject()));               
00378     }
00379 
00380 
00384     public FuncDecl mkFuncDecl(Symbol name, Sort[] domain, Sort range)
00385            
00386     {
00387         checkContextMatch(name);
00388         checkContextMatch(domain);
00389         checkContextMatch(range);
00390         return new FuncDecl(this, name, domain, range);
00391     }
00392 
00396     public FuncDecl mkFuncDecl(Symbol name, Sort domain, Sort range)
00397            
00398     {
00399         checkContextMatch(name);
00400         checkContextMatch(domain);
00401         checkContextMatch(range);
00402         Sort[] q = new Sort[] { domain };
00403         return new FuncDecl(this, name, q, range);
00404     }
00405 
00409     public FuncDecl mkFuncDecl(String name, Sort[] domain, Sort range)
00410            
00411     {
00412         checkContextMatch(domain);
00413         checkContextMatch(range);
00414         return new FuncDecl(this, mkSymbol(name), domain, range);
00415     }
00416 
00420     public FuncDecl mkFuncDecl(String name, Sort domain, Sort range)
00421            
00422     {
00423         checkContextMatch(domain);
00424         checkContextMatch(range);
00425         Sort[] q = new Sort[] { domain };
00426         return new FuncDecl(this, mkSymbol(name), q, range);
00427     }
00428 
00435     public FuncDecl mkFreshFuncDecl(String prefix, Sort[] domain, Sort range)
00436            
00437     {
00438         checkContextMatch(domain);
00439         checkContextMatch(range);
00440         return new FuncDecl(this, prefix, domain, range);
00441     }
00442 
00446     public FuncDecl mkConstDecl(Symbol name, Sort range)
00447     {
00448         checkContextMatch(name);
00449         checkContextMatch(range);
00450         return new FuncDecl(this, name, null, range);
00451     }
00452 
00456     public FuncDecl mkConstDecl(String name, Sort range)
00457     {
00458         checkContextMatch(range);
00459         return new FuncDecl(this, mkSymbol(name), null, range);
00460     }
00461 
00468     public FuncDecl mkFreshConstDecl(String prefix, Sort range)
00469            
00470     {
00471         checkContextMatch(range);
00472         return new FuncDecl(this, prefix, null, range);
00473     }
00474 
00480     public Expr mkBound(int index, Sort ty)
00481     {
00482         return Expr.create(this,
00483                 Native.mkBound(nCtx(), index, ty.getNativeObject()));
00484     }
00485 
00489     public Pattern mkPattern(Expr... terms)
00490     {
00491         if (terms.length == 0)
00492             throw new Z3Exception("Cannot create a pattern from zero terms");
00493 
00494         long[] termsNative = AST.arrayToNative(terms);
00495         return new Pattern(this, Native.mkPattern(nCtx(), (int) terms.length,
00496                 termsNative));
00497     }
00498 
00503     public Expr mkConst(Symbol name, Sort range)
00504     {
00505         checkContextMatch(name);
00506         checkContextMatch(range);
00507 
00508         return Expr.create(
00509                 this,
00510                 Native.mkConst(nCtx(), name.getNativeObject(),
00511                         range.getNativeObject()));
00512     }
00513 
00518     public Expr mkConst(String name, Sort range)
00519     {
00520         return mkConst(mkSymbol(name), range);
00521     }
00522 
00527     public Expr mkFreshConst(String prefix, Sort range)
00528     {
00529         checkContextMatch(range);
00530         return Expr.create(this,
00531                 Native.mkFreshConst(nCtx(), prefix, range.getNativeObject()));
00532     }
00533 
00538     public Expr mkConst(FuncDecl f)
00539     {
00540         return mkApp(f, (Expr[]) null);
00541     }
00542 
00546     public BoolExpr mkBoolConst(Symbol name)
00547     {
00548         return (BoolExpr) mkConst(name, getBoolSort());
00549     }
00550 
00554     public BoolExpr mkBoolConst(String name)
00555     {
00556         return (BoolExpr) mkConst(mkSymbol(name), getBoolSort());
00557     }
00558 
00562     public IntExpr mkIntConst(Symbol name)
00563     {
00564         return (IntExpr) mkConst(name, getIntSort());
00565     }
00566 
00570     public IntExpr mkIntConst(String name)
00571     {
00572         return (IntExpr) mkConst(name, getIntSort());
00573     }
00574 
00578     public RealExpr mkRealConst(Symbol name)
00579     {
00580         return (RealExpr) mkConst(name, getRealSort());
00581     }
00582 
00586     public RealExpr mkRealConst(String name)
00587     {
00588         return (RealExpr) mkConst(name, getRealSort());
00589     }
00590 
00594     public BitVecExpr mkBVConst(Symbol name, int size)
00595     {
00596         return (BitVecExpr) mkConst(name, mkBitVecSort(size));
00597     }
00598 
00602     public BitVecExpr mkBVConst(String name, int size)
00603     {
00604         return (BitVecExpr) mkConst(name, mkBitVecSort(size));
00605     }
00606 
00610     public Expr mkApp(FuncDecl f, Expr... args)
00611     {
00612         checkContextMatch(f);
00613         checkContextMatch(args);
00614         return Expr.create(this, f, args);
00615     }
00616 
00620     public BoolExpr mkTrue()
00621     {
00622         return new BoolExpr(this, Native.mkTrue(nCtx()));
00623     }
00624 
00628     public BoolExpr mkFalse()
00629     {
00630         return new BoolExpr(this, Native.mkFalse(nCtx()));
00631     }
00632 
00636     public BoolExpr mkBool(boolean value)
00637     {
00638         return value ? mkTrue() : mkFalse();
00639     }
00640 
00644     public BoolExpr mkEq(Expr x, Expr y)
00645     {
00646         checkContextMatch(x);
00647         checkContextMatch(y);
00648         return new BoolExpr(this, Native.mkEq(nCtx(), x.getNativeObject(),
00649                 y.getNativeObject()));
00650     }
00651 
00655     public BoolExpr mkDistinct(Expr... args)
00656     {
00657         checkContextMatch(args);
00658         return new BoolExpr(this, Native.mkDistinct(nCtx(), (int) args.length,
00659                 AST.arrayToNative(args)));
00660     }
00661 
00665     public BoolExpr mkNot(BoolExpr a)
00666     {
00667         checkContextMatch(a);
00668         return new BoolExpr(this, Native.mkNot(nCtx(), a.getNativeObject()));
00669     }
00670 
00678     public Expr mkITE(BoolExpr t1, Expr t2, Expr t3)
00679     {
00680         checkContextMatch(t1);
00681         checkContextMatch(t2);
00682         checkContextMatch(t3);
00683         return Expr.create(this, Native.mkIte(nCtx(), t1.getNativeObject(),
00684                 t2.getNativeObject(), t3.getNativeObject()));
00685     }
00686 
00690     public BoolExpr mkIff(BoolExpr t1, BoolExpr t2)
00691     {
00692         checkContextMatch(t1);
00693         checkContextMatch(t2);
00694         return new BoolExpr(this, Native.mkIff(nCtx(), t1.getNativeObject(),
00695                 t2.getNativeObject()));
00696     }
00697 
00701     public BoolExpr mkImplies(BoolExpr t1, BoolExpr t2)
00702     {
00703         checkContextMatch(t1);
00704         checkContextMatch(t2);
00705         return new BoolExpr(this, Native.mkImplies(nCtx(),
00706                 t1.getNativeObject(), t2.getNativeObject()));
00707     }
00708 
00712     public BoolExpr mkXor(BoolExpr t1, BoolExpr t2)
00713     {
00714         checkContextMatch(t1);
00715         checkContextMatch(t2);
00716         return new BoolExpr(this, Native.mkXor(nCtx(), t1.getNativeObject(),
00717                 t2.getNativeObject()));
00718     }
00719 
00723     public BoolExpr mkAnd(BoolExpr... t)
00724     {
00725         checkContextMatch(t);
00726         return new BoolExpr(this, Native.mkAnd(nCtx(), (int) t.length,
00727                 AST.arrayToNative(t)));
00728     }
00729 
00733     public BoolExpr mkOr(BoolExpr... t)
00734     {
00735         checkContextMatch(t);
00736         return new BoolExpr(this, Native.mkOr(nCtx(), (int) t.length,
00737                 AST.arrayToNative(t)));
00738     }
00739 
00743     public ArithExpr mkAdd(ArithExpr... t)
00744     {
00745         checkContextMatch(t);
00746         return (ArithExpr) Expr.create(this,
00747                 Native.mkAdd(nCtx(), (int) t.length, AST.arrayToNative(t)));
00748     }
00749 
00753     public ArithExpr mkMul(ArithExpr... t)
00754     {
00755         checkContextMatch(t);
00756         return (ArithExpr) Expr.create(this,
00757                 Native.mkMul(nCtx(), (int) t.length, AST.arrayToNative(t)));
00758     }
00759 
00763     public ArithExpr mkSub(ArithExpr... t)
00764     {
00765         checkContextMatch(t);
00766         return (ArithExpr) Expr.create(this,
00767                 Native.mkSub(nCtx(), (int) t.length, AST.arrayToNative(t)));
00768     }
00769 
00773     public ArithExpr mkUnaryMinus(ArithExpr t)
00774     {
00775         checkContextMatch(t);
00776         return (ArithExpr) Expr.create(this,
00777                 Native.mkUnaryMinus(nCtx(), t.getNativeObject()));
00778     }
00779 
00783     public ArithExpr mkDiv(ArithExpr t1, ArithExpr t2)
00784     {
00785         checkContextMatch(t1);
00786         checkContextMatch(t2);
00787         return (ArithExpr) Expr.create(this, Native.mkDiv(nCtx(),
00788                 t1.getNativeObject(), t2.getNativeObject()));
00789     }
00790 
00796     public IntExpr mkMod(IntExpr t1, IntExpr t2)
00797     {
00798         checkContextMatch(t1);
00799         checkContextMatch(t2);
00800         return new IntExpr(this, Native.mkMod(nCtx(), t1.getNativeObject(),
00801                 t2.getNativeObject()));
00802     }
00803 
00809     public IntExpr mkRem(IntExpr t1, IntExpr t2)
00810     {
00811         checkContextMatch(t1);
00812         checkContextMatch(t2);
00813         return new IntExpr(this, Native.mkRem(nCtx(), t1.getNativeObject(),
00814                 t2.getNativeObject()));
00815     }
00816 
00820     public ArithExpr mkPower(ArithExpr t1, ArithExpr t2)
00821     {
00822         checkContextMatch(t1);
00823         checkContextMatch(t2);
00824         return (ArithExpr) Expr.create(
00825                 this,
00826                 Native.mkPower(nCtx(), t1.getNativeObject(),
00827                         t2.getNativeObject()));
00828     }
00829 
00833     public BoolExpr mkLt(ArithExpr t1, ArithExpr t2)
00834     {
00835         checkContextMatch(t1);
00836         checkContextMatch(t2);
00837         return new BoolExpr(this, Native.mkLt(nCtx(), t1.getNativeObject(),
00838                 t2.getNativeObject()));
00839     }
00840 
00844     public BoolExpr mkLe(ArithExpr t1, ArithExpr t2)
00845     {
00846         checkContextMatch(t1);
00847         checkContextMatch(t2);
00848         return new BoolExpr(this, Native.mkLe(nCtx(), t1.getNativeObject(),
00849                 t2.getNativeObject()));
00850     }
00851 
00855     public BoolExpr mkGt(ArithExpr t1, ArithExpr t2)
00856     {
00857         checkContextMatch(t1);
00858         checkContextMatch(t2);
00859         return new BoolExpr(this, Native.mkGt(nCtx(), t1.getNativeObject(),
00860                 t2.getNativeObject()));
00861     }
00862 
00866     public BoolExpr mkGe(ArithExpr t1, ArithExpr t2)
00867     {
00868         checkContextMatch(t1);
00869         checkContextMatch(t2);
00870         return new BoolExpr(this, Native.mkGe(nCtx(), t1.getNativeObject(),
00871                 t2.getNativeObject()));
00872     }
00873 
00884     public RealExpr mkInt2Real(IntExpr t)
00885     {
00886         checkContextMatch(t);
00887         return new RealExpr(this,
00888                 Native.mkInt2real(nCtx(), t.getNativeObject()));
00889     }
00890 
00897     public IntExpr mkReal2Int(RealExpr t)
00898     {
00899         checkContextMatch(t);
00900         return new IntExpr(this, Native.mkReal2int(nCtx(), t.getNativeObject()));
00901     }
00902 
00906     public BoolExpr mkIsInteger(RealExpr t)
00907     {
00908         checkContextMatch(t);
00909         return new BoolExpr(this, Native.mkIsInt(nCtx(), t.getNativeObject()));
00910     }
00911 
00917     public BitVecExpr mkBVNot(BitVecExpr t)
00918     {
00919         checkContextMatch(t);
00920         return new BitVecExpr(this, Native.mkBvnot(nCtx(), t.getNativeObject()));
00921     }
00922 
00928     public BitVecExpr mkBVRedAND(BitVecExpr t)
00929     {
00930         checkContextMatch(t);
00931         return new BitVecExpr(this, Native.mkBvredand(nCtx(),
00932                 t.getNativeObject()));
00933     }
00934 
00940     public BitVecExpr mkBVRedOR(BitVecExpr t)
00941     {
00942         checkContextMatch(t);
00943         return new BitVecExpr(this, Native.mkBvredor(nCtx(),
00944                 t.getNativeObject()));
00945     }
00946 
00952     public BitVecExpr mkBVAND(BitVecExpr t1, BitVecExpr t2)
00953     {
00954         checkContextMatch(t1);
00955         checkContextMatch(t2);
00956         return new BitVecExpr(this, Native.mkBvand(nCtx(),
00957                 t1.getNativeObject(), t2.getNativeObject()));
00958     }
00959 
00965     public BitVecExpr mkBVOR(BitVecExpr t1, BitVecExpr t2)
00966     {
00967         checkContextMatch(t1);
00968         checkContextMatch(t2);
00969         return new BitVecExpr(this, Native.mkBvor(nCtx(), t1.getNativeObject(),
00970                 t2.getNativeObject()));
00971     }
00972 
00978     public BitVecExpr mkBVXOR(BitVecExpr t1, BitVecExpr t2)
00979     {
00980         checkContextMatch(t1);
00981         checkContextMatch(t2);
00982         return new BitVecExpr(this, Native.mkBvxor(nCtx(),
00983                 t1.getNativeObject(), t2.getNativeObject()));
00984     }
00985 
00991     public BitVecExpr mkBVNAND(BitVecExpr t1, BitVecExpr t2)
00992     {
00993         checkContextMatch(t1);
00994         checkContextMatch(t2);
00995         return new BitVecExpr(this, Native.mkBvnand(nCtx(),
00996                 t1.getNativeObject(), t2.getNativeObject()));
00997     }
00998 
01004     public BitVecExpr mkBVNOR(BitVecExpr t1, BitVecExpr t2)
01005     {
01006         checkContextMatch(t1);
01007         checkContextMatch(t2);
01008         return new BitVecExpr(this, Native.mkBvnor(nCtx(),
01009                 t1.getNativeObject(), t2.getNativeObject()));
01010     }
01011 
01017     public BitVecExpr mkBVXNOR(BitVecExpr t1, BitVecExpr t2)
01018     {
01019         checkContextMatch(t1);
01020         checkContextMatch(t2);
01021         return new BitVecExpr(this, Native.mkBvxnor(nCtx(),
01022                 t1.getNativeObject(), t2.getNativeObject()));
01023     }
01024 
01030     public BitVecExpr mkBVNeg(BitVecExpr t)
01031     {
01032         checkContextMatch(t);
01033         return new BitVecExpr(this, Native.mkBvneg(nCtx(), t.getNativeObject()));
01034     }
01035 
01041     public BitVecExpr mkBVAdd(BitVecExpr t1, BitVecExpr t2)
01042     {
01043         checkContextMatch(t1);
01044         checkContextMatch(t2);
01045         return new BitVecExpr(this, Native.mkBvadd(nCtx(),
01046                 t1.getNativeObject(), t2.getNativeObject()));
01047     }
01048 
01054     public BitVecExpr mkBVSub(BitVecExpr t1, BitVecExpr t2)
01055     {
01056         checkContextMatch(t1);
01057         checkContextMatch(t2);
01058         return new BitVecExpr(this, Native.mkBvsub(nCtx(),
01059                 t1.getNativeObject(), t2.getNativeObject()));
01060     }
01061 
01067     public BitVecExpr mkBVMul(BitVecExpr t1, BitVecExpr t2)
01068     {
01069         checkContextMatch(t1);
01070         checkContextMatch(t2);
01071         return new BitVecExpr(this, Native.mkBvmul(nCtx(),
01072                 t1.getNativeObject(), t2.getNativeObject()));
01073     }
01074 
01082     public BitVecExpr mkBVUDiv(BitVecExpr t1, BitVecExpr t2)
01083     {
01084         checkContextMatch(t1);
01085         checkContextMatch(t2);
01086         return new BitVecExpr(this, Native.mkBvudiv(nCtx(),
01087                 t1.getNativeObject(), t2.getNativeObject()));
01088     }
01089 
01103     public BitVecExpr mkBVSDiv(BitVecExpr t1, BitVecExpr t2)
01104     {
01105         checkContextMatch(t1);
01106         checkContextMatch(t2);
01107         return new BitVecExpr(this, Native.mkBvsdiv(nCtx(),
01108                 t1.getNativeObject(), t2.getNativeObject()));
01109     }
01110 
01118     public BitVecExpr mkBVURem(BitVecExpr t1, BitVecExpr t2)
01119     {
01120         checkContextMatch(t1);
01121         checkContextMatch(t2);
01122         return new BitVecExpr(this, Native.mkBvurem(nCtx(),
01123                 t1.getNativeObject(), t2.getNativeObject()));
01124     }
01125 
01136     public BitVecExpr mkBVSRem(BitVecExpr t1, BitVecExpr t2)
01137     {
01138         checkContextMatch(t1);
01139         checkContextMatch(t2);
01140         return new BitVecExpr(this, Native.mkBvsrem(nCtx(),
01141                 t1.getNativeObject(), t2.getNativeObject()));
01142     }
01143 
01150     public BitVecExpr mkBVSMod(BitVecExpr t1, BitVecExpr t2)
01151     {
01152         checkContextMatch(t1);
01153         checkContextMatch(t2);
01154         return new BitVecExpr(this, Native.mkBvsmod(nCtx(),
01155                 t1.getNativeObject(), t2.getNativeObject()));
01156     }
01157 
01163     public BoolExpr mkBVULT(BitVecExpr t1, BitVecExpr t2)
01164     {
01165         checkContextMatch(t1);
01166         checkContextMatch(t2);
01167         return new BoolExpr(this, Native.mkBvult(nCtx(), t1.getNativeObject(),
01168                 t2.getNativeObject()));
01169     }
01170 
01176     public BoolExpr mkBVSLT(BitVecExpr t1, BitVecExpr t2)
01177     {
01178         checkContextMatch(t1);
01179         checkContextMatch(t2);
01180         return new BoolExpr(this, Native.mkBvslt(nCtx(), t1.getNativeObject(),
01181                 t2.getNativeObject()));
01182     }
01183 
01189     public BoolExpr mkBVULE(BitVecExpr t1, BitVecExpr t2)
01190     {
01191         checkContextMatch(t1);
01192         checkContextMatch(t2);
01193         return new BoolExpr(this, Native.mkBvule(nCtx(), t1.getNativeObject(),
01194                 t2.getNativeObject()));
01195     }
01196 
01202     public BoolExpr mkBVSLE(BitVecExpr t1, BitVecExpr t2)
01203     {
01204         checkContextMatch(t1);
01205         checkContextMatch(t2);
01206         return new BoolExpr(this, Native.mkBvsle(nCtx(), t1.getNativeObject(),
01207                 t2.getNativeObject()));
01208     }
01209 
01215     public BoolExpr mkBVUGE(BitVecExpr t1, BitVecExpr t2)
01216     {
01217         checkContextMatch(t1);
01218         checkContextMatch(t2);
01219         return new BoolExpr(this, Native.mkBvuge(nCtx(), t1.getNativeObject(),
01220                 t2.getNativeObject()));
01221     }
01222 
01228     public BoolExpr mkBVSGE(BitVecExpr t1, BitVecExpr t2)
01229     {
01230         checkContextMatch(t1);
01231         checkContextMatch(t2);
01232         return new BoolExpr(this, Native.mkBvsge(nCtx(), t1.getNativeObject(),
01233                 t2.getNativeObject()));
01234     }
01235 
01241     public BoolExpr mkBVUGT(BitVecExpr t1, BitVecExpr t2)
01242     {
01243         checkContextMatch(t1);
01244         checkContextMatch(t2);
01245         return new BoolExpr(this, Native.mkBvugt(nCtx(), t1.getNativeObject(),
01246                 t2.getNativeObject()));
01247     }
01248 
01254     public BoolExpr mkBVSGT(BitVecExpr t1, BitVecExpr t2)
01255     {
01256         checkContextMatch(t1);
01257         checkContextMatch(t2);
01258         return new BoolExpr(this, Native.mkBvsgt(nCtx(), t1.getNativeObject(),
01259                 t2.getNativeObject()));
01260     }
01261 
01272     public BitVecExpr mkConcat(BitVecExpr t1, BitVecExpr t2)
01273     {
01274         checkContextMatch(t1);
01275         checkContextMatch(t2);
01276         return new BitVecExpr(this, Native.mkConcat(nCtx(),
01277                 t1.getNativeObject(), t2.getNativeObject()));
01278     }
01279 
01288     public BitVecExpr mkExtract(int high, int low, BitVecExpr t)
01289            
01290     {
01291         checkContextMatch(t);
01292         return new BitVecExpr(this, Native.mkExtract(nCtx(), high, low,
01293                 t.getNativeObject()));
01294     }
01295 
01303     public BitVecExpr mkSignExt(int i, BitVecExpr t)
01304     {
01305         checkContextMatch(t);
01306         return new BitVecExpr(this, Native.mkSignExt(nCtx(), i,
01307                 t.getNativeObject()));
01308     }
01309 
01317     public BitVecExpr mkZeroExt(int i, BitVecExpr t)
01318     {
01319         checkContextMatch(t);
01320         return new BitVecExpr(this, Native.mkZeroExt(nCtx(), i,
01321                 t.getNativeObject()));
01322     }
01323 
01329     public BitVecExpr mkRepeat(int i, BitVecExpr t)
01330     {
01331         checkContextMatch(t);
01332         return new BitVecExpr(this, Native.mkRepeat(nCtx(), i,
01333                 t.getNativeObject()));
01334     }
01335 
01347     public BitVecExpr mkBVSHL(BitVecExpr t1, BitVecExpr t2)
01348     {
01349         checkContextMatch(t1);
01350         checkContextMatch(t2);
01351         return new BitVecExpr(this, Native.mkBvshl(nCtx(),
01352                 t1.getNativeObject(), t2.getNativeObject()));
01353     }
01354 
01366     public BitVecExpr mkBVLSHR(BitVecExpr t1, BitVecExpr t2)
01367     {
01368         checkContextMatch(t1);
01369         checkContextMatch(t2);
01370         return new BitVecExpr(this, Native.mkBvlshr(nCtx(),
01371                 t1.getNativeObject(), t2.getNativeObject()));
01372     }
01373 
01386     public BitVecExpr mkBVASHR(BitVecExpr t1, BitVecExpr t2)
01387     {
01388         checkContextMatch(t1);
01389         checkContextMatch(t2);
01390         return new BitVecExpr(this, Native.mkBvashr(nCtx(),
01391                 t1.getNativeObject(), t2.getNativeObject()));
01392     }
01393 
01399     public BitVecExpr mkBVRotateLeft(int i, BitVecExpr t)
01400     {
01401         checkContextMatch(t);
01402         return new BitVecExpr(this, Native.mkRotateLeft(nCtx(), i,
01403                 t.getNativeObject()));
01404     }
01405 
01411     public BitVecExpr mkBVRotateRight(int i, BitVecExpr t)
01412     {
01413         checkContextMatch(t);
01414         return new BitVecExpr(this, Native.mkRotateRight(nCtx(), i,
01415                 t.getNativeObject()));
01416     }
01417 
01424     public BitVecExpr mkBVRotateLeft(BitVecExpr t1, BitVecExpr t2)
01425            
01426     {
01427         checkContextMatch(t1);
01428         checkContextMatch(t2);
01429         return new BitVecExpr(this, Native.mkExtRotateLeft(nCtx(),
01430                 t1.getNativeObject(), t2.getNativeObject()));
01431     }
01432 
01439     public BitVecExpr mkBVRotateRight(BitVecExpr t1, BitVecExpr t2)
01440            
01441     {
01442         checkContextMatch(t1);
01443         checkContextMatch(t2);
01444         return new BitVecExpr(this, Native.mkExtRotateRight(nCtx(),
01445                 t1.getNativeObject(), t2.getNativeObject()));
01446     }
01447 
01457     public BitVecExpr mkInt2BV(int n, IntExpr t)
01458     {
01459         checkContextMatch(t);
01460         return new BitVecExpr(this, Native.mkInt2bv(nCtx(), n,
01461                 t.getNativeObject()));
01462     }
01463 
01478     public IntExpr mkBV2Int(BitVecExpr t, boolean signed)
01479     {
01480         checkContextMatch(t);
01481         return new IntExpr(this, Native.mkBv2int(nCtx(), t.getNativeObject(),
01482                 (signed) ? true : false));
01483     }
01484 
01490     public BoolExpr mkBVAddNoOverflow(BitVecExpr t1, BitVecExpr t2,
01491             boolean isSigned)
01492     {
01493         checkContextMatch(t1);
01494         checkContextMatch(t2);
01495         return new BoolExpr(this, Native.mkBvaddNoOverflow(nCtx(), t1
01496                 .getNativeObject(), t2.getNativeObject(), (isSigned) ? true
01497                 : false));
01498     }
01499 
01505     public BoolExpr mkBVAddNoUnderflow(BitVecExpr t1, BitVecExpr t2)
01506            
01507     {
01508         checkContextMatch(t1);
01509         checkContextMatch(t2);
01510         return new BoolExpr(this, Native.mkBvaddNoUnderflow(nCtx(),
01511                 t1.getNativeObject(), t2.getNativeObject()));
01512     }
01513 
01519     public BoolExpr mkBVSubNoOverflow(BitVecExpr t1, BitVecExpr t2)
01520            
01521     {
01522         checkContextMatch(t1);
01523         checkContextMatch(t2);
01524         return new BoolExpr(this, Native.mkBvsubNoOverflow(nCtx(),
01525                 t1.getNativeObject(), t2.getNativeObject()));
01526     }
01527 
01533     public BoolExpr mkBVSubNoUnderflow(BitVecExpr t1, BitVecExpr t2,
01534             boolean isSigned)
01535     {
01536         checkContextMatch(t1);
01537         checkContextMatch(t2);
01538         return new BoolExpr(this, Native.mkBvsubNoUnderflow(nCtx(), t1
01539                 .getNativeObject(), t2.getNativeObject(), (isSigned) ? true
01540                 : false));
01541     }
01542 
01548     public BoolExpr mkBVSDivNoOverflow(BitVecExpr t1, BitVecExpr t2)
01549            
01550     {
01551         checkContextMatch(t1);
01552         checkContextMatch(t2);
01553         return new BoolExpr(this, Native.mkBvsdivNoOverflow(nCtx(),
01554                 t1.getNativeObject(), t2.getNativeObject()));
01555     }
01556 
01562     public BoolExpr mkBVNegNoOverflow(BitVecExpr t)
01563     {
01564         checkContextMatch(t);
01565         return new BoolExpr(this, Native.mkBvnegNoOverflow(nCtx(),
01566                 t.getNativeObject()));
01567     }
01568 
01574     public BoolExpr mkBVMulNoOverflow(BitVecExpr t1, BitVecExpr t2,
01575             boolean isSigned)
01576     {
01577         checkContextMatch(t1);
01578         checkContextMatch(t2);
01579         return new BoolExpr(this, Native.mkBvmulNoOverflow(nCtx(), t1
01580                 .getNativeObject(), t2.getNativeObject(), (isSigned) ? true
01581                 : false));
01582     }
01583 
01589     public BoolExpr mkBVMulNoUnderflow(BitVecExpr t1, BitVecExpr t2)
01590            
01591     {
01592         checkContextMatch(t1);
01593         checkContextMatch(t2);
01594         return new BoolExpr(this, Native.mkBvmulNoUnderflow(nCtx(),
01595                 t1.getNativeObject(), t2.getNativeObject()));
01596     }
01597 
01601     public ArrayExpr mkArrayConst(Symbol name, Sort domain, Sort range)
01602            
01603     {
01604         return (ArrayExpr) mkConst(name, mkArraySort(domain, range));
01605     }
01606 
01610     public ArrayExpr mkArrayConst(String name, Sort domain, Sort range)
01611            
01612     {
01613         return (ArrayExpr) mkConst(mkSymbol(name), mkArraySort(domain, range));
01614     }
01615 
01629     public Expr mkSelect(ArrayExpr a, Expr i)
01630     {
01631         checkContextMatch(a);
01632         checkContextMatch(i);
01633         return Expr.create(
01634                 this,
01635                 Native.mkSelect(nCtx(), a.getNativeObject(),
01636                         i.getNativeObject()));
01637     }
01638 
01655     public ArrayExpr mkStore(ArrayExpr a, Expr i, Expr v)
01656     {
01657         checkContextMatch(a);
01658         checkContextMatch(i);
01659         checkContextMatch(v);
01660         return new ArrayExpr(this, Native.mkStore(nCtx(), a.getNativeObject(),
01661                 i.getNativeObject(), v.getNativeObject()));
01662     }
01663 
01673     public ArrayExpr mkConstArray(Sort domain, Expr v)
01674     {
01675         checkContextMatch(domain);
01676         checkContextMatch(v);
01677         return new ArrayExpr(this, Native.mkConstArray(nCtx(),
01678                 domain.getNativeObject(), v.getNativeObject()));
01679     }
01680 
01694     public ArrayExpr mkMap(FuncDecl f, ArrayExpr... args)
01695     {
01696         checkContextMatch(f);
01697         checkContextMatch(args);
01698         return (ArrayExpr) Expr.create(this, Native.mkMap(nCtx(),
01699                 f.getNativeObject(), AST.arrayLength(args),
01700                 AST.arrayToNative(args)));
01701     }
01702 
01709     public Expr mkTermArray(ArrayExpr array)
01710     {
01711         checkContextMatch(array);
01712         return Expr.create(this,
01713                 Native.mkArrayDefault(nCtx(), array.getNativeObject()));
01714     }
01715 
01719     public SetSort mkSetSort(Sort ty)
01720     {
01721         checkContextMatch(ty);
01722         return new SetSort(this, ty);
01723     }
01724 
01728     public ArrayExpr mkEmptySet(Sort domain)
01729     {
01730         checkContextMatch(domain);
01731         return (ArrayExpr)Expr.create(this,
01732                 Native.mkEmptySet(nCtx(), domain.getNativeObject()));
01733     }
01734 
01738     public ArrayExpr mkFullSet(Sort domain)
01739     {
01740         checkContextMatch(domain);
01741         return (ArrayExpr)Expr.create(this,
01742                 Native.mkFullSet(nCtx(), domain.getNativeObject()));
01743     }
01744 
01748     public ArrayExpr mkSetAdd(ArrayExpr set, Expr element)
01749     {
01750         checkContextMatch(set);
01751         checkContextMatch(element);
01752         return (ArrayExpr)Expr.create(this,
01753                 Native.mkSetAdd(nCtx(), set.getNativeObject(),
01754                         element.getNativeObject()));
01755     }
01756 
01760     public ArrayExpr mkSetDel(ArrayExpr set, Expr element)
01761     {
01762         checkContextMatch(set);
01763         checkContextMatch(element);
01764         return (ArrayExpr)Expr.create(this,
01765                 Native.mkSetDel(nCtx(), set.getNativeObject(),
01766                         element.getNativeObject()));
01767     }
01768 
01772     public ArrayExpr mkSetUnion(ArrayExpr... args)
01773     {
01774         checkContextMatch(args);
01775         return (ArrayExpr)Expr.create(this,
01776                 Native.mkSetUnion(nCtx(), (int) args.length,
01777                         AST.arrayToNative(args)));
01778     }
01779 
01783     public ArrayExpr mkSetIntersection(ArrayExpr... args)
01784     {
01785         checkContextMatch(args);
01786         return (ArrayExpr)Expr.create(this,
01787                 Native.mkSetIntersect(nCtx(), (int) args.length,
01788                         AST.arrayToNative(args)));
01789     }
01790 
01794     public ArrayExpr mkSetDifference(ArrayExpr arg1, ArrayExpr arg2)
01795     {
01796         checkContextMatch(arg1);
01797         checkContextMatch(arg2);
01798         return (ArrayExpr)Expr.create(this,
01799                 Native.mkSetDifference(nCtx(), arg1.getNativeObject(),
01800                         arg2.getNativeObject()));
01801     }
01802 
01806     public ArrayExpr mkSetComplement(ArrayExpr arg)
01807     {
01808         checkContextMatch(arg);
01809         return (ArrayExpr)Expr.create(this,
01810                 Native.mkSetComplement(nCtx(), arg.getNativeObject()));
01811     }
01812 
01816     public BoolExpr mkSetMembership(Expr elem, ArrayExpr set)
01817     {
01818         checkContextMatch(elem);
01819         checkContextMatch(set);
01820         return (BoolExpr) Expr.create(this,
01821                 Native.mkSetMember(nCtx(), elem.getNativeObject(),
01822                         set.getNativeObject()));
01823     }
01824 
01828     public BoolExpr mkSetSubset(ArrayExpr arg1, ArrayExpr arg2)
01829     {
01830         checkContextMatch(arg1);
01831         checkContextMatch(arg2);
01832         return (BoolExpr) Expr.create(this,
01833                 Native.mkSetSubset(nCtx(), arg1.getNativeObject(),
01834                         arg2.getNativeObject()));
01835     }
01836 
01848     public Expr mkNumeral(String v, Sort ty)
01849     {
01850         checkContextMatch(ty);
01851         return Expr.create(this,
01852                 Native.mkNumeral(nCtx(), v, ty.getNativeObject()));
01853     }
01854 
01865     public Expr mkNumeral(int v, Sort ty)
01866     {
01867         checkContextMatch(ty);
01868         return Expr.create(this, Native.mkInt(nCtx(), v, ty.getNativeObject()));
01869     }
01870 
01881     public Expr mkNumeral(long v, Sort ty)
01882     {
01883         checkContextMatch(ty);
01884         return Expr.create(this,
01885                 Native.mkInt64(nCtx(), v, ty.getNativeObject()));
01886     }
01887 
01897     public RatNum mkReal(int num, int den)
01898     {
01899         if (den == 0)
01900             throw new Z3Exception("Denominator is zero");
01901 
01902         return new RatNum(this, Native.mkReal(nCtx(), num, den));
01903     }
01904 
01911     public RatNum mkReal(String v)
01912     {
01913 
01914         return new RatNum(this, Native.mkNumeral(nCtx(), v, getRealSort()
01915                 .getNativeObject()));
01916     }
01917 
01924     public RatNum mkReal(int v)
01925     {
01926 
01927         return new RatNum(this, Native.mkInt(nCtx(), v, getRealSort()
01928                 .getNativeObject()));
01929     }
01930 
01937     public RatNum mkReal(long v)
01938     {
01939 
01940         return new RatNum(this, Native.mkInt64(nCtx(), v, getRealSort()
01941                 .getNativeObject()));
01942     }
01943 
01948     public IntNum mkInt(String v)
01949     {
01950 
01951         return new IntNum(this, Native.mkNumeral(nCtx(), v, getIntSort()
01952                 .getNativeObject()));
01953     }
01954 
01961     public IntNum mkInt(int v)
01962     {
01963 
01964         return new IntNum(this, Native.mkInt(nCtx(), v, getIntSort()
01965                 .getNativeObject()));
01966     }
01967 
01974     public IntNum mkInt(long v)
01975     {
01976 
01977         return new IntNum(this, Native.mkInt64(nCtx(), v, getIntSort()
01978                 .getNativeObject()));
01979     }
01980 
01986     public BitVecNum mkBV(String v, int size)
01987     {
01988         return (BitVecNum) mkNumeral(v, mkBitVecSort(size));
01989     }
01990 
01996     public BitVecNum mkBV(int v, int size)
01997     {
01998         return (BitVecNum) mkNumeral(v, mkBitVecSort(size));
01999     }
02000 
02006     public BitVecNum mkBV(long v, int size)
02007     {
02008         return (BitVecNum) mkNumeral(v, mkBitVecSort(size));
02009     }
02010 
02030     public Quantifier mkForall(Sort[] sorts, Symbol[] names, Expr body,
02031             int weight, Pattern[] patterns, Expr[] noPatterns,
02032             Symbol quantifierID, Symbol skolemID)
02033     {
02034 
02035         return new Quantifier(this, true, sorts, names, body, weight, patterns,
02036                 noPatterns, quantifierID, skolemID);
02037     }
02038 
02042     public Quantifier mkForall(Expr[] boundConstants, Expr body, int weight,
02043             Pattern[] patterns, Expr[] noPatterns, Symbol quantifierID,
02044             Symbol skolemID)
02045     {
02046 
02047         return new Quantifier(this, true, boundConstants, body, weight,
02048                 patterns, noPatterns, quantifierID, skolemID);
02049     }
02050 
02055     public Quantifier mkExists(Sort[] sorts, Symbol[] names, Expr body,
02056             int weight, Pattern[] patterns, Expr[] noPatterns,
02057             Symbol quantifierID, Symbol skolemID)
02058     {
02059 
02060         return new Quantifier(this, false, sorts, names, body, weight,
02061                 patterns, noPatterns, quantifierID, skolemID);
02062     }
02063 
02067     public Quantifier mkExists(Expr[] boundConstants, Expr body, int weight,
02068             Pattern[] patterns, Expr[] noPatterns, Symbol quantifierID,
02069             Symbol skolemID)
02070     {
02071 
02072         return new Quantifier(this, false, boundConstants, body, weight,
02073                 patterns, noPatterns, quantifierID, skolemID);
02074     }
02075 
02079     public Quantifier mkQuantifier(boolean universal, Sort[] sorts,
02080             Symbol[] names, Expr body, int weight, Pattern[] patterns,
02081             Expr[] noPatterns, Symbol quantifierID, Symbol skolemID)
02082            
02083     {
02084 
02085         if (universal)
02086             return mkForall(sorts, names, body, weight, patterns, noPatterns,
02087                     quantifierID, skolemID);
02088         else
02089             return mkExists(sorts, names, body, weight, patterns, noPatterns,
02090                     quantifierID, skolemID);
02091     }
02092 
02096     public Quantifier mkQuantifier(boolean universal, Expr[] boundConstants,
02097             Expr body, int weight, Pattern[] patterns, Expr[] noPatterns,
02098             Symbol quantifierID, Symbol skolemID)
02099     {
02100 
02101         if (universal)
02102             return mkForall(boundConstants, body, weight, patterns, noPatterns,
02103                     quantifierID, skolemID);
02104         else
02105             return mkExists(boundConstants, body, weight, patterns, noPatterns,
02106                     quantifierID, skolemID);
02107     }
02108 
02123     public void setPrintMode(Z3_ast_print_mode value)
02124     {
02125         Native.setAstPrintMode(nCtx(), value.toInt());
02126     }
02127 
02141     public String benchmarkToSMTString(String name, String logic,
02142             String status, String attributes, BoolExpr[] assumptions,
02143             BoolExpr formula)
02144     {
02145 
02146         return Native.benchmarkToSmtlibString(nCtx(), name, logic, status,
02147                 attributes, (int) assumptions.length,
02148                 AST.arrayToNative(assumptions), formula.getNativeObject());
02149     }
02150 
02160     public void parseSMTLIBString(String str, Symbol[] sortNames, Sort[] sorts,
02161             Symbol[] declNames, FuncDecl[] decls)
02162     {
02163         int csn = Symbol.arrayLength(sortNames);
02164         int cs = Sort.arrayLength(sorts);
02165         int cdn = Symbol.arrayLength(declNames);
02166         int cd = AST.arrayLength(decls);
02167         if (csn != cs || cdn != cd)
02168             throw new Z3Exception("Argument size mismatch");
02169         Native.parseSmtlibString(nCtx(), str, AST.arrayLength(sorts),
02170                 Symbol.arrayToNative(sortNames), AST.arrayToNative(sorts),
02171                 AST.arrayLength(decls), Symbol.arrayToNative(declNames),
02172                 AST.arrayToNative(decls));
02173     }
02174 
02179     public void parseSMTLIBFile(String fileName, Symbol[] sortNames,
02180             Sort[] sorts, Symbol[] declNames, FuncDecl[] decls)
02181            
02182     {
02183         int csn = Symbol.arrayLength(sortNames);
02184         int cs = Sort.arrayLength(sorts);
02185         int cdn = Symbol.arrayLength(declNames);
02186         int cd = AST.arrayLength(decls);
02187         if (csn != cs || cdn != cd)
02188             throw new Z3Exception("Argument size mismatch");
02189         Native.parseSmtlibFile(nCtx(), fileName, AST.arrayLength(sorts),
02190                 Symbol.arrayToNative(sortNames), AST.arrayToNative(sorts),
02191                 AST.arrayLength(decls), Symbol.arrayToNative(declNames),
02192                 AST.arrayToNative(decls));
02193     }
02194 
02199     public int getNumSMTLIBFormulas()
02200     {
02201         return Native.getSmtlibNumFormulas(nCtx());
02202     }
02203 
02208     public BoolExpr[] getSMTLIBFormulas()
02209     {
02210 
02211         int n = getNumSMTLIBFormulas();
02212         BoolExpr[] res = new BoolExpr[n];
02213         for (int i = 0; i < n; i++)
02214             res[i] = (BoolExpr) Expr.create(this,
02215                     Native.getSmtlibFormula(nCtx(), i));
02216         return res;
02217     }
02218 
02223     public int getNumSMTLIBAssumptions()
02224     {
02225         return Native.getSmtlibNumAssumptions(nCtx());
02226     }
02227 
02232     public BoolExpr[] getSMTLIBAssumptions()
02233     {
02234 
02235         int n = getNumSMTLIBAssumptions();
02236         BoolExpr[] res = new BoolExpr[n];
02237         for (int i = 0; i < n; i++)
02238             res[i] = (BoolExpr) Expr.create(this,
02239                     Native.getSmtlibAssumption(nCtx(), i));
02240         return res;
02241     }
02242 
02247     public int getNumSMTLIBDecls()
02248     {
02249         return Native.getSmtlibNumDecls(nCtx());
02250     }
02251 
02256     public FuncDecl[] getSMTLIBDecls()
02257     {
02258 
02259         int n = getNumSMTLIBDecls();
02260         FuncDecl[] res = new FuncDecl[n];
02261         for (int i = 0; i < n; i++)
02262             res[i] = new FuncDecl(this, Native.getSmtlibDecl(nCtx(), i));
02263         return res;
02264     }
02265 
02270     public int getNumSMTLIBSorts()
02271     {
02272         return Native.getSmtlibNumSorts(nCtx());
02273     }
02274 
02279     public Sort[] getSMTLIBSorts()
02280     {
02281 
02282         int n = getNumSMTLIBSorts();
02283         Sort[] res = new Sort[n];
02284         for (int i = 0; i < n; i++)
02285             res[i] = Sort.create(this, Native.getSmtlibSort(nCtx(), i));
02286         return res;
02287     }
02288 
02296     public BoolExpr parseSMTLIB2String(String str, Symbol[] sortNames,
02297             Sort[] sorts, Symbol[] declNames, FuncDecl[] decls)
02298            
02299     {
02300 
02301         int csn = Symbol.arrayLength(sortNames);
02302         int cs = Sort.arrayLength(sorts);
02303         int cdn = Symbol.arrayLength(declNames);
02304         int cd = AST.arrayLength(decls);
02305         if (csn != cs || cdn != cd)
02306             throw new Z3Exception("Argument size mismatch");
02307         return (BoolExpr) Expr.create(this, Native.parseSmtlib2String(nCtx(),
02308                 str, AST.arrayLength(sorts), Symbol.arrayToNative(sortNames),
02309                 AST.arrayToNative(sorts), AST.arrayLength(decls),
02310                 Symbol.arrayToNative(declNames), AST.arrayToNative(decls)));
02311     }
02312 
02317     public BoolExpr parseSMTLIB2File(String fileName, Symbol[] sortNames,
02318             Sort[] sorts, Symbol[] declNames, FuncDecl[] decls)
02319            
02320     {
02321 
02322         int csn = Symbol.arrayLength(sortNames);
02323         int cs = Sort.arrayLength(sorts);
02324         int cdn = Symbol.arrayLength(declNames);
02325         int cd = AST.arrayLength(decls);
02326         if (csn != cs || cdn != cd)
02327             throw new Z3Exception("Argument size mismatch");
02328         return (BoolExpr) Expr.create(this, Native.parseSmtlib2File(nCtx(),
02329                 fileName, AST.arrayLength(sorts),
02330                 Symbol.arrayToNative(sortNames), AST.arrayToNative(sorts),
02331                 AST.arrayLength(decls), Symbol.arrayToNative(declNames),
02332                 AST.arrayToNative(decls)));
02333     }
02334 
02345     public Goal mkGoal(boolean models, boolean unsatCores, boolean proofs)
02346            
02347     {
02348         return new Goal(this, models, unsatCores, proofs);
02349     }
02350 
02354     public Params mkParams()
02355     {
02356         return new Params(this);
02357     }
02358 
02362     public int getNumTactics()
02363     {
02364         return Native.getNumTactics(nCtx());
02365     }
02366 
02370     public String[] getTacticNames()
02371     {
02372 
02373         int n = getNumTactics();
02374         String[] res = new String[n];
02375         for (int i = 0; i < n; i++)
02376             res[i] = Native.getTacticName(nCtx(), i);
02377         return res;
02378     }
02379 
02384     public String getTacticDescription(String name)
02385     {
02386         return Native.tacticGetDescr(nCtx(), name);
02387     }
02388 
02392     public Tactic mkTactic(String name)
02393     {
02394         return new Tactic(this, name);
02395     }
02396 
02401     public Tactic andThen(Tactic t1, Tactic t2, Tactic... ts)
02402            
02403     {
02404         checkContextMatch(t1);
02405         checkContextMatch(t2);
02406         checkContextMatch(ts);
02407 
02408         long last = 0;
02409         if (ts != null && ts.length > 0)
02410         {
02411             last = ts[ts.length - 1].getNativeObject();
02412             for (int i = ts.length - 2; i >= 0; i--)
02413                 last = Native.tacticAndThen(nCtx(), ts[i].getNativeObject(),
02414                         last);
02415         }
02416         if (last != 0)
02417         {
02418             last = Native.tacticAndThen(nCtx(), t2.getNativeObject(), last);
02419             return new Tactic(this, Native.tacticAndThen(nCtx(),
02420                     t1.getNativeObject(), last));
02421         } else
02422             return new Tactic(this, Native.tacticAndThen(nCtx(),
02423                     t1.getNativeObject(), t2.getNativeObject()));
02424     }
02425 
02432     public Tactic then(Tactic t1, Tactic t2, Tactic... ts)
02433     {
02434         return andThen(t1, t2, ts);
02435     }
02436 
02442     public Tactic orElse(Tactic t1, Tactic t2)
02443     {
02444         checkContextMatch(t1);
02445         checkContextMatch(t2);
02446         return new Tactic(this, Native.tacticOrElse(nCtx(),
02447                 t1.getNativeObject(), t2.getNativeObject()));
02448     }
02449 
02456     public Tactic tryFor(Tactic t, int ms)
02457     {
02458         checkContextMatch(t);
02459         return new Tactic(this, Native.tacticTryFor(nCtx(),
02460                 t.getNativeObject(), ms));
02461     }
02462 
02469     public Tactic when(Probe p, Tactic t)
02470     {
02471         checkContextMatch(t);
02472         checkContextMatch(p);
02473         return new Tactic(this, Native.tacticWhen(nCtx(), p.getNativeObject(),
02474                 t.getNativeObject()));
02475     }
02476 
02482     public Tactic cond(Probe p, Tactic t1, Tactic t2)
02483     {
02484         checkContextMatch(p);
02485         checkContextMatch(t1);
02486         checkContextMatch(t2);
02487         return new Tactic(this, Native.tacticCond(nCtx(), p.getNativeObject(),
02488                 t1.getNativeObject(), t2.getNativeObject()));
02489     }
02490 
02495     public Tactic repeat(Tactic t, int max)
02496     {
02497         checkContextMatch(t);
02498         return new Tactic(this, Native.tacticRepeat(nCtx(),
02499                 t.getNativeObject(), max));
02500     }
02501 
02505     public Tactic skip()
02506     {
02507         return new Tactic(this, Native.tacticSkip(nCtx()));
02508     }
02509 
02513     public Tactic fail()
02514     {
02515         return new Tactic(this, Native.tacticFail(nCtx()));
02516     }
02517 
02522     public Tactic failIf(Probe p)
02523     {
02524         checkContextMatch(p);
02525         return new Tactic(this,
02526                 Native.tacticFailIf(nCtx(), p.getNativeObject()));
02527     }
02528 
02533     public Tactic failIfNotDecided()
02534     {
02535         return new Tactic(this, Native.tacticFailIfNotDecided(nCtx()));
02536     }
02537 
02542     public Tactic usingParams(Tactic t, Params p)
02543     {
02544         checkContextMatch(t);
02545         checkContextMatch(p);
02546         return new Tactic(this, Native.tacticUsingParams(nCtx(),
02547                 t.getNativeObject(), p.getNativeObject()));
02548     }
02549 
02556     public Tactic with(Tactic t, Params p)
02557     {
02558         return usingParams(t, p);
02559     }
02560 
02564     public Tactic parOr(Tactic... t)
02565     {
02566         checkContextMatch(t);
02567         return new Tactic(this, Native.tacticParOr(nCtx(),
02568                 Tactic.arrayLength(t), Tactic.arrayToNative(t)));
02569     }
02570 
02575     public Tactic parAndThen(Tactic t1, Tactic t2)
02576     {
02577         checkContextMatch(t1);
02578         checkContextMatch(t2);
02579         return new Tactic(this, Native.tacticParAndThen(nCtx(),
02580                 t1.getNativeObject(), t2.getNativeObject()));
02581     }
02582 
02588     public void interrupt()
02589     {
02590         Native.interrupt(nCtx());
02591     }
02592 
02596     public int getNumProbes()
02597     {
02598         return Native.getNumProbes(nCtx());
02599     }
02600 
02604     public String[] getProbeNames()
02605     {
02606 
02607         int n = getNumProbes();
02608         String[] res = new String[n];
02609         for (int i = 0; i < n; i++)
02610             res[i] = Native.getProbeName(nCtx(), i);
02611         return res;
02612     }
02613 
02618     public String getProbeDescription(String name)
02619     {
02620         return Native.probeGetDescr(nCtx(), name);
02621     }
02622 
02626     public Probe mkProbe(String name)
02627     {
02628         return new Probe(this, name);
02629     }
02630 
02634     public Probe constProbe(double val)
02635     {
02636         return new Probe(this, Native.probeConst(nCtx(), val));
02637     }
02638 
02643     public Probe lt(Probe p1, Probe p2)
02644     {
02645         checkContextMatch(p1);
02646         checkContextMatch(p2);
02647         return new Probe(this, Native.probeLt(nCtx(), p1.getNativeObject(),
02648                 p2.getNativeObject()));
02649     }
02650 
02655     public Probe gt(Probe p1, Probe p2)
02656     {
02657         checkContextMatch(p1);
02658         checkContextMatch(p2);
02659         return new Probe(this, Native.probeGt(nCtx(), p1.getNativeObject(),
02660                 p2.getNativeObject()));
02661     }
02662 
02668     public Probe le(Probe p1, Probe p2)
02669     {
02670         checkContextMatch(p1);
02671         checkContextMatch(p2);
02672         return new Probe(this, Native.probeLe(nCtx(), p1.getNativeObject(),
02673                 p2.getNativeObject()));
02674     }
02675 
02681     public Probe ge(Probe p1, Probe p2)
02682     {
02683         checkContextMatch(p1);
02684         checkContextMatch(p2);
02685         return new Probe(this, Native.probeGe(nCtx(), p1.getNativeObject(),
02686                 p2.getNativeObject()));
02687     }
02688 
02693     public Probe eq(Probe p1, Probe p2)
02694     {
02695         checkContextMatch(p1);
02696         checkContextMatch(p2);
02697         return new Probe(this, Native.probeEq(nCtx(), p1.getNativeObject(),
02698                 p2.getNativeObject()));
02699     }
02700 
02704     public Probe and(Probe p1, Probe p2)
02705     {
02706         checkContextMatch(p1);
02707         checkContextMatch(p2);
02708         return new Probe(this, Native.probeAnd(nCtx(), p1.getNativeObject(),
02709                 p2.getNativeObject()));
02710     }
02711 
02715     public Probe or(Probe p1, Probe p2)
02716     {
02717         checkContextMatch(p1);
02718         checkContextMatch(p2);
02719         return new Probe(this, Native.probeOr(nCtx(), p1.getNativeObject(),
02720                 p2.getNativeObject()));
02721     }
02722 
02726     public Probe not(Probe p)
02727     {
02728         checkContextMatch(p);
02729         return new Probe(this, Native.probeNot(nCtx(), p.getNativeObject()));
02730     }
02731 
02739     public Solver mkSolver()
02740     {
02741         return mkSolver((Symbol) null);
02742     }
02743 
02751     public Solver mkSolver(Symbol logic)
02752     {
02753 
02754         if (logic == null)
02755             return new Solver(this, Native.mkSolver(nCtx()));
02756         else
02757             return new Solver(this, Native.mkSolverForLogic(nCtx(),
02758                     logic.getNativeObject()));
02759     }
02760 
02765     public Solver mkSolver(String logic)
02766     {
02767         return mkSolver(mkSymbol(logic));
02768     }
02769 
02773     public Solver mkSimpleSolver()
02774     {
02775         return new Solver(this, Native.mkSimpleSolver(nCtx()));
02776     }
02777 
02784     public Solver mkSolver(Tactic t)
02785     {
02786 
02787         return new Solver(this, Native.mkSolverFromTactic(nCtx(),
02788                 t.getNativeObject()));
02789     }
02790 
02794     public Fixedpoint mkFixedpoint()
02795     {
02796         return new Fixedpoint(this);
02797     }
02798 
02802     public Optimize mkOptimize()
02803     {
02804         return new Optimize(this);
02805     }
02806 
02807     
02812     public FPRMSort mkFPRoundingModeSort()
02813     {
02814         return new FPRMSort(this);
02815     }
02816 
02821     public FPRMExpr mkFPRoundNearestTiesToEven()
02822     {
02823         return new FPRMExpr(this, Native.mkFpaRoundNearestTiesToEven(nCtx()));
02824     }
02825 
02830     public FPRMNum mkFPRNE()
02831     {
02832         return new FPRMNum(this, Native.mkFpaRne(nCtx()));
02833     }
02834 
02839     public FPRMNum mkFPRoundNearestTiesToAway()
02840     {
02841         return new FPRMNum(this, Native.mkFpaRoundNearestTiesToAway(nCtx()));
02842     }
02843 
02848     public FPRMNum mkFPRNA()
02849     {
02850         return new FPRMNum(this, Native.mkFpaRna(nCtx()));
02851     }
02852 
02857     public FPRMNum mkFPRoundTowardPositive()
02858     {
02859         return new FPRMNum(this, Native.mkFpaRoundTowardPositive(nCtx()));
02860     }
02861 
02866     public FPRMNum mkFPRTP()
02867     {
02868         return new FPRMNum(this, Native.mkFpaRtp(nCtx()));
02869     }
02870 
02875     public FPRMNum mkFPRoundTowardNegative()
02876     {
02877         return new FPRMNum(this, Native.mkFpaRoundTowardNegative(nCtx()));
02878     }
02879 
02884     public FPRMNum mkFPRTN()
02885     {
02886         return new FPRMNum(this, Native.mkFpaRtn(nCtx()));
02887     }
02888 
02893     public FPRMNum mkFPRoundTowardZero()
02894     {
02895         return new FPRMNum(this, Native.mkFpaRoundTowardZero(nCtx()));
02896     }
02897 
02902     public FPRMNum mkFPRTZ()
02903     {
02904         return new FPRMNum(this, Native.mkFpaRtz(nCtx()));
02905     }        
02906 
02913     public FPSort mkFPSort(int ebits, int sbits)
02914     {
02915         return new FPSort(this, ebits, sbits);
02916     }
02917 
02922     public FPSort mkFPSortHalf()
02923     {
02924         return new FPSort(this, Native.mkFpaSortHalf(nCtx()));
02925     }
02926 
02931     public FPSort mkFPSort16()
02932     {
02933         return new FPSort(this, Native.mkFpaSort16(nCtx()));
02934     }
02935 
02940     public FPSort mkFPSortSingle()
02941     {
02942         return new FPSort(this, Native.mkFpaSortSingle(nCtx()));
02943     }
02944 
02949     public FPSort mkFPSort32()
02950     {
02951         return new FPSort(this, Native.mkFpaSort32(nCtx()));
02952     }
02953 
02958     public FPSort mkFPSortDouble()
02959     {
02960         return new FPSort(this, Native.mkFpaSortDouble(nCtx()));
02961     }
02962 
02967     public FPSort mkFPSort64()
02968     {
02969         return new FPSort(this, Native.mkFpaSort64(nCtx()));
02970     }
02971 
02976     public FPSort mkFPSortQuadruple()
02977     {        
02978         return new FPSort(this, Native.mkFpaSortQuadruple(nCtx()));
02979     }
02980 
02985     public FPSort mkFPSort128()
02986     {
02987         return new FPSort(this, Native.mkFpaSort128(nCtx()));
02988     }
02989 
02990 
02996     public FPNum mkFPNaN(FPSort s)
02997     {
02998         return new FPNum(this, Native.mkFpaNan(nCtx(), s.getNativeObject()));
02999     }
03000 
03007     public FPNum mkFPInf(FPSort s, boolean negative)
03008     {
03009         return new FPNum(this, Native.mkFpaInf(nCtx(), s.getNativeObject(), negative));
03010     }
03011 
03018     public FPNum mkFPZero(FPSort s, boolean negative)
03019     {
03020         return new FPNum(this, Native.mkFpaZero(nCtx(), s.getNativeObject(), negative));
03021     }
03022 
03029     public FPNum mkFPNumeral(float v, FPSort s)
03030     {
03031         return new FPNum(this, Native.mkFpaNumeralFloat(nCtx(), v, s.getNativeObject()));
03032     }
03033 
03040     public FPNum mkFPNumeral(double v, FPSort s)
03041     {
03042         return new FPNum(this, Native.mkFpaNumeralDouble(nCtx(), v, s.getNativeObject()));
03043     }
03044 
03051     public FPNum mkFPNumeral(int v, FPSort s)
03052     {
03053         return new FPNum(this, Native.mkFpaNumeralInt(nCtx(), v, s.getNativeObject()));
03054     }
03055 
03064     public FPNum mkFPNumeral(boolean sgn, int exp, int sig, FPSort s)
03065     {
03066         return new FPNum(this, Native.mkFpaNumeralIntUint(nCtx(), sgn, exp, sig, s.getNativeObject()));    
03067     }
03068 
03077     public FPNum mkFPNumeral(boolean sgn, long exp, long sig, FPSort s)
03078     {
03079         return new FPNum(this, Native.mkFpaNumeralInt64Uint64(nCtx(), sgn, exp, sig, s.getNativeObject()));
03080     }
03081 
03088     public FPNum mkFP(float v, FPSort s)
03089     {
03090         return mkFPNumeral(v, s);
03091     }
03092 
03099     public FPNum mkFP(double v, FPSort s)
03100     {
03101         return mkFPNumeral(v, s);
03102     }
03103 
03111     public FPNum mkFP(int v, FPSort s)
03112     {
03113         return mkFPNumeral(v, s);
03114     }
03115 
03124     public FPNum mkFP(boolean sgn, int exp, int sig, FPSort s)
03125     {
03126         return mkFPNumeral(sgn, sig, exp, s);
03127     }
03128 
03137     public FPNum mkFP(boolean sgn, long exp, long sig, FPSort s)
03138     {
03139         return mkFPNumeral(sgn, sig, exp, s);
03140     }
03141 
03142 
03148     public FPExpr mkFPAbs(FPExpr t) 
03149     {
03150         return new FPExpr(this, Native.mkFpaAbs(nCtx(), t.getNativeObject()));
03151     }
03152 
03158     public FPExpr mkFPNeg(FPExpr t) 
03159     {
03160         return new FPExpr(this, Native.mkFpaNeg(nCtx(), t.getNativeObject()));
03161     }
03162 
03170     public FPExpr mkFPAdd(FPRMExpr rm, FPExpr t1, FPExpr t2) 
03171     {
03172         return new FPExpr(this, Native.mkFpaAdd(nCtx(), rm.getNativeObject(), t1.getNativeObject(), t2.getNativeObject()));
03173     }
03174 
03182     public FPExpr mkFPSub(FPRMExpr rm, FPExpr t1, FPExpr t2) 
03183     {
03184         return new FPExpr(this, Native.mkFpaSub(nCtx(), rm.getNativeObject(), t1.getNativeObject(), t2.getNativeObject()));
03185     }
03186 
03194     public FPExpr mkFPMul(FPRMExpr rm, FPExpr t1, FPExpr t2) 
03195     {
03196         return new FPExpr(this, Native.mkFpaMul(nCtx(), rm.getNativeObject(), t1.getNativeObject(), t2.getNativeObject()));
03197     }
03198 
03206     public FPExpr mkFPDiv(FPRMExpr rm, FPExpr t1, FPExpr t2) 
03207     {
03208         return new FPExpr(this, Native.mkFpaDiv(nCtx(), rm.getNativeObject(), t1.getNativeObject(), t2.getNativeObject()));
03209     }
03210 
03221     public FPExpr mkFPFMA(FPRMExpr rm, FPExpr t1, FPExpr t2, FPExpr t3) 
03222     {
03223         return new FPExpr(this, Native.mkFpaFma(nCtx(), rm.getNativeObject(), t1.getNativeObject(), t2.getNativeObject(), t3.getNativeObject()));
03224     }
03225 
03232     public FPExpr mkFPSqrt(FPRMExpr rm, FPExpr t) 
03233     {
03234         return new FPExpr(this, Native.mkFpaSqrt(nCtx(), rm.getNativeObject(), t.getNativeObject()));
03235     }
03236 
03243     public FPExpr mkFPRem(FPExpr t1, FPExpr t2) 
03244     {
03245         return new FPExpr(this, Native.mkFpaRem(nCtx(), t1.getNativeObject(), t2.getNativeObject()));
03246     }
03247 
03255     public FPExpr mkFPRoundToIntegral(FPRMExpr rm, FPExpr t)
03256     {            
03257         return new FPExpr(this, Native.mkFpaRoundToIntegral(nCtx(), rm.getNativeObject(), t.getNativeObject()));
03258     }
03259 
03266     public FPExpr mkFPMin(FPExpr t1, FPExpr t2)
03267     {
03268         return new FPExpr(this, Native.mkFpaMin(nCtx(), t1.getNativeObject(), t2.getNativeObject()));
03269     }
03270 
03277     public FPExpr mkFPMax(FPExpr t1, FPExpr t2)
03278     {
03279         return new FPExpr(this, Native.mkFpaMax(nCtx(), t1.getNativeObject(), t2.getNativeObject()));
03280     }   
03281     
03288     public BoolExpr mkFPLEq(FPExpr t1, FPExpr t2) 
03289     {            
03290         return new BoolExpr(this, Native.mkFpaLeq(nCtx(), t1.getNativeObject(), t2.getNativeObject()));
03291     }
03292 
03299     public BoolExpr mkFPLt(FPExpr t1, FPExpr t2) 
03300     {                    
03301         return new BoolExpr(this, Native.mkFpaLt(nCtx(), t1.getNativeObject(), t2.getNativeObject()));
03302     }
03303 
03310     public BoolExpr mkFPGEq(FPExpr t1, FPExpr t2) 
03311     {                    
03312         return new BoolExpr(this, Native.mkFpaGeq(nCtx(), t1.getNativeObject(), t2.getNativeObject()));
03313     }
03314 
03321     public BoolExpr mkFPGt(FPExpr t1, FPExpr t2) 
03322     {            
03323         return new BoolExpr(this, Native.mkFpaGt(nCtx(), t1.getNativeObject(), t2.getNativeObject()));
03324     }
03325 
03334     public BoolExpr mkFPEq(FPExpr t1, FPExpr t2)
03335     {
03336         return new BoolExpr(this, Native.mkFpaEq(nCtx(), t1.getNativeObject(), t2.getNativeObject()));
03337     }
03338 
03344     public BoolExpr mkFPIsNormal(FPExpr t) 
03345     {
03346         return new BoolExpr(this, Native.mkFpaIsNormal(nCtx(), t.getNativeObject()));
03347     }
03348 
03354     public BoolExpr mkFPIsSubnormal(FPExpr t) 
03355     {                   
03356         return new BoolExpr(this, Native.mkFpaIsSubnormal(nCtx(), t.getNativeObject()));
03357     }
03358 
03364     public BoolExpr mkFPIsZero(FPExpr t)
03365     {
03366         return new BoolExpr(this, Native.mkFpaIsZero(nCtx(), t.getNativeObject()));
03367     }
03368 
03374     public BoolExpr mkFPIsInfinite(FPExpr t)
03375     {    
03376         return new BoolExpr(this, Native.mkFpaIsInfinite(nCtx(), t.getNativeObject()));
03377     }
03378 
03384     public BoolExpr mkFPIsNaN(FPExpr t) 
03385     {                   
03386         return new BoolExpr(this, Native.mkFpaIsNan(nCtx(), t.getNativeObject()));
03387     }
03388 
03394     public BoolExpr mkFPIsNegative(FPExpr t)
03395     {     
03396         return new BoolExpr(this, Native.mkFpaIsNegative(nCtx(), t.getNativeObject()));
03397     }
03398 
03404     public BoolExpr mkFPIsPositive(FPExpr t)
03405     {
03406         return new BoolExpr(this, Native.mkFpaIsPositive(nCtx(), t.getNativeObject()));
03407     }        
03408 
03422     public FPExpr mkFP(BitVecExpr sgn, BitVecExpr sig, BitVecExpr exp)
03423     {
03424         return new FPExpr(this, Native.mkFpaFp(nCtx(), sgn.getNativeObject(), sig.getNativeObject(), exp.getNativeObject()));
03425     }
03426 
03438     public FPExpr mkFPToFP(BitVecExpr bv, FPSort s)
03439     {
03440         return new FPExpr(this, Native.mkFpaToFpBv(nCtx(), bv.getNativeObject(), s.getNativeObject()));
03441     }
03442 
03454     public FPExpr mkFPToFP(FPRMExpr rm, FPExpr t, FPSort s)
03455     {
03456         return new FPExpr(this, Native.mkFpaToFpFloat(nCtx(), rm.getNativeObject(), t.getNativeObject(), s.getNativeObject()));
03457     }
03458 
03470     public FPExpr mkFPToFP(FPRMExpr rm, RealExpr t, FPSort s)
03471     {
03472         return new FPExpr(this, Native.mkFpaToFpReal(nCtx(), rm.getNativeObject(), t.getNativeObject(), s.getNativeObject()));
03473     }
03474 
03488     public FPExpr mkFPToFP(FPRMExpr rm, BitVecExpr t, FPSort s, boolean signed)
03489     {
03490         if (signed)
03491             return new FPExpr(this, Native.mkFpaToFpSigned(nCtx(), rm.getNativeObject(), t.getNativeObject(), s.getNativeObject()));
03492         else
03493             return new FPExpr(this, Native.mkFpaToFpUnsigned(nCtx(), rm.getNativeObject(), t.getNativeObject(), s.getNativeObject()));
03494     }
03495 
03506     public FPExpr mkFPToFP(FPSort s, FPRMExpr rm, FPExpr t)
03507     {
03508         return new FPExpr(this, Native.mkFpaToFpFloat(nCtx(), s.getNativeObject(), rm.getNativeObject(), t.getNativeObject()));
03509     }
03510 
03523     public BitVecExpr mkFPToBV(FPRMExpr rm, FPExpr t, int sz, boolean signed)
03524     {
03525         if (signed)
03526             return new BitVecExpr(this, Native.mkFpaToSbv(nCtx(), rm.getNativeObject(), t.getNativeObject(), sz));
03527         else
03528             return new BitVecExpr(this, Native.mkFpaToUbv(nCtx(), rm.getNativeObject(), t.getNativeObject(), sz));
03529     }
03530 
03540     public RealExpr mkFPToReal(FPExpr t)
03541     {
03542         return new RealExpr(this, Native.mkFpaToReal(nCtx(), t.getNativeObject()));
03543     }
03544 
03555     public BitVecExpr mkFPToIEEEBV(FPExpr t)
03556     {
03557         return new BitVecExpr(this, Native.mkFpaToIeeeBv(nCtx(), t.getNativeObject()));
03558     }
03559 
03573     public BitVecExpr mkFPToFP(FPRMExpr rm, IntExpr exp, RealExpr sig, FPSort s)
03574     {
03575         return new BitVecExpr(this, Native.mkFpaToFpIntReal(nCtx(), rm.getNativeObject(), exp.getNativeObject(), sig.getNativeObject(), s.getNativeObject()));
03576     }
03577     
03578     
03589     public AST wrapAST(long nativeObject)
03590     {
03591         return AST.create(this, nativeObject);
03592     }
03593 
03606     public long unwrapAST(AST a)
03607     {
03608         return a.getNativeObject();
03609     }
03610 
03615     public String SimplifyHelp()
03616     {
03617         return Native.simplifyGetHelp(nCtx());
03618     }
03619 
03623     public ParamDescrs getSimplifyParameterDescriptions()
03624     {
03625         return new ParamDescrs(this, Native.simplifyGetParamDescrs(nCtx()));
03626     }
03627 
03636     public void updateParamValue(String id, String value)
03637     {
03638         Native.updateParamValue(nCtx(), id, value);
03639     }
03640 
03641     long m_ctx = 0;
03642 
03643     long nCtx()
03644     {
03645         return m_ctx;
03646     }
03647 
03648     void initContext()
03649     {
03650         setPrintMode(Z3_ast_print_mode.Z3_PRINT_SMTLIB2_COMPLIANT);
03651         Native.setInternalErrorHandler(nCtx());
03652     }
03653 
03654     void checkContextMatch(Z3Object other)
03655     {
03656         if (this != other.getContext())
03657             throw new Z3Exception("Context mismatch");
03658     }
03659 
03660     void checkContextMatch(Z3Object[] arr)
03661     {
03662         if (arr != null)
03663             for (Z3Object a : arr)
03664                 checkContextMatch(a);
03665     }
03666 
03667     private ASTDecRefQueue m_AST_DRQ = new ASTDecRefQueue();
03668     private ASTMapDecRefQueue m_ASTMap_DRQ = new ASTMapDecRefQueue(10);
03669     private ASTVectorDecRefQueue m_ASTVector_DRQ = new ASTVectorDecRefQueue(10);
03670     private ApplyResultDecRefQueue m_ApplyResult_DRQ = new ApplyResultDecRefQueue(10);
03671     private FuncInterpEntryDecRefQueue m_FuncEntry_DRQ = new FuncInterpEntryDecRefQueue(10);
03672     private FuncInterpDecRefQueue m_FuncInterp_DRQ = new FuncInterpDecRefQueue(10);
03673     private GoalDecRefQueue m_Goal_DRQ = new GoalDecRefQueue(10);
03674     private ModelDecRefQueue m_Model_DRQ = new ModelDecRefQueue(10);
03675     private ParamsDecRefQueue m_Params_DRQ = new ParamsDecRefQueue(10);
03676     private ParamDescrsDecRefQueue m_ParamDescrs_DRQ = new ParamDescrsDecRefQueue(10);
03677     private ProbeDecRefQueue m_Probe_DRQ = new ProbeDecRefQueue(10);
03678     private SolverDecRefQueue m_Solver_DRQ = new SolverDecRefQueue(10);
03679     private StatisticsDecRefQueue m_Statistics_DRQ = new StatisticsDecRefQueue(10);
03680     private TacticDecRefQueue m_Tactic_DRQ = new TacticDecRefQueue(10);
03681     private FixedpointDecRefQueue m_Fixedpoint_DRQ = new FixedpointDecRefQueue(10);
03682     private OptimizeDecRefQueue m_Optimize_DRQ = new OptimizeDecRefQueue(10);
03683 
03684     public IDecRefQueue getASTDRQ()
03685     {
03686         return m_AST_DRQ;
03687     }
03688 
03689     public IDecRefQueue getASTMapDRQ()
03690     {
03691         return m_ASTMap_DRQ;
03692     }
03693 
03694     public IDecRefQueue getASTVectorDRQ()
03695     {
03696         return m_ASTVector_DRQ;
03697     }
03698 
03699     public IDecRefQueue getApplyResultDRQ()
03700     {
03701         return m_ApplyResult_DRQ;
03702     }
03703 
03704     public IDecRefQueue getFuncEntryDRQ()
03705     {
03706         return m_FuncEntry_DRQ;
03707     }
03708 
03709     public IDecRefQueue getFuncInterpDRQ()
03710     {
03711         return m_FuncInterp_DRQ;
03712     }
03713 
03714     public IDecRefQueue getGoalDRQ()
03715     {
03716         return m_Goal_DRQ;
03717     }
03718 
03719     public IDecRefQueue getModelDRQ()
03720     {
03721         return m_Model_DRQ;
03722     }
03723 
03724     public IDecRefQueue getParamsDRQ()
03725     {
03726         return m_Params_DRQ;
03727     }
03728 
03729     public IDecRefQueue getParamDescrsDRQ()
03730     {
03731         return m_ParamDescrs_DRQ;
03732     }
03733 
03734     public IDecRefQueue getProbeDRQ()
03735     {
03736         return m_Probe_DRQ;
03737     }
03738 
03739     public IDecRefQueue getSolverDRQ()
03740     {
03741         return m_Solver_DRQ;
03742     }
03743 
03744     public IDecRefQueue getStatisticsDRQ()
03745     {
03746         return m_Statistics_DRQ;
03747     }
03748 
03749     public IDecRefQueue getTacticDRQ()
03750     {
03751         return m_Tactic_DRQ;
03752     }
03753 
03754     public IDecRefQueue getFixedpointDRQ()
03755     {
03756         return m_Fixedpoint_DRQ;
03757     }
03758 
03759     public IDecRefQueue getOptimizeDRQ()
03760     {
03761         return m_Optimize_DRQ;
03762     }
03763 
03764     protected long m_refCount = 0;
03765 
03769     protected void finalize()
03770     {
03771         dispose();
03772 
03773         if (m_refCount == 0)
03774         {
03775             try
03776             {
03777                 Native.delContext(m_ctx);
03778             } catch (Z3Exception e)
03779             {
03780                 // OK.
03781             }
03782             m_ctx = 0;
03783         } 
03784         /*
03785         else
03786             CMW: re-queue the finalizer? */
03787     }
03788 
03792     public void dispose()
03793     {
03794         m_AST_DRQ.clear(this);
03795         m_ASTMap_DRQ.clear(this);
03796         m_ASTVector_DRQ.clear(this);
03797         m_ApplyResult_DRQ.clear(this);
03798         m_FuncEntry_DRQ.clear(this);
03799         m_FuncInterp_DRQ.clear(this);
03800         m_Goal_DRQ.clear(this);
03801         m_Model_DRQ.clear(this);
03802         m_Params_DRQ.clear(this);
03803         m_Probe_DRQ.clear(this);
03804         m_Solver_DRQ.clear(this);
03805         m_Statistics_DRQ.clear(this);
03806         m_Tactic_DRQ.clear(this);
03807         m_Fixedpoint_DRQ.clear(this);
03808 
03809         m_boolSort = null;
03810         m_intSort = null;
03811         m_realSort = null;
03812     }
03813 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines