/** * This file was automatically generated from Expr.cs **/ package com.Microsoft.Z3; /* using System; */ /** * Expressions are terms. **/ public class Expr extends AST { /** * Returns a simplified version of the expression. * A set of parameters to configure the simplifier * **/ public Expr Simplify(Params p) { if (p == null) return Expr.Create(Context, Native.simplify(Context.nCtx, NativeObject)); else return Expr.Create(Context, Native.simplifyEx(Context.nCtx, NativeObject, p.NativeObject)); } /** * The function declaration of the function that is applied in this expression. **/ public FuncDecl FuncDecl() { return new FuncDecl(Context, Native.getAppDecl(Context.nCtx, NativeObject)); } /** * Indicates whether the expression is the true or false expression * or something else (Z3_L_UNDEF). **/ public Z3_lboolean BoolValue() { return (Z3_lboolean)Native.getBooleanValue(Context.nCtx, NativeObject); } /** * The number of arguments of the expression. **/ public long NumArgs() { return Native.getAppNumArgs(Context.nCtx, NativeObject); } /** * The arguments of the expression. **/ public Expr[] Args() { long n = NumArgs; Expr[] res = new Expr[n]; for (long i = 0; i < n; i++) res[i] = Expr.Create(Context, Native.getAppArg(Context.nCtx, NativeObject, i)); return res; } /** * Update the arguments of the expression using the arguments * The number of new arguments should coincide with the current number of arguments. **/ public void Update(Expr[] args) { Context.CheckContextMatch(args); if (args.Length != NumArgs) throw new Z3Exception("Number of arguments does not match"); NativeObject = Native.updateTerm(Context.nCtx, NativeObject, (long)args.Length, Expr.ArrayToNative(args)); } /** * Substitute every occurrence of from[i] in the expression with to[i], for i smaller than num_exprs. * * The result is the new expression. The arrays from and to must have size num_exprs. * For every i smaller than num_exprs, we must have that * sort of from[i] must be equal to sort of to[i]. * **/ public Expr Substitute(Expr[] from, Expr[] to) { Context.CheckContextMatch(from); Context.CheckContextMatch(to); if (from.Length != to.Length) throw new Z3Exception("Argument sizes do not match"); return Expr.Create(Context, Native.substitute(Context.nCtx, NativeObject, (long)from.Length, Expr.ArrayToNative(from), Expr.ArrayToNative(to))); } /** * Substitute every occurrence of from in the expression with to. * **/ public Expr Substitute(Expr from, Expr to) { return Substitute(new Expr[] { from }, new Expr[] { to }); } /** * Substitute the free variables in the expression with the expressions in * * For every i smaller than num_exprs, the variable with de-Bruijn index i is replaced with term to[i]. * **/ public Expr SubstituteVars(Expr[] to) { Context.CheckContextMatch(to); return Expr.Create(Context, Native.substituteVars(Context.nCtx, NativeObject, (long)to.Length, Expr.ArrayToNative(to))); } /** * Translates (copies) the term to the Context . * A context * @return A copy of the term which is associated with **/ public Expr Translate(Context ctx) { if (ReferenceEquals(Context, ctx)) return this; else return Expr.Create(ctx, Native.translate(Context.nCtx, NativeObject, ctx.nCtx)); } /** * Returns a string representation of the expression. **/ public String toString() { return super.toString(); } /** * Indicates whether the term is a numeral **/ public boolean IsNumeral() { return Native.isNumeralAst(Context.nCtx, NativeObject) != 0; } /** * Indicates whether the term is well-sorted. * @return True if the term is well-sorted, false otherwise. **/ public boolean IsWellSorted() { return Native.isWellSorted(Context.nCtx, NativeObject) != 0; } /** * The Sort of the term. **/ public Sort Sort() { return Sort.Create(Context, Native.getSort(Context.nCtx, NativeObject)); } /** * Indicates whether the term represents a constant. **/ public boolean IsConst() { return IsExpr && NumArgs == 0 && FuncDecl.DomainSize == 0; } /** * Indicates whether the term is an integer numeral. **/ public boolean IsIntNum() { return IsNumeral && IsInt; } /** * Indicates whether the term is a real numeral. **/ public boolean IsRatNum() { return IsNumeral && IsReal; } /** * Indicates whether the term is an algebraic number **/ public boolean IsAlgebraicNumber() { return Native.isAlgebraicNumber(Context.nCtx, NativeObject) != 0; } /** * Indicates whether the term has Boolean sort. **/ public boolean IsBool() { return (IsExpr && Native.isEqSort(Context.nCtx, Native.mkBooleanSort(Context.nCtx), Native.getSort(Context.nCtx, NativeObject)) != 0); } /** * Indicates whether the term is the constant true. **/ public boolean IsTrue() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_TRUE; } /** * Indicates whether the term is the constant false. **/ public boolean IsFalse() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_FALSE; } /** * Indicates whether the term is an equality predicate. **/ public boolean IsEq() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EQ; } /** * Indicates whether the term is an n-ary distinct predicate (every argument is mutually distinct). **/ public boolean IsDistinct() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_DISTINCT; } /** * Indicates whether the term is a ternary if-then-else term **/ public boolean IsITE() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ITE; } /** * Indicates whether the term is an n-ary conjunction **/ public boolean IsAnd() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_AND; } /** * Indicates whether the term is an n-ary disjunction **/ public boolean IsOr() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_OR; } /** * Indicates whether the term is an if-and-only-if (Boolean equivalence, binary) **/ public boolean IsIff() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IFF; } /** * Indicates whether the term is an exclusive or **/ public boolean IsXor() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_XOR; } /** * Indicates whether the term is a negation **/ public boolean IsNot() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_NOT; } /** * Indicates whether the term is an implication **/ public boolean IsImplies() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IMPLIES; } /** * Indicates whether the term is of integer sort. **/ public boolean IsInt() { return (Native.isNumeralAst(Context.nCtx, NativeObject) != 0 && Native.getSortKind(Context.nCtx, Native.getSort(Context.nCtx, NativeObject)) == (long)Z3_sort_kind.Z3_INT_SORT); } /** * Indicates whether the term is of sort real. **/ public boolean IsReal() { return Native.getSortKind(Context.nCtx, Native.getSort(Context.nCtx, NativeObject)) == (long)Z3_sort_kind.Z3_REAL_SORT; } /** * Indicates whether the term is an arithmetic numeral. **/ public boolean IsArithmeticNumeral() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ANUM; } /** * Indicates whether the term is a less-than-or-equal **/ public boolean IsLE() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LE; } /** * Indicates whether the term is a greater-than-or-equal **/ public boolean IsGE() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_GE; } /** * Indicates whether the term is a less-than **/ public boolean IsLT() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LT; } /** * Indicates whether the term is a greater-than **/ public boolean IsGT() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_GT; } /** * Indicates whether the term is addition (binary) **/ public boolean IsAdd() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ADD; } /** * Indicates whether the term is subtraction (binary) **/ public boolean IsSub() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SUB; } /** * Indicates whether the term is a unary minus **/ public boolean IsUMinus() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_UMINUS; } /** * Indicates whether the term is multiplication (binary) **/ public boolean IsMul() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_MUL; } /** * Indicates whether the term is division (binary) **/ public boolean IsDiv() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_DIV; } /** * Indicates whether the term is integer division (binary) **/ public boolean IsIDiv() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IDIV; } /** * Indicates whether the term is remainder (binary) **/ public boolean IsRemainder() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_REM; } /** * Indicates whether the term is modulus (binary) **/ public boolean IsModulus() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_MOD; } /** * Indicates whether the term is a coercion of integer to real (unary) **/ public boolean IsIntToReal() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_TO_REAL; } /** * Indicates whether the term is a coercion of real to integer (unary) **/ public boolean IsRealToInt() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_TO_INT; } /** * Indicates whether the term is a check that tests whether a real is integral (unary) **/ public boolean IsRealIsInt() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_IS_INT; } /** * Indicates whether the term is of an array sort. **/ public boolean IsArray() { return (Native.isApp(Context.nCtx, NativeObject) != 0 && (Z3_sort_kind)Native.getSortKind(Context.nCtx, Native.getSort(Context.nCtx, NativeObject)) == Z3_sort_kind.Z3_ARRAY_SORT); } /** * Indicates whether the term is an array store. * It satisfies select(store(a,i,v),j) = if i = j then v else select(a,j). * Array store takes at least 3 arguments. **/ public boolean IsStore() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_STORE; } /** * Indicates whether the term is an array select. **/ public boolean IsSelect() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SELECT; } /** * Indicates whether the term is a constant array. * For example, select(const(v),i) = v holds for every v and i. The function is unary. **/ public boolean IsConstantArray() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_CONST_ARRAY; } /** * Indicates whether the term is a default array. * For example default(const(v)) = v. The function is unary. **/ public boolean IsDefaultArray() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ARRAY_DEFAULT; } /** * Indicates whether the term is an array map. * It satisfies map[f](a1,..,a_n)[i] = f(a1[i],...,a_n[i]) for every i. **/ public boolean IsArrayMap() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ARRAY_MAP; } /** * Indicates whether the term is an as-array term. * An as-array term is n array value that behaves as the function graph of the * function passed as parameter. **/ public boolean IsAsArray() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_AS_ARRAY; } /** * Indicates whether the term is set union **/ public boolean IsSetUnion() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_UNION; } /** * Indicates whether the term is set intersection **/ public boolean IsSetIntersect() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_INTERSECT; } /** * Indicates whether the term is set difference **/ public boolean IsSetDifference() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_DIFFERENCE; } /** * Indicates whether the term is set complement **/ public boolean IsSetComplement() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_COMPLEMENT; } /** * Indicates whether the term is set subset **/ public boolean IsSetSubset() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SET_SUBSET; } /** * Indicates whether the terms is of bit-vector sort. **/ public boolean IsBV() { return Native.getSortKind(Context.nCtx, Native.getSort(Context.nCtx, NativeObject)) == (long)Z3_sort_kind.Z3_BV_SORT; } /** * Indicates whether the term is a bit-vector numeral **/ public boolean IsBVNumeral() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNUM; } /** * Indicates whether the term is a one-bit bit-vector with value one **/ public boolean IsBVBitOne() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BIT1; } /** * Indicates whether the term is a one-bit bit-vector with value zero **/ public boolean IsBVBitZero() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BIT0; } /** * Indicates whether the term is a bit-vector unary minus **/ public boolean IsBVUMinus() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNEG; } /** * Indicates whether the term is a bit-vector addition (binary) **/ public boolean IsBVAdd() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BADD; } /** * Indicates whether the term is a bit-vector subtraction (binary) **/ public boolean IsBVSub() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSUB; } /** * Indicates whether the term is a bit-vector multiplication (binary) **/ public boolean IsBVMul() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BMUL; } /** * Indicates whether the term is a bit-vector signed division (binary) **/ public boolean IsBVSDiv() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSDIV; } /** * Indicates whether the term is a bit-vector unsigned division (binary) **/ public boolean IsBVUDiv() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUDIV; } /** * Indicates whether the term is a bit-vector signed remainder (binary) **/ public boolean IsBVSRem() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSREM; } /** * Indicates whether the term is a bit-vector unsigned remainder (binary) **/ public boolean IsBVURem() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUREM; } /** * Indicates whether the term is a bit-vector signed modulus **/ public boolean IsBVSMod() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSMOD; } /** * Indicates whether the term is a bit-vector signed division by zero **/ boolean IsBVSDiv0 () { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSDIV0; } /** * Indicates whether the term is a bit-vector unsigned division by zero **/ boolean IsBVUDiv0 () { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUDIV0; } /** * Indicates whether the term is a bit-vector signed remainder by zero **/ boolean IsBVSRem0 () { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSREM0; } /** * Indicates whether the term is a bit-vector unsigned remainder by zero **/ boolean IsBVURem0 () { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BUREM0; } /** * Indicates whether the term is a bit-vector signed modulus by zero **/ boolean IsBVSMod0 () { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSMOD0; } /** * Indicates whether the term is an unsigned bit-vector less-than-or-equal **/ public boolean IsBVULE() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ULEQ; } /** * Indicates whether the term is a signed bit-vector less-than-or-equal **/ public boolean IsBVSLE() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SLEQ; } /** * Indicates whether the term is an unsigned bit-vector greater-than-or-equal **/ public boolean IsBVUGE() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_UGEQ; } /** * Indicates whether the term is a signed bit-vector greater-than-or-equal **/ public boolean IsBVSGE() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SGEQ; } /** * Indicates whether the term is an unsigned bit-vector less-than **/ public boolean IsBVULT() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ULT; } /** * Indicates whether the term is a signed bit-vector less-than **/ public boolean IsBVSLT() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SLT; } /** * Indicates whether the term is an unsigned bit-vector greater-than **/ public boolean IsBVUGT() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_UGT; } /** * Indicates whether the term is a signed bit-vector greater-than **/ public boolean IsBVSGT() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SGT; } /** * Indicates whether the term is a bit-wise AND **/ public boolean IsBVAND() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BAND; } /** * Indicates whether the term is a bit-wise OR **/ public boolean IsBVOR() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BOR; } /** * Indicates whether the term is a bit-wise NOT **/ public boolean IsBVNOT() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNOT; } /** * Indicates whether the term is a bit-wise XOR **/ public boolean IsBVXOR() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BXOR; } /** * Indicates whether the term is a bit-wise NAND **/ public boolean IsBVNAND() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNAND; } /** * Indicates whether the term is a bit-wise NOR **/ public boolean IsBVNOR() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BNOR; } /** * Indicates whether the term is a bit-wise XNOR **/ public boolean IsBVXNOR() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BXNOR; } /** * Indicates whether the term is a bit-vector concatenation (binary) **/ public boolean IsBVConcat() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_CONCAT; } /** * Indicates whether the term is a bit-vector sign extension **/ public boolean IsBVSignExtension() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_SIGN_EXT; } /** * Indicates whether the term is a bit-vector zero extension **/ public boolean IsBVZeroExtension() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ZERO_EXT; } /** * Indicates whether the term is a bit-vector extraction **/ public boolean IsBVExtract() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EXTRACT; } /** * Indicates whether the term is a bit-vector repetition **/ public boolean IsBVRepeat() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_REPEAT; } /** * Indicates whether the term is a bit-vector reduce OR **/ public boolean IsBVReduceOR() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BREDOR; } /** * Indicates whether the term is a bit-vector reduce AND **/ public boolean IsBVReduceAND() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BREDAND; } /** * Indicates whether the term is a bit-vector comparison **/ public boolean IsBVComp() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BCOMP; } /** * Indicates whether the term is a bit-vector shift left **/ public boolean IsBVShiftLeft() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BSHL; } /** * Indicates whether the term is a bit-vector logical shift right **/ public boolean IsBVShiftRightLogical() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BLSHR; } /** * Indicates whether the term is a bit-vector arithmetic shift left **/ public boolean IsBVShiftRightArithmetic() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BASHR; } /** * Indicates whether the term is a bit-vector rotate left **/ public boolean IsBVRotateLeft() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ROTATE_LEFT; } /** * Indicates whether the term is a bit-vector rotate right **/ public boolean IsBVRotateRight() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_ROTATE_RIGHT; } /** * Indicates whether the term is a bit-vector rotate left (extended) * Similar to Z3_OP_ROTATE_LEFT, but it is a binary operator instead of a parametric one. **/ public boolean IsBVRotateLeftExtended() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EXT_ROTATE_LEFT; } /** * Indicates whether the term is a bit-vector rotate right (extended) * Similar to Z3_OP_ROTATE_RIGHT, but it is a binary operator instead of a parametric one. **/ public boolean IsBVRotateRightExtended() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_EXT_ROTATE_RIGHT; } /** * Indicates whether the term is a coercion from integer to bit-vector * This function is not supported by the decision procedures. Only the most * rudimentary simplification rules are applied to this function. **/ public boolean IsIntToBV() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_INT2BV; } /** * Indicates whether the term is a coercion from bit-vector to integer * This function is not supported by the decision procedures. Only the most * rudimentary simplification rules are applied to this function. **/ public boolean IsBVToInt() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_BV2INT; } /** * Indicates whether the term is a bit-vector carry * Compute the carry bit in a full-adder. The meaning is given by the * equivalence (carry l1 l2 l3) <=> (or (and l1 l2) (and l1 l3) (and l2 l3))) **/ public boolean IsBVCarry() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_CARRY; } /** * Indicates whether the term is a bit-vector ternary XOR * The meaning is given by the equivalence (xor3 l1 l2 l3) <=> (xor (xor l1 l2) l3) **/ public boolean IsBVXOR3() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_XOR3; } /** * Indicates whether the term is a label (used by the Boogie Verification condition generator). * The label has two parameters, a string and a Boolean polarity. It takes one argument, a formula. **/ public boolean IsLabel() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LABEL; } /** * Indicates whether the term is a label literal (used by the Boogie Verification condition generator). * A label literal has a set of string parameters. It takes no arguments. **/ public boolean IsLabelLit() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_LABEL_LIT; } /** * Indicates whether the term is a binary equivalence modulo namings. * This binary predicate is used in proof terms. * It captures equisatisfiability and equivalence modulo renamings. **/ public boolean IsOEQ() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_OEQ; } /** * Indicates whether the term is a Proof for the expression 'true'. **/ public boolean IsProofTrue() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TRUE; } /** * Indicates whether the term is a proof for a fact asserted by the user. **/ public boolean IsProofAsserted() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_ASSERTED; } /** * Indicates whether the term is a proof for a fact (tagged as goal) asserted by the user. **/ public boolean IsProofGoal() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_GOAL; } /** * Indicates whether the term is proof via modus ponens * * Given a proof for p and a proof for (implies p q), produces a proof for q. * T1: p * T2: (implies p q) * [mp T1 T2]: q * The second antecedents may also be a proof for (iff p q). **/ public boolean IsProofModusPonens() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_MODUS_PONENS; } /** * Indicates whether the term is a proof for (R t t), where R is a reflexive relation. * This proof object has no antecedents. * The only reflexive relations that are used are * equivalence modulo namings, equality and equivalence. * That is, R is either '~', '=' or 'iff'. **/ public boolean IsProofReflexivity() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_REFLEXIVITY; } /** * Indicates whether the term is proof by symmetricity of a relation * * Given an symmetric relation R and a proof for (R t s), produces a proof for (R s t). * T1: (R t s) * [symmetry T1]: (R s t) * T1 is the antecedent of this proof object. * **/ public boolean IsProofSymmetry() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_SYMMETRY; } /** * Indicates whether the term is a proof by transitivity of a relation * * Given a transitive relation R, and proofs for (R t s) and (R s u), produces a proof * for (R t u). * T1: (R t s) * T2: (R s u) * [trans T1 T2]: (R t u) * **/ public boolean IsProofTransitivity() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TRANSITIVITY; } /** * Indicates whether the term is a proof by condensed transitivity of a relation * * Condensed transitivity proof. This proof object is only used if the parameter PROOF_MODE is 1. * It combines several symmetry and transitivity proofs. * Example: * T1: (R a b) * T2: (R c b) * T3: (R c d) * [trans* T1 T2 T3]: (R a d) * R must be a symmetric and transitive relation. * * Assuming that this proof object is a proof for (R s t), then * a proof checker must check if it is possible to prove (R s t) * using the antecedents, symmetry and transitivity. That is, * if there is a path from s to t, if we view every * antecedent (R a b) as an edge between a and b. * **/ public boolean IsProofTransitivityStar() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TRANSITIVITY_STAR; } /** * Indicates whether the term is a monotonicity proof object. * * T1: (R t_1 s_1) * ... * Tn: (R t_n s_n) * [monotonicity T1 ... Tn]: (R (f t_1 ... t_n) (f s_1 ... s_n)) * Remark: if t_i == s_i, then the antecedent Ti is suppressed. * That is, reflexivity proofs are supressed to save space. * **/ public boolean IsProofMonotonicity() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_MONOTONICITY; } /** * Indicates whether the term is a quant-intro proof * * Given a proof for (~ p q), produces a proof for (~ (forall (x) p) (forall (x) q)). * T1: (~ p q) * [quant-intro T1]: (~ (forall (x) p) (forall (x) q)) * **/ public boolean IsProofQuantIntro() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_QUANT_INTRO; } /** * Indicates whether the term is a distributivity proof object. * * Given that f (= or) distributes over g (= and), produces a proof for * (= (f a (g c d)) * (g (f a c) (f a d))) * If f and g are associative, this proof also justifies the following equality: * (= (f (g a b) (g c d)) * (g (f a c) (f a d) (f b c) (f b d))) * where each f and g can have arbitrary number of arguments. * * This proof object has no antecedents. * Remark. This rule is used by the CNF conversion pass and * instantiated by f = or, and g = and. * **/ public boolean IsProofDistributivity() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DISTRIBUTIVITY; } /** * Indicates whether the term is a proof by elimination of AND * * Given a proof for (and l_1 ... l_n), produces a proof for l_i * T1: (and l_1 ... l_n) * [and-elim T1]: l_i * **/ public boolean IsProofAndElimination() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_AND_ELIM; } /** * Indicates whether the term is a proof by eliminiation of not-or * * Given a proof for (not (or l_1 ... l_n)), produces a proof for (not l_i). * T1: (not (or l_1 ... l_n)) * [not-or-elim T1]: (not l_i) * **/ public boolean IsProofOrElimination() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NOT_OR_ELIM; } /** * Indicates whether the term is a proof by rewriting * * A proof for a local rewriting step (= t s). * The head function symbol of t is interpreted. * * This proof object has no antecedents. * The conclusion of a rewrite rule is either an equality (= t s), * an equivalence (iff t s), or equi-satisfiability (~ t s). * Remark: if f is bool, then = is iff. * * Examples: * (= (+ x 0) x) * (= (+ x 1 2) (+ 3 x)) * (iff (or x false) x) * **/ public boolean IsProofRewrite() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_REWRITE; } /** * Indicates whether the term is a proof by rewriting * * A proof for rewriting an expression t into an expression s. * This proof object is used if the parameter PROOF_MODE is 1. * This proof object can have n antecedents. * The antecedents are proofs for equalities used as substitution rules. * The object is also used in a few cases if the parameter PROOF_MODE is 2. * The cases are: * - When applying contextual simplification (CONTEXT_SIMPLIFIER=true) * - When converting bit-vectors to Booleans (BIT2BOOL=true) * - When pulling ite expression up (PULL_CHEAP_ITE_TREES=true) * **/ public boolean IsProofRewriteStar() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_REWRITE_STAR; } /** * Indicates whether the term is a proof for pulling quantifiers out. * * A proof for (iff (f (forall (x) q(x)) r) (forall (x) (f (q x) r))). This proof object has no antecedents. * **/ public boolean IsProofPullQuant() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_PULL_QUANT; } /** * Indicates whether the term is a proof for pulling quantifiers out. * * A proof for (iff P Q) where Q is in prenex normal form. * This proof object is only used if the parameter PROOF_MODE is 1. * This proof object has no antecedents * **/ public boolean IsProofPullQuantStar() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_PULL_QUANT_STAR; } /** * Indicates whether the term is a proof for pushing quantifiers in. * * A proof for: * (iff (forall (x_1 ... x_m) (and p_1[x_1 ... x_m] ... p_n[x_1 ... x_m])) * (and (forall (x_1 ... x_m) p_1[x_1 ... x_m]) * ... * (forall (x_1 ... x_m) p_n[x_1 ... x_m]))) * This proof object has no antecedents * **/ public boolean IsProofPushQuant() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_PUSH_QUANT; } /** * Indicates whether the term is a proof for elimination of unused variables. * * A proof for (iff (forall (x_1 ... x_n y_1 ... y_m) p[x_1 ... x_n]) * (forall (x_1 ... x_n) p[x_1 ... x_n])) * * It is used to justify the elimination of unused variables. * This proof object has no antecedents. * **/ public boolean IsProofElimUnusedVars() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_ELIM_UNUSED_VARS; } /** * Indicates whether the term is a proof for destructive equality resolution * * A proof for destructive equality resolution: * (iff (forall (x) (or (not (= x t)) P[x])) P[t]) * if x does not occur in t. * * This proof object has no antecedents. * * Several variables can be eliminated simultaneously. * **/ public boolean IsProofDER() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DER; } /** * Indicates whether the term is a proof for quantifier instantiation * * A proof of (or (not (forall (x) (P x))) (P a)) * **/ public boolean IsProofQuantInst() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_QUANT_INST; } /** * Indicates whether the term is a hypthesis marker. * Mark a hypothesis in a natural deduction style proof. **/ public boolean IsProofHypothesis() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_HYPOTHESIS; } /** * Indicates whether the term is a proof by lemma * * T1: false * [lemma T1]: (or (not l_1) ... (not l_n)) * * This proof object has one antecedent: a hypothetical proof for false. * It converts the proof in a proof for (or (not l_1) ... (not l_n)), * when T1 contains the hypotheses: l_1, ..., l_n. * **/ public boolean IsProofLemma() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_LEMMA; } /** * Indicates whether the term is a proof by unit resolution * * T1: (or l_1 ... l_n l_1' ... l_m') * T2: (not l_1) * ... * T(n+1): (not l_n) * [unit-resolution T1 ... T(n+1)]: (or l_1' ... l_m') * **/ public boolean IsProofUnitResolution() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_UNIT_RESOLUTION; } /** * Indicates whether the term is a proof by iff-true * * T1: p * [iff-true T1]: (iff p true) * **/ public boolean IsProofIFFTrue() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_IFF_TRUE; } /** * Indicates whether the term is a proof by iff-false * * T1: (not p) * [iff-false T1]: (iff p false) * **/ public boolean IsProofIFFFalse() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_IFF_FALSE; } /** * Indicates whether the term is a proof by commutativity * * [comm]: (= (f a b) (f b a)) * * f is a commutative operator. * * This proof object has no antecedents. * Remark: if f is bool, then = is iff. * **/ public boolean IsProofCommutativity() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_COMMUTATIVITY; } /** * Indicates whether the term is a proof for Tseitin-like axioms * * Proof object used to justify Tseitin's like axioms: * * (or (not (and p q)) p) * (or (not (and p q)) q) * (or (not (and p q r)) p) * (or (not (and p q r)) q) * (or (not (and p q r)) r) * ... * (or (and p q) (not p) (not q)) * (or (not (or p q)) p q) * (or (or p q) (not p)) * (or (or p q) (not q)) * (or (not (iff p q)) (not p) q) * (or (not (iff p q)) p (not q)) * (or (iff p q) (not p) (not q)) * (or (iff p q) p q) * (or (not (ite a b c)) (not a) b) * (or (not (ite a b c)) a c) * (or (ite a b c) (not a) (not b)) * (or (ite a b c) a (not c)) * (or (not (not a)) (not a)) * (or (not a) a) * * This proof object has no antecedents. * Note: all axioms are propositional tautologies. * Note also that 'and' and 'or' can take multiple arguments. * You can recover the propositional tautologies by * unfolding the Boolean connectives in the axioms a small * bounded number of steps (=3). * **/ public boolean IsProofDefAxiom() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DEF_AXIOM; } /** * Indicates whether the term is a proof for introduction of a name * * Introduces a name for a formula/term. * Suppose e is an expression with free variables x, and def-intro * introduces the name n(x). The possible cases are: * * When e is of Boolean type: * [def-intro]: (and (or n (not e)) (or (not n) e)) * * or: * [def-intro]: (or (not n) e) * when e only occurs positively. * * When e is of the form (ite cond th el): * [def-intro]: (and (or (not cond) (= n th)) (or cond (= n el))) * * Otherwise: * [def-intro]: (= n e) * **/ public boolean IsProofDefIntro() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_DEF_INTRO; } /** * Indicates whether the term is a proof for application of a definition * * [apply-def T1]: F ~ n * F is 'equivalent' to n, given that T1 is a proof that * n is a name for F. * **/ public boolean IsProofApplyDef() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_APPLY_DEF; } /** * Indicates whether the term is a proof iff-oeq * * T1: (iff p q) * [iff~ T1]: (~ p q) * **/ public boolean IsProofIFFOEQ() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_IFF_OEQ; } /** * Indicates whether the term is a proof for a positive NNF step * * Proof for a (positive) NNF step. Example: * * T1: (not s_1) ~ r_1 * T2: (not s_2) ~ r_2 * T3: s_1 ~ r_1' * T4: s_2 ~ r_2' * [nnf-pos T1 T2 T3 T4]: (~ (iff s_1 s_2) * (and (or r_1 r_2') (or r_1' r_2))) * * The negation normal form steps NNF_POS and NNF_NEG are used in the following cases: * (a) When creating the NNF of a positive force quantifier. * The quantifier is retained (unless the bound variables are eliminated). * Example * T1: q ~ q_new * [nnf-pos T1]: (~ (forall (x T) q) (forall (x T) q_new)) * * (b) When recursively creating NNF over Boolean formulas, where the top-level * connective is changed during NNF conversion. The relevant Boolean connectives * for NNF_POS are 'implies', 'iff', 'xor', 'ite'. * NNF_NEG furthermore handles the case where negation is pushed * over Boolean connectives 'and' and 'or'. * **/ public boolean IsProofNNFPos() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NNF_POS; } /** * Indicates whether the term is a proof for a negative NNF step * * Proof for a (negative) NNF step. Examples: * * T1: (not s_1) ~ r_1 * ... * Tn: (not s_n) ~ r_n * [nnf-neg T1 ... Tn]: (not (and s_1 ... s_n)) ~ (or r_1 ... r_n) * and * T1: (not s_1) ~ r_1 * ... * Tn: (not s_n) ~ r_n * [nnf-neg T1 ... Tn]: (not (or s_1 ... s_n)) ~ (and r_1 ... r_n) * and * T1: (not s_1) ~ r_1 * T2: (not s_2) ~ r_2 * T3: s_1 ~ r_1' * T4: s_2 ~ r_2' * [nnf-neg T1 T2 T3 T4]: (~ (not (iff s_1 s_2)) * (and (or r_1 r_2) (or r_1' r_2'))) * **/ public boolean IsProofNNFNeg() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NNF_NEG; } /** * Indicates whether the term is a proof for (~ P Q) here Q is in negation normal form. * * A proof for (~ P Q) where Q is in negation normal form. * * This proof object is only used if the parameter PROOF_MODE is 1. * * This proof object may have n antecedents. Each antecedent is a PR_DEF_INTRO. * **/ public boolean IsProofNNFStar() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_NNF_STAR; } /** * Indicates whether the term is a proof for (~ P Q) where Q is in conjunctive normal form. * * A proof for (~ P Q) where Q is in conjunctive normal form. * This proof object is only used if the parameter PROOF_MODE is 1. * This proof object may have n antecedents. Each antecedent is a PR_DEF_INTRO. * **/ public boolean IsProofCNFStar() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_CNF_STAR; } /** * Indicates whether the term is a proof for a Skolemization step * * Proof for: * * [sk]: (~ (not (forall x (p x y))) (not (p (sk y) y))) * [sk]: (~ (exists x (p x y)) (p (sk y) y)) * * This proof object has no antecedents. * **/ public boolean IsProofSkolemize() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_SKOLEMIZE; } /** * Indicates whether the term is a proof by modus ponens for equi-satisfiability. * * Modus ponens style rule for equi-satisfiability. * T1: p * T2: (~ p q) * [mp~ T1 T2]: q * **/ public boolean IsProofModusPonensOEQ() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_MODUS_PONENS_OEQ; } /** * Indicates whether the term is a proof for theory lemma * * Generic proof for theory lemmas. * * The theory lemma function comes with one or more parameters. * The first parameter indicates the name of the theory. * For the theory of arithmetic, additional parameters provide hints for * checking the theory lemma. * The hints for arithmetic are: * - farkas - followed by rational coefficients. Multiply the coefficients to the * inequalities in the lemma, add the (negated) inequalities and obtain a contradiction. * - triangle-eq - Indicates a lemma related to the equivalence: * (iff (= t1 t2) (and (<= t1 t2) (<= t2 t1))) * - gcd-test - Indicates an integer linear arithmetic lemma that uses a gcd test. * **/ public boolean IsProofTheoryLemma() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_PR_TH_LEMMA; } /** * Indicates whether the term is of an array sort. **/ public boolean IsRelation() { return (Native.isApp(Context.nCtx, NativeObject) != 0 && (Z3_sort_kind)Native.getSortKind(Context.nCtx, Native.getSort(Context.nCtx, NativeObject)) == Z3_sort_kind.Z3_RELATION_SORT); } /** * Indicates whether the term is an relation store * * Insert a record into a relation. * The function takes n+1 arguments, where the first argument is the relation and the remaining n elements * correspond to the n columns of the relation. * **/ public boolean IsRelationStore() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_STORE; } /** * Indicates whether the term is an empty relation **/ public boolean IsEmptyRelation() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_EMPTY; } /** * Indicates whether the term is a test for the emptiness of a relation **/ public boolean IsIsEmptyRelation() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_IS_EMPTY; } /** * Indicates whether the term is a relational join **/ public boolean IsRelationalJoin() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_JOIN; } /** * Indicates whether the term is the union or convex hull of two relations. * The function takes two arguments. **/ public boolean IsRelationUnion() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_UNION; } /** * Indicates whether the term is the widening of two relations * The function takes two arguments. **/ public boolean IsRelationWiden() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_WIDEN; } /** * Indicates whether the term is a projection of columns (provided as numbers in the parameters). * The function takes one argument. **/ public boolean IsRelationProject() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_PROJECT; } /** * Indicates whether the term is a relation filter * * Filter (restrict) a relation with respect to a predicate. * The first argument is a relation. * The second argument is a predicate with free de-Brujin indices * corresponding to the columns of the relation. * So the first column in the relation has index 0. * **/ public boolean IsRelationFilter() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_FILTER; } /** * Indicates whether the term is an intersection of a relation with the negation of another. * * Intersect the first relation with respect to negation * of the second relation (the function takes two arguments). * Logically, the specification can be described by a function * * target = filter_by_negation(pos, neg, columns) * * where columns are pairs c1, d1, .., cN, dN of columns from pos and neg, such that * target are elements in x in pos, such that there is no y in neg that agrees with * x on the columns c1, d1, .., cN, dN. * **/ public boolean IsRelationNegationFilter() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_NEGATION_FILTER; } /** * Indicates whether the term is the renaming of a column in a relation * * The function takes one argument. * The parameters contain the renaming as a cycle. * **/ public boolean IsRelationRename() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_RENAME; } /** * Indicates whether the term is the complement of a relation **/ public boolean IsRelationComplement() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_COMPLEMENT; } /** * Indicates whether the term is a relational select * * Check if a record is an element of the relation. * The function takes n+1 arguments, where the first argument is a relation, * and the remaining n arguments correspond to a record. * **/ public boolean IsRelationSelect() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_SELECT; } /** * Indicates whether the term is a relational clone (copy) * * Create a fresh copy (clone) of a relation. * The function is logically the identity, but * in the context of a register machine allows * for terms of kind * to perform destructive updates to the first argument. * **/ public boolean IsRelationClone() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_RA_CLONE; } /** * Indicates whether the term is of an array sort. **/ public boolean IsFiniteDomain() { return (Native.isApp(Context.nCtx, NativeObject) != 0 && (Z3_sort_kind)Native.getSortKind(Context.nCtx, Native.getSort(Context.nCtx, NativeObject)) == Z3_sort_kind.Z3_FINITE_DOMAIN_SORT); } /** * Indicates whether the term is a less than predicate over a finite domain. **/ public boolean IsFiniteDomainLT() { return FuncDecl.DeclKind == Z3_decl_kind.Z3_OP_FD_LT; } /** * The de-Burijn index of a bound variable. * * Bound variables are indexed by de-Bruijn indices. It is perhaps easiest to explain * the meaning of de-Bruijn indices by indicating the compilation process from * non-de-Bruijn formulas to de-Bruijn format. * * abs(forall (x1) phi) = forall (x1) abs1(phi, x1, 0) * abs(forall (x1, x2) phi) = abs(forall (x1) abs(forall (x2) phi)) * abs1(x, x, n) = b_n * abs1(y, x, n) = y * abs1(f(t1,...,tn), x, n) = f(abs1(t1,x,n), ..., abs1(tn,x,n)) * abs1(forall (x1) phi, x, n) = forall (x1) (abs1(phi, x, n+1)) * * The last line is significant: the index of a bound variable is different depending * on the scope in which it appears. The deeper x appears, the higher is its * index. * **/ public long Index() { if (!IsVar) throw new Z3Exception("Term is not a bound variable."); return Native.getIndexValue(Context.nCtx, NativeObject); } /** * Constructor for Expr **/ protected Expr(Context ctx) { super(ctx); } /** * Constructor for Expr **/ protected Expr(Context ctx, IntPtr obj) { super(ctx, obj); } void CheckNativeObject(IntPtr obj) { if (Native.isApp(Context.nCtx, obj) == 0 && (Z3_ast_kind)Native.getAstKind(Context.nCtx, obj) != Z3_ast_kind.Z3_VAR_AST && (Z3_ast_kind)Native.getAstKind(Context.nCtx, obj) != Z3_ast_kind.Z3_QUANTIFIER_AST) throw new Z3Exception("Underlying object is not a term"); super.CheckNativeObject(obj); } static Expr Create(Context ctx, FuncDecl f, Expr[] arguments) { IntPtr obj = Native.mkApp(ctx.nCtx, f.NativeObject, AST.ArrayLength(arguments), AST.ArrayToNative(arguments)); return Create(ctx, obj); } static Expr Create(Context ctx, IntPtr obj) { Z3_ast_kind k = (Z3_ast_kind)Native.getAstKind(ctx.nCtx, obj); if (k == Z3_ast_kind.Z3_QUANTIFIER_AST) return new Quantifier(ctx, obj); IntPtr s = Native.getSort(ctx.nCtx, obj); Z3_sort_kind sk = (Z3_sort_kind)Native.getSortKind(ctx.nCtx, s); if (Native.isAlgebraicNumber(ctx.nCtx, obj) != 0) // is this a numeral ast? return new AlgebraicNum(ctx, obj); if (Native.isNumeralAst(ctx.nCtx, obj) != 0) { switch (sk) { case Z3_sort_kind.Z3_INT_SORT: return new IntNum(ctx, obj); case Z3_sort_kind.Z3_REAL_SORT: return new RatNum(ctx, obj); case Z3_sort_kind.Z3_BV_SORT: return new BitVecNum(ctx, obj); } } switch (sk) { case Z3_sort_kind.Z3_BOOL_SORT: return new BoolExpr(ctx, obj); case Z3_sort_kind.Z3_INT_SORT: return new IntExpr(ctx, obj); case Z3_sort_kind.Z3_REAL_SORT: return new RealExpr(ctx, obj); case Z3_sort_kind.Z3_BV_SORT: return new BitVecExpr(ctx, obj); case Z3_sort_kind.Z3_ARRAY_SORT: return new ArrayExpr(ctx, obj); case Z3_sort_kind.Z3_DATATYPE_SORT: return new DatatypeExpr(ctx, obj); } return new Expr(ctx, obj); } } /** * Boolean expressions **/ public class BoolExpr extends Expr { /** Constructor for BoolExpr **/ protected BoolExpr(Context ctx) { super(ctx); } /** Constructor for BoolExpr **/ BoolExpr(Context ctx, IntPtr obj) { super(ctx, obj); } } /** * Arithmetic expressions (int/real) **/ public class ArithExpr extends Expr { /** Constructor for ArithExpr **/ protected ArithExpr(Context ctx) { super(ctx); } ArithExpr(Context ctx, IntPtr obj) { super(ctx, obj); } } /** * Int expressions **/ public class IntExpr extends ArithExpr { /** Constructor for IntExpr **/ protected IntExpr(Context ctx) { super(ctx); } IntExpr(Context ctx, IntPtr obj) { super(ctx, obj); } } /** * Real expressions **/ public class RealExpr extends ArithExpr { /** Constructor for RealExpr **/ protected RealExpr(Context ctx) { super(ctx); } RealExpr(Context ctx, IntPtr obj) { super(ctx, obj); } } /** * Bit-vector expressions **/ public class BitVecExpr extends Expr { /** * The size of the sort of a bit-vector term. **/ public long SortSize() { return ((BitVecSort)Sort).Size; } /** Constructor for BitVecExpr **/ protected BitVecExpr(Context ctx) { super(ctx); } BitVecExpr(Context ctx, IntPtr obj) { super(ctx, obj); } } /** * Array expressions **/ public class ArrayExpr extends Expr { /** Constructor for ArrayExpr **/ protected ArrayExpr(Context ctx) { super(ctx); } ArrayExpr(Context ctx, IntPtr obj) { super(ctx, obj); } } /** * Datatype expressions **/ public class DatatypeExpr extends Expr { /** Constructor for DatatypeExpr **/ protected DatatypeExpr(Context ctx) { super(ctx); } DatatypeExpr(Context ctx, IntPtr obj) { super(ctx, obj); } }