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
03781 }
03782 m_ctx = 0;
03783 }
03784
03785
03786
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 }