Z3
 
Loading...
Searching...
No Matches
Data Structures | Public Member Functions | Friends
expr Class Reference

A Z3 expression is used to represent formulas and terms. For Z3, a formula is any expression of sort Boolean. Every expression has a sort. More...

#include <z3++.h>

+ Inheritance diagram for expr:

Data Structures

class  iterator
 

Public Member Functions

 expr (context &c)
 
 expr (context &c, Z3_ast n)
 
sort get_sort () const
 Return the sort of this expression.
 
bool is_bool () const
 Return true if this is a Boolean expression.
 
bool is_int () const
 Return true if this is an integer expression.
 
bool is_real () const
 Return true if this is a real expression.
 
bool is_arith () const
 Return true if this is an integer or real expression.
 
bool is_bv () const
 Return true if this is a Bit-vector expression.
 
bool is_array () const
 Return true if this is a Array expression.
 
bool is_datatype () const
 Return true if this is a Datatype expression.
 
bool is_relation () const
 Return true if this is a Relation expression.
 
bool is_seq () const
 Return true if this is a sequence expression.
 
bool is_re () const
 Return true if this is a regular expression.
 
bool is_finite_domain () const
 Return true if this is a Finite-domain expression.
 
bool is_fpa () const
 Return true if this is a FloatingPoint expression. .
 
bool is_numeral () const
 Return true if this expression is a numeral. Specialized functions also return representations for the numerals as small integers, 64 bit integers or rational or decimal strings.
 
bool is_numeral_i64 (int64_t &i) const
 
bool is_numeral_u64 (uint64_t &i) const
 
bool is_numeral_i (int &i) const
 
bool is_numeral_u (unsigned &i) const
 
bool is_numeral (std::string &s) const
 
bool is_numeral (std::string &s, unsigned precision) const
 
bool is_numeral (double &d) const
 
bool as_binary (std::string &s) const
 
double as_double () const
 
uint64_t as_uint64 () const
 
int64_t as_int64 () const
 
bool is_app () const
 Return true if this expression is an application.
 
bool is_const () const
 Return true if this expression is a constant (i.e., an application with 0 arguments).
 
bool is_quantifier () const
 Return true if this expression is a quantifier.
 
bool is_forall () const
 Return true if this expression is a universal quantifier.
 
bool is_exists () const
 Return true if this expression is an existential quantifier.
 
bool is_lambda () const
 Return true if this expression is a lambda expression.
 
bool is_var () const
 Return true if this expression is a variable.
 
bool is_algebraic () const
 Return true if expression is an algebraic number.
 
bool is_well_sorted () const
 Return true if this expression is well sorted (aka type correct).
 
expr mk_is_inf () const
 Return Boolean expression to test for whether an FP expression is inf.
 
expr mk_is_nan () const
 Return Boolean expression to test for whether an FP expression is a NaN.
 
expr mk_is_normal () const
 Return Boolean expression to test for whether an FP expression is a normal.
 
expr mk_is_subnormal () const
 Return Boolean expression to test for whether an FP expression is a subnormal.
 
expr mk_is_zero () const
 Return Boolean expression to test for whether an FP expression is a zero.
 
expr mk_to_ieee_bv () const
 Convert this fpa into an IEEE BV.
 
expr mk_from_ieee_bv (sort const &s) const
 Convert this IEEE BV into a fpa.
 
std::string get_decimal_string (int precision) const
 Return string representation of numeral or algebraic number This method assumes the expression is numeral or algebraic.
 
expr algebraic_lower (unsigned precision) const
 
expr algebraic_upper (unsigned precision) const
 
expr_vector algebraic_poly () const
 Return coefficients for p of an algebraic number (root-obj p i)
 
unsigned algebraic_i () const
 Return i of an algebraic number (root-obj p i)
 
unsigned id () const
 retrieve unique identifier for expression.
 
int get_numeral_int () const
 Return int value of numeral, throw if result cannot fit in machine int.
 
unsigned get_numeral_uint () const
 Return uint value of numeral, throw if result cannot fit in machine uint.
 
int64_t get_numeral_int64 () const
 Return int64_t value of numeral, throw if result cannot fit in int64_t.
 
uint64_t get_numeral_uint64 () const
 Return uint64_t value of numeral, throw if result cannot fit in uint64_t.
 
Z3_lbool bool_value () const
 
expr numerator () const
 
expr denominator () const
 
bool is_string_value () const
 Return true if this expression is a string literal. The string can be accessed using get_string() and get_escaped_string()
 
std::string get_string () const
 for a string value expression return an escaped string value.
 
std::u32string get_u32string () const
 for a string value expression return an unespaced string value.
 
 operator Z3_app () const
 
func_decl decl () const
 Return the declaration associated with this application. This method assumes the expression is an application.
 
unsigned num_args () const
 Return the number of arguments in this application. This method assumes the expression is an application.
 
expr arg (unsigned i) const
 Return the i-th argument of this application. This method assumes the expression is an application.
 
expr_vector args () const
 Return a vector of all the arguments of this application. This method assumes the expression is an application.
 
expr update (expr_vector const &args) const
 Update the arguments of this application. Return a new expression with the same function declaration and updated arguments. The number of new arguments must match the current number of arguments.
 
expr update_field (func_decl const &field_access, expr const &new_value) const
 Update a datatype field. Return a new datatype expression with the specified field updated to the new value. The remaining fields are unchanged.
 
expr body () const
 Return the 'body' of this quantifier.
 
bool is_true () const
 
bool is_false () const
 
bool is_not () const
 
bool is_and () const
 
bool is_or () const
 
bool is_xor () const
 
bool is_implies () const
 
bool is_eq () const
 
bool is_ite () const
 
bool is_distinct () const
 
expr rotate_left (unsigned i) const
 
expr rotate_right (unsigned i) const
 
expr ext_rotate_left (expr const &n) const
 
expr ext_rotate_right (expr const &n) const
 
expr repeat (unsigned i) const
 
expr extract (unsigned hi, unsigned lo) const
 
expr bit2bool (unsigned i) const
 
unsigned lo () const
 
unsigned hi () const
 
expr extract (expr const &offset, expr const &length) const
 sequence and regular expression operations.
 
expr replace (expr const &src, expr const &dst) const
 
expr unit () const
 
expr contains (expr const &s) const
 
expr at (expr const &index) const
 
expr nth (expr const &index) const
 
expr length () const
 
expr stoi () const
 
expr itos () const
 
expr ubvtos () const
 
expr sbvtos () const
 
expr char_to_int () const
 
expr char_to_bv () const
 
expr char_from_bv () const
 
expr is_digit () const
 
expr loop (unsigned lo)
 create a looping regular expression.
 
expr loop (unsigned lo, unsigned hi)
 
expr operator[] (expr const &index) const
 
expr operator[] (expr_vector const &index) const
 
expr simplify () const
 Return a simplified version of this expression.
 
expr simplify (params const &p) const
 Return a simplified version of this expression. The parameter p is a set of parameters for the Z3 simplifier.
 
expr substitute (expr_vector const &src, expr_vector const &dst)
 Apply substitution. Replace src expressions by dst.
 
expr substitute (expr_vector const &dst)
 Apply substitution. Replace bound variables by expressions.
 
expr substitute (func_decl_vector const &funs, expr_vector const &bodies)
 Apply function substitution by macro definitions.

 
iterator begin ()
 
iterator end ()
 
- Public Member Functions inherited from ast
 ast (context &c)
 
 ast (context &c, Z3_ast n)
 
 ast (ast const &s)
 
 ~ast () override
 
 operator Z3_ast () const
 
 operator bool () const
 
astoperator= (ast const &s)
 
Z3_ast_kind kind () const
 
unsigned hash () const
 
std::string to_string () const
 
- Public Member Functions inherited from object
 object (context &c)
 
virtual ~object ()=default
 
contextctx () const
 
Z3_error_code check_error () const
 

Friends

expr operator! (expr const &a)
 Return an expression representing not(a).
 
expr operator&& (expr const &a, expr const &b)
 Return an expression representing a and b.
 
expr operator&& (expr const &a, bool b)
 Return an expression representing a and b. The C++ Boolean value b is automatically converted into a Z3 Boolean constant.
 
expr operator&& (bool a, expr const &b)
 Return an expression representing a and b. The C++ Boolean value a is automatically converted into a Z3 Boolean constant.
 
expr operator|| (expr const &a, expr const &b)
 Return an expression representing a or b.
 
expr operator|| (expr const &a, bool b)
 Return an expression representing a or b. The C++ Boolean value b is automatically converted into a Z3 Boolean constant.
 
expr operator|| (bool a, expr const &b)
 Return an expression representing a or b. The C++ Boolean value a is automatically converted into a Z3 Boolean constant.
 
expr implies (expr const &a, expr const &b)
 
expr implies (expr const &a, bool b)
 
expr implies (bool a, expr const &b)
 
expr mk_or (expr_vector const &args)
 
expr mk_xor (expr_vector const &args)
 
expr mk_and (expr_vector const &args)
 
expr ite (expr const &c, expr const &t, expr const &e)
 Create the if-then-else expression ite(c, t, e)
 
expr distinct (expr_vector const &args)
 
expr concat (expr const &a, expr const &b)
 
expr concat (expr_vector const &args)
 
expr operator== (expr const &a, expr const &b)
 
expr operator== (expr const &a, int b)
 
expr operator== (int a, expr const &b)
 
expr operator!= (expr const &a, expr const &b)
 
expr operator!= (expr const &a, int b)
 
expr operator!= (int a, expr const &b)
 
expr operator+ (expr const &a, expr const &b)
 
expr operator+ (expr const &a, int b)
 
expr operator+ (int a, expr const &b)
 
expr sum (expr_vector const &args)
 
expr operator* (expr const &a, expr const &b)
 
expr operator* (expr const &a, int b)
 
expr operator* (int a, expr const &b)
 
expr pw (expr const &a, expr const &b)
 
expr pw (expr const &a, int b)
 
expr pw (int a, expr const &b)
 
expr mod (expr const &a, expr const &b)
 
expr mod (expr const &a, int b)
 
expr mod (int a, expr const &b)
 
expr rem (expr const &a, expr const &b)
 
expr rem (expr const &a, int b)
 
expr rem (int a, expr const &b)
 
expr is_int (expr const &e)
 
expr operator/ (expr const &a, expr const &b)
 
expr operator/ (expr const &a, int b)
 
expr operator/ (int a, expr const &b)
 
expr operator- (expr const &a)
 
expr operator- (expr const &a, expr const &b)
 
expr operator- (expr const &a, int b)
 
expr operator- (int a, expr const &b)
 
expr operator<= (expr const &a, expr const &b)
 
expr operator<= (expr const &a, int b)
 
expr operator<= (int a, expr const &b)
 
expr operator>= (expr const &a, expr const &b)
 
expr operator>= (expr const &a, int b)
 
expr operator>= (int a, expr const &b)
 
expr operator< (expr const &a, expr const &b)
 
expr operator< (expr const &a, int b)
 
expr operator< (int a, expr const &b)
 
expr operator> (expr const &a, expr const &b)
 
expr operator> (expr const &a, int b)
 
expr operator> (int a, expr const &b)
 
expr pble (expr_vector const &es, int const *coeffs, int bound)
 
expr pbge (expr_vector const &es, int const *coeffs, int bound)
 
expr pbeq (expr_vector const &es, int const *coeffs, int bound)
 
expr atmost (expr_vector const &es, unsigned bound)
 
expr atleast (expr_vector const &es, unsigned bound)
 
expr operator& (expr const &a, expr const &b)
 
expr operator& (expr const &a, int b)
 
expr operator& (int a, expr const &b)
 
expr operator^ (expr const &a, expr const &b)
 
expr operator^ (expr const &a, int b)
 
expr operator^ (int a, expr const &b)
 
expr operator| (expr const &a, expr const &b)
 
expr operator| (expr const &a, int b)
 
expr operator| (int a, expr const &b)
 
expr nand (expr const &a, expr const &b)
 
expr nor (expr const &a, expr const &b)
 
expr xnor (expr const &a, expr const &b)
 
expr min (expr const &a, expr const &b)
 
expr max (expr const &a, expr const &b)
 
expr bv2int (expr const &a, bool is_signed)
 bit-vector and integer conversions.
 
expr int2bv (unsigned n, expr const &a)
 
expr bvadd_no_overflow (expr const &a, expr const &b, bool is_signed)
 bit-vector overflow/underflow checks
 
expr bvadd_no_underflow (expr const &a, expr const &b)
 
expr bvsub_no_overflow (expr const &a, expr const &b)
 
expr bvsub_no_underflow (expr const &a, expr const &b, bool is_signed)
 
expr bvsdiv_no_overflow (expr const &a, expr const &b)
 
expr bvneg_no_overflow (expr const &a)
 
expr bvmul_no_overflow (expr const &a, expr const &b, bool is_signed)
 
expr bvmul_no_underflow (expr const &a, expr const &b)
 
expr bvredor (expr const &a)
 
expr bvredand (expr const &a)
 
expr abs (expr const &a)
 
expr sqrt (expr const &a, expr const &rm)
 
expr fp_eq (expr const &a, expr const &b)
 
expr operator~ (expr const &a)
 
expr fma (expr const &a, expr const &b, expr const &c, expr const &rm)
 FloatingPoint fused multiply-add.
 
expr fpa_fp (expr const &sgn, expr const &exp, expr const &sig)
 Create an expression of FloatingPoint sort from three bit-vector expressions.
 
expr fpa_to_sbv (expr const &t, unsigned sz)
 Conversion of a floating-point term into a signed bit-vector.
 
expr fpa_to_ubv (expr const &t, unsigned sz)
 Conversion of a floating-point term into an unsigned bit-vector.
 
expr sbv_to_fpa (expr const &t, sort s)
 Conversion of a signed bit-vector term into a floating-point.
 
expr ubv_to_fpa (expr const &t, sort s)
 Conversion of an unsigned bit-vector term into a floating-point.
 
expr fpa_to_fpa (expr const &t, sort s)
 Conversion of a floating-point term into another floating-point.
 
expr round_fpa_to_closest_integer (expr const &t)
 Round a floating-point term into its closest integer.
 
expr range (expr const &lo, expr const &hi)
 

Additional Inherited Members

- Protected Attributes inherited from ast
Z3_ast m_ast
 
- Protected Attributes inherited from object
contextm_ctx
 

Detailed Description

A Z3 expression is used to represent formulas and terms. For Z3, a formula is any expression of sort Boolean. Every expression has a sort.

Definition at line 919 of file z3++.h.

Constructor & Destructor Documentation

◆ expr() [1/2]

expr ( context c)
inline

Definition at line 921 of file z3++.h.

921:ast(c) {}
ast(context &c)
Definition z3++.h:625

◆ expr() [2/2]

expr ( context c,
Z3_ast  n 
)
inline

Definition at line 922 of file z3++.h.

922:ast(c, reinterpret_cast<Z3_ast>(n)) {}
System.IntPtr Z3_ast

Member Function Documentation

◆ algebraic_i()

unsigned algebraic_i ( ) const
inline

Return i of an algebraic number (root-obj p i)

Definition at line 1155 of file z3++.h.

1155 {
1156 assert(is_algebraic());
1157 unsigned i = Z3_algebraic_get_i(ctx(), m_ast);
1158 check_error();
1159 return i;
1160 }
Z3_ast m_ast
Definition z3++.h:623
bool is_algebraic() const
Return true if expression is an algebraic number.
Definition z3++.h:1037
Z3_error_code check_error() const
Definition z3++.h:545
context & ctx() const
Definition z3++.h:544
unsigned Z3_API Z3_algebraic_get_i(Z3_context c, Z3_ast a)
Return which root of the polynomial the algebraic number represents.

◆ algebraic_lower()

expr algebraic_lower ( unsigned  precision) const
inline

Retrieve lower and upper bounds for algebraic numerals based on a decimal precision

Definition at line 1128 of file z3++.h.

1128 {
1129 assert(is_algebraic());
1130 Z3_ast r = Z3_get_algebraic_number_lower(ctx(), m_ast, precision);
1131 check_error();
1132 return expr(ctx(), r);
1133 }
expr(context &c)
Definition z3++.h:921
Z3_ast Z3_API Z3_get_algebraic_number_lower(Z3_context c, Z3_ast a, unsigned precision)
Return a lower bound for the given real algebraic number. The interval isolating the number is smalle...

◆ algebraic_poly()

expr_vector algebraic_poly ( ) const
inline

Return coefficients for p of an algebraic number (root-obj p i)

Definition at line 1145 of file z3++.h.

1145 {
1146 assert(is_algebraic());
1148 check_error();
1149 return expr_vector(ctx(), r);
1150 }
Z3_ast_vector Z3_API Z3_algebraic_get_poly(Z3_context c, Z3_ast a)
Return the coefficients of the defining polynomial.
System.IntPtr Z3_ast_vector
ast_vector_tpl< expr > expr_vector
Definition z3++.h:77

◆ algebraic_upper()

expr algebraic_upper ( unsigned  precision) const
inline

Definition at line 1135 of file z3++.h.

1135 {
1136 assert(is_algebraic());
1137 Z3_ast r = Z3_get_algebraic_number_upper(ctx(), m_ast, precision);
1138 check_error();
1139 return expr(ctx(), r);
1140 }
Z3_ast Z3_API Z3_get_algebraic_number_upper(Z3_context c, Z3_ast a, unsigned precision)
Return a upper bound for the given real algebraic number. The interval isolating the number is smalle...

◆ arg()

expr arg ( unsigned  i) const
inline

Return the i-th argument of this application. This method assumes the expression is an application.

Precondition
is_app()
i < num_args()

Definition at line 1316 of file z3++.h.

1316{ Z3_ast r = Z3_get_app_arg(ctx(), *this, i); check_error(); return expr(ctx(), r); }
Z3_ast Z3_API Z3_get_app_arg(Z3_context c, Z3_app a, unsigned i)
Return the i-th argument of the given application.

Referenced by AstRef::__bool__(), expr::args(), ExprRef::children(), and expr::iterator::operator*().

◆ args()

expr_vector args ( ) const
inline

Return a vector of all the arguments of this application. This method assumes the expression is an application.

Precondition
is_app()

Definition at line 1323 of file z3++.h.

1323 {
1324 expr_vector vec(ctx());
1325 unsigned argCnt = num_args();
1326 for (unsigned i = 0; i < argCnt; ++i)
1327 vec.push_back(arg(i));
1328 return vec;
1329 }
unsigned num_args() const
Return the number of arguments in this application. This method assumes the expression is an applicat...
Definition z3++.h:1308
expr arg(unsigned i) const
Return the i-th argument of this application. This method assumes the expression is an application.
Definition z3++.h:1316

Referenced by expr::update().

◆ as_binary()

bool as_binary ( std::string &  s) const
inline

Definition at line 997 of file z3++.h.

997{ if (!is_numeral()) return false; s = Z3_get_numeral_binary_string(ctx(), m_ast); check_error(); return true; }
bool is_numeral() const
Return true if this expression is a numeral. Specialized functions also return representations for th...
Definition z3++.h:989
Z3_string Z3_API Z3_get_numeral_binary_string(Z3_context c, Z3_ast a)
Return numeral value, as a binary string of a numeric constant term.

◆ as_double()

double as_double ( ) const
inline

Definition at line 999 of file z3++.h.

999{ double d = 0; is_numeral(d); return d; }

◆ as_int64()

int64_t as_int64 ( ) const
inline

Definition at line 1001 of file z3++.h.

1001{ int64_t r = 0; is_numeral_i64(r); return r; }
bool is_numeral_i64(int64_t &i) const
Definition z3++.h:990

◆ as_uint64()

uint64_t as_uint64 ( ) const
inline

Definition at line 1000 of file z3++.h.

1000{ uint64_t r = 0; is_numeral_u64(r); return r; }
bool is_numeral_u64(uint64_t &i) const
Definition z3++.h:991

◆ at()

expr at ( expr const index) const
inline

Definition at line 1619 of file z3++.h.

1619 {
1620 check_context(*this, index);
1621 Z3_ast r = Z3_mk_seq_at(ctx(), *this, index);
1622 check_error();
1623 return expr(ctx(), r);
1624 }
friend void check_context(object const &a, object const &b)
Definition z3++.h:548
Z3_ast Z3_API Z3_mk_seq_at(Z3_context c, Z3_ast s, Z3_ast index)
Retrieve from s the unit sequence positioned at position index. The sequence is empty if the index is...

◆ begin()

iterator begin ( )
inline

Definition at line 1748 of file z3++.h.

1748{ return iterator(*this, 0); }

◆ bit2bool()

expr bit2bool ( unsigned  i) const
inline

Definition at line 1549 of file z3++.h.

1549{ Z3_ast r = Z3_mk_bit2bool(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
Z3_error_code check_error() const
Auxiliary method used to check for API usage errors.
Definition z3++.h:241
Z3_ast Z3_API Z3_mk_bit2bool(Z3_context c, unsigned i, Z3_ast t1)
Extracts the bit at position i of a bit-vector and yields a boolean.

◆ body()

expr body ( ) const
inline

Return the 'body' of this quantifier.

Precondition
is_quantifier()

Definition at line 1357 of file z3++.h.

1357{ assert(is_quantifier()); Z3_ast r = Z3_get_quantifier_body(ctx(), *this); check_error(); return expr(ctx(), r); }
bool is_quantifier() const
Return true if this expression is a quantifier.
Definition z3++.h:1015
Z3_ast Z3_API Z3_get_quantifier_body(Z3_context c, Z3_ast a)
Return body of quantifier.

Referenced by QuantifierRef::children().

◆ bool_value()

Z3_lbool bool_value ( ) const
inline

Definition at line 1241 of file z3++.h.

1241 {
1242 return Z3_get_bool_value(ctx(), m_ast);
1243 }
Z3_lbool Z3_API Z3_get_bool_value(Z3_context c, Z3_ast a)
Return Z3_L_TRUE if a is true, Z3_L_FALSE if it is false, and Z3_L_UNDEF otherwise.

◆ char_from_bv()

expr char_from_bv ( ) const
inline

Definition at line 1666 of file z3++.h.

1666 {
1667 Z3_ast r = Z3_mk_char_from_bv(ctx(), *this);
1668 check_error();
1669 return expr(ctx(), r);
1670 }
Z3_ast Z3_API Z3_mk_char_from_bv(Z3_context c, Z3_ast bv)
Create a character from a bit-vector (code point).

◆ char_to_bv()

expr char_to_bv ( ) const
inline

Definition at line 1661 of file z3++.h.

1661 {
1662 Z3_ast r = Z3_mk_char_to_bv(ctx(), *this);
1663 check_error();
1664 return expr(ctx(), r);
1665 }
Z3_ast Z3_API Z3_mk_char_to_bv(Z3_context c, Z3_ast ch)
Create a bit-vector (code point) from character.

◆ char_to_int()

expr char_to_int ( ) const
inline

Definition at line 1656 of file z3++.h.

1656 {
1657 Z3_ast r = Z3_mk_char_to_int(ctx(), *this);
1658 check_error();
1659 return expr(ctx(), r);
1660 }
Z3_ast Z3_API Z3_mk_char_to_int(Z3_context c, Z3_ast ch)
Create an integer (code point) from character.

◆ contains()

expr contains ( expr const s) const
inline

Definition at line 1613 of file z3++.h.

1613 {
1614 check_context(*this, s);
1615 Z3_ast r = Z3_mk_seq_contains(ctx(), *this, s);
1616 check_error();
1617 return expr(ctx(), r);
1618 }
Z3_ast Z3_API Z3_mk_seq_contains(Z3_context c, Z3_ast container, Z3_ast containee)
Check if container contains containee.

◆ decl()

func_decl decl ( ) const
inline

Return the declaration associated with this application. This method assumes the expression is an application.

Precondition
is_app()

Definition at line 1301 of file z3++.h.

1301{ Z3_func_decl f = Z3_get_app_decl(ctx(), *this); check_error(); return func_decl(ctx(), f); }
Z3_func_decl Z3_API Z3_get_app_decl(Z3_context c, Z3_app a)
Return the declaration of a constant or function application.
System.IntPtr Z3_func_decl

Referenced by expr::hi(), expr::is_and(), expr::is_distinct(), expr::is_eq(), expr::is_false(), expr::is_implies(), expr::is_ite(), expr::is_not(), expr::is_or(), expr::is_true(), expr::is_xor(), expr::lo(), and ExprRef::params().

◆ denominator()

expr denominator ( ) const
inline

Definition at line 1253 of file z3++.h.

1253 {
1254 assert(is_numeral());
1256 check_error();
1257 return expr(ctx(),r);
1258 }
Z3_ast Z3_API Z3_get_denominator(Z3_context c, Z3_ast a)
Return the denominator (as a numeral AST) of a numeral AST of sort Real.

Referenced by RatNumRef::denominator_as_long(), and RatNumRef::is_int_value().

◆ end()

iterator end ( )
inline

Definition at line 1749 of file z3++.h.

1749{ return iterator(*this, is_app() ? num_args() : 0); }
bool is_app() const
Return true if this expression is an application.
Definition z3++.h:1007

◆ ext_rotate_left()

expr ext_rotate_left ( expr const n) const
inline

Definition at line 1536 of file z3++.h.

1536{ Z3_ast r = Z3_mk_ext_rotate_left(ctx(), *this, n); ctx().check_error(); return expr(ctx(), r); }
Z3_ast Z3_API Z3_mk_ext_rotate_left(Z3_context c, Z3_ast t1, Z3_ast t2)
Rotate bits of t1 to the left t2 times.

◆ ext_rotate_right()

expr ext_rotate_right ( expr const n) const
inline

Definition at line 1537 of file z3++.h.

1537{ Z3_ast r = Z3_mk_ext_rotate_right(ctx(), *this, n); ctx().check_error(); return expr(ctx(), r); }
Z3_ast Z3_API Z3_mk_ext_rotate_right(Z3_context c, Z3_ast t1, Z3_ast t2)
Rotate bits of t1 to the right t2 times.

◆ extract() [1/2]

expr extract ( expr const offset,
expr const length 
) const
inline

sequence and regular expression operations.

  • is overloaded as sequence concatenation and regular expression union. concat is overloaded to handle sequences and regular expressions

Definition at line 1598 of file z3++.h.

1598 {
1599 check_context(*this, offset); check_context(offset, length);
1600 Z3_ast r = Z3_mk_seq_extract(ctx(), *this, offset, length); check_error(); return expr(ctx(), r);
1601 }
expr length() const
Definition z3++.h:1631
Z3_ast Z3_API Z3_mk_seq_extract(Z3_context c, Z3_ast s, Z3_ast offset, Z3_ast length)
Extract subsequence starting at offset of length.

◆ extract() [2/2]

expr extract ( unsigned  hi,
unsigned  lo 
) const
inline

Definition at line 1548 of file z3++.h.

1548{ Z3_ast r = Z3_mk_extract(ctx(), hi, lo, *this); ctx().check_error(); return expr(ctx(), r); }
unsigned hi() const
Definition z3++.h:1551
unsigned lo() const
Definition z3++.h:1550
Z3_ast Z3_API Z3_mk_extract(Z3_context c, unsigned high, unsigned low, Z3_ast t1)
Extract the bits high down to low from a bit-vector of size m to yield a new bit-vector of size n,...

◆ get_decimal_string()

std::string get_decimal_string ( int  precision) const
inline

Return string representation of numeral or algebraic number This method assumes the expression is numeral or algebraic.

Precondition
is_numeral() || is_algebraic()

Definition at line 1120 of file z3++.h.

1120 {
1121 assert(is_numeral() || is_algebraic());
1122 return std::string(Z3_get_numeral_decimal_string(ctx(), m_ast, precision));
1123 }
Z3_string Z3_API Z3_get_numeral_decimal_string(Z3_context c, Z3_ast a, unsigned precision)
Return numeral as a string in decimal notation. The result has at most precision decimal places.

◆ get_numeral_int()

int get_numeral_int ( ) const
inline

Return int value of numeral, throw if result cannot fit in machine int.

It only makes sense to use this function if the caller can ensure that the result is an integer or if exceptions are enabled. If exceptions are disabled, then use the is_numeral_i function.

Precondition
is_numeral()

Definition at line 1177 of file z3++.h.

1177 {
1178 int result = 0;
1179 if (!is_numeral_i(result)) {
1180 assert(ctx().enable_exceptions());
1181 if (!ctx().enable_exceptions()) return 0;
1182 Z3_THROW(exception("numeral does not fit in machine int"));
1183 }
1184 return result;
1185 }
bool is_numeral_i(int &i) const
Definition z3++.h:992
#define Z3_THROW(x)
Definition z3++.h:134

◆ get_numeral_int64()

int64_t get_numeral_int64 ( ) const
inline

Return int64_t value of numeral, throw if result cannot fit in int64_t.

Precondition
is_numeral()

Definition at line 1213 of file z3++.h.

1213 {
1214 assert(is_numeral());
1215 int64_t result = 0;
1216 if (!is_numeral_i64(result)) {
1217 assert(ctx().enable_exceptions());
1218 if (!ctx().enable_exceptions()) return 0;
1219 Z3_THROW(exception("numeral does not fit in machine int64_t"));
1220 }
1221 return result;
1222 }

◆ get_numeral_uint()

unsigned get_numeral_uint ( ) const
inline

Return uint value of numeral, throw if result cannot fit in machine uint.

It only makes sense to use this function if the caller can ensure that the result is an integer or if exceptions are enabled. If exceptions are disabled, then use the is_numeral_u function.

Precondition
is_numeral()

Definition at line 1196 of file z3++.h.

1196 {
1197 assert(is_numeral());
1198 unsigned result = 0;
1199 if (!is_numeral_u(result)) {
1200 assert(ctx().enable_exceptions());
1201 if (!ctx().enable_exceptions()) return 0;
1202 Z3_THROW(exception("numeral does not fit in machine uint"));
1203 }
1204 return result;
1205 }
bool is_numeral_u(unsigned &i) const
Definition z3++.h:993

◆ get_numeral_uint64()

uint64_t get_numeral_uint64 ( ) const
inline

Return uint64_t value of numeral, throw if result cannot fit in uint64_t.

Precondition
is_numeral()

Definition at line 1230 of file z3++.h.

1230 {
1231 assert(is_numeral());
1232 uint64_t result = 0;
1233 if (!is_numeral_u64(result)) {
1234 assert(ctx().enable_exceptions());
1235 if (!ctx().enable_exceptions()) return 0;
1236 Z3_THROW(exception("numeral does not fit in machine uint64_t"));
1237 }
1238 return result;
1239 }

◆ get_sort()

sort get_sort ( ) const
inline

Return the sort of this expression.

Definition at line 927 of file z3++.h.

927{ Z3_sort s = Z3_get_sort(*m_ctx, m_ast); check_error(); return sort(*m_ctx, s); }
context * m_ctx
Definition z3++.h:540
Z3_sort Z3_API Z3_get_sort(Z3_context c, Z3_ast a)
Return the sort of an AST node.
System.IntPtr Z3_sort

Referenced by expr::is_arith(), expr::is_array(), expr::is_bool(), expr::is_bv(), expr::is_datatype(), expr::is_finite_domain(), expr::is_fpa(), expr::is_int(), expr::is_re(), expr::is_real(), expr::is_relation(), expr::is_seq(), and ModelRef::sorts().

◆ get_string()

std::string get_string ( ) const
inline

for a string value expression return an escaped string value.

Precondition
expression is for a string value.

Definition at line 1272 of file z3++.h.

1272 {
1273 assert(is_string_value());
1274 char const* s = Z3_get_string(ctx(), m_ast);
1275 check_error();
1276 return std::string(s);
1277 }
bool is_string_value() const
Return true if this expression is a string literal. The string can be accessed using get_string() and...
Definition z3++.h:1265
Z3_string Z3_API Z3_get_string(Z3_context c, Z3_ast s)
Retrieve the string constant stored in s. Characters outside the basic printable ASCII range are esca...

◆ get_u32string()

std::u32string get_u32string ( ) const
inline

for a string value expression return an unespaced string value.

Precondition
expression is for a string value.

Definition at line 1284 of file z3++.h.

1284 {
1285 assert(is_string_value());
1286 unsigned n = Z3_get_string_length(ctx(), m_ast);
1287 std::u32string s;
1288 s.resize(n);
1289 Z3_get_string_contents(ctx(), m_ast, n, (unsigned*)s.data());
1290 return s;
1291 }
void Z3_API Z3_get_string_contents(Z3_context c, Z3_ast s, unsigned length, unsigned contents[])
Retrieve the unescaped string constant stored in s.
unsigned Z3_API Z3_get_string_length(Z3_context c, Z3_ast s)
Retrieve the length of the unescaped string constant stored in s.

◆ hi()

unsigned hi ( ) const
inline

Definition at line 1551 of file z3++.h.

1551{ assert (is_app() && Z3_get_decl_num_parameters(ctx(), decl()) == 2); return static_cast<unsigned>(Z3_get_decl_int_parameter(ctx(), decl(), 0)); }
func_decl decl() const
Return the declaration associated with this application. This method assumes the expression is an app...
Definition z3++.h:1301
unsigned Z3_API Z3_get_decl_num_parameters(Z3_context c, Z3_func_decl d)
Return the number of parameters associated with a declaration.
int Z3_API Z3_get_decl_int_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the integer value associated with an integer parameter.

Referenced by expr::extract(), and expr::loop().

◆ id()

unsigned id ( ) const
inline

retrieve unique identifier for expression.

Definition at line 1165 of file z3++.h.

1165{ unsigned r = Z3_get_ast_id(ctx(), m_ast); check_error(); return r; }
unsigned Z3_API Z3_get_ast_id(Z3_context c, Z3_ast t)
Return a unique identifier for t. The identifier is unique up to structural equality....

◆ is_algebraic()

bool is_algebraic ( ) const
inline

Return true if expression is an algebraic number.

Definition at line 1037 of file z3++.h.

1037{ return Z3_is_algebraic_number(ctx(), m_ast); }
bool Z3_API Z3_is_algebraic_number(Z3_context c, Z3_ast a)
Return true if the given AST is a real algebraic number.

Referenced by expr::algebraic_i(), expr::algebraic_lower(), expr::algebraic_poly(), expr::algebraic_upper(), and expr::get_decimal_string().

◆ is_and()

bool is_and ( ) const
inline

Definition at line 1426 of file z3++.h.

1426{ return is_app() && Z3_OP_AND == decl().decl_kind(); }
Z3_decl_kind decl_kind() const
Definition z3++.h:845
@ Z3_OP_AND
Definition z3_api.h:995

◆ is_app()

bool is_app ( ) const
inline

Return true if this expression is an application.

Definition at line 1007 of file z3++.h.

1007{ return kind() == Z3_APP_AST || kind() == Z3_NUMERAL_AST; }
Z3_ast_kind kind() const
Definition z3++.h:639
@ Z3_APP_AST
Definition z3_api.h:144
@ Z3_NUMERAL_AST
Definition z3_api.h:143

Referenced by expr::end(), expr::hi(), expr::is_and(), expr::is_const(), expr::is_distinct(), expr::is_eq(), expr::is_false(), expr::is_implies(), expr::is_ite(), expr::is_not(), expr::is_or(), expr::is_true(), expr::is_xor(), expr::lo(), and expr::operator Z3_app().

◆ is_arith()

bool is_arith ( ) const
inline

Return true if this is an integer or real expression.

Definition at line 944 of file z3++.h.

944{ return get_sort().is_arith(); }
sort get_sort() const
Return the sort of this expression.
Definition z3++.h:927
bool is_arith() const
Return true if this sort is the Integer or Real sort.
Definition z3++.h:762

◆ is_array()

bool is_array ( ) const
inline

Return true if this is a Array expression.

Definition at line 952 of file z3++.h.

952{ return get_sort().is_array(); }
bool is_array() const
Return true if this sort is a Array sort.
Definition z3++.h:770

Referenced by expr::operator[]().

◆ is_bool()

bool is_bool ( ) const
inline

Return true if this is a Boolean expression.

Definition at line 932 of file z3++.h.

932{ return get_sort().is_bool(); }
bool is_bool() const
Return true if this sort is the Boolean sort.
Definition z3++.h:750

Referenced by solver::add(), optimize::add(), optimize::add(), solver::add(), optimize::add(), optimize::add_soft(), and optimize::add_soft().

◆ is_bv()

bool is_bv ( ) const
inline

Return true if this is a Bit-vector expression.

Definition at line 948 of file z3++.h.

948{ return get_sort().is_bv(); }
bool is_bv() const
Return true if this sort is a Bit-vector sort.
Definition z3++.h:766

Referenced by expr::mk_from_ieee_bv().

◆ is_const()

bool is_const ( ) const
inline

Return true if this expression is a constant (i.e., an application with 0 arguments).

Definition at line 1011 of file z3++.h.

1011{ return is_app() && num_args() == 0; }

Referenced by solver::add().

◆ is_datatype()

bool is_datatype ( ) const
inline

Return true if this is a Datatype expression.

Definition at line 956 of file z3++.h.

956{ return get_sort().is_datatype(); }
bool is_datatype() const
Return true if this sort is a Datatype sort.
Definition z3++.h:774

Referenced by expr::update_field().

◆ is_digit()

expr is_digit ( ) const
inline

Definition at line 1671 of file z3++.h.

1671 {
1672 Z3_ast r = Z3_mk_char_is_digit(ctx(), *this);
1673 check_error();
1674 return expr(ctx(), r);
1675 }
Z3_ast Z3_API Z3_mk_char_is_digit(Z3_context c, Z3_ast ch)
Create a check if the character is a digit.

◆ is_distinct()

bool is_distinct ( ) const
inline

Definition at line 1432 of file z3++.h.

1432{ return is_app() && Z3_OP_DISTINCT == decl().decl_kind(); }
@ Z3_OP_DISTINCT
Definition z3_api.h:993

◆ is_eq()

bool is_eq ( ) const
inline

Definition at line 1430 of file z3++.h.

1430{ return is_app() && Z3_OP_EQ == decl().decl_kind(); }
@ Z3_OP_EQ
Definition z3_api.h:992

◆ is_exists()

bool is_exists ( ) const
inline

Return true if this expression is an existential quantifier.

Definition at line 1024 of file z3++.h.

1024{ return Z3_is_quantifier_exists(ctx(), m_ast); }
bool Z3_API Z3_is_quantifier_exists(Z3_context c, Z3_ast a)
Determine if ast is an existential quantifier.

◆ is_false()

bool is_false ( ) const
inline

Definition at line 1424 of file z3++.h.

1424{ return is_app() && Z3_OP_FALSE == decl().decl_kind(); }
@ Z3_OP_FALSE
Definition z3_api.h:991

◆ is_finite_domain()

bool is_finite_domain ( ) const
inline

Return true if this is a Finite-domain expression.

Remarks
Finite-domain is special kind of interpreted sort: is_bool(), is_bv() and is_finite_domain() are mutually exclusive.

Definition at line 978 of file z3++.h.

978{ return get_sort().is_finite_domain(); }
bool is_finite_domain() const
Return true if this sort is a Finite domain sort.
Definition z3++.h:790

◆ is_forall()

bool is_forall ( ) const
inline

Return true if this expression is a universal quantifier.

Definition at line 1020 of file z3++.h.

1020{ return Z3_is_quantifier_forall(ctx(), m_ast); }
bool Z3_API Z3_is_quantifier_forall(Z3_context c, Z3_ast a)
Determine if an ast is a universal quantifier.

◆ is_fpa()

bool is_fpa ( ) const
inline

Return true if this is a FloatingPoint expression. .

Definition at line 982 of file z3++.h.

982{ return get_sort().is_fpa(); }
bool is_fpa() const
Return true if this sort is a Floating point sort.
Definition z3++.h:794

Referenced by expr::mk_is_inf(), expr::mk_is_nan(), expr::mk_is_normal(), expr::mk_is_subnormal(), expr::mk_is_zero(), and expr::mk_to_ieee_bv().

◆ is_implies()

bool is_implies ( ) const
inline

Definition at line 1429 of file z3++.h.

1429{ return is_app() && Z3_OP_IMPLIES == decl().decl_kind(); }
@ Z3_OP_IMPLIES
Definition z3_api.h:1000

◆ is_int()

bool is_int ( ) const
inline

Return true if this is an integer expression.

Definition at line 936 of file z3++.h.

936{ return get_sort().is_int(); }
bool is_int() const
Return true if this sort is the Integer sort.
Definition z3++.h:754

Referenced by IntNumRef::as_long(), and ArithSortRef::subsort().

◆ is_ite()

bool is_ite ( ) const
inline

Definition at line 1431 of file z3++.h.

1431{ return is_app() && Z3_OP_ITE == decl().decl_kind(); }
@ Z3_OP_ITE
Definition z3_api.h:994

◆ is_lambda()

bool is_lambda ( ) const
inline

Return true if this expression is a lambda expression.

Definition at line 1028 of file z3++.h.

1028{ return Z3_is_lambda(ctx(), m_ast); }
bool Z3_API Z3_is_lambda(Z3_context c, Z3_ast a)
Determine if ast is a lambda expression.

Referenced by QuantifierRef::__getitem__(), and QuantifierRef::sort().

◆ is_not()

bool is_not ( ) const
inline

Definition at line 1425 of file z3++.h.

1425{ return is_app() && Z3_OP_NOT == decl().decl_kind(); }
@ Z3_OP_NOT
Definition z3_api.h:999

◆ is_numeral() [1/4]

bool is_numeral ( ) const
inline

Return true if this expression is a numeral. Specialized functions also return representations for the numerals as small integers, 64 bit integers or rational or decimal strings.

Definition at line 989 of file z3++.h.

989{ return kind() == Z3_NUMERAL_AST; }

Referenced by expr::as_binary(), expr::as_double(), expr::denominator(), expr::get_decimal_string(), expr::get_numeral_int64(), expr::get_numeral_uint(), expr::get_numeral_uint64(), and expr::numerator().

◆ is_numeral() [2/4]

bool is_numeral ( double &  d) const
inline

Definition at line 996 of file z3++.h.

996{ if (!is_numeral()) return false; d = Z3_get_numeral_double(ctx(), m_ast); check_error(); return true; }
double Z3_API Z3_get_numeral_double(Z3_context c, Z3_ast a)
Return numeral as a double.

Referenced by expr::is_numeral().

◆ is_numeral() [3/4]

bool is_numeral ( std::string &  s) const
inline

Definition at line 994 of file z3++.h.

994{ if (!is_numeral()) return false; s = Z3_get_numeral_string(ctx(), m_ast); check_error(); return true; }
Z3_string Z3_API Z3_get_numeral_string(Z3_context c, Z3_ast a)
Return numeral value, as a decimal string of a numeric constant term.

Referenced by expr::is_numeral().

◆ is_numeral() [4/4]

bool is_numeral ( std::string &  s,
unsigned  precision 
) const
inline

Definition at line 995 of file z3++.h.

995{ if (!is_numeral()) return false; s = Z3_get_numeral_decimal_string(ctx(), m_ast, precision); check_error(); return true; }

Referenced by expr::is_numeral().

◆ is_numeral_i()

bool is_numeral_i ( int &  i) const
inline

Definition at line 992 of file z3++.h.

992{ bool r = Z3_get_numeral_int(ctx(), m_ast, &i); check_error(); return r;}
bool Z3_API Z3_get_numeral_int(Z3_context c, Z3_ast v, int *i)
Similar to Z3_get_numeral_string, but only succeeds if the value can fit in a machine int....

Referenced by expr::get_numeral_int().

◆ is_numeral_i64()

bool is_numeral_i64 ( int64_t i) const
inline

Definition at line 990 of file z3++.h.

990{ bool r = Z3_get_numeral_int64(ctx(), m_ast, &i); check_error(); return r;}
bool Z3_API Z3_get_numeral_int64(Z3_context c, Z3_ast v, int64_t *i)
Similar to Z3_get_numeral_string, but only succeeds if the value can fit in a machine int64_t int....

Referenced by expr::as_int64(), and expr::get_numeral_int64().

◆ is_numeral_u()

bool is_numeral_u ( unsigned &  i) const
inline

Definition at line 993 of file z3++.h.

993{ bool r = Z3_get_numeral_uint(ctx(), m_ast, &i); check_error(); return r;}
bool Z3_API Z3_get_numeral_uint(Z3_context c, Z3_ast v, unsigned *u)
Similar to Z3_get_numeral_string, but only succeeds if the value can fit in a machine unsigned int....

Referenced by expr::get_numeral_uint().

◆ is_numeral_u64()

bool is_numeral_u64 ( uint64_t i) const
inline

Definition at line 991 of file z3++.h.

991{ bool r = Z3_get_numeral_uint64(ctx(), m_ast, &i); check_error(); return r;}
bool Z3_API Z3_get_numeral_uint64(Z3_context c, Z3_ast v, uint64_t *u)
Similar to Z3_get_numeral_string, but only succeeds if the value can fit in a machine uint64_t int....

Referenced by expr::as_uint64(), and expr::get_numeral_uint64().

◆ is_or()

bool is_or ( ) const
inline

Definition at line 1427 of file z3++.h.

1427{ return is_app() && Z3_OP_OR == decl().decl_kind(); }
@ Z3_OP_OR
Definition z3_api.h:996

◆ is_quantifier()

bool is_quantifier ( ) const
inline

Return true if this expression is a quantifier.

Definition at line 1015 of file z3++.h.

1015{ return kind() == Z3_QUANTIFIER_AST; }
@ Z3_QUANTIFIER_AST
Definition z3_api.h:146

Referenced by expr::body().

◆ is_re()

bool is_re ( ) const
inline

Return true if this is a regular expression.

Definition at line 968 of file z3++.h.

968{ return get_sort().is_re(); }
bool is_re() const
Return true if this sort is a regular expression sort.
Definition z3++.h:786

◆ is_real()

bool is_real ( ) const
inline

Return true if this is a real expression.

Definition at line 940 of file z3++.h.

940{ return get_sort().is_real(); }
bool is_real() const
Return true if this sort is the Real sort.
Definition z3++.h:758

◆ is_relation()

bool is_relation ( ) const
inline

Return true if this is a Relation expression.

Definition at line 960 of file z3++.h.

960{ return get_sort().is_relation(); }
bool is_relation() const
Return true if this sort is a Relation sort.
Definition z3++.h:778

◆ is_seq()

bool is_seq ( ) const
inline

Return true if this is a sequence expression.

Definition at line 964 of file z3++.h.

964{ return get_sort().is_seq(); }
bool is_seq() const
Return true if this sort is a Sequence sort.
Definition z3++.h:782

Referenced by expr::operator[]().

◆ is_string_value()

bool is_string_value ( ) const
inline

Return true if this expression is a string literal. The string can be accessed using get_string() and get_escaped_string()

Definition at line 1265 of file z3++.h.

1265{ return Z3_is_string(ctx(), m_ast); }
bool Z3_API Z3_is_string(Z3_context c, Z3_ast s)
Determine if s is a string constant.

Referenced by expr::get_string(), and expr::get_u32string().

◆ is_true()

bool is_true ( ) const
inline

Definition at line 1423 of file z3++.h.

1423{ return is_app() && Z3_OP_TRUE == decl().decl_kind(); }
@ Z3_OP_TRUE
Definition z3_api.h:990

◆ is_var()

bool is_var ( ) const
inline

Return true if this expression is a variable.

Definition at line 1033 of file z3++.h.

1033{ return kind() == Z3_VAR_AST; }
@ Z3_VAR_AST
Definition z3_api.h:145

◆ is_well_sorted()

bool is_well_sorted ( ) const
inline

Return true if this expression is well sorted (aka type correct).

Definition at line 1042 of file z3++.h.

1042{ bool r = Z3_is_well_sorted(ctx(), m_ast); check_error(); return r; }
bool Z3_API Z3_is_well_sorted(Z3_context c, Z3_ast t)
Return true if the given expression t is well sorted.

◆ is_xor()

bool is_xor ( ) const
inline

Definition at line 1428 of file z3++.h.

1428{ return is_app() && Z3_OP_XOR == decl().decl_kind(); }
@ Z3_OP_XOR
Definition z3_api.h:998

◆ itos()

expr itos ( ) const
inline

Definition at line 1641 of file z3++.h.

1641 {
1642 Z3_ast r = Z3_mk_int_to_str(ctx(), *this);
1643 check_error();
1644 return expr(ctx(), r);
1645 }
Z3_ast Z3_API Z3_mk_int_to_str(Z3_context c, Z3_ast s)
Integer to string conversion.

◆ length()

expr length ( ) const
inline

Definition at line 1631 of file z3++.h.

1631 {
1632 Z3_ast r = Z3_mk_seq_length(ctx(), *this);
1633 check_error();
1634 return expr(ctx(), r);
1635 }
Z3_ast Z3_API Z3_mk_seq_length(Z3_context c, Z3_ast s)
Return the length of the sequence s.

Referenced by expr::extract().

◆ lo()

unsigned lo ( ) const
inline

Definition at line 1550 of file z3++.h.

1550{ assert (is_app() && Z3_get_decl_num_parameters(ctx(), decl()) == 2); return static_cast<unsigned>(Z3_get_decl_int_parameter(ctx(), decl(), 1)); }

Referenced by expr::extract(), expr::loop(), and expr::loop().

◆ loop() [1/2]

expr loop ( unsigned  lo)
inline

create a looping regular expression.

Definition at line 1681 of file z3++.h.

1681 {
1682 Z3_ast r = Z3_mk_re_loop(ctx(), m_ast, lo, 0);
1683 check_error();
1684 return expr(ctx(), r);
1685 }
Z3_ast Z3_API Z3_mk_re_loop(Z3_context c, Z3_ast r, unsigned lo, unsigned hi)
Create a regular expression loop. The supplied regular expression r is repeated between lo and hi tim...

◆ loop() [2/2]

expr loop ( unsigned  lo,
unsigned  hi 
)
inline

Definition at line 1686 of file z3++.h.

1686 {
1687 Z3_ast r = Z3_mk_re_loop(ctx(), m_ast, lo, hi);
1688 check_error();
1689 return expr(ctx(), r);
1690 }

◆ mk_from_ieee_bv()

expr mk_from_ieee_bv ( sort const s) const
inline

Convert this IEEE BV into a fpa.

Definition at line 1107 of file z3++.h.

1107 {
1108 assert(is_bv());
1110 check_error();
1111 return expr(ctx(), r);
1112 }
bool is_bv() const
Return true if this is a Bit-vector expression.
Definition z3++.h:948
Z3_ast Z3_API Z3_mk_fpa_to_fp_bv(Z3_context c, Z3_ast bv, Z3_sort s)
Conversion of a single IEEE 754-2008 bit-vector into a floating-point number.

◆ mk_is_inf()

expr mk_is_inf ( ) const
inline

Return Boolean expression to test for whether an FP expression is inf.

Definition at line 1047 of file z3++.h.

1047 {
1048 assert(is_fpa());
1050 check_error();
1051 return expr(ctx(), r);
1052 }
bool is_fpa() const
Return true if this is a FloatingPoint expression. .
Definition z3++.h:982
Z3_ast Z3_API Z3_mk_fpa_is_infinite(Z3_context c, Z3_ast t)
Predicate indicating whether t is a floating-point number representing +oo or -oo.

◆ mk_is_nan()

expr mk_is_nan ( ) const
inline

Return Boolean expression to test for whether an FP expression is a NaN.

Definition at line 1057 of file z3++.h.

1057 {
1058 assert(is_fpa());
1060 check_error();
1061 return expr(ctx(), r);
1062 }
Z3_ast Z3_API Z3_mk_fpa_is_nan(Z3_context c, Z3_ast t)
Predicate indicating whether t is a NaN.

◆ mk_is_normal()

expr mk_is_normal ( ) const
inline

Return Boolean expression to test for whether an FP expression is a normal.

Definition at line 1067 of file z3++.h.

1067 {
1068 assert(is_fpa());
1070 check_error();
1071 return expr(ctx(), r);
1072 }
Z3_ast Z3_API Z3_mk_fpa_is_normal(Z3_context c, Z3_ast t)
Predicate indicating whether t is a normal floating-point number.

◆ mk_is_subnormal()

expr mk_is_subnormal ( ) const
inline

Return Boolean expression to test for whether an FP expression is a subnormal.

Definition at line 1077 of file z3++.h.

1077 {
1078 assert(is_fpa());
1080 check_error();
1081 return expr(ctx(), r);
1082 }
Z3_ast Z3_API Z3_mk_fpa_is_subnormal(Z3_context c, Z3_ast t)
Predicate indicating whether t is a subnormal floating-point number.

◆ mk_is_zero()

expr mk_is_zero ( ) const
inline

Return Boolean expression to test for whether an FP expression is a zero.

Definition at line 1087 of file z3++.h.

1087 {
1088 assert(is_fpa());
1090 check_error();
1091 return expr(ctx(), r);
1092 }
Z3_ast Z3_API Z3_mk_fpa_is_zero(Z3_context c, Z3_ast t)
Predicate indicating whether t is a floating-point number with zero value, i.e., +zero or -zero.

◆ mk_to_ieee_bv()

expr mk_to_ieee_bv ( ) const
inline

Convert this fpa into an IEEE BV.

Definition at line 1097 of file z3++.h.

1097 {
1098 assert(is_fpa());
1100 check_error();
1101 return expr(ctx(), r);
1102 }
Z3_ast Z3_API Z3_mk_fpa_to_ieee_bv(Z3_context c, Z3_ast t)
Conversion of a floating-point term into a bit-vector term in IEEE 754-2008 format.

◆ nth()

expr nth ( expr const index) const
inline

Definition at line 1625 of file z3++.h.

1625 {
1626 check_context(*this, index);
1627 Z3_ast r = Z3_mk_seq_nth(ctx(), *this, index);
1628 check_error();
1629 return expr(ctx(), r);
1630 }
Z3_ast Z3_API Z3_mk_seq_nth(Z3_context c, Z3_ast s, Z3_ast index)
Retrieve from s the element positioned at position index. The function is under-specified if the inde...

Referenced by expr::operator[]().

◆ num_args()

unsigned num_args ( ) const
inline

Return the number of arguments in this application. This method assumes the expression is an application.

Precondition
is_app()

Definition at line 1308 of file z3++.h.

1308{ unsigned r = Z3_get_app_num_args(ctx(), *this); check_error(); return r; }
unsigned Z3_API Z3_get_app_num_args(Z3_context c, Z3_app a)
Return the number of argument of an application. If t is an constant, then the number of arguments is...

Referenced by AstRef::__bool__(), ExprRef::arg(), FuncEntry::arg_value(), expr::args(), FuncEntry::as_list(), ExprRef::children(), expr::end(), expr::is_const(), and ExprRef::update().

◆ numerator()

expr numerator ( ) const
inline

Definition at line 1245 of file z3++.h.

1245 {
1246 assert(is_numeral());
1248 check_error();
1249 return expr(ctx(),r);
1250 }
Z3_ast Z3_API Z3_get_numerator(Z3_context c, Z3_ast a)
Return the numerator (as a numeral AST) of a numeral AST of sort Real.

Referenced by RatNumRef::numerator_as_long().

◆ operator Z3_app()

operator Z3_app ( ) const
inline

Definition at line 1293 of file z3++.h.

1293{ assert(is_app()); return reinterpret_cast<Z3_app>(m_ast); }
System.IntPtr Z3_app

◆ operator[]() [1/2]

expr operator[] ( expr const index) const
inline

index operator defined on arrays and sequences.

Definition at line 1695 of file z3++.h.

1695 {
1696 assert(is_array() || is_seq());
1697 if (is_array()) {
1698 return select(*this, index);
1699 }
1700 return nth(index);
1701 }
bool is_array() const
Return true if this is a Array expression.
Definition z3++.h:952
expr nth(expr const &index) const
Definition z3++.h:1625
bool is_seq() const
Return true if this is a sequence expression.
Definition z3++.h:964
expr select(expr const &a, expr const &i)
forward declarations
Definition z3++.h:4193

◆ operator[]() [2/2]

expr operator[] ( expr_vector const index) const
inline

Definition at line 1703 of file z3++.h.

1703 {
1704 return select(*this, index);
1705 }

◆ repeat()

expr repeat ( unsigned  i) const
inline

Definition at line 1538 of file z3++.h.

1538{ Z3_ast r = Z3_mk_repeat(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
Z3_ast Z3_API Z3_mk_repeat(Z3_context c, unsigned i, Z3_ast t1)
Repeat the given bit-vector up length i.

◆ replace()

expr replace ( expr const src,
expr const dst 
) const
inline

Definition at line 1602 of file z3++.h.

1602 {
1603 check_context(*this, src); check_context(src, dst);
1604 Z3_ast r = Z3_mk_seq_replace(ctx(), *this, src, dst);
1605 check_error();
1606 return expr(ctx(), r);
1607 }
Z3_ast Z3_API Z3_mk_seq_replace(Z3_context c, Z3_ast s, Z3_ast src, Z3_ast dst)
Replace the first occurrence of src with dst in s.

◆ rotate_left()

expr rotate_left ( unsigned  i) const
inline

Definition at line 1534 of file z3++.h.

1534{ Z3_ast r = Z3_mk_rotate_left(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
Z3_ast Z3_API Z3_mk_rotate_left(Z3_context c, unsigned i, Z3_ast t1)
Rotate bits of t1 to the left i times.

◆ rotate_right()

expr rotate_right ( unsigned  i) const
inline

Definition at line 1535 of file z3++.h.

1535{ Z3_ast r = Z3_mk_rotate_right(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
Z3_ast Z3_API Z3_mk_rotate_right(Z3_context c, unsigned i, Z3_ast t1)
Rotate bits of t1 to the right i times.

◆ sbvtos()

expr sbvtos ( ) const
inline

Definition at line 1651 of file z3++.h.

1651 {
1652 Z3_ast r = Z3_mk_sbv_to_str(ctx(), *this);
1653 check_error();
1654 return expr(ctx(), r);
1655 }
Z3_ast Z3_API Z3_mk_sbv_to_str(Z3_context c, Z3_ast s)
Signed bit-vector to string conversion.

◆ simplify() [1/2]

expr simplify ( ) const
inline

Return a simplified version of this expression.

Definition at line 1710 of file z3++.h.

1710{ Z3_ast r = Z3_simplify(ctx(), m_ast); check_error(); return expr(ctx(), r); }
Z3_ast Z3_API Z3_simplify(Z3_context c, Z3_ast a)
Interface to simplifier.

◆ simplify() [2/2]

expr simplify ( params const p) const
inline

Return a simplified version of this expression. The parameter p is a set of parameters for the Z3 simplifier.

Definition at line 1714 of file z3++.h.

1714{ Z3_ast r = Z3_simplify_ex(ctx(), m_ast, p); check_error(); return expr(ctx(), r); }
Z3_ast Z3_API Z3_simplify_ex(Z3_context c, Z3_ast a, Z3_params p)
Interface to simplifier.

◆ stoi()

expr stoi ( ) const
inline

Definition at line 1636 of file z3++.h.

1636 {
1637 Z3_ast r = Z3_mk_str_to_int(ctx(), *this);
1638 check_error();
1639 return expr(ctx(), r);
1640 }
Z3_ast Z3_API Z3_mk_str_to_int(Z3_context c, Z3_ast s)
Convert string to integer.

◆ substitute() [1/3]

expr substitute ( expr_vector const dst)
inline

Apply substitution. Replace bound variables by expressions.

Definition at line 4542 of file z3++.h.

4542 {
4543 array<Z3_ast> _dst(dst.size());
4544 for (unsigned i = 0; i < dst.size(); ++i) {
4545 _dst[i] = dst[i];
4546 }
4547 Z3_ast r = Z3_substitute_vars(ctx(), m_ast, dst.size(), _dst.ptr());
4548 check_error();
4549 return expr(ctx(), r);
4550 }
Z3_ast Z3_API Z3_substitute_vars(Z3_context c, Z3_ast a, unsigned num_exprs, Z3_ast const to[])
Substitute the variables in a with the expressions in to. For every i smaller than num_exprs,...

◆ substitute() [2/3]

expr substitute ( expr_vector const src,
expr_vector const dst 
)
inline

Apply substitution. Replace src expressions by dst.

Definition at line 4529 of file z3++.h.

4529 {
4530 assert(src.size() == dst.size());
4531 array<Z3_ast> _src(src.size());
4532 array<Z3_ast> _dst(dst.size());
4533 for (unsigned i = 0; i < src.size(); ++i) {
4534 _src[i] = src[i];
4535 _dst[i] = dst[i];
4536 }
4537 Z3_ast r = Z3_substitute(ctx(), m_ast, src.size(), _src.ptr(), _dst.ptr());
4538 check_error();
4539 return expr(ctx(), r);
4540 }
Z3_ast Z3_API Z3_substitute(Z3_context c, Z3_ast a, unsigned num_exprs, Z3_ast const from[], Z3_ast const to[])
Substitute every occurrence of from[i] in a with to[i], for i smaller than num_exprs....

◆ substitute() [3/3]

expr substitute ( func_decl_vector const funs,
expr_vector const bodies 
)
inline

Apply function substitution by macro definitions.

Definition at line 4552 of file z3++.h.

4552 {
4553 array<Z3_ast> _dst(dst.size());
4554 array<Z3_func_decl> _funs(funs.size());
4555 if (dst.size() != funs.size()) {
4556 Z3_THROW(exception("length of argument lists don't align"));
4557 return expr(ctx(), nullptr);
4558 }
4559 for (unsigned i = 0; i < dst.size(); ++i) {
4560 _dst[i] = dst[i];
4561 _funs[i] = funs[i];
4562 }
4563 Z3_ast r = Z3_substitute_funs(ctx(), m_ast, dst.size(), _funs.ptr(), _dst.ptr());
4564 check_error();
4565 return expr(ctx(), r);
4566 }
Z3_ast Z3_API Z3_substitute_funs(Z3_context c, Z3_ast a, unsigned num_funs, Z3_func_decl const from[], Z3_ast const to[])
Substitute functions in from with new expressions in to.

◆ ubvtos()

expr ubvtos ( ) const
inline

Definition at line 1646 of file z3++.h.

1646 {
1647 Z3_ast r = Z3_mk_ubv_to_str(ctx(), *this);
1648 check_error();
1649 return expr(ctx(), r);
1650 }
Z3_ast Z3_API Z3_mk_ubv_to_str(Z3_context c, Z3_ast s)
Unsigned bit-vector to string conversion.

◆ unit()

expr unit ( ) const
inline

Definition at line 1608 of file z3++.h.

1608 {
1609 Z3_ast r = Z3_mk_seq_unit(ctx(), *this);
1610 check_error();
1611 return expr(ctx(), r);
1612 }
Z3_ast Z3_API Z3_mk_seq_unit(Z3_context c, Z3_ast a)
Create a unit sequence of a.

◆ update()

expr update ( expr_vector const args) const
inline

Update the arguments of this application. Return a new expression with the same function declaration and updated arguments. The number of new arguments must match the current number of arguments.

Precondition
is_app()
args.size() == num_args()

Definition at line 4568 of file z3++.h.

4568 {
4569 array<Z3_ast> _args(args.size());
4570 for (unsigned i = 0; i < args.size(); ++i) {
4571 _args[i] = args[i];
4572 }
4573 Z3_ast r = Z3_update_term(ctx(), m_ast, args.size(), _args.ptr());
4574 check_error();
4575 return expr(ctx(), r);
4576 }
unsigned size() const
Definition z3++.h:668
expr_vector args() const
Return a vector of all the arguments of this application. This method assumes the expression is an ap...
Definition z3++.h:1323
Z3_ast Z3_API Z3_update_term(Z3_context c, Z3_ast a, unsigned num_args, Z3_ast const args[])
Update the arguments of term a using the arguments args. The number of arguments num_args should coin...

◆ update_field()

expr update_field ( func_decl const field_access,
expr const new_value 
) const
inline

Update a datatype field. Return a new datatype expression with the specified field updated to the new value. The remaining fields are unchanged.

Precondition
is_datatype()
Parameters
field_accessThe accessor function declaration for the field to update
new_valueThe new value for the field

Definition at line 4578 of file z3++.h.

4578 {
4579 assert(is_datatype());
4580 Z3_ast r = Z3_datatype_update_field(ctx(), field_access, m_ast, new_value);
4581 check_error();
4582 return expr(ctx(), r);
4583 }
bool is_datatype() const
Return true if this is a Datatype expression.
Definition z3++.h:956
Z3_ast Z3_API Z3_datatype_update_field(Z3_context c, Z3_func_decl field_access, Z3_ast t, Z3_ast value)
Update record field with a value.

Friends And Related Symbol Documentation

◆ abs

expr abs ( expr const a)
friend

Definition at line 2126 of file z3++.h.

2126 {
2127 Z3_ast r;
2128 if (a.is_int()) {
2129 expr zero = a.ctx().int_val(0);
2130 expr ge = a >= zero;
2131 expr na = -a;
2132 r = Z3_mk_ite(a.ctx(), ge, a, na);
2133 }
2134 else if (a.is_real()) {
2135 expr zero = a.ctx().real_val(0);
2136 expr ge = a >= zero;
2137 expr na = -a;
2138 r = Z3_mk_ite(a.ctx(), ge, a, na);
2139 }
2140 else {
2141 r = Z3_mk_fpa_abs(a.ctx(), a);
2142 }
2143 a.check_error();
2144 return expr(a.ctx(), r);
2145 }
Z3_ast Z3_API Z3_mk_ite(Z3_context c, Z3_ast t1, Z3_ast t2, Z3_ast t3)
Create an AST node representing an if-then-else: ite(t1, t2, t3).
Z3_ast Z3_API Z3_mk_fpa_abs(Z3_context c, Z3_ast t)
Floating-point absolute value.

◆ atleast

expr atleast ( expr_vector const es,
unsigned  bound 
)
friend

Definition at line 2582 of file z3++.h.

2582 {
2583 assert(es.size() > 0);
2584 context& ctx = es[0u].ctx();
2585 array<Z3_ast> _es(es);
2586 Z3_ast r = Z3_mk_atleast(ctx, _es.size(), _es.ptr(), bound);
2587 ctx.check_error();
2588 return expr(ctx, r);
2589 }
Z3_ast Z3_API Z3_mk_atleast(Z3_context c, unsigned num_args, Z3_ast const args[], unsigned k)
Pseudo-Boolean relations.

◆ atmost

expr atmost ( expr_vector const es,
unsigned  bound 
)
friend

Definition at line 2574 of file z3++.h.

2574 {
2575 assert(es.size() > 0);
2576 context& ctx = es[0u].ctx();
2577 array<Z3_ast> _es(es);
2578 Z3_ast r = Z3_mk_atmost(ctx, _es.size(), _es.ptr(), bound);
2579 ctx.check_error();
2580 return expr(ctx, r);
2581 }
Z3_ast Z3_API Z3_mk_atmost(Z3_context c, unsigned num_args, Z3_ast const args[], unsigned k)
Pseudo-Boolean relations.

◆ bv2int

expr bv2int ( expr const a,
bool  is_signed 
)
friend

bit-vector and integer conversions.

Definition at line 2372 of file z3++.h.

2372{ Z3_ast r = Z3_mk_bv2int(a.ctx(), a, is_signed); a.check_error(); return expr(a.ctx(), r); }
Z3_ast Z3_API Z3_mk_bv2int(Z3_context c, Z3_ast t1, bool is_signed)
Create an integer from the bit-vector argument t1. If is_signed is false, then the bit-vector t1 is t...

◆ bvadd_no_overflow

expr bvadd_no_overflow ( expr const a,
expr const b,
bool  is_signed 
)
friend

bit-vector overflow/underflow checks

Definition at line 2378 of file z3++.h.

2378 {
2379 check_context(a, b); Z3_ast r = Z3_mk_bvadd_no_overflow(a.ctx(), a, b, is_signed); a.check_error(); return expr(a.ctx(), r);
2380 }
Z3_ast Z3_API Z3_mk_bvadd_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2, bool is_signed)
Create a predicate that checks that the bit-wise addition of t1 and t2 does not overflow.

◆ bvadd_no_underflow

expr bvadd_no_underflow ( expr const a,
expr const b 
)
friend

Definition at line 2381 of file z3++.h.

2381 {
2382 check_context(a, b); Z3_ast r = Z3_mk_bvadd_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2383 }
Z3_ast Z3_API Z3_mk_bvadd_no_underflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed addition of t1 and t2 does not underflow.

◆ bvmul_no_overflow

expr bvmul_no_overflow ( expr const a,
expr const b,
bool  is_signed 
)
friend

Definition at line 2396 of file z3++.h.

2396 {
2397 check_context(a, b); Z3_ast r = Z3_mk_bvmul_no_overflow(a.ctx(), a, b, is_signed); a.check_error(); return expr(a.ctx(), r);
2398 }
Z3_ast Z3_API Z3_mk_bvmul_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2, bool is_signed)
Create a predicate that checks that the bit-wise multiplication of t1 and t2 does not overflow.

◆ bvmul_no_underflow

expr bvmul_no_underflow ( expr const a,
expr const b 
)
friend

Definition at line 2399 of file z3++.h.

2399 {
2400 check_context(a, b); Z3_ast r = Z3_mk_bvmul_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2401 }
Z3_ast Z3_API Z3_mk_bvmul_no_underflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed multiplication of t1 and t2 does not underflo...

◆ bvneg_no_overflow

expr bvneg_no_overflow ( expr const a)
friend

Definition at line 2393 of file z3++.h.

2393 {
2394 Z3_ast r = Z3_mk_bvneg_no_overflow(a.ctx(), a); a.check_error(); return expr(a.ctx(), r);
2395 }
Z3_ast Z3_API Z3_mk_bvneg_no_overflow(Z3_context c, Z3_ast t1)
Check that bit-wise negation does not overflow when t1 is interpreted as a signed bit-vector.

◆ bvredand

expr bvredand ( expr const a)
friend

Definition at line 2120 of file z3++.h.

2120 {
2121 assert(a.is_bv());
2122 Z3_ast r = Z3_mk_bvredand(a.ctx(), a);
2123 a.check_error();
2124 return expr(a.ctx(), r);
2125 }
Z3_ast Z3_API Z3_mk_bvredand(Z3_context c, Z3_ast t1)
Take conjunction of bits in vector, return vector of length 1.

◆ bvredor

expr bvredor ( expr const a)
friend

Definition at line 2114 of file z3++.h.

2114 {
2115 assert(a.is_bv());
2116 Z3_ast r = Z3_mk_bvredor(a.ctx(), a);
2117 a.check_error();
2118 return expr(a.ctx(), r);
2119 }
Z3_ast Z3_API Z3_mk_bvredor(Z3_context c, Z3_ast t1)
Take disjunction of bits in vector, return vector of length 1.

◆ bvsdiv_no_overflow

expr bvsdiv_no_overflow ( expr const a,
expr const b 
)
friend

Definition at line 2390 of file z3++.h.

2390 {
2391 check_context(a, b); Z3_ast r = Z3_mk_bvsdiv_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2392 }
Z3_ast Z3_API Z3_mk_bvsdiv_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed division of t1 and t2 does not overflow.

◆ bvsub_no_overflow

expr bvsub_no_overflow ( expr const a,
expr const b 
)
friend

Definition at line 2384 of file z3++.h.

2384 {
2385 check_context(a, b); Z3_ast r = Z3_mk_bvsub_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2386 }
Z3_ast Z3_API Z3_mk_bvsub_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed subtraction of t1 and t2 does not overflow.

◆ bvsub_no_underflow

expr bvsub_no_underflow ( expr const a,
expr const b,
bool  is_signed 
)
friend

Definition at line 2387 of file z3++.h.

2387 {
2388 check_context(a, b); Z3_ast r = Z3_mk_bvsub_no_underflow(a.ctx(), a, b, is_signed); a.check_error(); return expr(a.ctx(), r);
2389 }
Z3_ast Z3_API Z3_mk_bvsub_no_underflow(Z3_context c, Z3_ast t1, Z3_ast t2, bool is_signed)
Create a predicate that checks that the bit-wise subtraction of t1 and t2 does not underflow.

◆ concat [1/2]

expr concat ( expr const a,
expr const b 
)
friend

Definition at line 2608 of file z3++.h.

2608 {
2609 check_context(a, b);
2610 Z3_ast r;
2611 if (Z3_is_seq_sort(a.ctx(), a.get_sort())) {
2612 Z3_ast _args[2] = { a, b };
2613 r = Z3_mk_seq_concat(a.ctx(), 2, _args);
2614 }
2615 else if (Z3_is_re_sort(a.ctx(), a.get_sort())) {
2616 Z3_ast _args[2] = { a, b };
2617 r = Z3_mk_re_concat(a.ctx(), 2, _args);
2618 }
2619 else {
2620 r = Z3_mk_concat(a.ctx(), a, b);
2621 }
2622 a.ctx().check_error();
2623 return expr(a.ctx(), r);
2624 }
bool Z3_API Z3_is_seq_sort(Z3_context c, Z3_sort s)
Check if s is a sequence sort.
Z3_ast Z3_API Z3_mk_seq_concat(Z3_context c, unsigned n, Z3_ast const args[])
Concatenate sequences.
Z3_ast Z3_API Z3_mk_re_concat(Z3_context c, unsigned n, Z3_ast const args[])
Create the concatenation of the regular languages.
Z3_ast Z3_API Z3_mk_concat(Z3_context c, Z3_ast t1, Z3_ast t2)
Concatenate the given bit-vectors.
bool Z3_API Z3_is_re_sort(Z3_context c, Z3_sort s)
Check if s is a regular expression sort.

◆ concat [2/2]

expr concat ( expr_vector const args)
friend

Definition at line 2626 of file z3++.h.

2626 {
2627 Z3_ast r;
2628 assert(args.size() > 0);
2629 if (args.size() == 1) {
2630 return args[0u];
2631 }
2632 context& ctx = args[0u].ctx();
2633 array<Z3_ast> _args(args);
2634 if (Z3_is_seq_sort(ctx, args[0u].get_sort())) {
2635 r = Z3_mk_seq_concat(ctx, _args.size(), _args.ptr());
2636 }
2637 else if (Z3_is_re_sort(ctx, args[0u].get_sort())) {
2638 r = Z3_mk_re_concat(ctx, _args.size(), _args.ptr());
2639 }
2640 else {
2641 r = _args[args.size()-1];
2642 for (unsigned i = args.size()-1; i > 0; ) {
2643 --i;
2644 r = Z3_mk_concat(ctx, _args[i], r);
2645 ctx.check_error();
2646 }
2647 }
2648 ctx.check_error();
2649 return expr(ctx, r);
2650 }

◆ distinct

expr distinct ( expr_vector const args)
friend

Definition at line 2599 of file z3++.h.

2599 {
2600 assert(args.size() > 0);
2601 context& ctx = args[0u].ctx();
2602 array<Z3_ast> _args(args);
2603 Z3_ast r = Z3_mk_distinct(ctx, _args.size(), _args.ptr());
2604 ctx.check_error();
2605 return expr(ctx, r);
2606 }
Z3_ast Z3_API Z3_mk_distinct(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing distinct(args[0], ..., args[num_args-1]).

◆ fma

expr fma ( expr const a,
expr const b,
expr const c,
expr const rm 
)
friend

FloatingPoint fused multiply-add.

Definition at line 2162 of file z3++.h.

2162 {
2163 check_context(a, b); check_context(a, c); check_context(a, rm);
2164 assert(a.is_fpa() && b.is_fpa() && c.is_fpa());
2165 Z3_ast r = Z3_mk_fpa_fma(a.ctx(), rm, a, b, c);
2166 a.check_error();
2167 return expr(a.ctx(), r);
2168 }
Z3_ast Z3_API Z3_mk_fpa_fma(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2, Z3_ast t3)
Floating-point fused multiply-add.

◆ fp_eq

expr fp_eq ( expr const a,
expr const b 
)
friend

Definition at line 2153 of file z3++.h.

2153 {
2154 check_context(a, b);
2155 assert(a.is_fpa());
2156 Z3_ast r = Z3_mk_fpa_eq(a.ctx(), a, b);
2157 a.check_error();
2158 return expr(a.ctx(), r);
2159 }
Z3_ast Z3_API Z3_mk_fpa_eq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point equality.

◆ fpa_fp

expr fpa_fp ( expr const sgn,
expr const exp,
expr const sig 
)
friend

Create an expression of FloatingPoint sort from three bit-vector expressions.

Definition at line 2170 of file z3++.h.

2170 {
2171 check_context(sgn, exp); check_context(exp, sig);
2172 assert(sgn.is_bv() && exp.is_bv() && sig.is_bv());
2173 Z3_ast r = Z3_mk_fpa_fp(sgn.ctx(), sgn, exp, sig);
2174 sgn.check_error();
2175 return expr(sgn.ctx(), r);
2176 }
Z3_ast Z3_API Z3_mk_fpa_fp(Z3_context c, Z3_ast sgn, Z3_ast exp, Z3_ast sig)
Create an expression of FloatingPoint sort from three bit-vector expressions.

◆ fpa_to_fpa

expr fpa_to_fpa ( expr const t,
sort  s 
)
friend

Conversion of a floating-point term into another floating-point.

Definition at line 2206 of file z3++.h.

2206 {
2207 assert(t.is_fpa());
2208 Z3_ast r = Z3_mk_fpa_to_fp_float(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2209 t.check_error();
2210 return expr(t.ctx(), r);
2211 }
Z3_ast Z3_API Z3_mk_fpa_to_fp_float(Z3_context c, Z3_ast rm, Z3_ast t, Z3_sort s)
Conversion of a FloatingPoint term into another term of different FloatingPoint sort.

◆ fpa_to_sbv

expr fpa_to_sbv ( expr const t,
unsigned  sz 
)
friend

Conversion of a floating-point term into a signed bit-vector.

Definition at line 2178 of file z3++.h.

2178 {
2179 assert(t.is_fpa());
2180 Z3_ast r = Z3_mk_fpa_to_sbv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
2181 t.check_error();
2182 return expr(t.ctx(), r);
2183 }
Z3_ast Z3_API Z3_mk_fpa_to_sbv(Z3_context c, Z3_ast rm, Z3_ast t, unsigned sz)
Conversion of a floating-point term into a signed bit-vector.

◆ fpa_to_ubv

expr fpa_to_ubv ( expr const t,
unsigned  sz 
)
friend

Conversion of a floating-point term into an unsigned bit-vector.

Definition at line 2185 of file z3++.h.

2185 {
2186 assert(t.is_fpa());
2187 Z3_ast r = Z3_mk_fpa_to_ubv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
2188 t.check_error();
2189 return expr(t.ctx(), r);
2190 }
Z3_ast Z3_API Z3_mk_fpa_to_ubv(Z3_context c, Z3_ast rm, Z3_ast t, unsigned sz)
Conversion of a floating-point term into an unsigned bit-vector.

◆ implies [1/3]

expr implies ( bool  a,
expr const b 
)
friend

Definition at line 1765 of file z3++.h.

1765{ return implies(b.ctx().bool_val(a), b); }
friend expr implies(expr const &a, expr const &b)
Definition z3++.h:1760

◆ implies [2/3]

expr implies ( expr const a,
bool  b 
)
friend

Definition at line 1764 of file z3++.h.

1764{ return implies(a, a.ctx().bool_val(b)); }

◆ implies [3/3]

expr implies ( expr const a,
expr const b 
)
friend

Definition at line 1760 of file z3++.h.

1760 {
1761 assert(a.is_bool() && b.is_bool());
1763 }
Z3_ast Z3_API Z3_mk_implies(Z3_context c, Z3_ast t1, Z3_ast t2)
Create an AST node representing t1 implies t2.
#define _Z3_MK_BIN_(a, b, binop)
Definition z3++.h:1753

◆ int2bv

expr int2bv ( unsigned  n,
expr const a 
)
friend

Definition at line 2373 of file z3++.h.

2373{ Z3_ast r = Z3_mk_int2bv(a.ctx(), n, a); a.check_error(); return expr(a.ctx(), r); }
Z3_ast Z3_API Z3_mk_int2bv(Z3_context c, unsigned n, Z3_ast t1)
Create an n bit bit-vector from the integer argument t1.

◆ is_int

expr is_int ( expr const e)
friend

Definition at line 1808 of file z3++.h.

1808{ _Z3_MK_UN_(e, Z3_mk_is_int); }
Z3_ast Z3_API Z3_mk_is_int(Z3_context c, Z3_ast t1)
Check if a real number is an integer.
#define _Z3_MK_UN_(a, mkun)
Definition z3++.h:1800

Referenced by IntNumRef::as_long(), and ArithSortRef::subsort().

◆ ite

expr ite ( expr const c,
expr const t,
expr const e 
)
friend

Create the if-then-else expression ite(c, t, e)

Precondition
c.is_bool()

Definition at line 2225 of file z3++.h.

2225 {
2226 check_context(c, t); check_context(c, e);
2227 assert(c.is_bool());
2228 Z3_ast r = Z3_mk_ite(c.ctx(), c, t, e);
2229 c.check_error();
2230 return expr(c.ctx(), r);
2231 }

◆ max

expr max ( expr const a,
expr const b 
)
friend

Definition at line 2098 of file z3++.h.

2098 {
2099 check_context(a, b);
2100 Z3_ast r;
2101 if (a.is_arith()) {
2102 r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), a, b);
2103 }
2104 else if (a.is_bv()) {
2105 r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), a, b);
2106 }
2107 else {
2108 assert(a.is_fpa());
2109 r = Z3_mk_fpa_max(a.ctx(), a, b);
2110 }
2111 a.check_error();
2112 return expr(a.ctx(), r);
2113 }
Z3_ast Z3_API Z3_mk_ge(Z3_context c, Z3_ast t1, Z3_ast t2)
Create greater than or equal to.
Z3_ast Z3_API Z3_mk_fpa_max(Z3_context c, Z3_ast t1, Z3_ast t2)
Maximum of floating-point numbers.
Z3_ast Z3_API Z3_mk_bvuge(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than or equal to.

◆ min

expr min ( expr const a,
expr const b 
)
friend

Definition at line 2082 of file z3++.h.

2082 {
2083 check_context(a, b);
2084 Z3_ast r;
2085 if (a.is_arith()) {
2086 r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), b, a);
2087 }
2088 else if (a.is_bv()) {
2089 r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), b, a);
2090 }
2091 else {
2092 assert(a.is_fpa());
2093 r = Z3_mk_fpa_min(a.ctx(), a, b);
2094 }
2095 a.check_error();
2096 return expr(a.ctx(), r);
2097 }
Z3_ast Z3_API Z3_mk_fpa_min(Z3_context c, Z3_ast t1, Z3_ast t2)
Minimum of floating-point numbers.

◆ mk_and

expr mk_and ( expr_vector const args)
friend

Definition at line 2686 of file z3++.h.

2686 {
2687 array<Z3_ast> _args(args);
2688 Z3_ast r = Z3_mk_and(args.ctx(), _args.size(), _args.ptr());
2689 args.check_error();
2690 return expr(args.ctx(), r);
2691 }
Z3_ast Z3_API Z3_mk_and(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] and ... and args[num_args-1].

◆ mk_or

expr mk_or ( expr_vector const args)
friend

Definition at line 2680 of file z3++.h.

2680 {
2681 array<Z3_ast> _args(args);
2682 Z3_ast r = Z3_mk_or(args.ctx(), _args.size(), _args.ptr());
2683 args.check_error();
2684 return expr(args.ctx(), r);
2685 }
Z3_ast Z3_API Z3_mk_or(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] or ... or args[num_args-1].

◆ mk_xor

expr mk_xor ( expr_vector const args)
friend

Definition at line 2692 of file z3++.h.

2692 {
2693 if (args.empty())
2694 return args.ctx().bool_val(false);
2695 expr r = args[0u];
2696 for (unsigned i = 1; i < args.size(); ++i)
2697 r = r ^ args[i];
2698 return r;
2699 }
bool empty() const
Definition z3++.h:674
expr bool_val(bool b)
Definition z3++.h:4030

◆ mod [1/3]

expr mod ( expr const a,
expr const b 
)
friend

Definition at line 1772 of file z3++.h.

1772 {
1773 if (a.is_bv()) {
1774 _Z3_MK_BIN_(a, b, Z3_mk_bvsmod);
1775 }
1776 else {
1777 _Z3_MK_BIN_(a, b, Z3_mk_mod);
1778 }
1779 }
Z3_ast Z3_API Z3_mk_mod(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 mod arg2.
Z3_ast Z3_API Z3_mk_bvsmod(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed remainder (sign follows divisor).

◆ mod [2/3]

expr mod ( expr const a,
int  b 
)
friend

Definition at line 1780 of file z3++.h.

1780{ return mod(a, a.ctx().num_val(b, a.get_sort())); }
friend expr mod(expr const &a, expr const &b)
Definition z3++.h:1772

◆ mod [3/3]

expr mod ( int  a,
expr const b 
)
friend

Definition at line 1781 of file z3++.h.

1781{ return mod(b.ctx().num_val(a, b.get_sort()), b); }

◆ nand

expr nand ( expr const a,
expr const b 
)
friend

Definition at line 2079 of file z3++.h.

2079{ if (a.is_bool()) return !(a && b); check_context(a, b); Z3_ast r = Z3_mk_bvnand(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r); }
Z3_ast Z3_API Z3_mk_bvnand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nand.

◆ nor

expr nor ( expr const a,
expr const b 
)
friend

Definition at line 2080 of file z3++.h.

2080{ if (a.is_bool()) return !(a || b); check_context(a, b); Z3_ast r = Z3_mk_bvnor(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r); }
Z3_ast Z3_API Z3_mk_bvnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nor.

◆ operator!

expr operator! ( expr const a)
friend

Return an expression representing not(a).

Precondition
a.is_bool()

Definition at line 1806 of file z3++.h.

1806{ assert(a.is_bool()); _Z3_MK_UN_(a, Z3_mk_not); }
Z3_ast Z3_API Z3_mk_not(Z3_context c, Z3_ast a)
Create an AST node representing not(a).

◆ operator!= [1/3]

expr operator!= ( expr const a,
expr const b 
)
friend

Definition at line 1848 of file z3++.h.

1848 {
1849 check_context(a, b);
1850 Z3_ast args[2] = { a, b };
1851 Z3_ast r = Z3_mk_distinct(a.ctx(), 2, args);
1852 a.check_error();
1853 return expr(a.ctx(), r);
1854 }

◆ operator!= [2/3]

expr operator!= ( expr const a,
int  b 
)
friend

Definition at line 1855 of file z3++.h.

1855{ assert(a.is_arith() || a.is_bv() || a.is_fpa()); return a != a.ctx().num_val(b, a.get_sort()); }

◆ operator!= [3/3]

expr operator!= ( int  a,
expr const b 
)
friend

Definition at line 1856 of file z3++.h.

1856{ assert(b.is_arith() || b.is_bv() || b.is_fpa()); return b.ctx().num_val(a, b.get_sort()) != b; }

◆ operator& [1/3]

expr operator& ( expr const a,
expr const b 
)
friend

Definition at line 2067 of file z3++.h.

2067{ if (a.is_bool()) return a && b; check_context(a, b); Z3_ast r = Z3_mk_bvand(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r); }
Z3_ast Z3_API Z3_mk_bvand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise and.

◆ operator& [2/3]

expr operator& ( expr const a,
int  b 
)
friend

Definition at line 2068 of file z3++.h.

2068{ return a & a.ctx().num_val(b, a.get_sort()); }

◆ operator& [3/3]

expr operator& ( int  a,
expr const b 
)
friend

Definition at line 2069 of file z3++.h.

2069{ return b.ctx().num_val(a, b.get_sort()) & b; }

◆ operator&& [1/3]

expr operator&& ( bool  a,
expr const b 
)
friend

Return an expression representing a and b. The C++ Boolean value a is automatically converted into a Z3 Boolean constant.

Precondition
b.is_bool()

Definition at line 1822 of file z3++.h.

1822{ return b.ctx().bool_val(a) && b; }

◆ operator&& [2/3]

expr operator&& ( expr const a,
bool  b 
)
friend

Return an expression representing a and b. The C++ Boolean value b is automatically converted into a Z3 Boolean constant.

Precondition
a.is_bool()

Definition at line 1821 of file z3++.h.

1821{ return a && a.ctx().bool_val(b); }

◆ operator&& [3/3]

expr operator&& ( expr const a,
expr const b 
)
friend

Return an expression representing a and b.

Precondition
a.is_bool()
b.is_bool()

Definition at line 1812 of file z3++.h.

1812 {
1813 check_context(a, b);
1814 assert(a.is_bool() && b.is_bool());
1815 Z3_ast args[2] = { a, b };
1816 Z3_ast r = Z3_mk_and(a.ctx(), 2, args);
1817 a.check_error();
1818 return expr(a.ctx(), r);
1819 }

◆ operator* [1/3]

expr operator* ( expr const a,
expr const b 
)
friend

Definition at line 1890 of file z3++.h.

1890 {
1891 check_context(a, b);
1892 Z3_ast r = 0;
1893 if (a.is_arith() && b.is_arith()) {
1894 Z3_ast args[2] = { a, b };
1895 r = Z3_mk_mul(a.ctx(), 2, args);
1896 }
1897 else if (a.is_bv() && b.is_bv()) {
1898 r = Z3_mk_bvmul(a.ctx(), a, b);
1899 }
1900 else if (a.is_fpa() && b.is_fpa()) {
1901 r = Z3_mk_fpa_mul(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1902 }
1903 else {
1904 // operator is not supported by given arguments.
1905 assert(false);
1906 }
1907 a.check_error();
1908 return expr(a.ctx(), r);
1909 }
Z3_ast Z3_API Z3_mk_mul(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] * ... * args[num_args-1].
Z3_ast Z3_API Z3_mk_bvmul(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement multiplication.
Z3_ast Z3_API Z3_mk_fpa_mul(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point multiplication.

◆ operator* [2/3]

expr operator* ( expr const a,
int  b 
)
friend

Definition at line 1910 of file z3++.h.

1910{ return a * a.ctx().num_val(b, a.get_sort()); }

◆ operator* [3/3]

expr operator* ( int  a,
expr const b 
)
friend

Definition at line 1911 of file z3++.h.

1911{ return b.ctx().num_val(a, b.get_sort()) * b; }

◆ operator+ [1/3]

expr operator+ ( expr const a,
expr const b 
)
friend

Definition at line 1860 of file z3++.h.

1860 {
1861 check_context(a, b);
1862 Z3_ast r = 0;
1863 if (a.is_arith() && b.is_arith()) {
1864 Z3_ast args[2] = { a, b };
1865 r = Z3_mk_add(a.ctx(), 2, args);
1866 }
1867 else if (a.is_bv() && b.is_bv()) {
1868 r = Z3_mk_bvadd(a.ctx(), a, b);
1869 }
1870 else if (a.is_seq() && b.is_seq()) {
1871 return concat(a, b);
1872 }
1873 else if (a.is_re() && b.is_re()) {
1874 Z3_ast _args[2] = { a, b };
1875 r = Z3_mk_re_union(a.ctx(), 2, _args);
1876 }
1877 else if (a.is_fpa() && b.is_fpa()) {
1878 r = Z3_mk_fpa_add(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1879 }
1880 else {
1881 // operator is not supported by given arguments.
1882 assert(false);
1883 }
1884 a.check_error();
1885 return expr(a.ctx(), r);
1886 }
friend expr concat(expr const &a, expr const &b)
Definition z3++.h:2608
Z3_ast Z3_API Z3_mk_re_union(Z3_context c, unsigned n, Z3_ast const args[])
Create the union of the regular languages.
Z3_ast Z3_API Z3_mk_bvadd(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement addition.
Z3_ast Z3_API Z3_mk_fpa_add(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point addition.
Z3_ast Z3_API Z3_mk_add(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] + ... + args[num_args-1].

◆ operator+ [2/3]

expr operator+ ( expr const a,
int  b 
)
friend

Definition at line 1887 of file z3++.h.

1887{ return a + a.ctx().num_val(b, a.get_sort()); }

◆ operator+ [3/3]

expr operator+ ( int  a,
expr const b 
)
friend

Definition at line 1888 of file z3++.h.

1888{ return b.ctx().num_val(a, b.get_sort()) + b; }

◆ operator- [1/4]

expr operator- ( expr const a)
friend

Definition at line 1956 of file z3++.h.

1956 {
1957 Z3_ast r = 0;
1958 if (a.is_arith()) {
1959 r = Z3_mk_unary_minus(a.ctx(), a);
1960 }
1961 else if (a.is_bv()) {
1962 r = Z3_mk_bvneg(a.ctx(), a);
1963 }
1964 else if (a.is_fpa()) {
1965 r = Z3_mk_fpa_neg(a.ctx(), a);
1966 }
1967 else {
1968 // operator is not supported by given arguments.
1969 assert(false);
1970 }
1971 a.check_error();
1972 return expr(a.ctx(), r);
1973 }
Z3_ast Z3_API Z3_mk_unary_minus(Z3_context c, Z3_ast arg)
Create an AST node representing - arg.
Z3_ast Z3_API Z3_mk_fpa_neg(Z3_context c, Z3_ast t)
Floating-point negation.
Z3_ast Z3_API Z3_mk_bvneg(Z3_context c, Z3_ast t1)
Standard two's complement unary minus.

◆ operator- [2/4]

expr operator- ( expr const a,
expr const b 
)
friend

Definition at line 1975 of file z3++.h.

1975 {
1976 check_context(a, b);
1977 Z3_ast r = 0;
1978 if (a.is_arith() && b.is_arith()) {
1979 Z3_ast args[2] = { a, b };
1980 r = Z3_mk_sub(a.ctx(), 2, args);
1981 }
1982 else if (a.is_bv() && b.is_bv()) {
1983 r = Z3_mk_bvsub(a.ctx(), a, b);
1984 }
1985 else if (a.is_fpa() && b.is_fpa()) {
1986 r = Z3_mk_fpa_sub(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1987 }
1988 else {
1989 // operator is not supported by given arguments.
1990 assert(false);
1991 }
1992 a.check_error();
1993 return expr(a.ctx(), r);
1994 }
Z3_ast Z3_API Z3_mk_fpa_sub(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point subtraction.
Z3_ast Z3_API Z3_mk_bvsub(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement subtraction.
Z3_ast Z3_API Z3_mk_sub(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] - ... - args[num_args - 1].

◆ operator- [3/4]

expr operator- ( expr const a,
int  b 
)
friend

Definition at line 1995 of file z3++.h.

1995{ return a - a.ctx().num_val(b, a.get_sort()); }

◆ operator- [4/4]

expr operator- ( int  a,
expr const b 
)
friend

Definition at line 1996 of file z3++.h.

1996{ return b.ctx().num_val(a, b.get_sort()) - b; }

◆ operator/ [1/3]

expr operator/ ( expr const a,
expr const b 
)
friend

Definition at line 1934 of file z3++.h.

1934 {
1935 check_context(a, b);
1936 Z3_ast r = 0;
1937 if (a.is_arith() && b.is_arith()) {
1938 r = Z3_mk_div(a.ctx(), a, b);
1939 }
1940 else if (a.is_bv() && b.is_bv()) {
1941 r = Z3_mk_bvsdiv(a.ctx(), a, b);
1942 }
1943 else if (a.is_fpa() && b.is_fpa()) {
1944 r = Z3_mk_fpa_div(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1945 }
1946 else {
1947 // operator is not supported by given arguments.
1948 assert(false);
1949 }
1950 a.check_error();
1951 return expr(a.ctx(), r);
1952 }
Z3_ast Z3_API Z3_mk_div(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 div arg2.
Z3_ast Z3_API Z3_mk_bvsdiv(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed division.
Z3_ast Z3_API Z3_mk_fpa_div(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point division.

◆ operator/ [2/3]

expr operator/ ( expr const a,
int  b 
)
friend

Definition at line 1953 of file z3++.h.

1953{ return a / a.ctx().num_val(b, a.get_sort()); }

◆ operator/ [3/3]

expr operator/ ( int  a,
expr const b 
)
friend

Definition at line 1954 of file z3++.h.

1954{ return b.ctx().num_val(a, b.get_sort()) / b; }

◆ operator< [1/3]

expr operator< ( expr const a,
expr const b 
)
friend

Definition at line 2023 of file z3++.h.

2023 {
2024 check_context(a, b);
2025 Z3_ast r = 0;
2026 if (a.is_arith() && b.is_arith()) {
2027 r = Z3_mk_lt(a.ctx(), a, b);
2028 }
2029 else if (a.is_bv() && b.is_bv()) {
2030 r = Z3_mk_bvslt(a.ctx(), a, b);
2031 }
2032 else if (a.is_fpa() && b.is_fpa()) {
2033 r = Z3_mk_fpa_lt(a.ctx(), a, b);
2034 }
2035 else {
2036 // operator is not supported by given arguments.
2037 assert(false);
2038 }
2039 a.check_error();
2040 return expr(a.ctx(), r);
2041 }
Z3_ast Z3_API Z3_mk_bvslt(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed less than.
Z3_ast Z3_API Z3_mk_lt(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than.
Z3_ast Z3_API Z3_mk_fpa_lt(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point less than.

◆ operator< [2/3]

expr operator< ( expr const a,
int  b 
)
friend

Definition at line 2042 of file z3++.h.

2042{ return a < a.ctx().num_val(b, a.get_sort()); }

◆ operator< [3/3]

expr operator< ( int  a,
expr const b 
)
friend

Definition at line 2043 of file z3++.h.

2043{ return b.ctx().num_val(a, b.get_sort()) < b; }

◆ operator<= [1/3]

expr operator<= ( expr const a,
expr const b 
)
friend

Definition at line 1998 of file z3++.h.

1998 {
1999 check_context(a, b);
2000 Z3_ast r = 0;
2001 if (a.is_arith() && b.is_arith()) {
2002 r = Z3_mk_le(a.ctx(), a, b);
2003 }
2004 else if (a.is_bv() && b.is_bv()) {
2005 r = Z3_mk_bvsle(a.ctx(), a, b);
2006 }
2007 else if (a.is_fpa() && b.is_fpa()) {
2008 r = Z3_mk_fpa_leq(a.ctx(), a, b);
2009 }
2010 else {
2011 // operator is not supported by given arguments.
2012 assert(false);
2013 }
2014 a.check_error();
2015 return expr(a.ctx(), r);
2016 }
Z3_ast Z3_API Z3_mk_bvsle(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed less than or equal to.
Z3_ast Z3_API Z3_mk_le(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than or equal to.
Z3_ast Z3_API Z3_mk_fpa_leq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point less than or equal.

◆ operator<= [2/3]

expr operator<= ( expr const a,
int  b 
)
friend

Definition at line 2017 of file z3++.h.

2017{ return a <= a.ctx().num_val(b, a.get_sort()); }

◆ operator<= [3/3]

expr operator<= ( int  a,
expr const b 
)
friend

Definition at line 2018 of file z3++.h.

2018{ return b.ctx().num_val(a, b.get_sort()) <= b; }

◆ operator== [1/3]

expr operator== ( expr const a,
expr const b 
)
friend

Definition at line 1837 of file z3++.h.

1837 {
1838 check_context(a, b);
1839 Z3_ast r = Z3_mk_eq(a.ctx(), a, b);
1840 a.check_error();
1841 return expr(a.ctx(), r);
1842 }
Z3_ast Z3_API Z3_mk_eq(Z3_context c, Z3_ast l, Z3_ast r)
Create an AST node representing l = r.

◆ operator== [2/3]

expr operator== ( expr const a,
int  b 
)
friend

Definition at line 1843 of file z3++.h.

1843{ assert(a.is_arith() || a.is_bv() || a.is_fpa()); return a == a.ctx().num_val(b, a.get_sort()); }

◆ operator== [3/3]

expr operator== ( int  a,
expr const b 
)
friend

Definition at line 1844 of file z3++.h.

1844{ assert(b.is_arith() || b.is_bv() || b.is_fpa()); return b.ctx().num_val(a, b.get_sort()) == b; }

◆ operator> [1/3]

expr operator> ( expr const a,
expr const b 
)
friend

Definition at line 2045 of file z3++.h.

2045 {
2046 check_context(a, b);
2047 Z3_ast r = 0;
2048 if (a.is_arith() && b.is_arith()) {
2049 r = Z3_mk_gt(a.ctx(), a, b);
2050 }
2051 else if (a.is_bv() && b.is_bv()) {
2052 r = Z3_mk_bvsgt(a.ctx(), a, b);
2053 }
2054 else if (a.is_fpa() && b.is_fpa()) {
2055 r = Z3_mk_fpa_gt(a.ctx(), a, b);
2056 }
2057 else {
2058 // operator is not supported by given arguments.
2059 assert(false);
2060 }
2061 a.check_error();
2062 return expr(a.ctx(), r);
2063 }
Z3_ast Z3_API Z3_mk_bvsgt(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed greater than.
Z3_ast Z3_API Z3_mk_fpa_gt(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point greater than.
Z3_ast Z3_API Z3_mk_gt(Z3_context c, Z3_ast t1, Z3_ast t2)
Create greater than.

◆ operator> [2/3]

expr operator> ( expr const a,
int  b 
)
friend

Definition at line 2064 of file z3++.h.

2064{ return a > a.ctx().num_val(b, a.get_sort()); }

◆ operator> [3/3]

expr operator> ( int  a,
expr const b 
)
friend

Definition at line 2065 of file z3++.h.

2065{ return b.ctx().num_val(a, b.get_sort()) > b; }

◆ operator>= [1/3]

expr operator>= ( expr const a,
expr const b 
)
friend

Definition at line 1914 of file z3++.h.

1914 {
1915 check_context(a, b);
1916 Z3_ast r = 0;
1917 if (a.is_arith() && b.is_arith()) {
1918 r = Z3_mk_ge(a.ctx(), a, b);
1919 }
1920 else if (a.is_bv() && b.is_bv()) {
1921 r = Z3_mk_bvsge(a.ctx(), a, b);
1922 }
1923 else if (a.is_fpa() && b.is_fpa()) {
1924 r = Z3_mk_fpa_geq(a.ctx(), a, b);
1925 }
1926 else {
1927 // operator is not supported by given arguments.
1928 assert(false);
1929 }
1930 a.check_error();
1931 return expr(a.ctx(), r);
1932 }
Z3_ast Z3_API Z3_mk_bvsge(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed greater than or equal to.
Z3_ast Z3_API Z3_mk_fpa_geq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point greater than or equal.

◆ operator>= [2/3]

expr operator>= ( expr const a,
int  b 
)
friend

Definition at line 2020 of file z3++.h.

2020{ return a >= a.ctx().num_val(b, a.get_sort()); }

◆ operator>= [3/3]

expr operator>= ( int  a,
expr const b 
)
friend

Definition at line 2021 of file z3++.h.

2021{ return b.ctx().num_val(a, b.get_sort()) >= b; }

◆ operator^ [1/3]

expr operator^ ( expr const a,
expr const b 
)
friend

Definition at line 2071 of file z3++.h.

2071{ check_context(a, b); Z3_ast r = a.is_bool() ? Z3_mk_xor(a.ctx(), a, b) : Z3_mk_bvxor(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r); }
Z3_ast Z3_API Z3_mk_bvxor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise exclusive-or.
Z3_ast Z3_API Z3_mk_xor(Z3_context c, Z3_ast t1, Z3_ast t2)
Create an AST node representing t1 xor t2.

◆ operator^ [2/3]

expr operator^ ( expr const a,
int  b 
)
friend

Definition at line 2072 of file z3++.h.

2072{ return a ^ a.ctx().num_val(b, a.get_sort()); }

◆ operator^ [3/3]

expr operator^ ( int  a,
expr const b 
)
friend

Definition at line 2073 of file z3++.h.

2073{ return b.ctx().num_val(a, b.get_sort()) ^ b; }

◆ operator| [1/3]

expr operator| ( expr const a,
expr const b 
)
friend

Definition at line 2075 of file z3++.h.

2075{ if (a.is_bool()) return a || b; check_context(a, b); Z3_ast r = Z3_mk_bvor(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r); }
Z3_ast Z3_API Z3_mk_bvor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise or.

◆ operator| [2/3]

expr operator| ( expr const a,
int  b 
)
friend

Definition at line 2076 of file z3++.h.

2076{ return a | a.ctx().num_val(b, a.get_sort()); }

◆ operator| [3/3]

expr operator| ( int  a,
expr const b 
)
friend

Definition at line 2077 of file z3++.h.

2077{ return b.ctx().num_val(a, b.get_sort()) | b; }

◆ operator|| [1/3]

expr operator|| ( bool  a,
expr const b 
)
friend

Return an expression representing a or b. The C++ Boolean value a is automatically converted into a Z3 Boolean constant.

Precondition
b.is_bool()

Definition at line 1835 of file z3++.h.

1835{ return b.ctx().bool_val(a) || b; }

◆ operator|| [2/3]

expr operator|| ( expr const a,
bool  b 
)
friend

Return an expression representing a or b. The C++ Boolean value b is automatically converted into a Z3 Boolean constant.

Precondition
a.is_bool()

Definition at line 1833 of file z3++.h.

1833{ return a || a.ctx().bool_val(b); }

◆ operator|| [3/3]

expr operator|| ( expr const a,
expr const b 
)
friend

Return an expression representing a or b.

Precondition
a.is_bool()
b.is_bool()

Definition at line 1824 of file z3++.h.

1824 {
1825 check_context(a, b);
1826 assert(a.is_bool() && b.is_bool());
1827 Z3_ast args[2] = { a, b };
1828 Z3_ast r = Z3_mk_or(a.ctx(), 2, args);
1829 a.check_error();
1830 return expr(a.ctx(), r);
1831 }

◆ operator~

expr operator~ ( expr const a)
friend

Definition at line 2160 of file z3++.h.

2160{ Z3_ast r = Z3_mk_bvnot(a.ctx(), a); return expr(a.ctx(), r); }
Z3_ast Z3_API Z3_mk_bvnot(Z3_context c, Z3_ast t1)
Bitwise negation.

◆ pbeq

expr pbeq ( expr_vector const es,
int const coeffs,
int  bound 
)
friend

Definition at line 2566 of file z3++.h.

2566 {
2567 assert(es.size() > 0);
2568 context& ctx = es[0u].ctx();
2569 array<Z3_ast> _es(es);
2570 Z3_ast r = Z3_mk_pbeq(ctx, _es.size(), _es.ptr(), coeffs, bound);
2571 ctx.check_error();
2572 return expr(ctx, r);
2573 }
Z3_ast Z3_API Z3_mk_pbeq(Z3_context c, unsigned num_args, Z3_ast const args[], int const coeffs[], int k)
Pseudo-Boolean relations.

◆ pbge

expr pbge ( expr_vector const es,
int const coeffs,
int  bound 
)
friend

Definition at line 2558 of file z3++.h.

2558 {
2559 assert(es.size() > 0);
2560 context& ctx = es[0u].ctx();
2561 array<Z3_ast> _es(es);
2562 Z3_ast r = Z3_mk_pbge(ctx, _es.size(), _es.ptr(), coeffs, bound);
2563 ctx.check_error();
2564 return expr(ctx, r);
2565 }
Z3_ast Z3_API Z3_mk_pbge(Z3_context c, unsigned num_args, Z3_ast const args[], int const coeffs[], int k)
Pseudo-Boolean relations.

◆ pble

expr pble ( expr_vector const es,
int const coeffs,
int  bound 
)
friend

Definition at line 2550 of file z3++.h.

2550 {
2551 assert(es.size() > 0);
2552 context& ctx = es[0u].ctx();
2553 array<Z3_ast> _es(es);
2554 Z3_ast r = Z3_mk_pble(ctx, _es.size(), _es.ptr(), coeffs, bound);
2555 ctx.check_error();
2556 return expr(ctx, r);
2557 }
Z3_ast Z3_API Z3_mk_pble(Z3_context c, unsigned num_args, Z3_ast const args[], int const coeffs[], int k)
Pseudo-Boolean relations.

◆ pw [1/3]

expr pw ( expr const a,
expr const b 
)
friend

Definition at line 1768 of file z3++.h.

1768{ _Z3_MK_BIN_(a, b, Z3_mk_power); }
Z3_ast Z3_API Z3_mk_power(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 ^ arg2.

◆ pw [2/3]

expr pw ( expr const a,
int  b 
)
friend

Definition at line 1769 of file z3++.h.

1769{ return pw(a, a.ctx().num_val(b, a.get_sort())); }
friend expr pw(expr const &a, expr const &b)
Definition z3++.h:1768

◆ pw [3/3]

expr pw ( int  a,
expr const b 
)
friend

Definition at line 1770 of file z3++.h.

1770{ return pw(b.ctx().num_val(a, b.get_sort()), b); }

◆ range

expr range ( expr const lo,
expr const hi 
)
friend

Definition at line 4436 of file z3++.h.

4436 {
4438 Z3_ast r = Z3_mk_re_range(lo.ctx(), lo, hi);
4439 lo.check_error();
4440 return expr(lo.ctx(), r);
4441 }
Z3_ast Z3_API Z3_mk_re_range(Z3_context c, Z3_ast lo, Z3_ast hi)
Create the range regular expression over two sequences of length 1.

◆ rem [1/3]

expr rem ( expr const a,
expr const b 
)
friend

Definition at line 1788 of file z3++.h.

1788 {
1789 if (a.is_fpa() && b.is_fpa()) {
1791 } else {
1792 _Z3_MK_BIN_(a, b, Z3_mk_rem);
1793 }
1794 }
Z3_ast Z3_API Z3_mk_fpa_rem(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point remainder.
Z3_ast Z3_API Z3_mk_rem(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 rem arg2.

◆ rem [2/3]

expr rem ( expr const a,
int  b 
)
friend

Definition at line 1795 of file z3++.h.

1795{ return rem(a, a.ctx().num_val(b, a.get_sort())); }
friend expr rem(expr const &a, expr const &b)
Definition z3++.h:1788

◆ rem [3/3]

expr rem ( int  a,
expr const b 
)
friend

Definition at line 1796 of file z3++.h.

1796{ return rem(b.ctx().num_val(a, b.get_sort()), b); }

◆ round_fpa_to_closest_integer

expr round_fpa_to_closest_integer ( expr const t)
friend

Round a floating-point term into its closest integer.

Definition at line 2213 of file z3++.h.

2213 {
2214 assert(t.is_fpa());
2215 Z3_ast r = Z3_mk_fpa_round_to_integral(t.ctx(), t.ctx().fpa_rounding_mode(), t);
2216 t.check_error();
2217 return expr(t.ctx(), r);
2218 }
Z3_ast Z3_API Z3_mk_fpa_round_to_integral(Z3_context c, Z3_ast rm, Z3_ast t)
Floating-point roundToIntegral. Rounds a floating-point number to the closest integer,...

◆ sbv_to_fpa

expr sbv_to_fpa ( expr const t,
sort  s 
)
friend

Conversion of a signed bit-vector term into a floating-point.

Definition at line 2192 of file z3++.h.

2192 {
2193 assert(t.is_bv());
2194 Z3_ast r = Z3_mk_fpa_to_fp_signed(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2195 t.check_error();
2196 return expr(t.ctx(), r);
2197 }
Z3_ast Z3_API Z3_mk_fpa_to_fp_signed(Z3_context c, Z3_ast rm, Z3_ast t, Z3_sort s)
Conversion of a 2's complement signed bit-vector term into a term of FloatingPoint sort.

◆ sqrt

expr sqrt ( expr const a,
expr const rm 
)
friend

Definition at line 2146 of file z3++.h.

2146 {
2147 check_context(a, rm);
2148 assert(a.is_fpa());
2149 Z3_ast r = Z3_mk_fpa_sqrt(a.ctx(), rm, a);
2150 a.check_error();
2151 return expr(a.ctx(), r);
2152 }
Z3_ast Z3_API Z3_mk_fpa_sqrt(Z3_context c, Z3_ast rm, Z3_ast t)
Floating-point square root.

◆ sum

expr sum ( expr_vector const args)
friend

Definition at line 2590 of file z3++.h.

2590 {
2591 assert(args.size() > 0);
2592 context& ctx = args[0u].ctx();
2593 array<Z3_ast> _args(args);
2594 Z3_ast r = Z3_mk_add(ctx, _args.size(), _args.ptr());
2595 ctx.check_error();
2596 return expr(ctx, r);
2597 }

◆ ubv_to_fpa

expr ubv_to_fpa ( expr const t,
sort  s 
)
friend

Conversion of an unsigned bit-vector term into a floating-point.

Definition at line 2199 of file z3++.h.

2199 {
2200 assert(t.is_bv());
2201 Z3_ast r = Z3_mk_fpa_to_fp_unsigned(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2202 t.check_error();
2203 return expr(t.ctx(), r);
2204 }
Z3_ast Z3_API Z3_mk_fpa_to_fp_unsigned(Z3_context c, Z3_ast rm, Z3_ast t, Z3_sort s)
Conversion of a 2's complement unsigned bit-vector term into a term of FloatingPoint sort.

◆ xnor

expr xnor ( expr const a,
expr const b 
)
friend

Definition at line 2081 of file z3++.h.

2081{ if (a.is_bool()) return !(a ^ b); check_context(a, b); Z3_ast r = Z3_mk_bvxnor(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r); }
Z3_ast Z3_API Z3_mk_bvxnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise xnor.