Z3
 
Loading...
Searching...
No Matches
Data Structures | Namespaces | Macros | Typedefs | Enumerations | Functions
z3++.h File Reference

Go to the source code of this file.

Data Structures

class  exception
 Exception used to sign API usage errors. More...
 
class  config
 Z3 global configuration object. More...
 
class  context
 A Context manages all other Z3 objects, global configuration options, etc. More...
 
class  array< T >
 
class  object
 
class  symbol
 
class  param_descrs
 
class  params
 
class  ast
 
class  ast_vector_tpl< T >
 
class  ast_vector_tpl< T >::iterator
 
class  sort
 A Z3 sort (aka type). Every expression (i.e., formula or term) in Z3 has a sort. More...
 
class  func_decl
 Function declaration (aka function definition). It is the signature of interpreted and uninterpreted functions in Z3. The basic building block in Z3 is the function application. More...
 
class  parser_context
 
class  expr
 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...
 
class  expr::iterator
 
class  cast_ast< ast >
 
class  cast_ast< expr >
 
class  cast_ast< sort >
 
class  cast_ast< func_decl >
 
class  func_entry
 
class  func_interp
 
class  model
 
struct  model::translate
 
class  stats
 
class  parameter
 class for auxiliary parameters associated with func_decl The class is initialized with a func_decl or application expression and an index The accessor get_expr, get_sort, ... is available depending on the value of kind(). The caller is responsible to check that the kind of the parameter aligns with the call (get_expr etc). More...
 
class  solver
 
struct  solver::simple
 
struct  solver::translate
 
class  solver::cube_iterator
 
class  solver::cube_generator
 
class  goal
 
class  apply_result
 
class  tactic
 
class  simplifier
 
class  probe
 
class  optimize
 
struct  optimize::translate
 
class  optimize::handle
 
class  fixedpoint
 
class  constructor_list
 
class  constructors
 
class  on_clause
 
class  user_propagator_base
 
class  rcf_num
 Wrapper for Z3 Real Closed Field (RCF) numerals. More...
 

Namespaces

namespace  z3
 Z3 C++ namespace.
 

Macros

#define Z3_THROW(x)   {}
 
#define _Z3_MK_BIN_(a, b, binop)
 
#define _Z3_MK_UN_(a, mkun)
 
#define MK_EXPR1(_fn, _arg)
 
#define MK_EXPR2(_fn, _arg1, _arg2)
 

Typedefs

typedef ast_vector_tpl< astast_vector
 
typedef ast_vector_tpl< exprexpr_vector
 
typedef ast_vector_tpl< sortsort_vector
 
typedef ast_vector_tpl< func_declfunc_decl_vector
 
typedef std::function< void(expr const &proof, std::vector< unsigned > const &deps, expr_vector const &clause)> on_clause_eh_t
 

Enumerations

enum  check_result { unsat , sat , unknown }
 
enum  rounding_mode {
  RNA , RNE , RTP , RTN ,
  RTZ
}
 

Functions

void set_param (char const *param, char const *value)
 
void set_param (char const *param, bool value)
 
void set_param (char const *param, int value)
 
void reset_params ()
 
void get_version (unsigned &major, unsigned &minor, unsigned &build_number, unsigned &revision_number)
 Return Z3 version number information.
 
std::string get_full_version ()
 Return a string that fully describes the version of Z3 in use.
 
void enable_trace (char const *tag)
 Enable tracing messages tagged as tag when Z3 is compiled in debug mode. It is a NOOP otherwise.
 
void disable_trace (char const *tag)
 Disable tracing messages tagged as tag when Z3 is compiled in debug mode. It is a NOOP otherwise.
 
std::ostream & operator<< (std::ostream &out, exception const &e)
 
check_result to_check_result (Z3_lbool l)
 
void check_context (object const &a, object const &b)
 
std::ostream & operator<< (std::ostream &out, symbol const &s)
 
std::ostream & operator<< (std::ostream &out, param_descrs const &d)
 
std::ostream & operator<< (std::ostream &out, params const &p)
 
std::ostream & operator<< (std::ostream &out, ast const &n)
 
bool eq (ast const &a, ast const &b)
 
expr select (expr const &a, expr const &i)
 forward declarations
 
expr select (expr const &a, expr_vector const &i)
 
expr implies (expr const &a, expr const &b)
 
expr implies (expr const &a, bool b)
 
expr implies (bool 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 operator% (expr const &a, expr const &b)
 
expr operator% (expr const &a, int b)
 
expr operator% (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 operator! (expr const &a)
 
expr is_int (expr const &e)
 
expr operator&& (expr const &a, expr const &b)
 
expr operator&& (expr const &a, bool b)
 
expr operator&& (bool a, expr const &b)
 
expr operator|| (expr const &a, expr const &b)
 
expr operator|| (expr const &a, bool b)
 
expr operator|| (bool 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, double b)
 
expr operator== (double 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, double b)
 
expr operator!= (double 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, 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, 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 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 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)
 
expr fpa_fp (expr const &sgn, expr const &exp, expr const &sig)
 
expr fpa_to_sbv (expr const &t, unsigned sz)
 
expr fpa_to_ubv (expr const &t, unsigned sz)
 
expr sbv_to_fpa (expr const &t, sort s)
 
expr ubv_to_fpa (expr const &t, sort s)
 
expr fpa_to_fpa (expr const &t, sort s)
 
expr round_fpa_to_closest_integer (expr const &t)
 
expr ite (expr const &c, expr const &t, expr const &e)
 Create the if-then-else expression ite(c, t, e)
 
expr to_expr (context &c, Z3_ast a)
 Wraps a Z3_ast as an expr object. It also checks for errors. This function allows the user to use the whole C API with the C++ layer defined in this file.
 
sort to_sort (context &c, Z3_sort s)
 
func_decl to_func_decl (context &c, Z3_func_decl f)
 
expr sle (expr const &a, expr const &b)
 signed less than or equal to operator for bitvectors.
 
expr sle (expr const &a, int b)
 
expr sle (int a, expr const &b)
 
expr slt (expr const &a, expr const &b)
 signed less than operator for bitvectors.
 
expr slt (expr const &a, int b)
 
expr slt (int a, expr const &b)
 
expr sge (expr const &a, expr const &b)
 signed greater than or equal to operator for bitvectors.
 
expr sge (expr const &a, int b)
 
expr sge (int a, expr const &b)
 
expr sgt (expr const &a, expr const &b)
 signed greater than operator for bitvectors.
 
expr sgt (expr const &a, int b)
 
expr sgt (int a, expr const &b)
 
expr ule (expr const &a, expr const &b)
 unsigned less than or equal to operator for bitvectors.
 
expr ule (expr const &a, int b)
 
expr ule (int a, expr const &b)
 
expr ult (expr const &a, expr const &b)
 unsigned less than operator for bitvectors.
 
expr ult (expr const &a, int b)
 
expr ult (int a, expr const &b)
 
expr uge (expr const &a, expr const &b)
 unsigned greater than or equal to operator for bitvectors.
 
expr uge (expr const &a, int b)
 
expr uge (int a, expr const &b)
 
expr ugt (expr const &a, expr const &b)
 unsigned greater than operator for bitvectors.
 
expr ugt (expr const &a, int b)
 
expr ugt (int a, expr const &b)
 
expr sdiv (expr const &a, expr const &b)
 signed division operator for bitvectors.
 
expr sdiv (expr const &a, int b)
 
expr sdiv (int a, expr const &b)
 
expr udiv (expr const &a, expr const &b)
 unsigned division operator for bitvectors.
 
expr udiv (expr const &a, int b)
 
expr udiv (int a, expr const &b)
 
expr srem (expr const &a, expr const &b)
 signed remainder operator for bitvectors
 
expr srem (expr const &a, int b)
 
expr srem (int a, expr const &b)
 
expr smod (expr const &a, expr const &b)
 signed modulus operator for bitvectors
 
expr smod (expr const &a, int b)
 
expr smod (int a, expr const &b)
 
expr urem (expr const &a, expr const &b)
 unsigned reminder operator for bitvectors
 
expr urem (expr const &a, int b)
 
expr urem (int a, expr const &b)
 
expr shl (expr const &a, expr const &b)
 shift left operator for bitvectors
 
expr shl (expr const &a, int b)
 
expr shl (int a, expr const &b)
 
expr lshr (expr const &a, expr const &b)
 logic shift right operator for bitvectors
 
expr lshr (expr const &a, int b)
 
expr lshr (int a, expr const &b)
 
expr ashr (expr const &a, expr const &b)
 arithmetic shift right operator for bitvectors
 
expr ashr (expr const &a, int b)
 
expr ashr (int a, expr const &b)
 
expr zext (expr const &a, unsigned i)
 Extend the given bit-vector with zeros to the (unsigned) equivalent bitvector of size m+i, where m is the size of the given bit-vector.
 
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 sext (expr const &a, unsigned i)
 Sign-extend of the given bit-vector to the (signed) equivalent bitvector of size m+i, where m is the size of the given bit-vector.
 
func_decl linear_order (sort const &a, unsigned index)
 
func_decl partial_order (sort const &a, unsigned index)
 
func_decl piecewise_linear_order (sort const &a, unsigned index)
 
func_decl tree_order (sort const &a, unsigned index)
 
expr_vector polynomial_subresultants (expr const &p, expr const &q, expr const &x)
 Return the nonzero subresultants of p and q with respect to the "variable" x.
 
expr forall (expr const &x, expr const &b)
 
expr forall (expr const &x1, expr const &x2, expr const &b)
 
expr forall (expr const &x1, expr const &x2, expr const &x3, expr const &b)
 
expr forall (expr const &x1, expr const &x2, expr const &x3, expr const &x4, expr const &b)
 
expr forall (expr_vector const &xs, expr const &b)
 
expr exists (expr const &x, expr const &b)
 
expr exists (expr const &x1, expr const &x2, expr const &b)
 
expr exists (expr const &x1, expr const &x2, expr const &x3, expr const &b)
 
expr exists (expr const &x1, expr const &x2, expr const &x3, expr const &x4, expr const &b)
 
expr exists (expr_vector const &xs, expr const &b)
 
expr lambda (expr const &x, expr const &b)
 
expr lambda (expr const &x1, expr const &x2, expr const &b)
 
expr lambda (expr const &x1, expr const &x2, expr const &x3, expr const &b)
 
expr lambda (expr const &x1, expr const &x2, expr const &x3, expr const &x4, expr const &b)
 
expr lambda (expr_vector const &xs, 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 sum (expr_vector const &args)
 
expr distinct (expr_vector const &args)
 
expr concat (expr const &a, expr const &b)
 
expr concat (expr_vector const &args)
 
expr map (expr const &f, expr const &list)
 
expr mapi (expr const &f, expr const &i, expr const &list)
 
expr foldl (expr const &f, expr const &a, expr const &list)
 
expr foldli (expr const &f, expr const &i, expr const &a, expr const &list)
 
expr mk_or (expr_vector const &args)
 
expr mk_and (expr_vector const &args)
 
expr mk_xor (expr_vector const &args)
 
std::ostream & operator<< (std::ostream &out, model const &m)
 
std::ostream & operator<< (std::ostream &out, stats const &s)
 
std::ostream & operator<< (std::ostream &out, check_result r)
 
std::ostream & operator<< (std::ostream &out, solver const &s)
 
std::ostream & operator<< (std::ostream &out, goal const &g)
 
std::ostream & operator<< (std::ostream &out, apply_result const &r)
 
tactic operator& (tactic const &t1, tactic const &t2)
 
tactic operator| (tactic const &t1, tactic const &t2)
 
tactic repeat (tactic const &t, unsigned max=UINT_MAX)
 
tactic with (tactic const &t, params const &p)
 
tactic try_for (tactic const &t, unsigned ms)
 
tactic par_or (unsigned n, tactic const *tactics)
 
tactic par_and_then (tactic const &t1, tactic const &t2)
 
simplifier operator& (simplifier const &t1, simplifier const &t2)
 
simplifier with (simplifier const &t, params const &p)
 
probe operator<= (probe const &p1, probe const &p2)
 
probe operator<= (probe const &p1, double p2)
 
probe operator<= (double p1, probe const &p2)
 
probe operator>= (probe const &p1, probe const &p2)
 
probe operator>= (probe const &p1, double p2)
 
probe operator>= (double p1, probe const &p2)
 
probe operator< (probe const &p1, probe const &p2)
 
probe operator< (probe const &p1, double p2)
 
probe operator< (double p1, probe const &p2)
 
probe operator> (probe const &p1, probe const &p2)
 
probe operator> (probe const &p1, double p2)
 
probe operator> (double p1, probe const &p2)
 
probe operator== (probe const &p1, probe const &p2)
 
probe operator== (probe const &p1, double p2)
 
probe operator== (double p1, probe const &p2)
 
probe operator&& (probe const &p1, probe const &p2)
 
probe operator|| (probe const &p1, probe const &p2)
 
probe operator! (probe const &p)
 
std::ostream & operator<< (std::ostream &out, optimize const &s)
 
std::ostream & operator<< (std::ostream &out, fixedpoint const &f)
 
tactic fail_if (probe const &p)
 
tactic when (probe const &p, tactic const &t)
 
tactic cond (probe const &p, tactic const &t1, tactic const &t2)
 
expr to_real (expr const &a)
 
func_decl function (symbol const &name, unsigned arity, sort const *domain, sort const &range)
 
func_decl function (char const *name, unsigned arity, sort const *domain, sort const &range)
 
func_decl function (char const *name, sort const &domain, sort const &range)
 
func_decl function (char const *name, sort const &d1, sort const &d2, sort const &range)
 
func_decl function (char const *name, sort const &d1, sort const &d2, sort const &d3, sort const &range)
 
func_decl function (char const *name, sort const &d1, sort const &d2, sort const &d3, sort const &d4, sort const &range)
 
func_decl function (char const *name, sort const &d1, sort const &d2, sort const &d3, sort const &d4, sort const &d5, sort const &range)
 
func_decl function (char const *name, sort_vector const &domain, sort const &range)
 
func_decl function (std::string const &name, sort_vector const &domain, sort const &range)
 
func_decl recfun (symbol const &name, unsigned arity, sort const *domain, sort const &range)
 
func_decl recfun (char const *name, unsigned arity, sort const *domain, sort const &range)
 
func_decl recfun (char const *name, sort const &d1, sort const &range)
 
func_decl recfun (char const *name, sort const &d1, sort const &d2, sort const &range)
 
expr select (expr const &a, int i)
 
expr store (expr const &a, expr const &i, expr const &v)
 
expr store (expr const &a, int i, expr const &v)
 
expr store (expr const &a, expr i, int v)
 
expr store (expr const &a, int i, int v)
 
expr store (expr const &a, expr_vector const &i, expr const &v)
 
expr as_array (func_decl &f)
 
expr array_default (expr const &a)
 
expr array_ext (expr const &a, expr const &b)
 
expr const_array (sort const &d, expr const &v)
 
expr empty_set (sort const &s)
 
expr full_set (sort const &s)
 
expr set_add (expr const &s, expr const &e)
 
expr set_del (expr const &s, expr const &e)
 
expr set_union (expr const &a, expr const &b)
 
expr set_intersect (expr const &a, expr const &b)
 
expr set_difference (expr const &a, expr const &b)
 
expr set_complement (expr const &a)
 
expr set_member (expr const &s, expr const &e)
 
expr set_subset (expr const &a, expr const &b)
 
expr finite_set_empty (sort const &s)
 
expr finite_set_singleton (expr const &e)
 
expr finite_set_union (expr const &a, expr const &b)
 
expr finite_set_intersect (expr const &a, expr const &b)
 
expr finite_set_difference (expr const &a, expr const &b)
 
expr finite_set_member (expr const &e, expr const &s)
 
expr finite_set_size (expr const &s)
 
expr finite_set_subset (expr const &a, expr const &b)
 
expr finite_set_map (expr const &f, expr const &s)
 
expr finite_set_filter (expr const &f, expr const &s)
 
expr finite_set_range (expr const &low, expr const &high)
 
expr empty (sort const &s)
 
expr suffixof (expr const &a, expr const &b)
 
expr prefixof (expr const &a, expr const &b)
 
expr indexof (expr const &s, expr const &substr, expr const &offset)
 
expr last_indexof (expr const &s, expr const &substr)
 
expr to_re (expr const &s)
 
expr in_re (expr const &s, expr const &re)
 
expr plus (expr const &re)
 
expr option (expr const &re)
 
expr star (expr const &re)
 
expr re_empty (sort const &s)
 
expr re_full (sort const &s)
 
expr re_intersect (expr_vector const &args)
 
expr re_diff (expr const &a, expr const &b)
 
expr re_complement (expr const &a)
 
expr range (expr const &lo, expr const &hi)
 
rcf_num rcf_pi (context &c)
 Create an RCF numeral representing pi.
 
rcf_num rcf_e (context &c)
 Create an RCF numeral representing e (Euler's constant).
 
rcf_num rcf_infinitesimal (context &c)
 Create an RCF numeral representing an infinitesimal.
 
std::vector< rcf_numrcf_roots (context &c, std::vector< rcf_num > const &coeffs)
 Find roots of a polynomial with given coefficients.
 

Macro Definition Documentation

◆ _Z3_MK_BIN_

#define _Z3_MK_BIN_ (   a,
  b,
  binop 
)
Value:
check_context(a, b); \
Z3_ast r = binop(a.ctx(), a, b); \
a.check_error(); \
return expr(a.ctx(), r); \

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

1759 {
1760 assert(a.is_bool() && b.is_bool());
1762 }
1763 inline expr implies(expr const & a, bool b) { return implies(a, a.ctx().bool_val(b)); }
1764 inline expr implies(bool a, expr const & b) { return implies(b.ctx().bool_val(a), b); }
1765
1766
1767 inline expr pw(expr const & a, expr const & b) { _Z3_MK_BIN_(a, b, Z3_mk_power); }
1768 inline expr pw(expr const & a, int b) { return pw(a, a.ctx().num_val(b, a.get_sort())); }
1769 inline expr pw(int a, expr const & b) { return pw(b.ctx().num_val(a, b.get_sort()), b); }
1770
1771 inline expr mod(expr const& a, expr const& b) {
1772 if (a.is_bv()) {
1773 _Z3_MK_BIN_(a, b, Z3_mk_bvsmod);
1774 }
1775 else {
1776 _Z3_MK_BIN_(a, b, Z3_mk_mod);
1777 }
1778 }
1779 inline expr mod(expr const & a, int b) { return mod(a, a.ctx().num_val(b, a.get_sort())); }
1780 inline expr mod(int a, expr const & b) { return mod(b.ctx().num_val(a, b.get_sort()), b); }
1781
1782 inline expr operator%(expr const& a, expr const& b) { return mod(a, b); }
1783 inline expr operator%(expr const& a, int b) { return mod(a, b); }
1784 inline expr operator%(int a, expr const& b) { return mod(a, b); }
1785
1786
1787 inline expr rem(expr const& a, expr const& b) {
1788 if (a.is_fpa() && b.is_fpa()) {
1790 } else {
1791 _Z3_MK_BIN_(a, b, Z3_mk_rem);
1792 }
1793 }
1794 inline expr rem(expr const & a, int b) { return rem(a, a.ctx().num_val(b, a.get_sort())); }
1795 inline expr rem(int a, expr const & b) { return rem(b.ctx().num_val(a, b.get_sort()), b); }
1796
1797#undef _Z3_MK_BIN_
1798
1799#define _Z3_MK_UN_(a, mkun) \
1800 Z3_ast r = mkun(a.ctx(), a); \
1801 a.check_error(); \
1802 return expr(a.ctx(), r); \
1803
1804
1805 inline expr operator!(expr const & a) { assert(a.is_bool()); _Z3_MK_UN_(a, Z3_mk_not); }
1806
1807 inline expr is_int(expr const& e) { _Z3_MK_UN_(e, Z3_mk_is_int); }
1808
1809#undef _Z3_MK_UN_
1810
1811 inline expr operator&&(expr const & a, expr const & b) {
1812 check_context(a, b);
1813 assert(a.is_bool() && b.is_bool());
1814 Z3_ast args[2] = { a, b };
1815 Z3_ast r = Z3_mk_and(a.ctx(), 2, args);
1816 a.check_error();
1817 return expr(a.ctx(), r);
1818 }
1819
1820 inline expr operator&&(expr const & a, bool b) { return a && a.ctx().bool_val(b); }
1821 inline expr operator&&(bool a, expr const & b) { return b.ctx().bool_val(a) && b; }
1822
1823 inline expr operator||(expr const & a, expr const & b) {
1824 check_context(a, b);
1825 assert(a.is_bool() && b.is_bool());
1826 Z3_ast args[2] = { a, b };
1827 Z3_ast r = Z3_mk_or(a.ctx(), 2, args);
1828 a.check_error();
1829 return expr(a.ctx(), r);
1830 }
1831
1832 inline expr operator||(expr const & a, bool b) { return a || a.ctx().bool_val(b); }
1833
1834 inline expr operator||(bool a, expr const & b) { return b.ctx().bool_val(a) || b; }
1835
1836 inline expr operator==(expr const & a, expr const & b) {
1837 check_context(a, b);
1838 Z3_ast r = Z3_mk_eq(a.ctx(), a, b);
1839 a.check_error();
1840 return expr(a.ctx(), r);
1841 }
1842 inline expr operator==(expr const & a, int b) { assert(a.is_arith() || a.is_bv() || a.is_fpa()); return a == a.ctx().num_val(b, a.get_sort()); }
1843 inline expr operator==(int a, expr const & b) { assert(b.is_arith() || b.is_bv() || b.is_fpa()); return b.ctx().num_val(a, b.get_sort()) == b; }
1844 inline expr operator==(expr const & a, double b) { assert(a.is_fpa()); return a == a.ctx().fpa_val(b); }
1845 inline expr operator==(double a, expr const & b) { assert(b.is_fpa()); return b.ctx().fpa_val(a) == b; }
1846
1847 inline expr operator!=(expr const & a, expr const & b) {
1848 check_context(a, b);
1849 Z3_ast args[2] = { a, b };
1850 Z3_ast r = Z3_mk_distinct(a.ctx(), 2, args);
1851 a.check_error();
1852 return expr(a.ctx(), r);
1853 }
1854 inline expr operator!=(expr const & a, int b) { assert(a.is_arith() || a.is_bv() || a.is_fpa()); return a != a.ctx().num_val(b, a.get_sort()); }
1855 inline expr operator!=(int a, expr const & b) { assert(b.is_arith() || b.is_bv() || b.is_fpa()); return b.ctx().num_val(a, b.get_sort()) != b; }
1856 inline expr operator!=(expr const & a, double b) { assert(a.is_fpa()); return a != a.ctx().fpa_val(b); }
1857 inline expr operator!=(double a, expr const & b) { assert(b.is_fpa()); return b.ctx().fpa_val(a) != b; }
1858
1859 inline expr operator+(expr const & a, expr const & b) {
1860 check_context(a, b);
1861 Z3_ast r = 0;
1862 if (a.is_arith() && b.is_arith()) {
1863 Z3_ast args[2] = { a, b };
1864 r = Z3_mk_add(a.ctx(), 2, args);
1865 }
1866 else if (a.is_bv() && b.is_bv()) {
1867 r = Z3_mk_bvadd(a.ctx(), a, b);
1868 }
1869 else if (a.is_seq() && b.is_seq()) {
1870 return concat(a, b);
1871 }
1872 else if (a.is_re() && b.is_re()) {
1873 Z3_ast _args[2] = { a, b };
1874 r = Z3_mk_re_union(a.ctx(), 2, _args);
1875 }
1876 else if (a.is_fpa() && b.is_fpa()) {
1877 r = Z3_mk_fpa_add(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1878 }
1879 else {
1880 // operator is not supported by given arguments.
1881 assert(false);
1882 }
1883 a.check_error();
1884 return expr(a.ctx(), r);
1885 }
1886 inline expr operator+(expr const & a, int b) { return a + a.ctx().num_val(b, a.get_sort()); }
1887 inline expr operator+(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) + b; }
1888
1889 inline expr operator*(expr const & a, expr const & b) {
1890 check_context(a, b);
1891 Z3_ast r = 0;
1892 if (a.is_arith() && b.is_arith()) {
1893 Z3_ast args[2] = { a, b };
1894 r = Z3_mk_mul(a.ctx(), 2, args);
1895 }
1896 else if (a.is_bv() && b.is_bv()) {
1897 r = Z3_mk_bvmul(a.ctx(), a, b);
1898 }
1899 else if (a.is_fpa() && b.is_fpa()) {
1900 r = Z3_mk_fpa_mul(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1901 }
1902 else {
1903 // operator is not supported by given arguments.
1904 assert(false);
1905 }
1906 a.check_error();
1907 return expr(a.ctx(), r);
1908 }
1909 inline expr operator*(expr const & a, int b) { return a * a.ctx().num_val(b, a.get_sort()); }
1910 inline expr operator*(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) * b; }
1911
1912
1913 inline expr operator>=(expr const & a, expr const & b) {
1914 check_context(a, b);
1915 Z3_ast r = 0;
1916 if (a.is_arith() && b.is_arith()) {
1917 r = Z3_mk_ge(a.ctx(), a, b);
1918 }
1919 else if (a.is_bv() && b.is_bv()) {
1920 r = Z3_mk_bvsge(a.ctx(), a, b);
1921 }
1922 else if (a.is_fpa() && b.is_fpa()) {
1923 r = Z3_mk_fpa_geq(a.ctx(), a, b);
1924 }
1925 else {
1926 // operator is not supported by given arguments.
1927 assert(false);
1928 }
1929 a.check_error();
1930 return expr(a.ctx(), r);
1931 }
1932
1933 inline expr operator/(expr const & a, expr const & b) {
1934 check_context(a, b);
1935 Z3_ast r = 0;
1936 if (a.is_arith() && b.is_arith()) {
1937 r = Z3_mk_div(a.ctx(), a, b);
1938 }
1939 else if (a.is_bv() && b.is_bv()) {
1940 r = Z3_mk_bvsdiv(a.ctx(), a, b);
1941 }
1942 else if (a.is_fpa() && b.is_fpa()) {
1943 r = Z3_mk_fpa_div(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1944 }
1945 else {
1946 // operator is not supported by given arguments.
1947 assert(false);
1948 }
1949 a.check_error();
1950 return expr(a.ctx(), r);
1951 }
1952 inline expr operator/(expr const & a, int b) { return a / a.ctx().num_val(b, a.get_sort()); }
1953 inline expr operator/(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) / b; }
1954
1955 inline expr operator-(expr const & a) {
1956 Z3_ast r = 0;
1957 if (a.is_arith()) {
1958 r = Z3_mk_unary_minus(a.ctx(), a);
1959 }
1960 else if (a.is_bv()) {
1961 r = Z3_mk_bvneg(a.ctx(), a);
1962 }
1963 else if (a.is_fpa()) {
1964 r = Z3_mk_fpa_neg(a.ctx(), a);
1965 }
1966 else {
1967 // operator is not supported by given arguments.
1968 assert(false);
1969 }
1970 a.check_error();
1971 return expr(a.ctx(), r);
1972 }
1973
1974 inline expr operator-(expr const & a, expr const & b) {
1975 check_context(a, b);
1976 Z3_ast r = 0;
1977 if (a.is_arith() && b.is_arith()) {
1978 Z3_ast args[2] = { a, b };
1979 r = Z3_mk_sub(a.ctx(), 2, args);
1980 }
1981 else if (a.is_bv() && b.is_bv()) {
1982 r = Z3_mk_bvsub(a.ctx(), a, b);
1983 }
1984 else if (a.is_fpa() && b.is_fpa()) {
1985 r = Z3_mk_fpa_sub(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1986 }
1987 else {
1988 // operator is not supported by given arguments.
1989 assert(false);
1990 }
1991 a.check_error();
1992 return expr(a.ctx(), r);
1993 }
1994 inline expr operator-(expr const & a, int b) { return a - a.ctx().num_val(b, a.get_sort()); }
1995 inline expr operator-(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) - b; }
1996
1997 inline expr operator<=(expr const & a, expr const & b) {
1998 check_context(a, b);
1999 Z3_ast r = 0;
2000 if (a.is_arith() && b.is_arith()) {
2001 r = Z3_mk_le(a.ctx(), a, b);
2002 }
2003 else if (a.is_bv() && b.is_bv()) {
2004 r = Z3_mk_bvsle(a.ctx(), a, b);
2005 }
2006 else if (a.is_fpa() && b.is_fpa()) {
2007 r = Z3_mk_fpa_leq(a.ctx(), a, b);
2008 }
2009 else {
2010 // operator is not supported by given arguments.
2011 assert(false);
2012 }
2013 a.check_error();
2014 return expr(a.ctx(), r);
2015 }
2016 inline expr operator<=(expr const & a, int b) { return a <= a.ctx().num_val(b, a.get_sort()); }
2017 inline expr operator<=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) <= b; }
2018
2019 inline expr operator>=(expr const & a, int b) { return a >= a.ctx().num_val(b, a.get_sort()); }
2020 inline expr operator>=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) >= b; }
2021
2022 inline expr operator<(expr const & a, expr const & b) {
2023 check_context(a, b);
2024 Z3_ast r = 0;
2025 if (a.is_arith() && b.is_arith()) {
2026 r = Z3_mk_lt(a.ctx(), a, b);
2027 }
2028 else if (a.is_bv() && b.is_bv()) {
2029 r = Z3_mk_bvslt(a.ctx(), a, b);
2030 }
2031 else if (a.is_fpa() && b.is_fpa()) {
2032 r = Z3_mk_fpa_lt(a.ctx(), a, b);
2033 }
2034 else {
2035 // operator is not supported by given arguments.
2036 assert(false);
2037 }
2038 a.check_error();
2039 return expr(a.ctx(), r);
2040 }
2041 inline expr operator<(expr const & a, int b) { return a < a.ctx().num_val(b, a.get_sort()); }
2042 inline expr operator<(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) < b; }
2043
2044 inline expr operator>(expr const & a, expr const & b) {
2045 check_context(a, b);
2046 Z3_ast r = 0;
2047 if (a.is_arith() && b.is_arith()) {
2048 r = Z3_mk_gt(a.ctx(), a, b);
2049 }
2050 else if (a.is_bv() && b.is_bv()) {
2051 r = Z3_mk_bvsgt(a.ctx(), a, b);
2052 }
2053 else if (a.is_fpa() && b.is_fpa()) {
2054 r = Z3_mk_fpa_gt(a.ctx(), a, b);
2055 }
2056 else {
2057 // operator is not supported by given arguments.
2058 assert(false);
2059 }
2060 a.check_error();
2061 return expr(a.ctx(), r);
2062 }
2063 inline expr operator>(expr const & a, int b) { return a > a.ctx().num_val(b, a.get_sort()); }
2064 inline expr operator>(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) > b; }
2065
2066 inline expr operator&(expr const & a, expr const & b) { 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); }
2067 inline expr operator&(expr const & a, int b) { return a & a.ctx().num_val(b, a.get_sort()); }
2068 inline expr operator&(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) & b; }
2069
2070 inline expr operator^(expr const & a, expr const & b) { 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); }
2071 inline expr operator^(expr const & a, int b) { return a ^ a.ctx().num_val(b, a.get_sort()); }
2072 inline expr operator^(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) ^ b; }
2073
2074 inline expr operator|(expr const & a, expr const & b) { 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); }
2075 inline expr operator|(expr const & a, int b) { return a | a.ctx().num_val(b, a.get_sort()); }
2076 inline expr operator|(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) | b; }
2077
2078 inline expr nand(expr const& a, expr const& b) { 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); }
2079 inline expr nor(expr const& a, expr const& b) { 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); }
2080 inline expr xnor(expr const& a, expr const& b) { 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); }
2081 inline expr min(expr const& a, expr const& b) {
2082 check_context(a, b);
2083 Z3_ast r;
2084 if (a.is_arith()) {
2085 r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), b, a);
2086 }
2087 else if (a.is_bv()) {
2088 r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), b, a);
2089 }
2090 else {
2091 assert(a.is_fpa());
2092 r = Z3_mk_fpa_min(a.ctx(), a, b);
2093 }
2094 a.check_error();
2095 return expr(a.ctx(), r);
2096 }
2097 inline expr max(expr const& a, expr const& b) {
2098 check_context(a, b);
2099 Z3_ast r;
2100 if (a.is_arith()) {
2101 r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), a, b);
2102 }
2103 else if (a.is_bv()) {
2104 r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), a, b);
2105 }
2106 else {
2107 assert(a.is_fpa());
2108 r = Z3_mk_fpa_max(a.ctx(), a, b);
2109 }
2110 a.check_error();
2111 return expr(a.ctx(), r);
2112 }
2113 inline expr bvredor(expr const & a) {
2114 assert(a.is_bv());
2115 Z3_ast r = Z3_mk_bvredor(a.ctx(), a);
2116 a.check_error();
2117 return expr(a.ctx(), r);
2118 }
2119 inline expr bvredand(expr const & a) {
2120 assert(a.is_bv());
2121 Z3_ast r = Z3_mk_bvredand(a.ctx(), a);
2122 a.check_error();
2123 return expr(a.ctx(), r);
2124 }
2125 inline expr abs(expr const & a) {
2126 Z3_ast r;
2127 if (a.is_int()) {
2128 expr zero = a.ctx().int_val(0);
2129 expr ge = a >= zero;
2130 expr na = -a;
2131 r = Z3_mk_ite(a.ctx(), ge, a, na);
2132 }
2133 else if (a.is_real()) {
2134 expr zero = a.ctx().real_val(0);
2135 expr ge = a >= zero;
2136 expr na = -a;
2137 r = Z3_mk_ite(a.ctx(), ge, a, na);
2138 }
2139 else {
2140 r = Z3_mk_fpa_abs(a.ctx(), a);
2141 }
2142 a.check_error();
2143 return expr(a.ctx(), r);
2144 }
2145 inline expr sqrt(expr const & a, expr const& rm) {
2146 check_context(a, rm);
2147 assert(a.is_fpa());
2148 Z3_ast r = Z3_mk_fpa_sqrt(a.ctx(), rm, a);
2149 a.check_error();
2150 return expr(a.ctx(), r);
2151 }
2152 inline expr fp_eq(expr const & a, expr const & b) {
2153 check_context(a, b);
2154 assert(a.is_fpa());
2155 Z3_ast r = Z3_mk_fpa_eq(a.ctx(), a, b);
2156 a.check_error();
2157 return expr(a.ctx(), r);
2158 }
2159 inline expr operator~(expr const & a) { Z3_ast r = Z3_mk_bvnot(a.ctx(), a); return expr(a.ctx(), r); }
2160
2161 inline expr fma(expr const& a, expr const& b, expr const& c, expr const& rm) {
2162 check_context(a, b); check_context(a, c); check_context(a, rm);
2163 assert(a.is_fpa() && b.is_fpa() && c.is_fpa());
2164 Z3_ast r = Z3_mk_fpa_fma(a.ctx(), rm, a, b, c);
2165 a.check_error();
2166 return expr(a.ctx(), r);
2167 }
2168
2169 inline expr fpa_fp(expr const& sgn, expr const& exp, expr const& sig) {
2170 check_context(sgn, exp); check_context(exp, sig);
2171 assert(sgn.is_bv() && exp.is_bv() && sig.is_bv());
2172 Z3_ast r = Z3_mk_fpa_fp(sgn.ctx(), sgn, exp, sig);
2173 sgn.check_error();
2174 return expr(sgn.ctx(), r);
2175 }
2176
2177 inline expr fpa_to_sbv(expr const& t, unsigned sz) {
2178 assert(t.is_fpa());
2179 Z3_ast r = Z3_mk_fpa_to_sbv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
2180 t.check_error();
2181 return expr(t.ctx(), r);
2182 }
2183
2184 inline expr fpa_to_ubv(expr const& t, unsigned sz) {
2185 assert(t.is_fpa());
2186 Z3_ast r = Z3_mk_fpa_to_ubv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
2187 t.check_error();
2188 return expr(t.ctx(), r);
2189 }
2190
2191 inline expr sbv_to_fpa(expr const& t, sort s) {
2192 assert(t.is_bv());
2193 Z3_ast r = Z3_mk_fpa_to_fp_signed(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2194 t.check_error();
2195 return expr(t.ctx(), r);
2196 }
2197
2198 inline expr ubv_to_fpa(expr const& t, sort s) {
2199 assert(t.is_bv());
2200 Z3_ast r = Z3_mk_fpa_to_fp_unsigned(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2201 t.check_error();
2202 return expr(t.ctx(), r);
2203 }
2204
2205 inline expr fpa_to_fpa(expr const& t, sort s) {
2206 assert(t.is_fpa());
2207 Z3_ast r = Z3_mk_fpa_to_fp_float(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2208 t.check_error();
2209 return expr(t.ctx(), r);
2210 }
2211
2212 inline expr round_fpa_to_closest_integer(expr const& t) {
2213 assert(t.is_fpa());
2214 Z3_ast r = Z3_mk_fpa_round_to_integral(t.ctx(), t.ctx().fpa_rounding_mode(), t);
2215 t.check_error();
2216 return expr(t.ctx(), r);
2217 }
2218
2224 inline expr ite(expr const & c, expr const & t, expr const & e) {
2225 check_context(c, t); check_context(c, e);
2226 assert(c.is_bool());
2227 Z3_ast r = Z3_mk_ite(c.ctx(), c, t, e);
2228 c.check_error();
2229 return expr(c.ctx(), r);
2230 }
2231
2232
2237 inline expr to_expr(context & c, Z3_ast a) {
2238 c.check_error();
2239 assert(Z3_get_ast_kind(c, a) == Z3_APP_AST ||
2241 Z3_get_ast_kind(c, a) == Z3_VAR_AST ||
2243 return expr(c, a);
2244 }
2245
2246 inline sort to_sort(context & c, Z3_sort s) {
2247 c.check_error();
2248 return sort(c, s);
2249 }
2250
2251 inline func_decl to_func_decl(context & c, Z3_func_decl f) {
2252 c.check_error();
2253 return func_decl(c, f);
2254 }
2255
2259 inline expr sle(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsle(a.ctx(), a, b)); }
2260 inline expr sle(expr const & a, int b) { return sle(a, a.ctx().num_val(b, a.get_sort())); }
2261 inline expr sle(int a, expr const & b) { return sle(b.ctx().num_val(a, b.get_sort()), b); }
2265 inline expr slt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvslt(a.ctx(), a, b)); }
2266 inline expr slt(expr const & a, int b) { return slt(a, a.ctx().num_val(b, a.get_sort())); }
2267 inline expr slt(int a, expr const & b) { return slt(b.ctx().num_val(a, b.get_sort()), b); }
2271 inline expr sge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsge(a.ctx(), a, b)); }
2272 inline expr sge(expr const & a, int b) { return sge(a, a.ctx().num_val(b, a.get_sort())); }
2273 inline expr sge(int a, expr const & b) { return sge(b.ctx().num_val(a, b.get_sort()), b); }
2277 inline expr sgt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsgt(a.ctx(), a, b)); }
2278 inline expr sgt(expr const & a, int b) { return sgt(a, a.ctx().num_val(b, a.get_sort())); }
2279 inline expr sgt(int a, expr const & b) { return sgt(b.ctx().num_val(a, b.get_sort()), b); }
2280
2281
2285 inline expr ule(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvule(a.ctx(), a, b)); }
2286 inline expr ule(expr const & a, int b) { return ule(a, a.ctx().num_val(b, a.get_sort())); }
2287 inline expr ule(int a, expr const & b) { return ule(b.ctx().num_val(a, b.get_sort()), b); }
2291 inline expr ult(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvult(a.ctx(), a, b)); }
2292 inline expr ult(expr const & a, int b) { return ult(a, a.ctx().num_val(b, a.get_sort())); }
2293 inline expr ult(int a, expr const & b) { return ult(b.ctx().num_val(a, b.get_sort()), b); }
2297 inline expr uge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b)); }
2298 inline expr uge(expr const & a, int b) { return uge(a, a.ctx().num_val(b, a.get_sort())); }
2299 inline expr uge(int a, expr const & b) { return uge(b.ctx().num_val(a, b.get_sort()), b); }
2303 inline expr ugt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvugt(a.ctx(), a, b)); }
2304 inline expr ugt(expr const & a, int b) { return ugt(a, a.ctx().num_val(b, a.get_sort())); }
2305 inline expr ugt(int a, expr const & b) { return ugt(b.ctx().num_val(a, b.get_sort()), b); }
2306
2310 inline expr sdiv(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsdiv(a.ctx(), a, b)); }
2311 inline expr sdiv(expr const & a, int b) { return sdiv(a, a.ctx().num_val(b, a.get_sort())); }
2312 inline expr sdiv(int a, expr const & b) { return sdiv(b.ctx().num_val(a, b.get_sort()), b); }
2313
2317 inline expr udiv(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvudiv(a.ctx(), a, b)); }
2318 inline expr udiv(expr const & a, int b) { return udiv(a, a.ctx().num_val(b, a.get_sort())); }
2319 inline expr udiv(int a, expr const & b) { return udiv(b.ctx().num_val(a, b.get_sort()), b); }
2320
2324 inline expr srem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsrem(a.ctx(), a, b)); }
2325 inline expr srem(expr const & a, int b) { return srem(a, a.ctx().num_val(b, a.get_sort())); }
2326 inline expr srem(int a, expr const & b) { return srem(b.ctx().num_val(a, b.get_sort()), b); }
2327
2331 inline expr smod(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsmod(a.ctx(), a, b)); }
2332 inline expr smod(expr const & a, int b) { return smod(a, a.ctx().num_val(b, a.get_sort())); }
2333 inline expr smod(int a, expr const & b) { return smod(b.ctx().num_val(a, b.get_sort()), b); }
2334
2338 inline expr urem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvurem(a.ctx(), a, b)); }
2339 inline expr urem(expr const & a, int b) { return urem(a, a.ctx().num_val(b, a.get_sort())); }
2340 inline expr urem(int a, expr const & b) { return urem(b.ctx().num_val(a, b.get_sort()), b); }
2341
2345 inline expr shl(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvshl(a.ctx(), a, b)); }
2346 inline expr shl(expr const & a, int b) { return shl(a, a.ctx().num_val(b, a.get_sort())); }
2347 inline expr shl(int a, expr const & b) { return shl(b.ctx().num_val(a, b.get_sort()), b); }
2348
2352 inline expr lshr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvlshr(a.ctx(), a, b)); }
2353 inline expr lshr(expr const & a, int b) { return lshr(a, a.ctx().num_val(b, a.get_sort())); }
2354 inline expr lshr(int a, expr const & b) { return lshr(b.ctx().num_val(a, b.get_sort()), b); }
2355
2359 inline expr ashr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvashr(a.ctx(), a, b)); }
2360 inline expr ashr(expr const & a, int b) { return ashr(a, a.ctx().num_val(b, a.get_sort())); }
2361 inline expr ashr(int a, expr const & b) { return ashr(b.ctx().num_val(a, b.get_sort()), b); }
2362
2366 inline expr zext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_zero_ext(a.ctx(), i, a)); }
2367
2371 inline expr bv2int(expr const& a, bool is_signed) { Z3_ast r = Z3_mk_bv2int(a.ctx(), a, is_signed); a.check_error(); return expr(a.ctx(), r); }
2372 inline expr int2bv(unsigned n, expr const& a) { Z3_ast r = Z3_mk_int2bv(a.ctx(), n, a); a.check_error(); return expr(a.ctx(), r); }
2373
2377 inline expr bvadd_no_overflow(expr const& a, expr const& b, bool is_signed) {
2378 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);
2379 }
2380 inline expr bvadd_no_underflow(expr const& a, expr const& b) {
2381 check_context(a, b); Z3_ast r = Z3_mk_bvadd_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2382 }
2383 inline expr bvsub_no_overflow(expr const& a, expr const& b) {
2384 check_context(a, b); Z3_ast r = Z3_mk_bvsub_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2385 }
2386 inline expr bvsub_no_underflow(expr const& a, expr const& b, bool is_signed) {
2387 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);
2388 }
2389 inline expr bvsdiv_no_overflow(expr const& a, expr const& b) {
2390 check_context(a, b); Z3_ast r = Z3_mk_bvsdiv_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2391 }
2392 inline expr bvneg_no_overflow(expr const& a) {
2393 Z3_ast r = Z3_mk_bvneg_no_overflow(a.ctx(), a); a.check_error(); return expr(a.ctx(), r);
2394 }
2395 inline expr bvmul_no_overflow(expr const& a, expr const& b, bool is_signed) {
2396 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);
2397 }
2398 inline expr bvmul_no_underflow(expr const& a, expr const& b) {
2399 check_context(a, b); Z3_ast r = Z3_mk_bvmul_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2400 }
2401
2402
2406 inline expr sext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_sign_ext(a.ctx(), i, a)); }
2407
2408 inline func_decl linear_order(sort const& a, unsigned index) {
2409 return to_func_decl(a.ctx(), Z3_mk_linear_order(a.ctx(), a, index));
2410 }
2411 inline func_decl partial_order(sort const& a, unsigned index) {
2412 return to_func_decl(a.ctx(), Z3_mk_partial_order(a.ctx(), a, index));
2413 }
2414 inline func_decl piecewise_linear_order(sort const& a, unsigned index) {
2415 return to_func_decl(a.ctx(), Z3_mk_piecewise_linear_order(a.ctx(), a, index));
2416 }
2417 inline func_decl tree_order(sort const& a, unsigned index) {
2418 return to_func_decl(a.ctx(), Z3_mk_tree_order(a.ctx(), a, index));
2419 }
2420
2427 inline expr_vector polynomial_subresultants(expr const& p, expr const& q, expr const& x) {
2428 check_context(p, q); check_context(p, x);
2429 Z3_ast_vector r = Z3_polynomial_subresultants(p.ctx(), p, q, x);
2430 p.check_error();
2431 return expr_vector(p.ctx(), r);
2432 }
2433
2434 template<> class cast_ast<ast> {
2435 public:
2436 ast operator()(context & c, Z3_ast a) { return ast(c, a); }
2437 };
2438
2439 template<> class cast_ast<expr> {
2440 public:
2441 expr operator()(context & c, Z3_ast a) {
2442 assert(Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST ||
2443 Z3_get_ast_kind(c, a) == Z3_APP_AST ||
2445 Z3_get_ast_kind(c, a) == Z3_VAR_AST);
2446 return expr(c, a);
2447 }
2448 };
2449
2450 template<> class cast_ast<sort> {
2451 public:
2452 sort operator()(context & c, Z3_ast a) {
2453 assert(Z3_get_ast_kind(c, a) == Z3_SORT_AST);
2454 return sort(c, reinterpret_cast<Z3_sort>(a));
2455 }
2456 };
2457
2458 template<> class cast_ast<func_decl> {
2459 public:
2460 func_decl operator()(context & c, Z3_ast a) {
2461 assert(Z3_get_ast_kind(c, a) == Z3_FUNC_DECL_AST);
2462 return func_decl(c, reinterpret_cast<Z3_func_decl>(a));
2463 }
2464 };
2465
2466 template<typename T>
2467 template<typename T2>
2468 array<T>::array(ast_vector_tpl<T2> const & v):m_array(new T[v.size()]), m_size(v.size()) {
2469 for (unsigned i = 0; i < m_size; ++i) {
2470 m_array[i] = v[i];
2471 }
2472 }
2473
2474 // Basic functions for creating quantified formulas.
2475 // The C API should be used for creating quantifiers with patterns, weights, many variables, etc.
2476 inline expr forall(expr const & x, expr const & b) {
2477 check_context(x, b);
2478 Z3_app vars[] = {(Z3_app) x};
2479 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2480 }
2481 inline expr forall(expr const & x1, expr const & x2, expr const & b) {
2482 check_context(x1, b); check_context(x2, b);
2483 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2484 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2485 }
2486 inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2487 check_context(x1, b); check_context(x2, b); check_context(x3, b);
2488 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2489 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2490 }
2491 inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2492 check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2493 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2494 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2495 }
2496 inline expr forall(expr_vector const & xs, expr const & b) {
2497 array<Z3_app> vars(xs);
2498 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, vars.size(), vars.ptr(), 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2499 }
2500 inline expr exists(expr const & x, expr const & b) {
2501 check_context(x, b);
2502 Z3_app vars[] = {(Z3_app) x};
2503 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2504 }
2505 inline expr exists(expr const & x1, expr const & x2, expr const & b) {
2506 check_context(x1, b); check_context(x2, b);
2507 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2508 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2509 }
2510 inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2511 check_context(x1, b); check_context(x2, b); check_context(x3, b);
2512 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2513 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2514 }
2515 inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2516 check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2517 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2518 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2519 }
2520 inline expr exists(expr_vector const & xs, expr const & b) {
2521 array<Z3_app> vars(xs);
2522 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, vars.size(), vars.ptr(), 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2523 }
2524 inline expr lambda(expr const & x, expr const & b) {
2525 check_context(x, b);
2526 Z3_app vars[] = {(Z3_app) x};
2527 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 1, vars, b); b.check_error(); return expr(b.ctx(), r);
2528 }
2529 inline expr lambda(expr const & x1, expr const & x2, expr const & b) {
2530 check_context(x1, b); check_context(x2, b);
2531 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2532 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 2, vars, b); b.check_error(); return expr(b.ctx(), r);
2533 }
2534 inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2535 check_context(x1, b); check_context(x2, b); check_context(x3, b);
2536 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2537 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 3, vars, b); b.check_error(); return expr(b.ctx(), r);
2538 }
2539 inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2540 check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2541 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2542 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 4, vars, b); b.check_error(); return expr(b.ctx(), r);
2543 }
2544 inline expr lambda(expr_vector const & xs, expr const & b) {
2545 array<Z3_app> vars(xs);
2546 Z3_ast r = Z3_mk_lambda_const(b.ctx(), vars.size(), vars.ptr(), b); b.check_error(); return expr(b.ctx(), r);
2547 }
2548
2549 inline expr pble(expr_vector const& es, int const* coeffs, int bound) {
2550 assert(es.size() > 0);
2551 context& ctx = es[0u].ctx();
2552 array<Z3_ast> _es(es);
2553 Z3_ast r = Z3_mk_pble(ctx, _es.size(), _es.ptr(), coeffs, bound);
2554 ctx.check_error();
2555 return expr(ctx, r);
2556 }
2557 inline expr pbge(expr_vector const& es, int const* coeffs, int bound) {
2558 assert(es.size() > 0);
2559 context& ctx = es[0u].ctx();
2560 array<Z3_ast> _es(es);
2561 Z3_ast r = Z3_mk_pbge(ctx, _es.size(), _es.ptr(), coeffs, bound);
2562 ctx.check_error();
2563 return expr(ctx, r);
2564 }
2565 inline expr pbeq(expr_vector const& es, int const* coeffs, int bound) {
2566 assert(es.size() > 0);
2567 context& ctx = es[0u].ctx();
2568 array<Z3_ast> _es(es);
2569 Z3_ast r = Z3_mk_pbeq(ctx, _es.size(), _es.ptr(), coeffs, bound);
2570 ctx.check_error();
2571 return expr(ctx, r);
2572 }
2573 inline expr atmost(expr_vector const& es, unsigned bound) {
2574 assert(es.size() > 0);
2575 context& ctx = es[0u].ctx();
2576 array<Z3_ast> _es(es);
2577 Z3_ast r = Z3_mk_atmost(ctx, _es.size(), _es.ptr(), bound);
2578 ctx.check_error();
2579 return expr(ctx, r);
2580 }
2581 inline expr atleast(expr_vector const& es, unsigned bound) {
2582 assert(es.size() > 0);
2583 context& ctx = es[0u].ctx();
2584 array<Z3_ast> _es(es);
2585 Z3_ast r = Z3_mk_atleast(ctx, _es.size(), _es.ptr(), bound);
2586 ctx.check_error();
2587 return expr(ctx, r);
2588 }
2589 inline expr sum(expr_vector const& args) {
2590 assert(args.size() > 0);
2591 context& ctx = args[0u].ctx();
2592 array<Z3_ast> _args(args);
2593 Z3_ast r = Z3_mk_add(ctx, _args.size(), _args.ptr());
2594 ctx.check_error();
2595 return expr(ctx, r);
2596 }
2597
2598 inline expr distinct(expr_vector const& args) {
2599 assert(args.size() > 0);
2600 context& ctx = args[0u].ctx();
2601 array<Z3_ast> _args(args);
2602 Z3_ast r = Z3_mk_distinct(ctx, _args.size(), _args.ptr());
2603 ctx.check_error();
2604 return expr(ctx, r);
2605 }
2606
2607 inline expr concat(expr const& a, expr const& b) {
2608 check_context(a, b);
2609 Z3_ast r;
2610 if (Z3_is_seq_sort(a.ctx(), a.get_sort())) {
2611 Z3_ast _args[2] = { a, b };
2612 r = Z3_mk_seq_concat(a.ctx(), 2, _args);
2613 }
2614 else if (Z3_is_re_sort(a.ctx(), a.get_sort())) {
2615 Z3_ast _args[2] = { a, b };
2616 r = Z3_mk_re_concat(a.ctx(), 2, _args);
2617 }
2618 else {
2619 r = Z3_mk_concat(a.ctx(), a, b);
2620 }
2621 a.ctx().check_error();
2622 return expr(a.ctx(), r);
2623 }
2624
2625 inline expr concat(expr_vector const& args) {
2626 Z3_ast r;
2627 assert(args.size() > 0);
2628 if (args.size() == 1) {
2629 return args[0u];
2630 }
2631 context& ctx = args[0u].ctx();
2632 array<Z3_ast> _args(args);
2633 if (Z3_is_seq_sort(ctx, args[0u].get_sort())) {
2634 r = Z3_mk_seq_concat(ctx, _args.size(), _args.ptr());
2635 }
2636 else if (Z3_is_re_sort(ctx, args[0u].get_sort())) {
2637 r = Z3_mk_re_concat(ctx, _args.size(), _args.ptr());
2638 }
2639 else {
2640 r = _args[args.size()-1];
2641 for (unsigned i = args.size()-1; i > 0; ) {
2642 --i;
2643 r = Z3_mk_concat(ctx, _args[i], r);
2644 ctx.check_error();
2645 }
2646 }
2647 ctx.check_error();
2648 return expr(ctx, r);
2649 }
2650
2651 inline expr map(expr const& f, expr const& list) {
2652 context& ctx = f.ctx();
2653 Z3_ast r = Z3_mk_seq_map(ctx, f, list);
2654 ctx.check_error();
2655 return expr(ctx, r);
2656 }
2657
2658 inline expr mapi(expr const& f, expr const& i, expr const& list) {
2659 context& ctx = f.ctx();
2660 Z3_ast r = Z3_mk_seq_mapi(ctx, f, i, list);
2661 ctx.check_error();
2662 return expr(ctx, r);
2663 }
2664
2665 inline expr foldl(expr const& f, expr const& a, expr const& list) {
2666 context& ctx = f.ctx();
2667 Z3_ast r = Z3_mk_seq_foldl(ctx, f, a, list);
2668 ctx.check_error();
2669 return expr(ctx, r);
2670 }
2671
2672 inline expr foldli(expr const& f, expr const& i, expr const& a, expr const& list) {
2673 context& ctx = f.ctx();
2674 Z3_ast r = Z3_mk_seq_foldli(ctx, f, i, a, list);
2675 ctx.check_error();
2676 return expr(ctx, r);
2677 }
2678
2679 inline expr mk_or(expr_vector const& args) {
2680 array<Z3_ast> _args(args);
2681 Z3_ast r = Z3_mk_or(args.ctx(), _args.size(), _args.ptr());
2682 args.check_error();
2683 return expr(args.ctx(), r);
2684 }
2685 inline expr mk_and(expr_vector const& args) {
2686 array<Z3_ast> _args(args);
2687 Z3_ast r = Z3_mk_and(args.ctx(), _args.size(), _args.ptr());
2688 args.check_error();
2689 return expr(args.ctx(), r);
2690 }
2691 inline expr mk_xor(expr_vector const& args) {
2692 if (args.empty())
2693 return args.ctx().bool_val(false);
2694 expr r = args[0u];
2695 for (unsigned i = 1; i < args.size(); ++i)
2696 r = r ^ args[i];
2697 return r;
2698 }
2699
2700
2701 class func_entry : public object {
2702 Z3_func_entry m_entry;
2703 void init(Z3_func_entry e) {
2704 m_entry = e;
2705 Z3_func_entry_inc_ref(ctx(), m_entry);
2706 }
2707 public:
2708 func_entry(context & c, Z3_func_entry e):object(c) { init(e); }
2709 func_entry(func_entry const & s):object(s) { init(s.m_entry); }
2710 ~func_entry() override { Z3_func_entry_dec_ref(ctx(), m_entry); }
2711 operator Z3_func_entry() const { return m_entry; }
2712 func_entry & operator=(func_entry const & s) {
2713 Z3_func_entry_inc_ref(s.ctx(), s.m_entry);
2714 Z3_func_entry_dec_ref(ctx(), m_entry);
2715 object::operator=(s);
2716 m_entry = s.m_entry;
2717 return *this;
2718 }
2719 expr value() const { Z3_ast r = Z3_func_entry_get_value(ctx(), m_entry); check_error(); return expr(ctx(), r); }
2720 unsigned num_args() const { unsigned r = Z3_func_entry_get_num_args(ctx(), m_entry); check_error(); return r; }
2721 expr arg(unsigned i) const { Z3_ast r = Z3_func_entry_get_arg(ctx(), m_entry, i); check_error(); return expr(ctx(), r); }
2722 };
2723
2724 class func_interp : public object {
2725 Z3_func_interp m_interp;
2726 void init(Z3_func_interp e) {
2727 m_interp = e;
2728 Z3_func_interp_inc_ref(ctx(), m_interp);
2729 }
2730 public:
2731 func_interp(context & c, Z3_func_interp e):object(c) { init(e); }
2732 func_interp(func_interp const & s):object(s) { init(s.m_interp); }
2733 ~func_interp() override { Z3_func_interp_dec_ref(ctx(), m_interp); }
2734 operator Z3_func_interp() const { return m_interp; }
2735 func_interp & operator=(func_interp const & s) {
2736 Z3_func_interp_inc_ref(s.ctx(), s.m_interp);
2737 Z3_func_interp_dec_ref(ctx(), m_interp);
2738 object::operator=(s);
2739 m_interp = s.m_interp;
2740 return *this;
2741 }
2742 expr else_value() const { Z3_ast r = Z3_func_interp_get_else(ctx(), m_interp); check_error(); return expr(ctx(), r); }
2743 unsigned num_entries() const { unsigned r = Z3_func_interp_get_num_entries(ctx(), m_interp); check_error(); return r; }
2744 func_entry entry(unsigned i) const { Z3_func_entry e = Z3_func_interp_get_entry(ctx(), m_interp, i); check_error(); return func_entry(ctx(), e); }
2745 void add_entry(expr_vector const& args, expr& value) {
2746 Z3_func_interp_add_entry(ctx(), m_interp, args, value);
2747 check_error();
2748 }
2749 void set_else(expr& value) {
2750 Z3_func_interp_set_else(ctx(), m_interp, value);
2751 check_error();
2752 }
2753 };
2754
2755 class model : public object {
2756 Z3_model m_model;
2757 void init(Z3_model m) {
2758 m_model = m;
2759 Z3_model_inc_ref(ctx(), m);
2760 }
2761 public:
2762 struct translate {};
2763 model(context & c):object(c) { init(Z3_mk_model(c)); }
2764 model(context & c, Z3_model m):object(c) { init(m); }
2765 model(model const & s):object(s) { init(s.m_model); }
2766 model(model& src, context& dst, translate) : object(dst) { init(Z3_model_translate(src.ctx(), src, dst)); }
2767 ~model() override { Z3_model_dec_ref(ctx(), m_model); }
2768 operator Z3_model() const { return m_model; }
2769 model & operator=(model const & s) {
2770 Z3_model_inc_ref(s.ctx(), s.m_model);
2771 Z3_model_dec_ref(ctx(), m_model);
2772 object::operator=(s);
2773 m_model = s.m_model;
2774 return *this;
2775 }
2776
2777 expr eval(expr const & n, bool model_completion=false) const {
2778 check_context(*this, n);
2779 Z3_ast r = 0;
2780 bool status = Z3_model_eval(ctx(), m_model, n, model_completion, &r);
2781 check_error();
2782 if (status == false && ctx().enable_exceptions())
2783 Z3_THROW(exception("failed to evaluate expression"));
2784 return expr(ctx(), r);
2785 }
2786
2787 unsigned num_consts() const { return Z3_model_get_num_consts(ctx(), m_model); }
2788 unsigned num_funcs() const { return Z3_model_get_num_funcs(ctx(), m_model); }
2789 func_decl get_const_decl(unsigned i) const { Z3_func_decl r = Z3_model_get_const_decl(ctx(), m_model, i); check_error(); return func_decl(ctx(), r); }
2790 func_decl get_func_decl(unsigned i) const { Z3_func_decl r = Z3_model_get_func_decl(ctx(), m_model, i); check_error(); return func_decl(ctx(), r); }
2791 unsigned size() const { return num_consts() + num_funcs(); }
2792 func_decl operator[](int i) const {
2793 assert(0 <= i);
2794 return static_cast<unsigned>(i) < num_consts() ? get_const_decl(i) : get_func_decl(i - num_consts());
2795 }
2796
2797 // returns interpretation of constant declaration c.
2798 // If c is not assigned any value in the model it returns
2799 // an expression with a null ast reference.
2800 expr get_const_interp(func_decl c) const {
2801 check_context(*this, c);
2802 Z3_ast r = Z3_model_get_const_interp(ctx(), m_model, c);
2803 check_error();
2804 return expr(ctx(), r);
2805 }
2806 func_interp get_func_interp(func_decl f) const {
2807 check_context(*this, f);
2808 Z3_func_interp r = Z3_model_get_func_interp(ctx(), m_model, f);
2809 check_error();
2810 return func_interp(ctx(), r);
2811 }
2812
2813 // returns true iff the model contains an interpretation
2814 // for function f.
2815 bool has_interp(func_decl f) const {
2816 check_context(*this, f);
2817 return Z3_model_has_interp(ctx(), m_model, f);
2818 }
2819
2820 func_interp add_func_interp(func_decl& f, expr& else_val) {
2821 Z3_func_interp r = Z3_add_func_interp(ctx(), m_model, f, else_val);
2822 check_error();
2823 return func_interp(ctx(), r);
2824 }
2825
2826 void add_const_interp(func_decl& f, expr& value) {
2827 Z3_add_const_interp(ctx(), m_model, f, value);
2828 check_error();
2829 }
2830
2831 unsigned num_sorts() const {
2832 unsigned r = Z3_model_get_num_sorts(ctx(), m_model);
2833 check_error();
2834 return r;
2835 }
2836
2841 sort get_sort(unsigned i) const {
2842 Z3_sort s = Z3_model_get_sort(ctx(), m_model, i);
2843 check_error();
2844 return sort(ctx(), s);
2845 }
2846
2847 expr_vector sort_universe(sort const& s) const {
2848 check_context(*this, s);
2849 Z3_ast_vector r = Z3_model_get_sort_universe(ctx(), m_model, s);
2850 check_error();
2851 return expr_vector(ctx(), r);
2852 }
2853
2854 friend std::ostream & operator<<(std::ostream & out, model const & m);
2855
2856 std::string to_string() const { return m_model ? std::string(Z3_model_to_string(ctx(), m_model)) : "null"; }
2857 };
2858 inline std::ostream & operator<<(std::ostream & out, model const & m) { return out << m.to_string(); }
2859
2860 class stats : public object {
2861 Z3_stats m_stats;
2862 void init(Z3_stats e) {
2863 m_stats = e;
2864 Z3_stats_inc_ref(ctx(), m_stats);
2865 }
2866 public:
2867 stats(context & c):object(c), m_stats(0) {}
2868 stats(context & c, Z3_stats e):object(c) { init(e); }
2869 stats(stats const & s):object(s) { init(s.m_stats); }
2870 ~stats() override { if (m_stats) Z3_stats_dec_ref(ctx(), m_stats); }
2871 operator Z3_stats() const { return m_stats; }
2872 stats & operator=(stats const & s) {
2873 Z3_stats_inc_ref(s.ctx(), s.m_stats);
2874 if (m_stats) Z3_stats_dec_ref(ctx(), m_stats);
2875 object::operator=(s);
2876 m_stats = s.m_stats;
2877 return *this;
2878 }
2879 unsigned size() const { return Z3_stats_size(ctx(), m_stats); }
2880 std::string key(unsigned i) const { Z3_string s = Z3_stats_get_key(ctx(), m_stats, i); check_error(); return s; }
2881 bool is_uint(unsigned i) const { bool r = Z3_stats_is_uint(ctx(), m_stats, i); check_error(); return r; }
2882 bool is_double(unsigned i) const { bool r = Z3_stats_is_double(ctx(), m_stats, i); check_error(); return r; }
2883 unsigned uint_value(unsigned i) const { unsigned r = Z3_stats_get_uint_value(ctx(), m_stats, i); check_error(); return r; }
2884 double double_value(unsigned i) const { double r = Z3_stats_get_double_value(ctx(), m_stats, i); check_error(); return r; }
2885 friend std::ostream & operator<<(std::ostream & out, stats const & s);
2886 };
2887 inline std::ostream & operator<<(std::ostream & out, stats const & s) { out << Z3_stats_to_string(s.ctx(), s); return out; }
2888
2889
2890 inline std::ostream & operator<<(std::ostream & out, check_result r) {
2891 if (r == unsat) out << "unsat";
2892 else if (r == sat) out << "sat";
2893 else out << "unknown";
2894 return out;
2895 }
2896
2907 class parameter {
2908 Z3_parameter_kind m_kind;
2909 func_decl m_decl;
2910 unsigned m_index;
2911 context& ctx() const { return m_decl.ctx(); }
2912 void check_error() const { ctx().check_error(); }
2913 public:
2914 parameter(func_decl const& d, unsigned idx) : m_decl(d), m_index(idx) {
2915 if (ctx().enable_exceptions() && idx >= d.num_parameters())
2916 Z3_THROW(exception("parameter index is out of bounds"));
2917 m_kind = Z3_get_decl_parameter_kind(ctx(), d, idx);
2918 }
2919 parameter(expr const& e, unsigned idx) : m_decl(e.decl()), m_index(idx) {
2920 if (ctx().enable_exceptions() && idx >= m_decl.num_parameters())
2921 Z3_THROW(exception("parameter index is out of bounds"));
2922 m_kind = Z3_get_decl_parameter_kind(ctx(), m_decl, idx);
2923 }
2924 Z3_parameter_kind kind() const { return m_kind; }
2925 expr get_expr() const { Z3_ast a = Z3_get_decl_ast_parameter(ctx(), m_decl, m_index); check_error(); return expr(ctx(), a); }
2926 sort get_sort() const { Z3_sort s = Z3_get_decl_sort_parameter(ctx(), m_decl, m_index); check_error(); return sort(ctx(), s); }
2927 func_decl get_decl() const { Z3_func_decl f = Z3_get_decl_func_decl_parameter(ctx(), m_decl, m_index); check_error(); return func_decl(ctx(), f); }
2928 symbol get_symbol() const { Z3_symbol s = Z3_get_decl_symbol_parameter(ctx(), m_decl, m_index); check_error(); return symbol(ctx(), s); }
2929 std::string get_rational() const { Z3_string s = Z3_get_decl_rational_parameter(ctx(), m_decl, m_index); check_error(); return s; }
2930 double get_double() const { double d = Z3_get_decl_double_parameter(ctx(), m_decl, m_index); check_error(); return d; }
2931 int get_int() const { int i = Z3_get_decl_int_parameter(ctx(), m_decl, m_index); check_error(); return i; }
2932 };
2933
2934
2935 class solver : public object {
2936 Z3_solver m_solver;
2937 void init(Z3_solver s) {
2938 m_solver = s;
2939 if (s)
2940 Z3_solver_inc_ref(ctx(), s);
2941 }
2942 public:
2943 struct simple {};
2944 struct translate {};
2945 solver(context & c):object(c) { init(Z3_mk_solver(c)); check_error(); }
2946 solver(context & c, simple):object(c) { init(Z3_mk_simple_solver(c)); check_error(); }
2947 solver(context & c, Z3_solver s):object(c) { init(s); }
2948 solver(context & c, char const * logic):object(c) { init(Z3_mk_solver_for_logic(c, c.str_symbol(logic))); check_error(); }
2949 solver(context & c, solver const& src, translate): object(c) { Z3_solver s = Z3_solver_translate(src.ctx(), src, c); check_error(); init(s); }
2950 solver(solver const & s):object(s) { init(s.m_solver); }
2951 solver(solver const& s, simplifier const& simp);
2952 ~solver() override { Z3_solver_dec_ref(ctx(), m_solver); }
2953 operator Z3_solver() const { return m_solver; }
2954 solver & operator=(solver const & s) {
2955 Z3_solver_inc_ref(s.ctx(), s.m_solver);
2956 Z3_solver_dec_ref(ctx(), m_solver);
2957 object::operator=(s);
2958 m_solver = s.m_solver;
2959 return *this;
2960 }
2961 void set(params const & p) { Z3_solver_set_params(ctx(), m_solver, p); check_error(); }
2962 void set(char const * k, bool v) { params p(ctx()); p.set(k, v); set(p); }
2963 void set(char const * k, unsigned v) { params p(ctx()); p.set(k, v); set(p); }
2964 void set(char const * k, double v) { params p(ctx()); p.set(k, v); set(p); }
2965 void set(char const * k, symbol const & v) { params p(ctx()); p.set(k, v); set(p); }
2966 void set(char const * k, char const* v) { params p(ctx()); p.set(k, v); set(p); }
2977 void push() { Z3_solver_push(ctx(), m_solver); check_error(); }
2978 void pop(unsigned n = 1) { Z3_solver_pop(ctx(), m_solver, n); check_error(); }
2979 void reset() { Z3_solver_reset(ctx(), m_solver); check_error(); }
2980 void add(expr const & e) { assert(e.is_bool()); Z3_solver_assert(ctx(), m_solver, e); check_error(); }
2981 void add(expr const & e, expr const & p) {
2982 assert(e.is_bool()); assert(p.is_bool()); assert(p.is_const());
2983 Z3_solver_assert_and_track(ctx(), m_solver, e, p);
2984 check_error();
2985 }
2986 void add(expr const & e, char const * p) {
2987 add(e, ctx().bool_const(p));
2988 }
2989 void add(expr_vector const& v) {
2990 check_context(*this, v);
2991 for (unsigned i = 0; i < v.size(); ++i)
2992 add(v[i]);
2993 }
2994 void from_file(char const* file) { Z3_solver_from_file(ctx(), m_solver, file); ctx().check_parser_error(); }
2995 void from_string(char const* s) { Z3_solver_from_string(ctx(), m_solver, s); ctx().check_parser_error(); }
2996
2997 check_result check() { Z3_lbool r = Z3_solver_check(ctx(), m_solver); check_error(); return to_check_result(r); }
2998 check_result check(unsigned n, expr * const assumptions) {
2999 array<Z3_ast> _assumptions(n);
3000 for (unsigned i = 0; i < n; ++i) {
3001 check_context(*this, assumptions[i]);
3002 _assumptions[i] = assumptions[i];
3003 }
3004 Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
3005 check_error();
3006 return to_check_result(r);
3007 }
3008 check_result check(expr_vector const& assumptions) {
3009 unsigned n = assumptions.size();
3010 array<Z3_ast> _assumptions(n);
3011 for (unsigned i = 0; i < n; ++i) {
3012 check_context(*this, assumptions[i]);
3013 _assumptions[i] = assumptions[i];
3014 }
3015 Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
3016 check_error();
3017 return to_check_result(r);
3018 }
3019 model get_model() const { Z3_model m = Z3_solver_get_model(ctx(), m_solver); check_error(); return model(ctx(), m); }
3020 check_result consequences(expr_vector& assumptions, expr_vector& vars, expr_vector& conseq) {
3021 Z3_lbool r = Z3_solver_get_consequences(ctx(), m_solver, assumptions, vars, conseq);
3022 check_error();
3023 return to_check_result(r);
3024 }
3025 std::string reason_unknown() const { Z3_string r = Z3_solver_get_reason_unknown(ctx(), m_solver); check_error(); return r; }
3026 stats statistics() const { Z3_stats r = Z3_solver_get_statistics(ctx(), m_solver); check_error(); return stats(ctx(), r); }
3027 expr_vector unsat_core() const { Z3_ast_vector r = Z3_solver_get_unsat_core(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
3028 expr_vector assertions() const { Z3_ast_vector r = Z3_solver_get_assertions(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
3029 expr_vector non_units() const { Z3_ast_vector r = Z3_solver_get_non_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
3030 expr_vector units() const { Z3_ast_vector r = Z3_solver_get_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
3031 expr_vector trail() const { Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
3032 expr_vector trail(array<unsigned>& levels) const {
3033 Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver);
3034 check_error();
3035 expr_vector result(ctx(), r);
3036 unsigned sz = result.size();
3037 levels.resize(sz);
3038 Z3_solver_get_levels(ctx(), m_solver, r, sz, levels.ptr());
3039 check_error();
3040 return result;
3041 }
3042 expr congruence_root(expr const& t) const {
3043 check_context(*this, t);
3044 Z3_ast r = Z3_solver_congruence_root(ctx(), m_solver, t);
3045 check_error();
3046 return expr(ctx(), r);
3047 }
3048 expr congruence_next(expr const& t) const {
3049 check_context(*this, t);
3050 Z3_ast r = Z3_solver_congruence_next(ctx(), m_solver, t);
3051 check_error();
3052 return expr(ctx(), r);
3053 }
3054 expr congruence_explain(expr const& a, expr const& b) const {
3055 check_context(*this, a);
3056 check_context(*this, b);
3057 Z3_ast r = Z3_solver_congruence_explain(ctx(), m_solver, a, b);
3058 check_error();
3059 return expr(ctx(), r);
3060 }
3061 void set_initial_value(expr const& var, expr const& value) {
3062 Z3_solver_set_initial_value(ctx(), m_solver, var, value);
3063 check_error();
3064 }
3065 void set_initial_value(expr const& var, int i) {
3066 set_initial_value(var, ctx().num_val(i, var.get_sort()));
3067 }
3068 void set_initial_value(expr const& var, bool b) {
3069 set_initial_value(var, ctx().bool_val(b));
3070 }
3071
3072 void solve_for(expr_vector const& vars, expr_vector& terms, expr_vector& guards) {
3073 // Create a copy of vars since the C API modifies the variables vector
3074 expr_vector variables(ctx());
3075 for (unsigned i = 0; i < vars.size(); ++i) {
3076 check_context(*this, vars[i]);
3077 variables.push_back(vars[i]);
3078 }
3079 // Clear output vectors before calling C API
3080 terms = expr_vector(ctx());
3081 guards = expr_vector(ctx());
3082 Z3_solver_solve_for(ctx(), m_solver, variables, terms, guards);
3083 check_error();
3084 }
3085
3086 void import_model_converter(solver const& src) {
3087 check_context(*this, src);
3088 Z3_solver_import_model_converter(ctx(), src.m_solver, m_solver);
3089 check_error();
3090 }
3091
3092 expr proof() const { Z3_ast r = Z3_solver_get_proof(ctx(), m_solver); check_error(); return expr(ctx(), r); }
3093 friend std::ostream & operator<<(std::ostream & out, solver const & s);
3094
3095 std::string to_smt2(char const* status = "unknown") {
3096 array<Z3_ast> es(assertions());
3097 Z3_ast const* fmls = es.ptr();
3098 Z3_ast fml = 0;
3099 unsigned sz = es.size();
3100 if (sz > 0) {
3101 --sz;
3102 fml = fmls[sz];
3103 }
3104 else {
3105 fml = ctx().bool_val(true);
3106 }
3107 return std::string(Z3_benchmark_to_smtlib_string(
3108 ctx(),
3109 "", "", status, "",
3110 sz,
3111 fmls,
3112 fml));
3113 }
3114
3115 std::string dimacs(bool include_names = true) const { return std::string(Z3_solver_to_dimacs_string(ctx(), m_solver, include_names)); }
3116
3117 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_solver_get_param_descrs(ctx(), m_solver)); }
3118
3119
3120 expr_vector cube(expr_vector& vars, unsigned cutoff) {
3121 Z3_ast_vector r = Z3_solver_cube(ctx(), m_solver, vars, cutoff);
3122 check_error();
3123 return expr_vector(ctx(), r);
3124 }
3125
3126 class cube_iterator {
3127 solver& m_solver;
3128 unsigned& m_cutoff;
3129 expr_vector& m_vars;
3130 expr_vector m_cube;
3131 bool m_end;
3132 bool m_empty;
3133
3134 void inc() {
3135 assert(!m_end && !m_empty);
3136 m_cube = m_solver.cube(m_vars, m_cutoff);
3137 m_cutoff = 0xFFFFFFFF;
3138 if (m_cube.size() == 1 && m_cube[0u].is_false()) {
3139 m_cube = z3::expr_vector(m_solver.ctx());
3140 m_end = true;
3141 }
3142 else if (m_cube.empty()) {
3143 m_empty = true;
3144 }
3145 }
3146 public:
3147 cube_iterator(solver& s, expr_vector& vars, unsigned& cutoff, bool end):
3148 m_solver(s),
3149 m_cutoff(cutoff),
3150 m_vars(vars),
3151 m_cube(s.ctx()),
3152 m_end(end),
3153 m_empty(false) {
3154 if (!m_end) {
3155 inc();
3156 }
3157 }
3158
3159 cube_iterator& operator++() {
3160 assert(!m_end);
3161 if (m_empty) {
3162 m_end = true;
3163 }
3164 else {
3165 inc();
3166 }
3167 return *this;
3168 }
3169 cube_iterator operator++(int) { assert(false); return *this; }
3170 expr_vector const * operator->() const { return &(operator*()); }
3171 expr_vector const& operator*() const noexcept { return m_cube; }
3172
3173 bool operator==(cube_iterator const& other) const noexcept {
3174 return other.m_end == m_end;
3175 };
3176 bool operator!=(cube_iterator const& other) const noexcept {
3177 return other.m_end != m_end;
3178 };
3179
3180 };
3181
3182 class cube_generator {
3183 solver& m_solver;
3184 unsigned m_cutoff;
3185 expr_vector m_default_vars;
3186 expr_vector& m_vars;
3187 public:
3188 cube_generator(solver& s):
3189 m_solver(s),
3190 m_cutoff(0xFFFFFFFF),
3191 m_default_vars(s.ctx()),
3192 m_vars(m_default_vars)
3193 {}
3194
3195 cube_generator(solver& s, expr_vector& vars):
3196 m_solver(s),
3197 m_cutoff(0xFFFFFFFF),
3198 m_default_vars(s.ctx()),
3199 m_vars(vars)
3200 {}
3201
3202 cube_iterator begin() { return cube_iterator(m_solver, m_vars, m_cutoff, false); }
3203 cube_iterator end() { return cube_iterator(m_solver, m_vars, m_cutoff, true); }
3204 void set_cutoff(unsigned c) noexcept { m_cutoff = c; }
3205 };
3206
3207 cube_generator cubes() { return cube_generator(*this); }
3208 cube_generator cubes(expr_vector& vars) { return cube_generator(*this, vars); }
3209
3210 };
3211 inline std::ostream & operator<<(std::ostream & out, solver const & s) { out << Z3_solver_to_string(s.ctx(), s); return out; }
3212
3213 class goal : public object {
3214 Z3_goal m_goal;
3215 void init(Z3_goal s) {
3216 m_goal = s;
3217 Z3_goal_inc_ref(ctx(), s);
3218 }
3219 public:
3220 goal(context & c, bool models=true, bool unsat_cores=false, bool proofs=false):object(c) { init(Z3_mk_goal(c, models, unsat_cores, proofs)); }
3221 goal(context & c, Z3_goal s):object(c) { init(s); }
3222 goal(goal const & s):object(s) { init(s.m_goal); }
3223 ~goal() override { Z3_goal_dec_ref(ctx(), m_goal); }
3224 operator Z3_goal() const { return m_goal; }
3225 goal & operator=(goal const & s) {
3226 Z3_goal_inc_ref(s.ctx(), s.m_goal);
3227 Z3_goal_dec_ref(ctx(), m_goal);
3228 object::operator=(s);
3229 m_goal = s.m_goal;
3230 return *this;
3231 }
3232 void add(expr const & f) { check_context(*this, f); Z3_goal_assert(ctx(), m_goal, f); check_error(); }
3233 void add(expr_vector const& v) { check_context(*this, v); for (unsigned i = 0; i < v.size(); ++i) add(v[i]); }
3234 unsigned size() const { return Z3_goal_size(ctx(), m_goal); }
3235 expr operator[](int i) const { assert(0 <= i); Z3_ast r = Z3_goal_formula(ctx(), m_goal, i); check_error(); return expr(ctx(), r); }
3236 Z3_goal_prec precision() const { return Z3_goal_precision(ctx(), m_goal); }
3237 bool inconsistent() const { return Z3_goal_inconsistent(ctx(), m_goal); }
3238 unsigned depth() const { return Z3_goal_depth(ctx(), m_goal); }
3239 void reset() { Z3_goal_reset(ctx(), m_goal); }
3240 unsigned num_exprs() const { return Z3_goal_num_exprs(ctx(), m_goal); }
3241 bool is_decided_sat() const { return Z3_goal_is_decided_sat(ctx(), m_goal); }
3242 bool is_decided_unsat() const { return Z3_goal_is_decided_unsat(ctx(), m_goal); }
3243 model convert_model(model const & m) const {
3244 check_context(*this, m);
3245 Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, m);
3246 check_error();
3247 return model(ctx(), new_m);
3248 }
3249 model get_model() const {
3250 Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, 0);
3251 check_error();
3252 return model(ctx(), new_m);
3253 }
3254 expr as_expr() const {
3255 unsigned n = size();
3256 if (n == 0)
3257 return ctx().bool_val(true);
3258 else if (n == 1)
3259 return operator[](0u);
3260 else {
3261 array<Z3_ast> args(n);
3262 for (unsigned i = 0; i < n; ++i)
3263 args[i] = operator[](i);
3264 return expr(ctx(), Z3_mk_and(ctx(), n, args.ptr()));
3265 }
3266 }
3267 std::string dimacs(bool include_names = true) const { return std::string(Z3_goal_to_dimacs_string(ctx(), m_goal, include_names)); }
3268 friend std::ostream & operator<<(std::ostream & out, goal const & g);
3269 };
3270 inline std::ostream & operator<<(std::ostream & out, goal const & g) { out << Z3_goal_to_string(g.ctx(), g); return out; }
3271
3272 class apply_result : public object {
3273 Z3_apply_result m_apply_result;
3274 void init(Z3_apply_result s) {
3275 m_apply_result = s;
3276 Z3_apply_result_inc_ref(ctx(), s);
3277 }
3278 public:
3279 apply_result(context & c, Z3_apply_result s):object(c) { init(s); }
3280 apply_result(apply_result const & s):object(s) { init(s.m_apply_result); }
3281 ~apply_result() override { Z3_apply_result_dec_ref(ctx(), m_apply_result); }
3282 operator Z3_apply_result() const { return m_apply_result; }
3283 apply_result & operator=(apply_result const & s) {
3284 Z3_apply_result_inc_ref(s.ctx(), s.m_apply_result);
3285 Z3_apply_result_dec_ref(ctx(), m_apply_result);
3286 object::operator=(s);
3287 m_apply_result = s.m_apply_result;
3288 return *this;
3289 }
3290 unsigned size() const { return Z3_apply_result_get_num_subgoals(ctx(), m_apply_result); }
3291 goal operator[](int i) const { assert(0 <= i); Z3_goal r = Z3_apply_result_get_subgoal(ctx(), m_apply_result, i); check_error(); return goal(ctx(), r); }
3292 friend std::ostream & operator<<(std::ostream & out, apply_result const & r);
3293 };
3294 inline std::ostream & operator<<(std::ostream & out, apply_result const & r) { out << Z3_apply_result_to_string(r.ctx(), r); return out; }
3295
3296 class tactic : public object {
3297 Z3_tactic m_tactic;
3298 void init(Z3_tactic s) {
3299 m_tactic = s;
3300 Z3_tactic_inc_ref(ctx(), s);
3301 }
3302 public:
3303 tactic(context & c, char const * name):object(c) { Z3_tactic r = Z3_mk_tactic(c, name); check_error(); init(r); }
3304 tactic(context & c, Z3_tactic s):object(c) { init(s); }
3305 tactic(tactic const & s):object(s) { init(s.m_tactic); }
3306 ~tactic() override { Z3_tactic_dec_ref(ctx(), m_tactic); }
3307 operator Z3_tactic() const { return m_tactic; }
3308 tactic & operator=(tactic const & s) {
3309 Z3_tactic_inc_ref(s.ctx(), s.m_tactic);
3310 Z3_tactic_dec_ref(ctx(), m_tactic);
3311 object::operator=(s);
3312 m_tactic = s.m_tactic;
3313 return *this;
3314 }
3315 solver mk_solver() const { Z3_solver r = Z3_mk_solver_from_tactic(ctx(), m_tactic); check_error(); return solver(ctx(), r); }
3316 apply_result apply(goal const & g) const {
3317 check_context(*this, g);
3318 Z3_apply_result r = Z3_tactic_apply(ctx(), m_tactic, g);
3319 check_error();
3320 return apply_result(ctx(), r);
3321 }
3322 apply_result operator()(goal const & g) const {
3323 return apply(g);
3324 }
3325 std::string help() const { char const * r = Z3_tactic_get_help(ctx(), m_tactic); check_error(); return r; }
3326 friend tactic operator&(tactic const & t1, tactic const & t2);
3327 friend tactic operator|(tactic const & t1, tactic const & t2);
3328 friend tactic repeat(tactic const & t, unsigned max);
3329 friend tactic with(tactic const & t, params const & p);
3330 friend tactic try_for(tactic const & t, unsigned ms);
3331 friend tactic par_or(unsigned n, tactic const* tactics);
3332 friend tactic par_and_then(tactic const& t1, tactic const& t2);
3333 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_tactic_get_param_descrs(ctx(), m_tactic)); }
3334 };
3335
3336 inline tactic operator&(tactic const & t1, tactic const & t2) {
3337 check_context(t1, t2);
3338 Z3_tactic r = Z3_tactic_and_then(t1.ctx(), t1, t2);
3339 t1.check_error();
3340 return tactic(t1.ctx(), r);
3341 }
3342
3343 inline tactic operator|(tactic const & t1, tactic const & t2) {
3344 check_context(t1, t2);
3345 Z3_tactic r = Z3_tactic_or_else(t1.ctx(), t1, t2);
3346 t1.check_error();
3347 return tactic(t1.ctx(), r);
3348 }
3349
3350 inline tactic repeat(tactic const & t, unsigned max=UINT_MAX) {
3351 Z3_tactic r = Z3_tactic_repeat(t.ctx(), t, max);
3352 t.check_error();
3353 return tactic(t.ctx(), r);
3354 }
3355
3356 inline tactic with(tactic const & t, params const & p) {
3357 Z3_tactic r = Z3_tactic_using_params(t.ctx(), t, p);
3358 t.check_error();
3359 return tactic(t.ctx(), r);
3360 }
3361 inline tactic try_for(tactic const & t, unsigned ms) {
3362 Z3_tactic r = Z3_tactic_try_for(t.ctx(), t, ms);
3363 t.check_error();
3364 return tactic(t.ctx(), r);
3365 }
3366 inline tactic par_or(unsigned n, tactic const* tactics) {
3367 if (n == 0) {
3368 Z3_THROW(exception("a non-zero number of tactics need to be passed to par_or"));
3369 }
3370 array<Z3_tactic> buffer(n);
3371 for (unsigned i = 0; i < n; ++i) buffer[i] = tactics[i];
3372 return tactic(tactics[0u].ctx(), Z3_tactic_par_or(tactics[0u].ctx(), n, buffer.ptr()));
3373 }
3374
3375 inline tactic par_and_then(tactic const & t1, tactic const & t2) {
3376 check_context(t1, t2);
3377 Z3_tactic r = Z3_tactic_par_and_then(t1.ctx(), t1, t2);
3378 t1.check_error();
3379 return tactic(t1.ctx(), r);
3380 }
3381
3382 class simplifier : public object {
3383 Z3_simplifier m_simplifier;
3384 void init(Z3_simplifier s) {
3385 m_simplifier = s;
3386 Z3_simplifier_inc_ref(ctx(), s);
3387 }
3388 public:
3389 simplifier(context & c, char const * name):object(c) { Z3_simplifier r = Z3_mk_simplifier(c, name); check_error(); init(r); }
3390 simplifier(context & c, Z3_simplifier s):object(c) { init(s); }
3391 simplifier(simplifier const & s):object(s) { init(s.m_simplifier); }
3392 ~simplifier() override { Z3_simplifier_dec_ref(ctx(), m_simplifier); }
3393 operator Z3_simplifier() const { return m_simplifier; }
3394 simplifier & operator=(simplifier const & s) {
3395 Z3_simplifier_inc_ref(s.ctx(), s.m_simplifier);
3396 Z3_simplifier_dec_ref(ctx(), m_simplifier);
3397 object::operator=(s);
3398 m_simplifier = s.m_simplifier;
3399 return *this;
3400 }
3401 std::string help() const { char const * r = Z3_simplifier_get_help(ctx(), m_simplifier); check_error(); return r; }
3402 friend simplifier operator&(simplifier const & t1, simplifier const & t2);
3403 friend simplifier with(simplifier const & t, params const & p);
3404 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_simplifier_get_param_descrs(ctx(), m_simplifier)); }
3405 };
3406
3407 inline solver::solver(solver const& s, simplifier const& simp):object(s) { init(Z3_solver_add_simplifier(s.ctx(), s, simp)); }
3408
3409
3410 inline simplifier operator&(simplifier const & t1, simplifier const & t2) {
3411 check_context(t1, t2);
3412 Z3_simplifier r = Z3_simplifier_and_then(t1.ctx(), t1, t2);
3413 t1.check_error();
3414 return simplifier(t1.ctx(), r);
3415 }
3416
3417 inline simplifier with(simplifier const & t, params const & p) {
3418 Z3_simplifier r = Z3_simplifier_using_params(t.ctx(), t, p);
3419 t.check_error();
3420 return simplifier(t.ctx(), r);
3421 }
3422
3423 class probe : public object {
3424 Z3_probe m_probe;
3425 void init(Z3_probe s) {
3426 m_probe = s;
3427 Z3_probe_inc_ref(ctx(), s);
3428 }
3429 public:
3430 probe(context & c, char const * name):object(c) { Z3_probe r = Z3_mk_probe(c, name); check_error(); init(r); }
3431 probe(context & c, double val):object(c) { Z3_probe r = Z3_probe_const(c, val); check_error(); init(r); }
3432 probe(context & c, Z3_probe s):object(c) { init(s); }
3433 probe(probe const & s):object(s) { init(s.m_probe); }
3434 ~probe() override { Z3_probe_dec_ref(ctx(), m_probe); }
3435 operator Z3_probe() const { return m_probe; }
3436 probe & operator=(probe const & s) {
3437 Z3_probe_inc_ref(s.ctx(), s.m_probe);
3438 Z3_probe_dec_ref(ctx(), m_probe);
3439 object::operator=(s);
3440 m_probe = s.m_probe;
3441 return *this;
3442 }
3443 double apply(goal const & g) const { double r = Z3_probe_apply(ctx(), m_probe, g); check_error(); return r; }
3444 double operator()(goal const & g) const { return apply(g); }
3445 friend probe operator<=(probe const & p1, probe const & p2);
3446 friend probe operator<=(probe const & p1, double p2);
3447 friend probe operator<=(double p1, probe const & p2);
3448 friend probe operator>=(probe const & p1, probe const & p2);
3449 friend probe operator>=(probe const & p1, double p2);
3450 friend probe operator>=(double p1, probe const & p2);
3451 friend probe operator<(probe const & p1, probe const & p2);
3452 friend probe operator<(probe const & p1, double p2);
3453 friend probe operator<(double p1, probe const & p2);
3454 friend probe operator>(probe const & p1, probe const & p2);
3455 friend probe operator>(probe const & p1, double p2);
3456 friend probe operator>(double p1, probe const & p2);
3457 friend probe operator==(probe const & p1, probe const & p2);
3458 friend probe operator==(probe const & p1, double p2);
3459 friend probe operator==(double p1, probe const & p2);
3460 friend probe operator&&(probe const & p1, probe const & p2);
3461 friend probe operator||(probe const & p1, probe const & p2);
3462 friend probe operator!(probe const & p);
3463 };
3464
3465 inline probe operator<=(probe const & p1, probe const & p2) {
3466 check_context(p1, p2); Z3_probe r = Z3_probe_le(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3467 }
3468 inline probe operator<=(probe const & p1, double p2) { return p1 <= probe(p1.ctx(), p2); }
3469 inline probe operator<=(double p1, probe const & p2) { return probe(p2.ctx(), p1) <= p2; }
3470 inline probe operator>=(probe const & p1, probe const & p2) {
3471 check_context(p1, p2); Z3_probe r = Z3_probe_ge(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3472 }
3473 inline probe operator>=(probe const & p1, double p2) { return p1 >= probe(p1.ctx(), p2); }
3474 inline probe operator>=(double p1, probe const & p2) { return probe(p2.ctx(), p1) >= p2; }
3475 inline probe operator<(probe const & p1, probe const & p2) {
3476 check_context(p1, p2); Z3_probe r = Z3_probe_lt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3477 }
3478 inline probe operator<(probe const & p1, double p2) { return p1 < probe(p1.ctx(), p2); }
3479 inline probe operator<(double p1, probe const & p2) { return probe(p2.ctx(), p1) < p2; }
3480 inline probe operator>(probe const & p1, probe const & p2) {
3481 check_context(p1, p2); Z3_probe r = Z3_probe_gt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3482 }
3483 inline probe operator>(probe const & p1, double p2) { return p1 > probe(p1.ctx(), p2); }
3484 inline probe operator>(double p1, probe const & p2) { return probe(p2.ctx(), p1) > p2; }
3485 inline probe operator==(probe const & p1, probe const & p2) {
3486 check_context(p1, p2); Z3_probe r = Z3_probe_eq(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3487 }
3488 inline probe operator==(probe const & p1, double p2) { return p1 == probe(p1.ctx(), p2); }
3489 inline probe operator==(double p1, probe const & p2) { return probe(p2.ctx(), p1) == p2; }
3490 inline probe operator&&(probe const & p1, probe const & p2) {
3491 check_context(p1, p2); Z3_probe r = Z3_probe_and(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3492 }
3493 inline probe operator||(probe const & p1, probe const & p2) {
3494 check_context(p1, p2); Z3_probe r = Z3_probe_or(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3495 }
3496 inline probe operator!(probe const & p) {
3497 Z3_probe r = Z3_probe_not(p.ctx(), p); p.check_error(); return probe(p.ctx(), r);
3498 }
3499
3500 class optimize : public object {
3501 Z3_optimize m_opt;
3502
3503 public:
3504 struct translate {};
3505 class handle final {
3506 unsigned m_h;
3507 public:
3508 handle(unsigned h): m_h(h) {}
3509 unsigned h() const { return m_h; }
3510 };
3511 optimize(context& c):object(c) { m_opt = Z3_mk_optimize(c); Z3_optimize_inc_ref(c, m_opt); }
3512 optimize(context & c, optimize const& src, translate): object(c) {
3513 Z3_optimize o = Z3_optimize_translate(src.ctx(), src, c);
3514 check_error();
3515 m_opt = o;
3516 Z3_optimize_inc_ref(c, m_opt);
3517 }
3518 optimize(optimize const & o):object(o), m_opt(o.m_opt) {
3519 Z3_optimize_inc_ref(o.ctx(), o.m_opt);
3520 }
3521 optimize(context& c, optimize& src):object(c) {
3522 m_opt = Z3_mk_optimize(c);
3523 Z3_optimize_inc_ref(c, m_opt);
3524 add(expr_vector(c, src.assertions()));
3525 expr_vector v(c, src.objectives());
3526 for (expr_vector::iterator it = v.begin(); it != v.end(); ++it) minimize(*it);
3527 }
3528 optimize& operator=(optimize const& o) {
3529 Z3_optimize_inc_ref(o.ctx(), o.m_opt);
3530 Z3_optimize_dec_ref(ctx(), m_opt);
3531 m_opt = o.m_opt;
3532 object::operator=(o);
3533 return *this;
3534 }
3535 ~optimize() override { Z3_optimize_dec_ref(ctx(), m_opt); }
3536 operator Z3_optimize() const { return m_opt; }
3537 void add(expr const& e) {
3538 assert(e.is_bool());
3539 Z3_optimize_assert(ctx(), m_opt, e);
3540 }
3541 void add(expr_vector const& es) {
3542 for (expr_vector::iterator it = es.begin(); it != es.end(); ++it) add(*it);
3543 }
3544 void add(expr const& e, expr const& t) {
3545 assert(e.is_bool());
3546 Z3_optimize_assert_and_track(ctx(), m_opt, e, t);
3547 }
3548 void add(expr const& e, char const* p) {
3549 assert(e.is_bool());
3550 add(e, ctx().bool_const(p));
3551 }
3552 handle add_soft(expr const& e, unsigned weight) {
3553 assert(e.is_bool());
3554 auto str = std::to_string(weight);
3555 return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, str.c_str(), 0));
3556 }
3557 handle add_soft(expr const& e, char const* weight) {
3558 assert(e.is_bool());
3559 return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, weight, 0));
3560 }
3561 handle add(expr const& e, unsigned weight) {
3562 return add_soft(e, weight);
3563 }
3564 void set_initial_value(expr const& var, expr const& value) {
3565 Z3_optimize_set_initial_value(ctx(), m_opt, var, value);
3566 check_error();
3567 }
3568 void set_initial_value(expr const& var, int i) {
3569 set_initial_value(var, ctx().num_val(i, var.get_sort()));
3570 }
3571 void set_initial_value(expr const& var, bool b) {
3572 set_initial_value(var, ctx().bool_val(b));
3573 }
3574
3575 handle maximize(expr const& e) {
3576 return handle(Z3_optimize_maximize(ctx(), m_opt, e));
3577 }
3578 handle minimize(expr const& e) {
3579 return handle(Z3_optimize_minimize(ctx(), m_opt, e));
3580 }
3581 void push() {
3582 Z3_optimize_push(ctx(), m_opt);
3583 }
3584 void pop() {
3585 Z3_optimize_pop(ctx(), m_opt);
3586 }
3587 check_result check() { Z3_lbool r = Z3_optimize_check(ctx(), m_opt, 0, 0); check_error(); return to_check_result(r); }
3588 check_result check(expr_vector const& asms) {
3589 unsigned n = asms.size();
3590 array<Z3_ast> _asms(n);
3591 for (unsigned i = 0; i < n; ++i) {
3592 check_context(*this, asms[i]);
3593 _asms[i] = asms[i];
3594 }
3595 Z3_lbool r = Z3_optimize_check(ctx(), m_opt, n, _asms.ptr());
3596 check_error();
3597 return to_check_result(r);
3598 }
3599 model get_model() const { Z3_model m = Z3_optimize_get_model(ctx(), m_opt); check_error(); return model(ctx(), m); }
3600 expr_vector unsat_core() const { Z3_ast_vector r = Z3_optimize_get_unsat_core(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3601 void set(params const & p) { Z3_optimize_set_params(ctx(), m_opt, p); check_error(); }
3602 expr lower(handle const& h) {
3603 Z3_ast r = Z3_optimize_get_lower(ctx(), m_opt, h.h());
3604 check_error();
3605 return expr(ctx(), r);
3606 }
3607 expr upper(handle const& h) {
3608 Z3_ast r = Z3_optimize_get_upper(ctx(), m_opt, h.h());
3609 check_error();
3610 return expr(ctx(), r);
3611 }
3612 expr_vector assertions() const { Z3_ast_vector r = Z3_optimize_get_assertions(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3613 expr_vector objectives() const { Z3_ast_vector r = Z3_optimize_get_objectives(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3614 stats statistics() const { Z3_stats r = Z3_optimize_get_statistics(ctx(), m_opt); check_error(); return stats(ctx(), r); }
3615 friend std::ostream & operator<<(std::ostream & out, optimize const & s);
3616 void from_file(char const* filename) { Z3_optimize_from_file(ctx(), m_opt, filename); check_error(); }
3617 void from_string(char const* constraints) { Z3_optimize_from_string(ctx(), m_opt, constraints); check_error(); }
3618 std::string help() const { char const * r = Z3_optimize_get_help(ctx(), m_opt); check_error(); return r; }
3619 };
3620 inline std::ostream & operator<<(std::ostream & out, optimize const & s) { out << Z3_optimize_to_string(s.ctx(), s.m_opt); return out; }
3621
3622 class fixedpoint : public object {
3623 Z3_fixedpoint m_fp;
3624 public:
3625 fixedpoint(context& c):object(c) { m_fp = Z3_mk_fixedpoint(c); Z3_fixedpoint_inc_ref(c, m_fp); }
3626 fixedpoint(fixedpoint const & o):object(o), m_fp(o.m_fp) { Z3_fixedpoint_inc_ref(ctx(), m_fp); }
3627 ~fixedpoint() override { Z3_fixedpoint_dec_ref(ctx(), m_fp); }
3628 fixedpoint & operator=(fixedpoint const & o) {
3629 Z3_fixedpoint_inc_ref(o.ctx(), o.m_fp);
3630 Z3_fixedpoint_dec_ref(ctx(), m_fp);
3631 m_fp = o.m_fp;
3632 object::operator=(o);
3633 return *this;
3634 }
3635 operator Z3_fixedpoint() const { return m_fp; }
3636 expr_vector from_string(char const* s) {
3637 Z3_ast_vector r = Z3_fixedpoint_from_string(ctx(), m_fp, s);
3638 check_error();
3639 return expr_vector(ctx(), r);
3640 }
3641 expr_vector from_file(char const* s) {
3642 Z3_ast_vector r = Z3_fixedpoint_from_file(ctx(), m_fp, s);
3643 check_error();
3644 return expr_vector(ctx(), r);
3645 }
3646 void add_rule(expr& rule, symbol const& name) { Z3_fixedpoint_add_rule(ctx(), m_fp, rule, name); check_error(); }
3647 void add_fact(func_decl& f, unsigned * args) { Z3_fixedpoint_add_fact(ctx(), m_fp, f, f.arity(), args); check_error(); }
3648 check_result query(expr& q) { Z3_lbool r = Z3_fixedpoint_query(ctx(), m_fp, q); check_error(); return to_check_result(r); }
3649 check_result query(func_decl_vector& relations) {
3650 array<Z3_func_decl> rs(relations);
3651 Z3_lbool r = Z3_fixedpoint_query_relations(ctx(), m_fp, rs.size(), rs.ptr());
3652 check_error();
3653 return to_check_result(r);
3654 }
3655 expr get_answer() { Z3_ast r = Z3_fixedpoint_get_answer(ctx(), m_fp); check_error(); return expr(ctx(), r); }
3656 std::string reason_unknown() { return Z3_fixedpoint_get_reason_unknown(ctx(), m_fp); }
3657 void update_rule(expr& rule, symbol const& name) { Z3_fixedpoint_update_rule(ctx(), m_fp, rule, name); check_error(); }
3658 unsigned get_num_levels(func_decl& p) { unsigned r = Z3_fixedpoint_get_num_levels(ctx(), m_fp, p); check_error(); return r; }
3659 expr get_cover_delta(int level, func_decl& p) {
3660 Z3_ast r = Z3_fixedpoint_get_cover_delta(ctx(), m_fp, level, p);
3661 check_error();
3662 return expr(ctx(), r);
3663 }
3664 void add_cover(int level, func_decl& p, expr& property) { Z3_fixedpoint_add_cover(ctx(), m_fp, level, p, property); check_error(); }
3665 stats statistics() const { Z3_stats r = Z3_fixedpoint_get_statistics(ctx(), m_fp); check_error(); return stats(ctx(), r); }
3666 void register_relation(func_decl& p) { Z3_fixedpoint_register_relation(ctx(), m_fp, p); }
3667 expr_vector assertions() const { Z3_ast_vector r = Z3_fixedpoint_get_assertions(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
3668 expr_vector rules() const { Z3_ast_vector r = Z3_fixedpoint_get_rules(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
3669 void set(params const & p) { Z3_fixedpoint_set_params(ctx(), m_fp, p); check_error(); }
3670 std::string help() const { return Z3_fixedpoint_get_help(ctx(), m_fp); }
3671 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_fixedpoint_get_param_descrs(ctx(), m_fp)); }
3672 std::string to_string() { return Z3_fixedpoint_to_string(ctx(), m_fp, 0, 0); }
3673 std::string to_string(expr_vector const& queries) {
3674 array<Z3_ast> qs(queries);
3675 return Z3_fixedpoint_to_string(ctx(), m_fp, qs.size(), qs.ptr());
3676 }
3677 };
3678 inline std::ostream & operator<<(std::ostream & out, fixedpoint const & f) { return out << Z3_fixedpoint_to_string(f.ctx(), f, 0, 0); }
3679
3680 inline tactic fail_if(probe const & p) {
3681 Z3_tactic r = Z3_tactic_fail_if(p.ctx(), p);
3682 p.check_error();
3683 return tactic(p.ctx(), r);
3684 }
3685 inline tactic when(probe const & p, tactic const & t) {
3686 check_context(p, t);
3687 Z3_tactic r = Z3_tactic_when(t.ctx(), p, t);
3688 t.check_error();
3689 return tactic(t.ctx(), r);
3690 }
3691 inline tactic cond(probe const & p, tactic const & t1, tactic const & t2) {
3692 check_context(p, t1); check_context(p, t2);
3693 Z3_tactic r = Z3_tactic_cond(t1.ctx(), p, t1, t2);
3694 t1.check_error();
3695 return tactic(t1.ctx(), r);
3696 }
3697
3698 inline symbol context::str_symbol(char const * s) { Z3_symbol r = Z3_mk_string_symbol(m_ctx, s); check_error(); return symbol(*this, r); }
3699 inline symbol context::int_symbol(int n) { Z3_symbol r = Z3_mk_int_symbol(m_ctx, n); check_error(); return symbol(*this, r); }
3700
3701 inline sort context::bool_sort() { Z3_sort s = Z3_mk_bool_sort(m_ctx); check_error(); return sort(*this, s); }
3702 inline sort context::int_sort() { Z3_sort s = Z3_mk_int_sort(m_ctx); check_error(); return sort(*this, s); }
3703 inline sort context::real_sort() { Z3_sort s = Z3_mk_real_sort(m_ctx); check_error(); return sort(*this, s); }
3704 inline sort context::bv_sort(unsigned sz) { Z3_sort s = Z3_mk_bv_sort(m_ctx, sz); check_error(); return sort(*this, s); }
3705 inline sort context::string_sort() { Z3_sort s = Z3_mk_string_sort(m_ctx); check_error(); return sort(*this, s); }
3706 inline sort context::char_sort() { Z3_sort s = Z3_mk_char_sort(m_ctx); check_error(); return sort(*this, s); }
3707 inline sort context::seq_sort(sort& s) { Z3_sort r = Z3_mk_seq_sort(m_ctx, s); check_error(); return sort(*this, r); }
3708 inline sort context::re_sort(sort& s) { Z3_sort r = Z3_mk_re_sort(m_ctx, s); check_error(); return sort(*this, r); }
3709 inline sort context::finite_set_sort(sort& s) { Z3_sort r = Z3_mk_finite_set_sort(m_ctx, s); check_error(); return sort(*this, r); }
3710 inline sort context::fpa_sort(unsigned ebits, unsigned sbits) { Z3_sort s = Z3_mk_fpa_sort(m_ctx, ebits, sbits); check_error(); return sort(*this, s); }
3711
3712 template<>
3713 inline sort context::fpa_sort<16>() { return fpa_sort(5, 11); }
3714
3715 template<>
3716 inline sort context::fpa_sort<32>() { return fpa_sort(8, 24); }
3717
3718 template<>
3719 inline sort context::fpa_sort<64>() { return fpa_sort(11, 53); }
3720
3721 template<>
3722 inline sort context::fpa_sort<128>() { return fpa_sort(15, 113); }
3723
3724 inline sort context::fpa_rounding_mode_sort() { Z3_sort r = Z3_mk_fpa_rounding_mode_sort(m_ctx); check_error(); return sort(*this, r); }
3725
3726 inline sort context::array_sort(sort d, sort r) { Z3_sort s = Z3_mk_array_sort(m_ctx, d, r); check_error(); return sort(*this, s); }
3727 inline sort context::array_sort(sort_vector const& d, sort r) {
3728 array<Z3_sort> dom(d);
3729 Z3_sort s = Z3_mk_array_sort_n(m_ctx, dom.size(), dom.ptr(), r); check_error(); return sort(*this, s);
3730 }
3731 inline sort context::enumeration_sort(char const * name, unsigned n, char const * const * enum_names, func_decl_vector & cs, func_decl_vector & ts) {
3732 array<Z3_symbol> _enum_names(n);
3733 for (unsigned i = 0; i < n; ++i) { _enum_names[i] = Z3_mk_string_symbol(*this, enum_names[i]); }
3734 array<Z3_func_decl> _cs(n);
3735 array<Z3_func_decl> _ts(n);
3736 Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3737 sort s = to_sort(*this, Z3_mk_enumeration_sort(*this, _name, n, _enum_names.ptr(), _cs.ptr(), _ts.ptr()));
3738 check_error();
3739 for (unsigned i = 0; i < n; ++i) { cs.push_back(func_decl(*this, _cs[i])); ts.push_back(func_decl(*this, _ts[i])); }
3740 return s;
3741 }
3742 inline func_decl context::tuple_sort(char const * name, unsigned n, char const * const * names, sort const* sorts, func_decl_vector & projs) {
3743 array<Z3_symbol> _names(n);
3744 array<Z3_sort> _sorts(n);
3745 for (unsigned i = 0; i < n; ++i) { _names[i] = Z3_mk_string_symbol(*this, names[i]); _sorts[i] = sorts[i]; }
3746 array<Z3_func_decl> _projs(n);
3747 Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3748 Z3_func_decl tuple;
3749 sort _ignore_s = to_sort(*this, Z3_mk_tuple_sort(*this, _name, n, _names.ptr(), _sorts.ptr(), &tuple, _projs.ptr()));
3750 check_error();
3751 for (unsigned i = 0; i < n; ++i) { projs.push_back(func_decl(*this, _projs[i])); }
3752 return func_decl(*this, tuple);
3753 }
3754
3755 class constructor_list {
3756 context& ctx;
3757 Z3_constructor_list clist;
3758 public:
3759 constructor_list(constructors const& cs);
3760 ~constructor_list() { Z3_del_constructor_list(ctx, clist); }
3761 operator Z3_constructor_list() const { return clist; }
3762 };
3763
3764 class constructors {
3765 friend class constructor_list;
3766 context& ctx;
3767 std::vector<Z3_constructor> cons;
3768 std::vector<unsigned> num_fields;
3769 public:
3770 constructors(context& ctx): ctx(ctx) {}
3771
3772 ~constructors() {
3773 for (auto con : cons)
3774 Z3_del_constructor(ctx, con);
3775 }
3776
3777 void add(symbol const& name, symbol const& rec, unsigned n, symbol const* names, sort const* fields) {
3778 array<unsigned> sort_refs(n);
3779 array<Z3_sort> sorts(n);
3780 array<Z3_symbol> _names(n);
3781 for (unsigned i = 0; i < n; ++i) sorts[i] = fields[i], _names[i] = names[i];
3782 cons.push_back(Z3_mk_constructor(ctx, name, rec, n, _names.ptr(), sorts.ptr(), sort_refs.ptr()));
3783 num_fields.push_back(n);
3784 }
3785
3786 Z3_constructor operator[](unsigned i) const { return cons[i]; }
3787
3788 unsigned size() const { return (unsigned)cons.size(); }
3789
3790 void query(unsigned i, func_decl& constructor, func_decl& test, func_decl_vector& accs) {
3791 Z3_func_decl _constructor;
3792 Z3_func_decl _test;
3793 array<Z3_func_decl> accessors(num_fields[i]);
3794 accs.resize(0);
3796 cons[i],
3797 num_fields[i],
3798 &_constructor,
3799 &_test,
3800 accessors.ptr());
3801 constructor = func_decl(ctx, _constructor);
3802
3803 test = func_decl(ctx, _test);
3804 for (unsigned j = 0; j < num_fields[i]; ++j)
3805 accs.push_back(func_decl(ctx, accessors[j]));
3806 }
3807 };
3808
3809 inline constructor_list::constructor_list(constructors const& cs): ctx(cs.ctx) {
3810 array<Z3_constructor> cons(cs.size());
3811 for (unsigned i = 0; i < cs.size(); ++i)
3812 cons[i] = cs[i];
3813 clist = Z3_mk_constructor_list(ctx, cs.size(), cons.ptr());
3814 }
3815
3816 inline sort context::datatype(symbol const& name, constructors const& cs) {
3817 array<Z3_constructor> _cs(cs.size());
3818 for (unsigned i = 0; i < cs.size(); ++i) _cs[i] = cs[i];
3819 Z3_sort s = Z3_mk_datatype(*this, name, cs.size(), _cs.ptr());
3820 check_error();
3821 return sort(*this, s);
3822 }
3823
3824 inline sort context::datatype(symbol const &name, sort_vector const& params, constructors const &cs) {
3825 array<Z3_sort> _params(params);
3826 array<Z3_constructor> _cs(cs.size());
3827 for (unsigned i = 0; i < cs.size(); ++i)
3828 _cs[i] = cs[i];
3829 Z3_sort s = Z3_mk_polymorphic_datatype(*this, name, _params.size(), _params.ptr(), cs.size(), _cs.ptr());
3830 check_error();
3831 return sort(*this, s);
3832 }
3833
3834 inline sort_vector context::datatypes(
3835 unsigned n, symbol const* names,
3836 constructor_list *const* cons) {
3837 sort_vector result(*this);
3838 array<Z3_symbol> _names(n);
3839 array<Z3_sort> _sorts(n);
3840 array<Z3_constructor_list> _cons(n);
3841 for (unsigned i = 0; i < n; ++i)
3842 _names[i] = names[i], _cons[i] = *cons[i];
3843 Z3_mk_datatypes(*this, n, _names.ptr(), _sorts.ptr(), _cons.ptr());
3844 for (unsigned i = 0; i < n; ++i)
3845 result.push_back(sort(*this, _sorts[i]));
3846 return result;
3847 }
3848
3849
3850 inline sort context::datatype_sort(symbol const& name) {
3851 Z3_sort s = Z3_mk_datatype_sort(*this, name, 0, nullptr);
3852 check_error();
3853 return sort(*this, s);
3854 }
3855
3856 inline sort context::datatype_sort(symbol const& name, sort_vector const& params) {
3857 array<Z3_sort> _params(params);
3858 Z3_sort s = Z3_mk_datatype_sort(*this, name, _params.size(), _params.ptr());
3859 check_error();
3860 return sort(*this, s);
3861 }
3862
3863
3864 inline sort context::uninterpreted_sort(char const* name) {
3865 Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3866 return to_sort(*this, Z3_mk_uninterpreted_sort(*this, _name));
3867 }
3868 inline sort context::uninterpreted_sort(symbol const& name) {
3869 return to_sort(*this, Z3_mk_uninterpreted_sort(*this, name));
3870 }
3871
3872 inline func_decl context::function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3873 array<Z3_sort> args(arity);
3874 for (unsigned i = 0; i < arity; ++i) {
3875 check_context(domain[i], range);
3876 args[i] = domain[i];
3877 }
3878 Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, arity, args.ptr(), range);
3879 check_error();
3880 return func_decl(*this, f);
3881 }
3882
3883 inline func_decl context::function(char const * name, unsigned arity, sort const * domain, sort const & range) {
3884 return function(range.ctx().str_symbol(name), arity, domain, range);
3885 }
3886
3887 inline func_decl context::function(symbol const& name, sort_vector const& domain, sort const& range) {
3888 array<Z3_sort> args(domain.size());
3889 for (unsigned i = 0; i < domain.size(); ++i) {
3890 check_context(domain[i], range);
3891 args[i] = domain[i];
3892 }
3893 Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, domain.size(), args.ptr(), range);
3894 check_error();
3895 return func_decl(*this, f);
3896 }
3897
3898 inline func_decl context::function(char const * name, sort_vector const& domain, sort const& range) {
3899 return function(range.ctx().str_symbol(name), domain, range);
3900 }
3901
3902
3903 inline func_decl context::function(char const * name, sort const & domain, sort const & range) {
3904 check_context(domain, range);
3905 Z3_sort args[1] = { domain };
3906 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 1, args, range);
3907 check_error();
3908 return func_decl(*this, f);
3909 }
3910
3911 inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & range) {
3912 check_context(d1, range); check_context(d2, range);
3913 Z3_sort args[2] = { d1, d2 };
3914 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 2, args, range);
3915 check_error();
3916 return func_decl(*this, f);
3917 }
3918
3919 inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
3920 check_context(d1, range); check_context(d2, range); check_context(d3, range);
3921 Z3_sort args[3] = { d1, d2, d3 };
3922 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 3, args, range);
3923 check_error();
3924 return func_decl(*this, f);
3925 }
3926
3927 inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
3928 check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range);
3929 Z3_sort args[4] = { d1, d2, d3, d4 };
3930 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 4, args, range);
3931 check_error();
3932 return func_decl(*this, f);
3933 }
3934
3935 inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & d5, sort const & range) {
3936 check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range); check_context(d5, range);
3937 Z3_sort args[5] = { d1, d2, d3, d4, d5 };
3938 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 5, args, range);
3939 check_error();
3940 return func_decl(*this, f);
3941 }
3942
3943 inline func_decl context::recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3944 array<Z3_sort> args(arity);
3945 for (unsigned i = 0; i < arity; ++i) {
3946 check_context(domain[i], range);
3947 args[i] = domain[i];
3948 }
3949 Z3_func_decl f = Z3_mk_rec_func_decl(m_ctx, name, arity, args.ptr(), range);
3950 check_error();
3951 return func_decl(*this, f);
3952
3953 }
3954
3955 inline func_decl context::recfun(symbol const & name, sort_vector const& domain, sort const & range) {
3956 check_context(domain, range);
3957 array<Z3_sort> domain1(domain);
3958 Z3_func_decl f = Z3_mk_rec_func_decl(m_ctx, name, domain1.size(), domain1.ptr(), range);
3959 check_error();
3960 return func_decl(*this, f);
3961 }
3962
3963 inline func_decl context::recfun(char const * name, sort_vector const& domain, sort const & range) {
3964 return recfun(str_symbol(name), domain, range);
3965
3966 }
3967
3968 inline func_decl context::recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
3969 return recfun(str_symbol(name), arity, domain, range);
3970 }
3971
3972 inline func_decl context::recfun(char const * name, sort const& d1, sort const & range) {
3973 return recfun(str_symbol(name), 1, &d1, range);
3974 }
3975
3976 inline func_decl context::recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
3977 sort dom[2] = { d1, d2 };
3978 return recfun(str_symbol(name), 2, dom, range);
3979 }
3980
3981 inline void context::recdef(func_decl f, expr_vector const& args, expr const& body) {
3982 check_context(f, args); check_context(f, body);
3983 array<Z3_ast> vars(args);
3984 Z3_add_rec_def(f.ctx(), f, vars.size(), vars.ptr(), body);
3985 }
3986
3987 inline func_decl context::user_propagate_function(symbol const& name, sort_vector const& domain, sort const& range) {
3988 check_context(domain, range);
3989 array<Z3_sort> domain1(domain);
3990 Z3_func_decl f = Z3_solver_propagate_declare(range.ctx(), name, domain1.size(), domain1.ptr(), range);
3991 check_error();
3992 return func_decl(*this, f);
3993 }
3994
3995 inline expr context::constant(symbol const & name, sort const & s) {
3996 Z3_ast r = Z3_mk_const(m_ctx, name, s);
3997 check_error();
3998 return expr(*this, r);
3999 }
4000 inline expr context::constant(char const * name, sort const & s) { return constant(str_symbol(name), s); }
4001 inline expr context::variable(unsigned idx, sort const& s) {
4002 Z3_ast r = Z3_mk_bound(m_ctx, idx, s);
4003 check_error();
4004 return expr(*this, r);
4005 }
4006 inline expr context::bool_const(char const * name) { return constant(name, bool_sort()); }
4007 inline expr context::int_const(char const * name) { return constant(name, int_sort()); }
4008 inline expr context::real_const(char const * name) { return constant(name, real_sort()); }
4009 inline expr context::string_const(char const * name) { return constant(name, string_sort()); }
4010 inline expr context::bv_const(char const * name, unsigned sz) { return constant(name, bv_sort(sz)); }
4011 inline expr context::fpa_const(char const * name, unsigned ebits, unsigned sbits) { return constant(name, fpa_sort(ebits, sbits)); }
4012
4013 template<size_t precision>
4014 inline expr context::fpa_const(char const * name) { return constant(name, fpa_sort<precision>()); }
4015
4016 inline void context::set_rounding_mode(rounding_mode rm) { m_rounding_mode = rm; }
4017
4018 inline expr context::fpa_rounding_mode() {
4019 switch (m_rounding_mode) {
4020 case RNA: return expr(*this, Z3_mk_fpa_rna(m_ctx));
4021 case RNE: return expr(*this, Z3_mk_fpa_rne(m_ctx));
4022 case RTP: return expr(*this, Z3_mk_fpa_rtp(m_ctx));
4023 case RTN: return expr(*this, Z3_mk_fpa_rtn(m_ctx));
4024 case RTZ: return expr(*this, Z3_mk_fpa_rtz(m_ctx));
4025 default: return expr(*this);
4026 }
4027 }
4028
4029 inline expr context::bool_val(bool b) { return b ? expr(*this, Z3_mk_true(m_ctx)) : expr(*this, Z3_mk_false(m_ctx)); }
4030
4031 inline expr context::int_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, int_sort()); check_error(); return expr(*this, r); }
4032 inline expr context::int_val(unsigned n) { Z3_ast r = Z3_mk_unsigned_int(m_ctx, n, int_sort()); check_error(); return expr(*this, r); }
4033 inline expr context::int_val(int64_t n) { Z3_ast r = Z3_mk_int64(m_ctx, n, int_sort()); check_error(); return expr(*this, r); }
4034 inline expr context::int_val(uint64_t n) { Z3_ast r = Z3_mk_unsigned_int64(m_ctx, n, int_sort()); check_error(); return expr(*this, r); }
4035 inline expr context::int_val(char const * n) { Z3_ast r = Z3_mk_numeral(m_ctx, n, int_sort()); check_error(); return expr(*this, r); }
4036
4037 inline expr context::real_val(int64_t n, int64_t d) { Z3_ast r = Z3_mk_real_int64(m_ctx, n, d); check_error(); return expr(*this, r); }
4038 inline expr context::real_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, real_sort()); check_error(); return expr(*this, r); }
4039 inline expr context::real_val(unsigned n) { Z3_ast r = Z3_mk_unsigned_int(m_ctx, n, real_sort()); check_error(); return expr(*this, r); }
4040 inline expr context::real_val(int64_t n) { Z3_ast r = Z3_mk_int64(m_ctx, n, real_sort()); check_error(); return expr(*this, r); }
4041 inline expr context::real_val(uint64_t n) { Z3_ast r = Z3_mk_unsigned_int64(m_ctx, n, real_sort()); check_error(); return expr(*this, r); }
4042 inline expr context::real_val(char const * n) { Z3_ast r = Z3_mk_numeral(m_ctx, n, real_sort()); check_error(); return expr(*this, r); }
4043
4044 inline expr context::bv_val(int n, unsigned sz) { sort s = bv_sort(sz); Z3_ast r = Z3_mk_int(m_ctx, n, s); check_error(); return expr(*this, r); }
4045 inline expr context::bv_val(unsigned n, unsigned sz) { sort s = bv_sort(sz); Z3_ast r = Z3_mk_unsigned_int(m_ctx, n, s); check_error(); return expr(*this, r); }
4046 inline expr context::bv_val(int64_t n, unsigned sz) { sort s = bv_sort(sz); Z3_ast r = Z3_mk_int64(m_ctx, n, s); check_error(); return expr(*this, r); }
4047 inline expr context::bv_val(uint64_t n, unsigned sz) { sort s = bv_sort(sz); Z3_ast r = Z3_mk_unsigned_int64(m_ctx, n, s); check_error(); return expr(*this, r); }
4048 inline expr context::bv_val(char const * n, unsigned sz) { sort s = bv_sort(sz); Z3_ast r = Z3_mk_numeral(m_ctx, n, s); check_error(); return expr(*this, r); }
4049 inline expr context::bv_val(unsigned n, bool const* bits) {
4050 array<bool> _bits(n);
4051 for (unsigned i = 0; i < n; ++i) _bits[i] = bits[i] ? 1 : 0;
4052 Z3_ast r = Z3_mk_bv_numeral(m_ctx, n, _bits.ptr()); check_error(); return expr(*this, r);
4053 }
4054
4055 inline expr context::fpa_val(double n) { sort s = fpa_sort<64>(); Z3_ast r = Z3_mk_fpa_numeral_double(m_ctx, n, s); check_error(); return expr(*this, r); }
4056 inline expr context::fpa_val(float n) { sort s = fpa_sort<32>(); Z3_ast r = Z3_mk_fpa_numeral_float(m_ctx, n, s); check_error(); return expr(*this, r); }
4057 inline expr context::fpa_nan(sort const & s) { Z3_ast r = Z3_mk_fpa_nan(m_ctx, s); check_error(); return expr(*this, r); }
4058 inline expr context::fpa_inf(sort const & s, bool sgn) { Z3_ast r = Z3_mk_fpa_inf(m_ctx, s, sgn); check_error(); return expr(*this, r); }
4059
4060 inline expr context::string_val(char const* s, unsigned n) { Z3_ast r = Z3_mk_lstring(m_ctx, n, s); check_error(); return expr(*this, r); }
4061 inline expr context::string_val(char const* s) { Z3_ast r = Z3_mk_string(m_ctx, s); check_error(); return expr(*this, r); }
4062 inline expr context::string_val(std::string const& s) { Z3_ast r = Z3_mk_string(m_ctx, s.c_str()); check_error(); return expr(*this, r); }
4063 inline expr context::string_val(std::u32string const& s) { Z3_ast r = Z3_mk_u32string(m_ctx, (unsigned)s.size(), (unsigned const*)s.c_str()); check_error(); return expr(*this, r); }
4064
4065 inline expr context::num_val(int n, sort const & s) { Z3_ast r = Z3_mk_int(m_ctx, n, s); check_error(); return expr(*this, r); }
4066
4067 inline expr func_decl::operator()(unsigned n, expr const * args) const {
4068 array<Z3_ast> _args(n);
4069 for (unsigned i = 0; i < n; ++i) {
4070 check_context(*this, args[i]);
4071 _args[i] = args[i];
4072 }
4073 Z3_ast r = Z3_mk_app(ctx(), *this, n, _args.ptr());
4074 check_error();
4075 return expr(ctx(), r);
4076
4077 }
4078 inline expr func_decl::operator()(expr_vector const& args) const {
4079 array<Z3_ast> _args(args.size());
4080 for (unsigned i = 0; i < args.size(); ++i) {
4081 check_context(*this, args[i]);
4082 _args[i] = args[i];
4083 }
4084 Z3_ast r = Z3_mk_app(ctx(), *this, args.size(), _args.ptr());
4085 check_error();
4086 return expr(ctx(), r);
4087 }
4088 inline expr func_decl::operator()() const {
4089 Z3_ast r = Z3_mk_app(ctx(), *this, 0, 0);
4090 ctx().check_error();
4091 return expr(ctx(), r);
4092 }
4093 inline expr func_decl::operator()(expr const & a) const {
4094 check_context(*this, a);
4095 Z3_ast args[1] = { a };
4096 Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
4097 ctx().check_error();
4098 return expr(ctx(), r);
4099 }
4100 inline expr func_decl::operator()(int a) const {
4101 Z3_ast args[1] = { ctx().num_val(a, domain(0)) };
4102 Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
4103 ctx().check_error();
4104 return expr(ctx(), r);
4105 }
4106 inline expr func_decl::operator()(expr const & a1, expr const & a2) const {
4107 check_context(*this, a1); check_context(*this, a2);
4108 Z3_ast args[2] = { a1, a2 };
4109 Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4110 ctx().check_error();
4111 return expr(ctx(), r);
4112 }
4113 inline expr func_decl::operator()(expr const & a1, int a2) const {
4114 check_context(*this, a1);
4115 Z3_ast args[2] = { a1, ctx().num_val(a2, domain(1)) };
4116 Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4117 ctx().check_error();
4118 return expr(ctx(), r);
4119 }
4120 inline expr func_decl::operator()(int a1, expr const & a2) const {
4121 check_context(*this, a2);
4122 Z3_ast args[2] = { ctx().num_val(a1, domain(0)), a2 };
4123 Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4124 ctx().check_error();
4125 return expr(ctx(), r);
4126 }
4127 inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3) const {
4128 check_context(*this, a1); check_context(*this, a2); check_context(*this, a3);
4129 Z3_ast args[3] = { a1, a2, a3 };
4130 Z3_ast r = Z3_mk_app(ctx(), *this, 3, args);
4131 ctx().check_error();
4132 return expr(ctx(), r);
4133 }
4134 inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const {
4135 check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4);
4136 Z3_ast args[4] = { a1, a2, a3, a4 };
4137 Z3_ast r = Z3_mk_app(ctx(), *this, 4, args);
4138 ctx().check_error();
4139 return expr(ctx(), r);
4140 }
4141 inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const {
4142 check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4); check_context(*this, a5);
4143 Z3_ast args[5] = { a1, a2, a3, a4, a5 };
4144 Z3_ast r = Z3_mk_app(ctx(), *this, 5, args);
4145 ctx().check_error();
4146 return expr(ctx(), r);
4147 }
4148
4149 inline expr to_real(expr const & a) { Z3_ast r = Z3_mk_int2real(a.ctx(), a); a.check_error(); return expr(a.ctx(), r); }
4150
4151 inline func_decl function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
4152 return range.ctx().function(name, arity, domain, range);
4153 }
4154 inline func_decl function(char const * name, unsigned arity, sort const * domain, sort const & range) {
4155 return range.ctx().function(name, arity, domain, range);
4156 }
4157 inline func_decl function(char const * name, sort const & domain, sort const & range) {
4158 return range.ctx().function(name, domain, range);
4159 }
4160 inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & range) {
4161 return range.ctx().function(name, d1, d2, range);
4162 }
4163 inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
4164 return range.ctx().function(name, d1, d2, d3, range);
4165 }
4166 inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
4167 return range.ctx().function(name, d1, d2, d3, d4, range);
4168 }
4169 inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & d5, sort const & range) {
4170 return range.ctx().function(name, d1, d2, d3, d4, d5, range);
4171 }
4172 inline func_decl function(char const* name, sort_vector const& domain, sort const& range) {
4173 return range.ctx().function(name, domain, range);
4174 }
4175 inline func_decl function(std::string const& name, sort_vector const& domain, sort const& range) {
4176 return range.ctx().function(name.c_str(), domain, range);
4177 }
4178
4179 inline func_decl recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
4180 return range.ctx().recfun(name, arity, domain, range);
4181 }
4182 inline func_decl recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
4183 return range.ctx().recfun(name, arity, domain, range);
4184 }
4185 inline func_decl recfun(char const * name, sort const& d1, sort const & range) {
4186 return range.ctx().recfun(name, d1, range);
4187 }
4188 inline func_decl recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
4189 return range.ctx().recfun(name, d1, d2, range);
4190 }
4191
4192 inline expr select(expr const & a, expr const & i) {
4193 check_context(a, i);
4194 Z3_ast r = Z3_mk_select(a.ctx(), a, i);
4195 a.check_error();
4196 return expr(a.ctx(), r);
4197 }
4198 inline expr select(expr const & a, int i) {
4199 return select(a, a.ctx().num_val(i, a.get_sort().array_domain()));
4200 }
4201 inline expr select(expr const & a, expr_vector const & i) {
4202 check_context(a, i);
4203 array<Z3_ast> idxs(i);
4204 Z3_ast r = Z3_mk_select_n(a.ctx(), a, idxs.size(), idxs.ptr());
4205 a.check_error();
4206 return expr(a.ctx(), r);
4207 }
4208
4209 inline expr store(expr const & a, expr const & i, expr const & v) {
4210 check_context(a, i); check_context(a, v);
4211 Z3_ast r = Z3_mk_store(a.ctx(), a, i, v);
4212 a.check_error();
4213 return expr(a.ctx(), r);
4214 }
4215
4216 inline expr store(expr const & a, int i, expr const & v) { return store(a, a.ctx().num_val(i, a.get_sort().array_domain()), v); }
4217 inline expr store(expr const & a, expr i, int v) { return store(a, i, a.ctx().num_val(v, a.get_sort().array_range())); }
4218 inline expr store(expr const & a, int i, int v) {
4219 return store(a, a.ctx().num_val(i, a.get_sort().array_domain()), a.ctx().num_val(v, a.get_sort().array_range()));
4220 }
4221 inline expr store(expr const & a, expr_vector const & i, expr const & v) {
4222 check_context(a, i); check_context(a, v);
4223 array<Z3_ast> idxs(i);
4224 Z3_ast r = Z3_mk_store_n(a.ctx(), a, idxs.size(), idxs.ptr(), v);
4225 a.check_error();
4226 return expr(a.ctx(), r);
4227 }
4228
4229 inline expr as_array(func_decl & f) {
4230 Z3_ast r = Z3_mk_as_array(f.ctx(), f);
4231 f.check_error();
4232 return expr(f.ctx(), r);
4233 }
4234
4235 inline expr array_default(expr const & a) {
4236 Z3_ast r = Z3_mk_array_default(a.ctx(), a);
4237 a.check_error();
4238 return expr(a.ctx(), r);
4239 }
4240
4241 inline expr array_ext(expr const & a, expr const & b) {
4242 check_context(a, b);
4243 Z3_ast r = Z3_mk_array_ext(a.ctx(), a, b);
4244 a.check_error();
4245 return expr(a.ctx(), r);
4246 }
4247
4248#define MK_EXPR1(_fn, _arg) \
4249 Z3_ast r = _fn(_arg.ctx(), _arg); \
4250 _arg.check_error(); \
4251 return expr(_arg.ctx(), r);
4252
4253#define MK_EXPR2(_fn, _arg1, _arg2) \
4254 check_context(_arg1, _arg2); \
4255 Z3_ast r = _fn(_arg1.ctx(), _arg1, _arg2); \
4256 _arg1.check_error(); \
4257 return expr(_arg1.ctx(), r);
4258
4259 inline expr const_array(sort const & d, expr const & v) {
4261 }
4262
4263 inline expr empty_set(sort const& s) {
4265 }
4266
4267 inline expr full_set(sort const& s) {
4269 }
4270
4271 inline expr set_add(expr const& s, expr const& e) {
4272 MK_EXPR2(Z3_mk_set_add, s, e);
4273 }
4274
4275 inline expr set_del(expr const& s, expr const& e) {
4276 MK_EXPR2(Z3_mk_set_del, s, e);
4277 }
4278
4279 inline expr set_union(expr const& a, expr const& b) {
4280 check_context(a, b);
4281 Z3_ast es[2] = { a, b };
4282 Z3_ast r = Z3_mk_set_union(a.ctx(), 2, es);
4283 a.check_error();
4284 return expr(a.ctx(), r);
4285 }
4286
4287 inline expr set_intersect(expr const& a, expr const& b) {
4288 check_context(a, b);
4289 Z3_ast es[2] = { a, b };
4290 Z3_ast r = Z3_mk_set_intersect(a.ctx(), 2, es);
4291 a.check_error();
4292 return expr(a.ctx(), r);
4293 }
4294
4295 inline expr set_difference(expr const& a, expr const& b) {
4297 }
4298
4299 inline expr set_complement(expr const& a) {
4301 }
4302
4303 inline expr set_member(expr const& s, expr const& e) {
4305 }
4306
4307 inline expr set_subset(expr const& a, expr const& b) {
4309 }
4310
4311 // finite set operations
4312
4313 inline expr finite_set_empty(sort const& s) {
4314 Z3_ast r = Z3_mk_finite_set_empty(s.ctx(), s);
4315 s.check_error();
4316 return expr(s.ctx(), r);
4317 }
4318
4319 inline expr finite_set_singleton(expr const& e) {
4321 }
4322
4323 inline expr finite_set_union(expr const& a, expr const& b) {
4325 }
4326
4327 inline expr finite_set_intersect(expr const& a, expr const& b) {
4329 }
4330
4331 inline expr finite_set_difference(expr const& a, expr const& b) {
4333 }
4334
4335 inline expr finite_set_member(expr const& e, expr const& s) {
4337 }
4338
4339 inline expr finite_set_size(expr const& s) {
4341 }
4342
4343 inline expr finite_set_subset(expr const& a, expr const& b) {
4345 }
4346
4347 inline expr finite_set_map(expr const& f, expr const& s) {
4349 }
4350
4351 inline expr finite_set_filter(expr const& f, expr const& s) {
4353 }
4354
4355 inline expr finite_set_range(expr const& low, expr const& high) {
4356 MK_EXPR2(Z3_mk_finite_set_range, low, high);
4357 }
4358
4359 // sequence and regular expression operations.
4360 // union is +
4361 // concat is overloaded to handle sequences and regular expressions
4362
4363 inline expr empty(sort const& s) {
4364 Z3_ast r = Z3_mk_seq_empty(s.ctx(), s);
4365 s.check_error();
4366 return expr(s.ctx(), r);
4367 }
4368 inline expr suffixof(expr const& a, expr const& b) {
4369 check_context(a, b);
4370 Z3_ast r = Z3_mk_seq_suffix(a.ctx(), a, b);
4371 a.check_error();
4372 return expr(a.ctx(), r);
4373 }
4374 inline expr prefixof(expr const& a, expr const& b) {
4375 check_context(a, b);
4376 Z3_ast r = Z3_mk_seq_prefix(a.ctx(), a, b);
4377 a.check_error();
4378 return expr(a.ctx(), r);
4379 }
4380 inline expr indexof(expr const& s, expr const& substr, expr const& offset) {
4381 check_context(s, substr); check_context(s, offset);
4382 Z3_ast r = Z3_mk_seq_index(s.ctx(), s, substr, offset);
4383 s.check_error();
4384 return expr(s.ctx(), r);
4385 }
4386 inline expr last_indexof(expr const& s, expr const& substr) {
4387 check_context(s, substr);
4388 Z3_ast r = Z3_mk_seq_last_index(s.ctx(), s, substr);
4389 s.check_error();
4390 return expr(s.ctx(), r);
4391 }
4392 inline expr to_re(expr const& s) {
4394 }
4395 inline expr in_re(expr const& s, expr const& re) {
4396 MK_EXPR2(Z3_mk_seq_in_re, s, re);
4397 }
4398 inline expr plus(expr const& re) {
4400 }
4401 inline expr option(expr const& re) {
4403 }
4404 inline expr star(expr const& re) {
4406 }
4407 inline expr re_empty(sort const& s) {
4408 Z3_ast r = Z3_mk_re_empty(s.ctx(), s);
4409 s.check_error();
4410 return expr(s.ctx(), r);
4411 }
4412 inline expr re_full(sort const& s) {
4413 Z3_ast r = Z3_mk_re_full(s.ctx(), s);
4414 s.check_error();
4415 return expr(s.ctx(), r);
4416 }
4417 inline expr re_intersect(expr_vector const& args) {
4418 assert(args.size() > 0);
4419 context& ctx = args[0u].ctx();
4420 array<Z3_ast> _args(args);
4421 Z3_ast r = Z3_mk_re_intersect(ctx, _args.size(), _args.ptr());
4422 ctx.check_error();
4423 return expr(ctx, r);
4424 }
4425 inline expr re_diff(expr const& a, expr const& b) {
4426 check_context(a, b);
4427 context& ctx = a.ctx();
4428 Z3_ast r = Z3_mk_re_diff(ctx, a, b);
4429 ctx.check_error();
4430 return expr(ctx, r);
4431 }
4432 inline expr re_complement(expr const& a) {
4434 }
4435 inline expr range(expr const& lo, expr const& hi) {
4436 check_context(lo, hi);
4437 Z3_ast r = Z3_mk_re_range(lo.ctx(), lo, hi);
4438 lo.check_error();
4439 return expr(lo.ctx(), r);
4440 }
4441
4442
4443
4444
4445
4446 inline expr_vector context::parse_string(char const* s) {
4447 Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, 0, 0, 0, 0, 0, 0);
4448 check_error();
4449 return expr_vector(*this, r);
4450
4451 }
4452 inline expr_vector context::parse_file(char const* s) {
4453 Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, 0, 0, 0, 0, 0, 0);
4454 check_error();
4455 return expr_vector(*this, r);
4456 }
4457
4458 inline expr_vector context::parse_string(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
4459 array<Z3_symbol> sort_names(sorts.size());
4460 array<Z3_symbol> decl_names(decls.size());
4461 array<Z3_sort> sorts1(sorts);
4462 array<Z3_func_decl> decls1(decls);
4463 for (unsigned i = 0; i < sorts.size(); ++i) {
4464 sort_names[i] = sorts[i].name();
4465 }
4466 for (unsigned i = 0; i < decls.size(); ++i) {
4467 decl_names[i] = decls[i].name();
4468 }
4469
4470 Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
4471 check_error();
4472 return expr_vector(*this, r);
4473 }
4474
4475 inline expr_vector context::parse_file(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
4476 array<Z3_symbol> sort_names(sorts.size());
4477 array<Z3_symbol> decl_names(decls.size());
4478 array<Z3_sort> sorts1(sorts);
4479 array<Z3_func_decl> decls1(decls);
4480 for (unsigned i = 0; i < sorts.size(); ++i) {
4481 sort_names[i] = sorts[i].name();
4482 }
4483 for (unsigned i = 0; i < decls.size(); ++i) {
4484 decl_names[i] = decls[i].name();
4485 }
4486 Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
4487 check_error();
4488 return expr_vector(*this, r);
4489 }
4490
4491 inline func_decl_vector sort::constructors() {
4492 assert(is_datatype());
4493 func_decl_vector cs(ctx());
4494 unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), *this);
4495 for (unsigned i = 0; i < n; ++i)
4496 cs.push_back(func_decl(ctx(), Z3_get_datatype_sort_constructor(ctx(), *this, i)));
4497 return cs;
4498 }
4499
4500 inline func_decl_vector sort::recognizers() {
4501 assert(is_datatype());
4502 func_decl_vector rs(ctx());
4503 unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), *this);
4504 for (unsigned i = 0; i < n; ++i)
4505 rs.push_back(func_decl(ctx(), Z3_get_datatype_sort_recognizer(ctx(), *this, i)));
4506 return rs;
4507 }
4508
4509 inline func_decl_vector func_decl::accessors() {
4510 sort s = range();
4511 assert(s.is_datatype());
4512 unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), s);
4513 unsigned idx = 0;
4514 for (; idx < n; ++idx) {
4515 func_decl f(ctx(), Z3_get_datatype_sort_constructor(ctx(), s, idx));
4516 if (id() == f.id())
4517 break;
4518 }
4519 assert(idx < n);
4520 n = arity();
4521 func_decl_vector as(ctx());
4522 for (unsigned i = 0; i < n; ++i)
4523 as.push_back(func_decl(ctx(), Z3_get_datatype_sort_constructor_accessor(ctx(), s, idx, i)));
4524 return as;
4525 }
4526
4527
4528 inline expr expr::substitute(expr_vector const& src, expr_vector const& dst) {
4529 assert(src.size() == dst.size());
4530 array<Z3_ast> _src(src.size());
4531 array<Z3_ast> _dst(dst.size());
4532 for (unsigned i = 0; i < src.size(); ++i) {
4533 _src[i] = src[i];
4534 _dst[i] = dst[i];
4535 }
4536 Z3_ast r = Z3_substitute(ctx(), m_ast, src.size(), _src.ptr(), _dst.ptr());
4537 check_error();
4538 return expr(ctx(), r);
4539 }
4540
4541 inline expr expr::substitute(expr_vector const& dst) {
4542 array<Z3_ast> _dst(dst.size());
4543 for (unsigned i = 0; i < dst.size(); ++i) {
4544 _dst[i] = dst[i];
4545 }
4546 Z3_ast r = Z3_substitute_vars(ctx(), m_ast, dst.size(), _dst.ptr());
4547 check_error();
4548 return expr(ctx(), r);
4549 }
4550
4551 inline expr expr::substitute(func_decl_vector const& funs, expr_vector const& dst) {
4552 array<Z3_ast> _dst(dst.size());
4553 array<Z3_func_decl> _funs(funs.size());
4554 if (dst.size() != funs.size()) {
4555 Z3_THROW(exception("length of argument lists don't align"));
4556 return expr(ctx(), nullptr);
4557 }
4558 for (unsigned i = 0; i < dst.size(); ++i) {
4559 _dst[i] = dst[i];
4560 _funs[i] = funs[i];
4561 }
4562 Z3_ast r = Z3_substitute_funs(ctx(), m_ast, dst.size(), _funs.ptr(), _dst.ptr());
4563 check_error();
4564 return expr(ctx(), r);
4565 }
4566
4567 inline expr expr::update(expr_vector const& args) const {
4568 array<Z3_ast> _args(args.size());
4569 for (unsigned i = 0; i < args.size(); ++i) {
4570 _args[i] = args[i];
4571 }
4572 Z3_ast r = Z3_update_term(ctx(), m_ast, args.size(), _args.ptr());
4573 check_error();
4574 return expr(ctx(), r);
4575 }
4576
4577 inline expr expr::update_field(func_decl const& field_access, expr const& new_value) const {
4578 assert(is_datatype());
4579 Z3_ast r = Z3_datatype_update_field(ctx(), field_access, m_ast, new_value);
4580 check_error();
4581 return expr(ctx(), r);
4582 }
4583
4584 typedef std::function<void(expr const& proof, std::vector<unsigned> const& deps, expr_vector const& clause)> on_clause_eh_t;
4585
4586 class on_clause {
4587 context& c;
4588 on_clause_eh_t m_on_clause;
4589
4590 static void _on_clause_eh(void* _ctx, Z3_ast _proof, unsigned n, unsigned const* dep, Z3_ast_vector _literals) {
4591 on_clause* ctx = static_cast<on_clause*>(_ctx);
4592 expr_vector lits(ctx->c, _literals);
4593 expr proof(ctx->c, _proof);
4594 std::vector<unsigned> deps;
4595 for (unsigned i = 0; i < n; ++i)
4596 deps.push_back(dep[i]);
4597 ctx->m_on_clause(proof, deps, lits);
4598 }
4599 public:
4600 on_clause(solver& s, on_clause_eh_t& on_clause_eh): c(s.ctx()) {
4601 m_on_clause = on_clause_eh;
4602 Z3_solver_register_on_clause(c, s, this, _on_clause_eh);
4603 c.check_error();
4604 }
4605 };
4606
4607 class user_propagator_base {
4608
4609 typedef std::function<void(expr const&, expr const&)> fixed_eh_t;
4610 typedef std::function<void(void)> final_eh_t;
4611 typedef std::function<void(expr const&, expr const&)> eq_eh_t;
4612 typedef std::function<void(expr const&)> created_eh_t;
4613 typedef std::function<void(expr, unsigned, bool)> decide_eh_t;
4614 typedef std::function<bool(expr const&, expr const&)> on_binding_eh_t;
4615
4616 final_eh_t m_final_eh;
4617 eq_eh_t m_eq_eh;
4618 fixed_eh_t m_fixed_eh;
4619 created_eh_t m_created_eh;
4620 decide_eh_t m_decide_eh;
4621 on_binding_eh_t m_on_binding_eh;
4622 solver* s;
4623 context* c;
4624 std::vector<z3::context*> subcontexts;
4625
4626 unsigned m_callbackNesting = 0;
4627 Z3_solver_callback cb { nullptr };
4628
4629 struct scoped_cb {
4630 user_propagator_base& p;
4631 scoped_cb(void* _p, Z3_solver_callback cb):p(*static_cast<user_propagator_base*>(_p)) {
4632 p.cb = cb;
4633 p.m_callbackNesting++;
4634 }
4635 ~scoped_cb() {
4636 if (--p.m_callbackNesting == 0)
4637 p.cb = nullptr;
4638 }
4639 };
4640
4641 static void push_eh(void* _p, Z3_solver_callback cb) {
4642 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4643 scoped_cb _cb(p, cb);
4644 static_cast<user_propagator_base*>(p)->push();
4645 }
4646
4647 static void pop_eh(void* _p, Z3_solver_callback cb, unsigned num_scopes) {
4648 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4649 scoped_cb _cb(p, cb);
4650 static_cast<user_propagator_base*>(_p)->pop(num_scopes);
4651 }
4652
4653 static void* fresh_eh(void* _p, Z3_context ctx) {
4654 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4655 context* c = new context(ctx);
4656 p->subcontexts.push_back(c);
4657 return p->fresh(*c);
4658 }
4659
4660 static void fixed_eh(void* _p, Z3_solver_callback cb, Z3_ast _var, Z3_ast _value) {
4661 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4662 scoped_cb _cb(p, cb);
4663 expr value(p->ctx(), _value);
4664 expr var(p->ctx(), _var);
4665 p->m_fixed_eh(var, value);
4666 }
4667
4668 static void eq_eh(void* _p, Z3_solver_callback cb, Z3_ast _x, Z3_ast _y) {
4669 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4670 scoped_cb _cb(p, cb);
4671 expr x(p->ctx(), _x), y(p->ctx(), _y);
4672 p->m_eq_eh(x, y);
4673 }
4674
4675 static void final_eh(void* p, Z3_solver_callback cb) {
4676 scoped_cb _cb(p, cb);
4677 static_cast<user_propagator_base*>(p)->m_final_eh();
4678 }
4679
4680 static void created_eh(void* _p, Z3_solver_callback cb, Z3_ast _e) {
4681 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4682 scoped_cb _cb(p, cb);
4683 expr e(p->ctx(), _e);
4684 p->m_created_eh(e);
4685 }
4686
4687 static void decide_eh(void* _p, Z3_solver_callback cb, Z3_ast _val, unsigned bit, bool is_pos) {
4688 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4689 scoped_cb _cb(p, cb);
4690 expr val(p->ctx(), _val);
4691 p->m_decide_eh(val, bit, is_pos);
4692 }
4693
4694 static bool on_binding_eh(void* _p, Z3_solver_callback cb, Z3_ast _q, Z3_ast _inst) {
4695 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4696 scoped_cb _cb(p, cb);
4697 expr q(p->ctx(), _q), inst(p->ctx(), _inst);
4698 return p->m_on_binding_eh(q, inst);
4699 }
4700
4701 public:
4702 user_propagator_base(context& c) : s(nullptr), c(&c) {}
4703
4704 user_propagator_base(solver* s): s(s), c(nullptr) {
4705 Z3_solver_propagate_init(ctx(), *s, this, push_eh, pop_eh, fresh_eh);
4706 }
4707
4708 virtual void push() = 0;
4709 virtual void pop(unsigned num_scopes) = 0;
4710
4711 virtual ~user_propagator_base() {
4712 for (auto& subcontext : subcontexts) {
4713 subcontext->detach(); // detach first; the subcontexts will be freed internally!
4714 delete subcontext;
4715 }
4716 }
4717
4718 context& ctx() {
4719 return c ? *c : s->ctx();
4720 }
4721
4730 virtual user_propagator_base* fresh(context& ctx) = 0;
4731
4738 void register_fixed(fixed_eh_t& f) {
4739 m_fixed_eh = f;
4740 if (s) {
4741 Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4742 }
4743 }
4744
4745 void register_fixed() {
4746 m_fixed_eh = [this](expr const &id, expr const &e) {
4747 fixed(id, e);
4748 };
4749 if (s) {
4750 Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4751 }
4752 }
4753
4754 void register_eq(eq_eh_t& f) {
4755 m_eq_eh = f;
4756 if (s) {
4757 Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4758 }
4759 }
4760
4761 void register_eq() {
4762 m_eq_eh = [this](expr const& x, expr const& y) {
4763 eq(x, y);
4764 };
4765 if (s) {
4766 Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4767 }
4768 }
4769
4778 void register_final(final_eh_t& f) {
4779 m_final_eh = f;
4780 if (s) {
4781 Z3_solver_propagate_final(ctx(), *s, final_eh);
4782 }
4783 }
4784
4785 void register_final() {
4786 m_final_eh = [this]() {
4787 final();
4788 };
4789 if (s) {
4790 Z3_solver_propagate_final(ctx(), *s, final_eh);
4791 }
4792 }
4793
4794 void register_created(created_eh_t& c) {
4795 m_created_eh = c;
4796 if (s) {
4797 Z3_solver_propagate_created(ctx(), *s, created_eh);
4798 }
4799 }
4800
4801 void register_created() {
4802 m_created_eh = [this](expr const& e) {
4803 created(e);
4804 };
4805 if (s) {
4806 Z3_solver_propagate_created(ctx(), *s, created_eh);
4807 }
4808 }
4809
4810 void register_decide(decide_eh_t& c) {
4811 m_decide_eh = c;
4812 if (s) {
4813 Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4814 }
4815 }
4816
4817 void register_decide() {
4818 m_decide_eh = [this](expr val, unsigned bit, bool is_pos) {
4819 decide(val, bit, is_pos);
4820 };
4821 if (s) {
4822 Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4823 }
4824 }
4825
4826 void register_on_binding() {
4827 m_on_binding_eh = [this](expr const& q, expr const& inst) {
4828 return on_binding(q, inst);
4829 };
4830 if (s)
4831 Z3_solver_propagate_on_binding(ctx(), *s, on_binding_eh);
4832 }
4833
4834 virtual void fixed(expr const& /*id*/, expr const& /*e*/) { }
4835
4836 virtual void eq(expr const& /*x*/, expr const& /*y*/) { }
4837
4838 virtual void final() { }
4839
4840 virtual void created(expr const& /*e*/) {}
4841
4842 virtual void decide(expr const& /*val*/, unsigned /*bit*/, bool /*is_pos*/) {}
4843
4844 virtual bool on_binding(expr const& /*q*/, expr const& /*inst*/) { return true; }
4845
4846 bool next_split(expr const& e, unsigned idx, Z3_lbool phase) {
4847 assert(cb);
4848 return Z3_solver_next_split(ctx(), cb, e, idx, phase);
4849 }
4850
4865 void add(expr const& e) {
4866 if (cb)
4867 Z3_solver_propagate_register_cb(ctx(), cb, e);
4868 else if (s)
4869 Z3_solver_propagate_register(ctx(), *s, e);
4870 else
4871 assert(false);
4872 }
4873
4874 void conflict(expr_vector const& fixed) {
4875 assert(cb);
4876 expr conseq = ctx().bool_val(false);
4877 array<Z3_ast> _fixed(fixed);
4878 Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
4879 }
4880
4881 void conflict(expr_vector const& fixed, expr_vector const& lhs, expr_vector const& rhs) {
4882 assert(cb);
4883 assert(lhs.size() == rhs.size());
4884 expr conseq = ctx().bool_val(false);
4885 array<Z3_ast> _fixed(fixed);
4886 array<Z3_ast> _lhs(lhs);
4887 array<Z3_ast> _rhs(rhs);
4888 Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
4889 }
4890
4891 bool propagate(expr_vector const& fixed, expr const& conseq) {
4892 assert(cb);
4893 assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
4894 array<Z3_ast> _fixed(fixed);
4895 return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
4896 }
4897
4898 bool propagate(expr_vector const& fixed,
4899 expr_vector const& lhs, expr_vector const& rhs,
4900 expr const& conseq) {
4901 assert(cb);
4902 assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
4903 assert(lhs.size() == rhs.size());
4904 array<Z3_ast> _fixed(fixed);
4905 array<Z3_ast> _lhs(lhs);
4906 array<Z3_ast> _rhs(rhs);
4907
4908 return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
4909 }
4910 };
4911
4921 class rcf_num {
4922 Z3_context m_ctx;
4923 Z3_rcf_num m_num;
4924
4925 void check_context(rcf_num const& other) const {
4926 if (m_ctx != other.m_ctx) {
4927 Z3_THROW(exception("rcf_num objects from different contexts"));
4928 }
4929 }
4930
4931 public:
4932 rcf_num(context& c, Z3_rcf_num n): m_ctx(c), m_num(n) {}
4933
4934 rcf_num(context& c, int val): m_ctx(c) {
4935 m_num = Z3_rcf_mk_small_int(c, val);
4936 }
4937
4938 rcf_num(context& c, char const* val): m_ctx(c) {
4939 m_num = Z3_rcf_mk_rational(c, val);
4940 }
4941
4942 rcf_num(rcf_num const& other): m_ctx(other.m_ctx) {
4943 // Create a copy by converting to string and back
4944 std::string str = Z3_rcf_num_to_string(m_ctx, other.m_num, false, false);
4945 m_num = Z3_rcf_mk_rational(m_ctx, str.c_str());
4946 }
4947
4948 rcf_num& operator=(rcf_num const& other) {
4949 if (this != &other) {
4950 Z3_rcf_del(m_ctx, m_num);
4951 m_ctx = other.m_ctx;
4952 std::string str = Z3_rcf_num_to_string(m_ctx, other.m_num, false, false);
4953 m_num = Z3_rcf_mk_rational(m_ctx, str.c_str());
4954 }
4955 return *this;
4956 }
4957
4958 ~rcf_num() {
4959 Z3_rcf_del(m_ctx, m_num);
4960 }
4961
4962 operator Z3_rcf_num() const { return m_num; }
4963 Z3_context ctx() const { return m_ctx; }
4964
4968 std::string to_string(bool compact = false) const {
4969 return std::string(Z3_rcf_num_to_string(m_ctx, m_num, compact, false));
4970 }
4971
4975 std::string to_decimal(unsigned precision = 10) const {
4976 return std::string(Z3_rcf_num_to_decimal_string(m_ctx, m_num, precision));
4977 }
4978
4979 // Arithmetic operations
4980 rcf_num operator+(rcf_num const& other) const {
4981 check_context(other);
4982 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
4983 Z3_rcf_add(m_ctx, m_num, other.m_num));
4984 }
4985
4986 rcf_num operator-(rcf_num const& other) const {
4987 check_context(other);
4988 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
4989 Z3_rcf_sub(m_ctx, m_num, other.m_num));
4990 }
4991
4992 rcf_num operator*(rcf_num const& other) const {
4993 check_context(other);
4994 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
4995 Z3_rcf_mul(m_ctx, m_num, other.m_num));
4996 }
4997
4998 rcf_num operator/(rcf_num const& other) const {
4999 check_context(other);
5000 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
5001 Z3_rcf_div(m_ctx, m_num, other.m_num));
5002 }
5003
5004 rcf_num operator-() const {
5005 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
5006 Z3_rcf_neg(m_ctx, m_num));
5007 }
5008
5012 rcf_num power(unsigned k) const {
5013 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
5014 Z3_rcf_power(m_ctx, m_num, k));
5015 }
5016
5020 rcf_num inv() const {
5021 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
5022 Z3_rcf_inv(m_ctx, m_num));
5023 }
5024
5025 // Comparison operations
5026 bool operator<(rcf_num const& other) const {
5027 check_context(other);
5028 return Z3_rcf_lt(m_ctx, m_num, other.m_num);
5029 }
5030
5031 bool operator>(rcf_num const& other) const {
5032 check_context(other);
5033 return Z3_rcf_gt(m_ctx, m_num, other.m_num);
5034 }
5035
5036 bool operator<=(rcf_num const& other) const {
5037 check_context(other);
5038 return Z3_rcf_le(m_ctx, m_num, other.m_num);
5039 }
5040
5041 bool operator>=(rcf_num const& other) const {
5042 check_context(other);
5043 return Z3_rcf_ge(m_ctx, m_num, other.m_num);
5044 }
5045
5046 bool operator==(rcf_num const& other) const {
5047 check_context(other);
5048 return Z3_rcf_eq(m_ctx, m_num, other.m_num);
5049 }
5050
5051 bool operator!=(rcf_num const& other) const {
5052 check_context(other);
5053 return Z3_rcf_neq(m_ctx, m_num, other.m_num);
5054 }
5055
5056 // Type queries
5057 bool is_rational() const {
5058 return Z3_rcf_is_rational(m_ctx, m_num);
5059 }
5060
5061 bool is_algebraic() const {
5062 return Z3_rcf_is_algebraic(m_ctx, m_num);
5063 }
5064
5065 bool is_infinitesimal() const {
5066 return Z3_rcf_is_infinitesimal(m_ctx, m_num);
5067 }
5068
5069 bool is_transcendental() const {
5070 return Z3_rcf_is_transcendental(m_ctx, m_num);
5071 }
5072
5073 friend std::ostream& operator<<(std::ostream& out, rcf_num const& n) {
5074 return out << n.to_string();
5075 }
5076 };
5077
5081 inline rcf_num rcf_pi(context& c) {
5082 return rcf_num(c, Z3_rcf_mk_pi(c));
5083 }
5084
5088 inline rcf_num rcf_e(context& c) {
5089 return rcf_num(c, Z3_rcf_mk_e(c));
5090 }
5091
5095 inline rcf_num rcf_infinitesimal(context& c) {
5096 return rcf_num(c, Z3_rcf_mk_infinitesimal(c));
5097 }
5098
5105 inline std::vector<rcf_num> rcf_roots(context& c, std::vector<rcf_num> const& coeffs) {
5106 if (coeffs.empty()) {
5107 Z3_THROW(exception("polynomial coefficients cannot be empty"));
5108 }
5109
5110 unsigned n = static_cast<unsigned>(coeffs.size());
5111 std::vector<Z3_rcf_num> a(n);
5112 std::vector<Z3_rcf_num> roots(n);
5113
5114 for (unsigned i = 0; i < n; ++i) {
5115 a[i] = coeffs[i];
5116 }
5117
5118 unsigned num_roots = Z3_rcf_mk_roots(c, n, a.data(), roots.data());
5119
5120 std::vector<rcf_num> result;
5121 result.reserve(num_roots);
5122 for (unsigned i = 0; i < num_roots; ++i) {
5123 result.push_back(rcf_num(c, roots[i]));
5124 }
5125
5126 return result;
5127 }
5128
5129}
5130
5133#undef Z3_THROW
5134
symbol str_symbol(char const *s)
Create a Z3 symbol based on the given string.
Definition z3++.h:3699
expr num_val(int n, sort const &s)
Definition z3++.h:4066
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition z3++.h:3944
expr bool_val(bool b)
Definition z3++.h:4030
func_decl function(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition z3++.h:3873
Z3_error_code check_error() const
Definition z3++.h:545
context & ctx() const
Definition z3++.h:544
Z3_ast Z3_API Z3_mk_exists_const(Z3_context c, unsigned weight, unsigned num_bound, Z3_app const bound[], unsigned num_patterns, Z3_pattern const patterns[], Z3_ast body)
Similar to Z3_mk_forall_const.
void Z3_API Z3_solver_propagate_on_binding(Z3_context c, Z3_solver s, Z3_on_binding_eh on_binding_eh)
register a callback when the solver instantiates a quantifier. If the callback returns false,...
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.
Z3_ast_vector Z3_API Z3_optimize_get_assertions(Z3_context c, Z3_optimize o)
Return the set of asserted formulas on the optimization context.
Z3_ast Z3_API Z3_model_get_const_interp(Z3_context c, Z3_model m, Z3_func_decl a)
Return the interpretation (i.e., assignment) of constant a in the model m. Return NULL,...
Z3_sort Z3_API Z3_mk_int_sort(Z3_context c)
Create the integer type.
Z3_simplifier Z3_API Z3_simplifier_and_then(Z3_context c, Z3_simplifier t1, Z3_simplifier t2)
Return a simplifier that applies t1 to a given goal and t2 to every subgoal produced by t1.
Z3_probe Z3_API Z3_probe_lt(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when the value returned by p1 is less than the value returned...
Z3_sort Z3_API Z3_mk_array_sort_n(Z3_context c, unsigned n, Z3_sort const *domain, Z3_sort range)
Create an array type with N arguments.
Z3_ast Z3_API Z3_mk_bvxnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise xnor.
Z3_parameter_kind Z3_API Z3_get_decl_parameter_kind(Z3_context c, Z3_func_decl d, unsigned idx)
Return the parameter type associated with a declaration.
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_bvnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nor.
Z3_probe Z3_API Z3_probe_not(Z3_context x, Z3_probe p)
Return a probe that evaluates to "true" when p does not evaluate to true.
void Z3_API Z3_solver_assert_and_track(Z3_context c, Z3_solver s, Z3_ast a, Z3_ast p)
Assert a constraint a into the solver, and track it (in the unsat) core using the Boolean constant p.
Z3_ast Z3_API Z3_func_interp_get_else(Z3_context c, Z3_func_interp f)
Return the 'else' value of the given function interpretation.
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.
void Z3_API Z3_fixedpoint_inc_ref(Z3_context c, Z3_fixedpoint d)
Increment the reference counter of the given fixedpoint context.
Z3_tactic Z3_API Z3_tactic_using_params(Z3_context c, Z3_tactic t, Z3_params p)
Return a tactic that applies t using the given set of parameters.
Z3_ast Z3_API Z3_mk_const_array(Z3_context c, Z3_sort domain, Z3_ast v)
Create the constant array.
Z3_rcf_num Z3_API Z3_rcf_div(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return the value a / b.
void Z3_API Z3_simplifier_inc_ref(Z3_context c, Z3_simplifier t)
Increment the reference counter of the given simplifier.
unsigned Z3_API Z3_rcf_mk_roots(Z3_context c, unsigned n, Z3_rcf_num const a[], Z3_rcf_num roots[])
Store in roots the roots of the polynomial a[n-1]*x^{n-1} + ... + a[0]. The output vector roots must ...
void Z3_API Z3_fixedpoint_add_rule(Z3_context c, Z3_fixedpoint d, Z3_ast rule, Z3_symbol name)
Add a universal Horn clause as a named rule. The horn_rule should be of the form:
Z3_probe Z3_API Z3_probe_eq(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when the value returned by p1 is equal to the value returned ...
Z3_ast_vector Z3_API Z3_optimize_get_unsat_core(Z3_context c, Z3_optimize o)
Retrieve the unsat core for the last Z3_optimize_check The unsat core is a subset of the assumptions ...
Z3_sort Z3_API Z3_mk_char_sort(Z3_context c)
Create a sort for unicode characters.
Z3_ast Z3_API Z3_mk_unsigned_int(Z3_context c, unsigned v, Z3_sort ty)
Create a numeral of a int, bit-vector, or finite-domain sort.
Z3_ast Z3_API Z3_mk_re_option(Z3_context c, Z3_ast re)
Create the regular language [re].
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.
void Z3_API Z3_query_constructor(Z3_context c, Z3_constructor constr, unsigned num_fields, Z3_func_decl *constructor, Z3_func_decl *tester, Z3_func_decl accessors[])
Query constructor for declared functions.
void Z3_API Z3_optimize_set_initial_value(Z3_context c, Z3_optimize o, Z3_ast v, Z3_ast val)
provide an initialization hint to the solver. The initialization hint is used to calibrate an initial...
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....
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_func_decl Z3_API Z3_get_decl_func_decl_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the expression value associated with an expression parameter.
Z3_goal_prec
Z3 custom error handler (See Z3_set_error_handler).
Definition z3_api.h:1429
Z3_ast_vector Z3_API Z3_polynomial_subresultants(Z3_context c, Z3_ast p, Z3_ast q, Z3_ast x)
Return the nonzero subresultants of p and q with respect to the "variable" x.
Z3_ast Z3_API Z3_mk_zero_ext(Z3_context c, unsigned i, Z3_ast t1)
Extend the given bit-vector with zeros to the (unsigned) equivalent bit-vector of size m+i,...
void Z3_API Z3_solver_set_params(Z3_context c, Z3_solver s, Z3_params p)
Set the given solver using the given parameters.
Z3_ast Z3_API Z3_mk_set_intersect(Z3_context c, unsigned num_args, Z3_ast const args[])
Take the intersection of a list of sets.
Z3_ast Z3_API Z3_mk_set_subset(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Check for subsetness of sets.
Z3_ast Z3_API Z3_mk_int(Z3_context c, int v, Z3_sort ty)
Create a numeral of an int, bit-vector, or finite-domain sort.
Z3_lbool Z3_API Z3_solver_get_consequences(Z3_context c, Z3_solver s, Z3_ast_vector assumptions, Z3_ast_vector variables, Z3_ast_vector consequences)
retrieve consequences from solver that determine values of the supplied function symbols.
Z3_ast_vector Z3_API Z3_fixedpoint_from_file(Z3_context c, Z3_fixedpoint f, Z3_string s)
Parse an SMT-LIB2 file with fixedpoint rules. Add the rules to the current fixedpoint context....
Z3_ast Z3_API Z3_mk_bvule(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned less than or equal to.
Z3_ast Z3_API Z3_mk_full_set(Z3_context c, Z3_sort domain)
Create the full set.
Z3_rcf_num Z3_API Z3_rcf_mk_rational(Z3_context c, Z3_string val)
Return a RCF rational using the given string.
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.
void Z3_API Z3_add_rec_def(Z3_context c, Z3_func_decl f, unsigned n, Z3_ast args[], Z3_ast body)
Define the body of a recursive function.
Z3_param_descrs Z3_API Z3_solver_get_param_descrs(Z3_context c, Z3_solver s)
Return the parameter description set for the given solver object.
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.
Z3_ast Z3_API Z3_mk_true(Z3_context c)
Create an AST node representing true.
Z3_ast Z3_API Z3_optimize_get_lower(Z3_context c, Z3_optimize o, unsigned idx)
Retrieve lower bound value or approximation for the i'th optimization objective.
Z3_ast Z3_API Z3_mk_set_union(Z3_context c, unsigned num_args, Z3_ast const args[])
Take the union of a list of sets.
Z3_model Z3_API Z3_optimize_get_model(Z3_context c, Z3_optimize o)
Retrieve the model for the last Z3_optimize_check.
Z3_ast Z3_API Z3_mk_finite_set_empty(Z3_context c, Z3_sort set_sort)
Create an empty finite set of the given sort.
void Z3_API Z3_apply_result_inc_ref(Z3_context c, Z3_apply_result r)
Increment the reference counter of the given Z3_apply_result object.
Z3_func_interp Z3_API Z3_add_func_interp(Z3_context c, Z3_model m, Z3_func_decl f, Z3_ast default_value)
Create a fresh func_interp object, add it to a model for a specified function. It has reference count...
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.
Z3_ast Z3_API Z3_mk_bvxor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise exclusive-or.
Z3_string Z3_API Z3_stats_to_string(Z3_context c, Z3_stats s)
Convert a statistics into a string.
Z3_param_descrs Z3_API Z3_fixedpoint_get_param_descrs(Z3_context c, Z3_fixedpoint f)
Return the parameter description set for the given fixedpoint object.
Z3_sort Z3_API Z3_mk_real_sort(Z3_context c)
Create the real type.
void Z3_API Z3_optimize_from_file(Z3_context c, Z3_optimize o, Z3_string s)
Parse an SMT-LIB2 file with assertions, soft constraints and optimization objectives....
Z3_ast Z3_API Z3_mk_le(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than or equal to.
Z3_string Z3_API Z3_simplifier_get_help(Z3_context c, Z3_simplifier t)
Return a string containing a description of parameters accepted by the given simplifier.
bool Z3_API Z3_goal_inconsistent(Z3_context c, Z3_goal g)
Return true if the given goal contains the formula false.
Z3_ast Z3_API Z3_mk_lambda_const(Z3_context c, unsigned num_bound, Z3_app const bound[], Z3_ast body)
Create a lambda expression using a list of constants that form the set of bound variables.
Z3_tactic Z3_API Z3_tactic_par_and_then(Z3_context c, Z3_tactic t1, Z3_tactic t2)
Return a tactic that applies t1 to a given goal and then t2 to every subgoal produced by t1....
void Z3_API Z3_fixedpoint_update_rule(Z3_context c, Z3_fixedpoint d, Z3_ast a, Z3_symbol name)
Update a named rule. A rule with the same name must have been previously created.
void Z3_API Z3_solver_dec_ref(Z3_context c, Z3_solver s)
Decrement the reference counter of the given solver.
Z3_ast Z3_API Z3_mk_bvslt(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed less than.
Z3_func_decl Z3_API Z3_model_get_func_decl(Z3_context c, Z3_model m, unsigned i)
Return the declaration of the i-th function in the given model.
Z3_ast Z3_API Z3_mk_numeral(Z3_context c, Z3_string numeral, Z3_sort ty)
Create a numeral of a given sort.
Z3_ast Z3_API Z3_mk_finite_set_difference(Z3_context c, Z3_ast s1, Z3_ast s2)
Create the set difference of two finite sets.
unsigned Z3_API Z3_func_entry_get_num_args(Z3_context c, Z3_func_entry e)
Return the number of arguments in a Z3_func_entry object.
Z3_rcf_num Z3_API Z3_rcf_add(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return the value a + b.
Z3_symbol Z3_API Z3_get_decl_symbol_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the double value associated with an double parameter.
void Z3_API Z3_solver_from_string(Z3_context c, Z3_solver s, Z3_string str)
load solver assertions from a string.
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_rna(Z3_context c)
Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode.
Z3_probe Z3_API Z3_probe_ge(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when the value returned by p1 is greater than or equal to the...
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].
Z3_ast Z3_API Z3_mk_finite_set_subset(Z3_context c, Z3_ast s1, Z3_ast s2)
Check if one finite set is a subset of another.
void Z3_API Z3_simplifier_dec_ref(Z3_context c, Z3_simplifier g)
Decrement the reference counter of the given simplifier.
Z3_ast Z3_API Z3_mk_fpa_sub(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point subtraction.
void Z3_API Z3_goal_assert(Z3_context c, Z3_goal g, Z3_ast a)
Add a new formula a to the given goal. The formula is split according to the following procedure that...
Z3_sort Z3_API Z3_mk_polymorphic_datatype(Z3_context c, Z3_symbol name, unsigned num_parameters, Z3_sort parameters[], unsigned num_constructors, Z3_constructor constructors[])
Create a parametric datatype with explicit type parameters.
Z3_ast Z3_API Z3_func_entry_get_value(Z3_context c, Z3_func_entry e)
Return the value of this point.
Z3_ast_vector Z3_API Z3_fixedpoint_from_string(Z3_context c, Z3_fixedpoint f, Z3_string s)
Parse an SMT-LIB2 string with fixedpoint rules. Add the rules to the current fixedpoint context....
Z3_sort Z3_API Z3_mk_uninterpreted_sort(Z3_context c, Z3_symbol s)
Create a free (uninterpreted) type using the given name (symbol).
void Z3_API Z3_optimize_pop(Z3_context c, Z3_optimize d)
Backtrack one level.
Z3_ast Z3_API Z3_mk_false(Z3_context c)
Create an AST node representing false.
Z3_sort Z3_API Z3_mk_datatype(Z3_context c, Z3_symbol name, unsigned num_constructors, Z3_constructor constructors[])
Create datatype, such as lists, trees, records, enumerations or unions of records....
Z3_lbool Z3_API Z3_solver_check(Z3_context c, Z3_solver s)
Check whether the assertions in a given solver are consistent or not.
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.
Z3_ast Z3_API Z3_mk_bvmul(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement multiplication.
Z3_model Z3_API Z3_goal_convert_model(Z3_context c, Z3_goal g, Z3_model m)
Convert a model of the formulas of a goal to a model of an original goal. The model may be null,...
void Z3_API Z3_del_constructor(Z3_context c, Z3_constructor constr)
Reclaim memory allocated to constructor.
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_re_complement(Z3_context c, Z3_ast re)
Create the complement of the regular language re.
bool Z3_API Z3_rcf_eq(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a == b.
Z3_ast_vector Z3_API Z3_fixedpoint_get_assertions(Z3_context c, Z3_fixedpoint f)
Retrieve set of background assertions from fixedpoint context.
Z3_ast_vector Z3_API Z3_solver_get_assertions(Z3_context c, Z3_solver s)
Return the set of asserted formulas on the solver.
Z3_solver Z3_API Z3_mk_solver_from_tactic(Z3_context c, Z3_tactic t)
Create a new solver that is implemented using the given tactic. The solver supports the commands Z3_s...
Z3_ast Z3_API Z3_mk_set_complement(Z3_context c, Z3_ast arg)
Take the complement of a set.
bool Z3_API Z3_stats_is_uint(Z3_context c, Z3_stats s, unsigned idx)
Return true if the given statistical data is a unsigned integer.
bool Z3_API Z3_stats_is_double(Z3_context c, Z3_stats s, unsigned idx)
Return true if the given statistical data is a double.
Z3_ast Z3_API Z3_mk_fpa_rtn(Z3_context c)
Create a numeral of RoundingMode sort which represents the TowardNegative rounding mode.
unsigned Z3_API Z3_model_get_num_consts(Z3_context c, Z3_model m)
Return the number of constants assigned by the given model.
bool Z3_API Z3_rcf_lt(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a < b.
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_bvredand(Z3_context c, Z3_ast t1)
Take conjunction of bits in vector, return vector of length 1.
Z3_ast Z3_API Z3_mk_set_add(Z3_context c, Z3_ast set, Z3_ast elem)
Add an element to a set.
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_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.
Z3_ast Z3_API Z3_mk_fpa_rtp(Z3_context c)
Create a numeral of RoundingMode sort which represents the TowardPositive rounding mode.
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.
bool Z3_API Z3_solver_propagate_consequence(Z3_context c, Z3_solver_callback cb, unsigned num_fixed, Z3_ast const *fixed, unsigned num_eqs, Z3_ast const *eq_lhs, Z3_ast const *eq_rhs, Z3_ast conseq)
propagate a consequence based on fixed values and equalities. A client may invoke it during the pro...
Z3_rcf_num Z3_API Z3_rcf_inv(Z3_context c, Z3_rcf_num a)
Return the value 1/a.
Z3_ast Z3_API Z3_mk_array_default(Z3_context c, Z3_ast array)
Access the array default value. Produces the default range value, for arrays that can be represented ...
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.
Z3_ast Z3_API Z3_mk_forall_const(Z3_context c, unsigned weight, unsigned num_bound, Z3_app const bound[], unsigned num_patterns, Z3_pattern const patterns[], Z3_ast body)
Create a universal quantifier using a list of constants that will form the set of bound variables.
unsigned Z3_API Z3_model_get_num_sorts(Z3_context c, Z3_model m)
Return the number of uninterpreted sorts that m assigns an interpretation to.
bool Z3_API Z3_rcf_gt(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a > b.
const char * Z3_string
Z3 string type. It is just an alias for const char *.
Definition z3_api.h:50
Z3_param_descrs Z3_API Z3_tactic_get_param_descrs(Z3_context c, Z3_tactic t)
Return the parameter description set for the given tactic object.
Z3_sort Z3_API Z3_mk_tuple_sort(Z3_context c, Z3_symbol mk_tuple_name, unsigned num_fields, Z3_symbol const field_names[], Z3_sort const field_sorts[], Z3_func_decl *mk_tuple_decl, Z3_func_decl proj_decl[])
Create a tuple type.
void Z3_API Z3_func_entry_inc_ref(Z3_context c, Z3_func_entry e)
Increment the reference counter of the given Z3_func_entry object.
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.
void Z3_API Z3_solver_push(Z3_context c, Z3_solver s)
Create a backtracking point.
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.
Z3_rcf_num Z3_API Z3_rcf_sub(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return the value a - b.
Z3_ast Z3_API Z3_mk_fpa_max(Z3_context c, Z3_ast t1, Z3_ast t2)
Maximum of floating-point numbers.
void Z3_API Z3_optimize_assert_and_track(Z3_context c, Z3_optimize o, Z3_ast a, Z3_ast t)
Assert tracked hard constraint to the optimization context.
unsigned Z3_API Z3_optimize_assert_soft(Z3_context c, Z3_optimize o, Z3_ast a, Z3_string weight, Z3_symbol id)
Assert soft constraint to the optimization context.
Z3_ast Z3_API Z3_mk_bvudiv(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned division.
Z3_ast_vector Z3_API Z3_solver_get_trail(Z3_context c, Z3_solver s)
Return the trail modulo model conversion, in order of decision level The decision level can be retrie...
bool Z3_API Z3_rcf_le(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a <= b.
Z3_ast Z3_API Z3_mk_bvshl(Z3_context c, Z3_ast t1, Z3_ast t2)
Shift left.
Z3_func_decl Z3_API Z3_mk_tree_order(Z3_context c, Z3_sort a, unsigned id)
create a tree ordering relation over signature a identified using index id.
Z3_ast Z3_API Z3_mk_finite_set_filter(Z3_context c, Z3_ast f, Z3_ast set)
Filter a finite set using a predicate.
Z3_ast Z3_API Z3_mk_bvsrem(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed remainder (sign follows dividend).
Z3_ast Z3_API Z3_solver_congruence_next(Z3_context c, Z3_solver s, Z3_ast a)
retrieve the next expression in the congruence class. The set of congruent siblings form a cyclic lis...
Z3_func_decl Z3_API Z3_mk_func_decl(Z3_context c, Z3_symbol s, unsigned domain_size, Z3_sort const domain[], Z3_sort range)
Declare a constant or function.
unsigned Z3_API Z3_goal_num_exprs(Z3_context c, Z3_goal g)
Return the number of formulas, subformulas and terms in the given goal.
Z3_solver Z3_API Z3_mk_solver_for_logic(Z3_context c, Z3_symbol logic)
Create a new solver customized for the given logic. It behaves like Z3_mk_solver if the logic is unkn...
Z3_ast Z3_API Z3_mk_is_int(Z3_context c, Z3_ast t1)
Check if a real number is an integer.
unsigned Z3_API Z3_apply_result_get_num_subgoals(Z3_context c, Z3_apply_result r)
Return the number of subgoals in the Z3_apply_result object returned by Z3_tactic_apply.
bool Z3_API Z3_rcf_is_infinitesimal(Z3_context c, Z3_rcf_num a)
Return true if a represents an infinitesimal.
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_select(Z3_context c, Z3_ast a, Z3_ast i)
Array read. The argument a is the array and i is the index of the array that gets read.
Z3_ast Z3_API Z3_mk_sign_ext(Z3_context c, unsigned i, Z3_ast t1)
Sign-extend of the given bit-vector to the (signed) equivalent bit-vector of size m+i,...
Z3_ast Z3_API Z3_mk_re_intersect(Z3_context c, unsigned n, Z3_ast const args[])
Create the intersection of the regular languages.
Z3_ast Z3_API Z3_mk_finite_set_member(Z3_context c, Z3_ast elem, Z3_ast set)
Check if an element is a member of a finite set.
Z3_ast_vector Z3_API Z3_solver_cube(Z3_context c, Z3_solver s, Z3_ast_vector vars, unsigned backtrack_level)
extract a next cube for a solver. The last cube is the constant true or false. The number of (non-con...
Z3_ast Z3_API Z3_mk_u32string(Z3_context c, unsigned len, unsigned const chars[])
Create a string constant out of the string that is passed in It takes the length of the string as wel...
void Z3_API Z3_fixedpoint_add_fact(Z3_context c, Z3_fixedpoint d, Z3_func_decl r, unsigned num_args, unsigned args[])
Add a Database fact.
unsigned Z3_API Z3_goal_size(Z3_context c, Z3_goal g)
Return the number of formulas in the given goal.
Z3_func_decl Z3_API Z3_solver_propagate_declare(Z3_context c, Z3_symbol name, unsigned n, Z3_sort *domain, Z3_sort range)
void Z3_API Z3_stats_inc_ref(Z3_context c, Z3_stats s)
Increment the reference counter of the given statistics object.
Z3_ast Z3_API Z3_mk_select_n(Z3_context c, Z3_ast a, unsigned n, Z3_ast const *idxs)
n-ary Array read. The argument a is the array and idxs are the indices of the array that gets read.
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_pbge(Z3_context c, unsigned num_args, Z3_ast const args[], int const coeffs[], int k)
Pseudo-Boolean relations.
Z3_sort Z3_API Z3_mk_re_sort(Z3_context c, Z3_sort seq)
Create a regular expression sort out of a sequence sort.
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.
void Z3_API Z3_optimize_inc_ref(Z3_context c, Z3_optimize d)
Increment the reference counter of the given optimize context.
void Z3_API Z3_model_dec_ref(Z3_context c, Z3_model m)
Decrement the reference counter of the given model.
Z3_sort Z3_API Z3_mk_datatype_sort(Z3_context c, Z3_symbol name, unsigned num_params, Z3_sort const params[])
create a forward reference to a recursive datatype being declared. The forward reference can be used ...
Z3_ast Z3_API Z3_mk_fpa_inf(Z3_context c, Z3_sort s, bool negative)
Create a floating-point infinity of sort s.
void Z3_API Z3_func_interp_inc_ref(Z3_context c, Z3_func_interp f)
Increment the reference counter of the given Z3_func_interp object.
Z3_func_decl Z3_API Z3_mk_piecewise_linear_order(Z3_context c, Z3_sort a, unsigned id)
create a piecewise linear ordering relation over signature a and index id.
Z3_rcf_num Z3_API Z3_rcf_mk_infinitesimal(Z3_context c)
Return a new infinitesimal that is smaller than all elements in the Z3 field.
Z3_ast Z3_API Z3_mk_finite_set_union(Z3_context c, Z3_ast s1, Z3_ast s2)
Create the union of two finite sets.
Z3_solver Z3_API Z3_mk_solver(Z3_context c)
Create a new solver. This solver is a "combined solver" (see combined_solver module) that internally ...
Z3_model Z3_API Z3_solver_get_model(Z3_context c, Z3_solver s)
Retrieve the model for the last Z3_solver_check or Z3_solver_check_assumptions.
void Z3_API Z3_goal_inc_ref(Z3_context c, Z3_goal g)
Increment the reference counter of the given goal.
Z3_tactic Z3_API Z3_tactic_par_or(Z3_context c, unsigned num, Z3_tactic const ts[])
Return a tactic that applies the given tactics in parallel.
Z3_ast Z3_API Z3_mk_implies(Z3_context c, Z3_ast t1, Z3_ast t2)
Create an AST node representing t1 implies t2.
Z3_ast Z3_API Z3_mk_fpa_nan(Z3_context c, Z3_sort s)
Create a floating-point NaN of sort s.
unsigned Z3_API Z3_get_datatype_sort_num_constructors(Z3_context c, Z3_sort t)
Return number of constructors for datatype.
Z3_ast Z3_API Z3_optimize_get_upper(Z3_context c, Z3_optimize o, unsigned idx)
Retrieve upper bound value or approximation for the i'th optimization objective.
Z3_lbool Z3_API Z3_solver_check_assumptions(Z3_context c, Z3_solver s, unsigned num_assumptions, Z3_ast const assumptions[])
Check whether the assertions in the given solver and optional assumptions are consistent or not.
Z3_ast Z3_API Z3_mk_fpa_gt(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point greater than.
Z3_sort Z3_API Z3_model_get_sort(Z3_context c, Z3_model m, unsigned i)
Return a uninterpreted sort that m assigns an interpretation.
Z3_ast Z3_API Z3_mk_bvashr(Z3_context c, Z3_ast t1, Z3_ast t2)
Arithmetic shift right.
Z3_simplifier Z3_API Z3_simplifier_using_params(Z3_context c, Z3_simplifier t, Z3_params p)
Return a simplifier that applies t using the given set of parameters.
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...
void Z3_API Z3_solver_import_model_converter(Z3_context ctx, Z3_solver src, Z3_solver dst)
Ad-hoc method for importing model conversion from solver.
bool Z3_API Z3_rcf_ge(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a >= b.
Z3_ast Z3_API Z3_mk_set_del(Z3_context c, Z3_ast set, Z3_ast elem)
Remove an element to a set.
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.
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_param_descrs Z3_API Z3_simplifier_get_param_descrs(Z3_context c, Z3_simplifier t)
Return the parameter description set for the given simplifier object.
void Z3_API Z3_optimize_set_params(Z3_context c, Z3_optimize o, Z3_params p)
Set parameters on optimization context.
Z3_ast Z3_API Z3_mk_finite_set_intersect(Z3_context c, Z3_ast s1, Z3_ast s2)
Create the intersection of two finite sets.
Z3_ast Z3_API Z3_mk_bvor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise or.
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.
Z3_func_decl Z3_API Z3_get_datatype_sort_constructor(Z3_context c, Z3_sort t, unsigned idx)
Return idx'th constructor.
Z3_lbool
Lifted Boolean type: false, undefined, true.
Definition z3_api.h:58
Z3_ast Z3_API Z3_mk_seq_empty(Z3_context c, Z3_sort seq)
Create an empty sequence of the sequence sort seq.
Z3_probe Z3_API Z3_mk_probe(Z3_context c, Z3_string name)
Return a probe associated with the given name. The complete list of probes may be obtained using the ...
Z3_tactic Z3_API Z3_tactic_when(Z3_context c, Z3_probe p, Z3_tactic t)
Return a tactic that applies t to a given goal is the probe p evaluates to true. If p evaluates to fa...
Z3_ast Z3_API Z3_mk_seq_suffix(Z3_context c, Z3_ast suffix, Z3_ast s)
Check if suffix is a suffix of s.
void Z3_API Z3_solver_set_initial_value(Z3_context c, Z3_solver s, Z3_ast v, Z3_ast val)
provide an initialization hint to the solver. The initialization hint is used to calibrate an initial...
Z3_solver Z3_API Z3_solver_translate(Z3_context source, Z3_solver s, Z3_context target)
Copy a solver s from the context source to the context target.
void Z3_API Z3_optimize_push(Z3_context c, Z3_optimize d)
Create a backtracking point.
unsigned Z3_API Z3_stats_get_uint_value(Z3_context c, Z3_stats s, unsigned idx)
Return the unsigned value of the given statistical data.
void Z3_API Z3_probe_inc_ref(Z3_context c, Z3_probe p)
Increment the reference counter of the given probe.
Z3_ast Z3_API Z3_mk_fpa_eq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point equality.
void Z3_API Z3_solver_propagate_register_cb(Z3_context c, Z3_solver_callback cb, Z3_ast e)
register an expression to propagate on with the solver. Only expressions of type Bool and type Bit-Ve...
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...
void Z3_API Z3_add_const_interp(Z3_context c, Z3_model m, Z3_func_decl f, Z3_ast a)
Add a constant interpretation.
Z3_ast Z3_API Z3_mk_bvadd(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement addition.
void Z3_API Z3_fixedpoint_dec_ref(Z3_context c, Z3_fixedpoint d)
Decrement the reference counter of the given fixedpoint context.
Z3_ast Z3_API Z3_solver_congruence_root(Z3_context c, Z3_solver s, Z3_ast a)
retrieve the congruence closure root of an expression. The root is retrieved relative to the state wh...
Z3_string Z3_API Z3_model_to_string(Z3_context c, Z3_model m)
Convert the given model into a string.
Z3_string Z3_API Z3_tactic_get_help(Z3_context c, Z3_tactic t)
Return a string containing a description of parameters accepted by the given tactic.
void Z3_API Z3_solver_propagate_final(Z3_context c, Z3_solver s, Z3_final_eh final_eh)
register a callback on final check. This provides freedom to the propagator to delay actions or imple...
Z3_parameter_kind
The different kinds of parameters that can be associated with function symbols.
Definition z3_api.h:94
Z3_ast_vector Z3_API Z3_parse_smtlib2_string(Z3_context c, Z3_string str, unsigned num_sorts, Z3_symbol const sort_names[], Z3_sort const sorts[], unsigned num_decls, Z3_symbol const decl_names[], Z3_func_decl const decls[])
Parse the given string using the SMT-LIB2 parser.
Z3_ast Z3_API Z3_mk_fpa_geq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point greater than or equal.
void Z3_API Z3_solver_register_on_clause(Z3_context c, Z3_solver s, void *user_context, Z3_on_clause_eh on_clause_eh)
register a callback to that retrieves assumed, inferred and deleted clauses during search.
Z3_string Z3_API Z3_goal_to_dimacs_string(Z3_context c, Z3_goal g, bool include_names)
Convert a goal into a DIMACS formatted string. The goal must be in CNF. You can convert a goal to CNF...
Z3_ast Z3_API Z3_mk_lt(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than.
double Z3_API Z3_stats_get_double_value(Z3_context c, Z3_stats s, unsigned idx)
Return the double value of the given statistical data.
Z3_ast Z3_API Z3_mk_fpa_numeral_float(Z3_context c, float v, Z3_sort ty)
Create a numeral of FloatingPoint sort from a float.
Z3_ast Z3_API Z3_mk_bvugt(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than.
Z3_lbool Z3_API Z3_fixedpoint_query(Z3_context c, Z3_fixedpoint d, Z3_ast query)
Pose a query against the asserted rules.
unsigned Z3_API Z3_goal_depth(Z3_context c, Z3_goal g)
Return the depth of the given goal. It tracks how many transformations were applied to it.
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...
Z3_ast Z3_API Z3_mk_fpa_rtz(Z3_context c)
Create a numeral of RoundingMode sort which represents the TowardZero rounding mode.
Z3_simplifier Z3_API Z3_mk_simplifier(Z3_context c, Z3_string name)
Return a simplifier associated with the given name. The complete list of simplifiers may be obtained ...
Z3_ast Z3_API Z3_mk_bvnot(Z3_context c, Z3_ast t1)
Bitwise negation.
Z3_ast Z3_API Z3_mk_bvurem(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned remainder.
Z3_ast Z3_API Z3_mk_seq_foldli(Z3_context c, Z3_ast f, Z3_ast i, Z3_ast a, Z3_ast s)
Create a fold with index tracking of the function f over the sequence s with accumulator a starting a...
void Z3_API Z3_mk_datatypes(Z3_context c, unsigned num_sorts, Z3_symbol const sort_names[], Z3_sort sorts[], Z3_constructor_list constructor_lists[])
Create mutually recursive datatypes.
Z3_ast_vector Z3_API Z3_solver_get_non_units(Z3_context c, Z3_solver s)
Return the set of non units in the solver state.
Z3_ast Z3_API Z3_mk_seq_to_re(Z3_context c, Z3_ast seq)
Create a regular expression that accepts the sequence seq.
Z3_ast Z3_API Z3_mk_bvsub(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement subtraction.
Z3_ast_vector Z3_API Z3_optimize_get_objectives(Z3_context c, Z3_optimize o)
Return objectives on the optimization context. If the objective function is a max-sat objective it is...
Z3_ast Z3_API Z3_mk_seq_index(Z3_context c, Z3_ast s, Z3_ast substr, Z3_ast offset)
Return index of the first occurrence of substr in s starting from offset offset. If s does not contai...
Z3_ast Z3_API Z3_mk_power(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 ^ arg2.
Z3_ast Z3_API Z3_mk_seq_concat(Z3_context c, unsigned n, Z3_ast const args[])
Concatenate sequences.
Z3_sort Z3_API Z3_mk_enumeration_sort(Z3_context c, Z3_symbol name, unsigned n, Z3_symbol const enum_names[], Z3_func_decl enum_consts[], Z3_func_decl enum_testers[])
Create a enumeration sort.
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.
Z3_ast_vector Z3_API Z3_fixedpoint_get_rules(Z3_context c, Z3_fixedpoint f)
Retrieve set of rules from fixedpoint context.
Z3_ast Z3_API Z3_mk_set_member(Z3_context c, Z3_ast elem, Z3_ast set)
Check for set membership.
Z3_tactic Z3_API Z3_tactic_fail_if(Z3_context c, Z3_probe p)
Return a tactic that fails if the probe p evaluates to false.
void Z3_API Z3_goal_reset(Z3_context c, Z3_goal g)
Erase all formulas from the given goal.
void Z3_API Z3_func_interp_dec_ref(Z3_context c, Z3_func_interp f)
Decrement the reference counter of the given Z3_func_interp object.
void Z3_API Z3_probe_dec_ref(Z3_context c, Z3_probe p)
Decrement the reference counter of the given probe.
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]).
Z3_string Z3_API Z3_rcf_num_to_decimal_string(Z3_context c, Z3_rcf_num a, unsigned prec)
Convert the RCF numeral into a string in decimal notation.
Z3_ast Z3_API Z3_mk_seq_prefix(Z3_context c, Z3_ast prefix, Z3_ast s)
Check if prefix is a prefix of s.
Z3_rcf_num Z3_API Z3_rcf_power(Z3_context c, Z3_rcf_num a, unsigned k)
Return the value a^k.
Z3_ast Z3_API Z3_solver_congruence_explain(Z3_context c, Z3_solver s, Z3_ast a, Z3_ast b)
retrieve explanation for congruence.
Z3_sort Z3_API Z3_mk_bv_sort(Z3_context c, unsigned sz)
Create a bit-vector type of the given size.
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_bvult(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned less than.
Z3_probe Z3_API Z3_probe_or(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when p1 or p2 evaluates to true.
Z3_fixedpoint Z3_API Z3_mk_fixedpoint(Z3_context c)
Create a new fixedpoint context.
void Z3_API Z3_solver_propagate_init(Z3_context c, Z3_solver s, void *user_context, Z3_push_eh push_eh, Z3_pop_eh pop_eh, Z3_fresh_eh fresh_eh)
register a user-propagator with the solver.
Z3_func_decl Z3_API Z3_model_get_const_decl(Z3_context c, Z3_model m, unsigned i)
Return the i-th constant in the given model.
void Z3_API Z3_tactic_dec_ref(Z3_context c, Z3_tactic g)
Decrement the reference counter of the given tactic.
Z3_ast Z3_API Z3_mk_bvnand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nand.
Z3_solver Z3_API Z3_mk_simple_solver(Z3_context c)
Create a new incremental solver.
void Z3_API Z3_optimize_assert(Z3_context c, Z3_optimize o, Z3_ast a)
Assert hard constraint to the optimization context.
Z3_ast_vector Z3_API Z3_model_get_sort_universe(Z3_context c, Z3_model m, Z3_sort s)
Return the finite set of distinct values that represent the interpretation for sort s.
Z3_string Z3_API Z3_benchmark_to_smtlib_string(Z3_context c, Z3_string name, Z3_string logic, Z3_string status, Z3_string attributes, unsigned num_assumptions, Z3_ast const assumptions[], Z3_ast formula)
Convert the given benchmark into SMT-LIB formatted string.
Z3_ast Z3_API Z3_mk_re_star(Z3_context c, Z3_ast re)
Create the regular language re*.
Z3_ast Z3_API Z3_mk_bv_numeral(Z3_context c, unsigned sz, bool const *bits)
create a bit-vector numeral from a vector of Booleans.
void Z3_API Z3_func_entry_dec_ref(Z3_context c, Z3_func_entry e)
Decrement the reference counter of the given Z3_func_entry object.
unsigned Z3_API Z3_stats_size(Z3_context c, Z3_stats s)
Return the number of statistical data in s.
Z3_string Z3_API Z3_optimize_to_string(Z3_context c, Z3_optimize o)
Print the current context as a string.
Z3_ast Z3_API Z3_mk_re_full(Z3_context c, Z3_sort re)
Create an universal regular expression of sort re.
Z3_ast Z3_API Z3_mk_fpa_min(Z3_context c, Z3_ast t1, Z3_ast t2)
Minimum of floating-point numbers.
Z3_model Z3_API Z3_mk_model(Z3_context c)
Create a fresh model object. It has reference count 0.
Z3_ast Z3_API Z3_mk_seq_mapi(Z3_context c, Z3_ast f, Z3_ast i, Z3_ast s)
Create a map of the function f over the sequence s starting at index i.
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.
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,...
Z3_rcf_num Z3_API Z3_rcf_mk_small_int(Z3_context c, int val)
Return a RCF small integer.
Z3_string Z3_API Z3_stats_get_key(Z3_context c, Z3_stats s, unsigned idx)
Return the key (a string) for a particular statistical data.
Z3_ast Z3_API Z3_mk_re_diff(Z3_context c, Z3_ast re1, Z3_ast re2)
Create the difference of regular expressions.
unsigned Z3_API Z3_fixedpoint_get_num_levels(Z3_context c, Z3_fixedpoint d, Z3_func_decl pred)
Query the PDR engine for the maximal levels properties are known about predicate.
Z3_ast Z3_API Z3_mk_int64(Z3_context c, int64_t v, Z3_sort ty)
Create a numeral of a int, bit-vector, or finite-domain sort.
Z3_ast Z3_API Z3_mk_re_empty(Z3_context c, Z3_sort re)
Create an empty regular expression of sort re.
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_bvand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise and.
bool Z3_API Z3_goal_is_decided_unsat(Z3_context c, Z3_goal g)
Return true if the goal contains false, and it is precise or the product of an over approximation.
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].
Z3_ast_kind Z3_API Z3_get_ast_kind(Z3_context c, Z3_ast a)
Return the kind of the given AST.
Z3_ast_vector Z3_API Z3_parse_smtlib2_file(Z3_context c, Z3_string file_name, unsigned num_sorts, Z3_symbol const sort_names[], Z3_sort const sorts[], unsigned num_decls, Z3_symbol const decl_names[], Z3_func_decl const decls[])
Similar to Z3_parse_smtlib2_string, but reads the benchmark from a file.
Z3_ast Z3_API Z3_mk_bvsmod(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed remainder (sign follows divisor).
Z3_tactic Z3_API Z3_tactic_cond(Z3_context c, Z3_probe p, Z3_tactic t1, Z3_tactic t2)
Return a tactic that applies t1 to a given goal if the probe p evaluates to true, and t2 if p evaluat...
Z3_model Z3_API Z3_model_translate(Z3_context c, Z3_model m, Z3_context dst)
translate model from context c to context dst.
Z3_string Z3_API Z3_fixedpoint_to_string(Z3_context c, Z3_fixedpoint f, unsigned num_queries, Z3_ast queries[])
Print the current rules and background axioms as a string.
void Z3_API Z3_solver_get_levels(Z3_context c, Z3_solver s, Z3_ast_vector literals, unsigned sz, unsigned levels[])
retrieve the decision depth of Boolean literals (variables or their negations). Assumes a check-sat c...
Z3_ast Z3_API Z3_fixedpoint_get_cover_delta(Z3_context c, Z3_fixedpoint d, int level, Z3_func_decl pred)
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.
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.
void Z3_API Z3_solver_assert(Z3_context c, Z3_solver s, Z3_ast a)
Assert a constraint into the solver.
Z3_tactic Z3_API Z3_mk_tactic(Z3_context c, Z3_string name)
Return a tactic associated with the given name. The complete list of tactics may be obtained using th...
Z3_ast Z3_API Z3_mk_fpa_abs(Z3_context c, Z3_ast t)
Floating-point absolute value.
Z3_optimize Z3_API Z3_mk_optimize(Z3_context c)
Create a new optimize context.
bool Z3_API Z3_model_eval(Z3_context c, Z3_model m, Z3_ast t, bool model_completion, Z3_ast *v)
Evaluate the AST node t in the given model. Return true if succeeded, and store the result in v.
void Z3_API Z3_del_constructor_list(Z3_context c, Z3_constructor_list clist)
Reclaim memory allocated for constructor list.
Z3_ast Z3_API Z3_mk_bound(Z3_context c, unsigned index, Z3_sort ty)
Create a variable.
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.
Z3_ast Z3_API Z3_func_entry_get_arg(Z3_context c, Z3_func_entry e, unsigned i)
Return an argument of a Z3_func_entry object.
Z3_ast Z3_API Z3_mk_eq(Z3_context c, Z3_ast l, Z3_ast r)
Create an AST node representing l = r.
Z3_ast Z3_API Z3_mk_atleast(Z3_context c, unsigned num_args, Z3_ast const args[], unsigned k)
Pseudo-Boolean relations.
unsigned Z3_API Z3_model_get_num_funcs(Z3_context c, Z3_model m)
Return the number of function interpretations in the given model.
Z3_ast_vector Z3_API Z3_solver_get_unsat_core(Z3_context c, Z3_solver s)
Retrieve the unsat core for the last Z3_solver_check_assumptions The unsat core is a subset of the as...
void Z3_API Z3_optimize_dec_ref(Z3_context c, Z3_optimize d)
Decrement the reference counter of the given optimize context.
Z3_string Z3_API Z3_rcf_num_to_string(Z3_context c, Z3_rcf_num a, bool compact, bool html)
Convert the RCF numeral into a string.
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.
Z3_func_decl Z3_API Z3_mk_partial_order(Z3_context c, Z3_sort a, unsigned id)
create a partial ordering relation over signature a and index id.
Z3_ast Z3_API Z3_mk_empty_set(Z3_context c, Z3_sort domain)
Create the empty set.
bool Z3_API Z3_rcf_neq(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a != b.
void Z3_API Z3_solver_solve_for(Z3_context c, Z3_solver s, Z3_ast_vector variables, Z3_ast_vector terms, Z3_ast_vector guards)
retrieve a 'solution' for variables as defined by equalities in maintained by solvers....
Z3_ast Z3_API Z3_mk_fpa_neg(Z3_context c, Z3_ast t)
Floating-point negation.
void Z3_API Z3_rcf_del(Z3_context c, Z3_rcf_num a)
Delete a RCF numeral created using the RCF API.
Z3_ast Z3_API Z3_mk_re_plus(Z3_context c, Z3_ast re)
Create the regular language re+.
Z3_goal_prec Z3_API Z3_goal_precision(Z3_context c, Z3_goal g)
Return the "precision" of the given goal. Goals can be transformed using over and under approximation...
void Z3_API Z3_solver_pop(Z3_context c, Z3_solver s, unsigned n)
Backtrack n backtracking points.
Z3_ast Z3_API Z3_mk_int2real(Z3_context c, Z3_ast t1)
Coerce an integer to a real.
Z3_goal Z3_API Z3_mk_goal(Z3_context c, bool models, bool unsat_cores, bool proofs)
Create a goal (aka problem). A goal is essentially a set of formulas, that can be solved and/or trans...
double Z3_API Z3_get_decl_double_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the double value associated with an double parameter.
Z3_ast Z3_API Z3_mk_fpa_lt(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point less than.
Z3_ast Z3_API Z3_mk_unsigned_int64(Z3_context c, uint64_t v, Z3_sort ty)
Create a numeral of a int, bit-vector, or finite-domain sort.
Z3_rcf_num Z3_API Z3_rcf_mk_pi(Z3_context c)
Return Pi.
Z3_string Z3_API Z3_optimize_get_help(Z3_context c, Z3_optimize t)
Return a string containing a description of parameters accepted by optimize.
Z3_func_decl Z3_API Z3_get_datatype_sort_recognizer(Z3_context c, Z3_sort t, unsigned idx)
Return idx'th recognizer.
Z3_ast Z3_API Z3_mk_gt(Z3_context c, Z3_ast t1, Z3_ast t2)
Create greater than.
Z3_stats Z3_API Z3_optimize_get_statistics(Z3_context c, Z3_optimize d)
Retrieve statistics information from the last call to Z3_optimize_check.
Z3_ast Z3_API Z3_mk_store(Z3_context c, Z3_ast a, Z3_ast i, Z3_ast v)
Array update.
Z3_probe Z3_API Z3_probe_gt(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when the value returned by p1 is greater than the value retur...
Z3_ast Z3_API Z3_solver_get_proof(Z3_context c, Z3_solver s)
Retrieve the proof for the last Z3_solver_check or Z3_solver_check_assumptions.
Z3_string Z3_API Z3_get_decl_rational_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the rational value, as a string, associated with a rational parameter.
unsigned Z3_API Z3_optimize_minimize(Z3_context c, Z3_optimize o, Z3_ast t)
Add a minimization constraint.
Z3_stats Z3_API Z3_fixedpoint_get_statistics(Z3_context c, Z3_fixedpoint d)
Retrieve statistics information from the last call to Z3_fixedpoint_query.
bool Z3_API Z3_model_has_interp(Z3_context c, Z3_model m, Z3_func_decl a)
Test if there exists an interpretation (i.e., assignment) for a in the model m.
void Z3_API Z3_tactic_inc_ref(Z3_context c, Z3_tactic t)
Increment the reference counter of the given tactic.
Z3_ast Z3_API Z3_mk_real_int64(Z3_context c, int64_t num, int64_t den)
Create a real from a fraction of int64.
void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name)
load solver assertions from a file.
Z3_ast Z3_API Z3_mk_seq_last_index(Z3_context c, Z3_ast s, Z3_ast substr)
Return index of the last occurrence of substr in s. If s does not contain substr, then the value is -...
Z3_ast Z3_API Z3_mk_xor(Z3_context c, Z3_ast t1, Z3_ast t2)
Create an AST node representing t1 xor t2.
void Z3_API Z3_solver_propagate_eq(Z3_context c, Z3_solver s, Z3_eq_eh eq_eh)
register a callback on expression equalities.
Z3_ast Z3_API Z3_mk_string(Z3_context c, Z3_string s)
Create a string constant out of the string that is passed in The string may contain escape encoding f...
Z3_tactic Z3_API Z3_tactic_try_for(Z3_context c, Z3_tactic t, unsigned ms)
Return a tactic that applies t to a given goal for ms milliseconds. If t does not terminate in ms mil...
void Z3_API Z3_apply_result_dec_ref(Z3_context c, Z3_apply_result r)
Decrement the reference counter of the given Z3_apply_result object.
Z3_ast Z3_API Z3_mk_finite_set_singleton(Z3_context c, Z3_ast elem)
Create a singleton finite set.
Z3_sort Z3_API Z3_mk_seq_sort(Z3_context c, Z3_sort s)
Create a sequence sort out of the sort for the elements.
unsigned Z3_API Z3_optimize_maximize(Z3_context c, Z3_optimize o, Z3_ast t)
Add a maximization constraint.
Z3_ast_vector Z3_API Z3_solver_get_units(Z3_context c, Z3_solver s)
Return the set of units modulo model conversion.
Z3_ast Z3_API Z3_mk_const(Z3_context c, Z3_symbol s, Z3_sort ty)
Declare and create a constant.
Z3_symbol Z3_API Z3_mk_string_symbol(Z3_context c, Z3_string s)
Create a Z3 symbol using a C string.
Z3_goal Z3_API Z3_apply_result_get_subgoal(Z3_context c, Z3_apply_result r, unsigned i)
Return one of the subgoals in the Z3_apply_result object returned by Z3_tactic_apply.
Z3_probe Z3_API Z3_probe_le(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when the value returned by p1 is less than or equal to the va...
void Z3_API Z3_stats_dec_ref(Z3_context c, Z3_stats s)
Decrement the reference counter of the given statistics object.
Z3_rcf_num Z3_API Z3_rcf_neg(Z3_context c, Z3_rcf_num a)
Return the value -a.
Z3_ast Z3_API Z3_mk_array_ext(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create array extensionality index given two arrays with the same sort. The meaning is given by the ax...
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_func_entry Z3_API Z3_func_interp_get_entry(Z3_context c, Z3_func_interp f, unsigned i)
Return a "point" of the given function interpretation. It represents the value of f in a particular p...
Z3_func_decl Z3_API Z3_mk_rec_func_decl(Z3_context c, Z3_symbol s, unsigned domain_size, Z3_sort const domain[], Z3_sort range)
Declare a recursive function.
Z3_ast Z3_API Z3_mk_concat(Z3_context c, Z3_ast t1, Z3_ast t2)
Concatenate the given bit-vectors.
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.
Z3_sort Z3_API Z3_get_decl_sort_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the sort value associated with a sort parameter.
Z3_constructor_list Z3_API Z3_mk_constructor_list(Z3_context c, unsigned num_constructors, Z3_constructor const constructors[])
Create list of constructors.
Z3_apply_result Z3_API Z3_tactic_apply(Z3_context c, Z3_tactic t, Z3_goal g)
Apply tactic t to the goal g.
Z3_ast Z3_API Z3_mk_fpa_leq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point less than or equal.
Z3_ast Z3_API Z3_mk_finite_set_map(Z3_context c, Z3_ast f, Z3_ast set)
Apply a function to all elements of a finite set.
void Z3_API Z3_solver_propagate_created(Z3_context c, Z3_solver s, Z3_created_eh created_eh)
register a callback when a new expression with a registered function is used by the solver The regist...
bool Z3_API Z3_rcf_is_algebraic(Z3_context c, Z3_rcf_num a)
Return true if a represents an algebraic number.
Z3_ast Z3_API Z3_mk_fpa_numeral_double(Z3_context c, double v, Z3_sort ty)
Create a numeral of FloatingPoint sort from a double.
Z3_ast Z3_API Z3_mk_fpa_mul(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point multiplication.
Z3_ast Z3_API Z3_mk_app(Z3_context c, Z3_func_decl d, unsigned num_args, Z3_ast const args[])
Create a constant or function application.
Z3_stats Z3_API Z3_solver_get_statistics(Z3_context c, Z3_solver s)
Return statistics for the given solver.
Z3_ast Z3_API Z3_mk_bvneg(Z3_context c, Z3_ast t1)
Standard two's complement unary minus.
Z3_ast Z3_API Z3_mk_store_n(Z3_context c, Z3_ast a, unsigned n, Z3_ast const *idxs, Z3_ast v)
n-ary Array update.
Z3_string Z3_API Z3_fixedpoint_get_reason_unknown(Z3_context c, Z3_fixedpoint d)
Retrieve a string that describes the last status returned by Z3_fixedpoint_query.
Z3_func_decl Z3_API Z3_mk_linear_order(Z3_context c, Z3_sort a, unsigned id)
create a linear ordering relation over signature a. The relation is identified by the index id.
Z3_string Z3_API Z3_fixedpoint_get_help(Z3_context c, Z3_fixedpoint f)
Return a string describing all fixedpoint available parameters.
Z3_ast Z3_API Z3_mk_seq_in_re(Z3_context c, Z3_ast seq, Z3_ast re)
Check if seq is in the language generated by the regular expression re.
Z3_sort Z3_API Z3_mk_bool_sort(Z3_context c)
Create the Boolean type.
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].
Z3_sort Z3_API Z3_mk_finite_set_sort(Z3_context c, Z3_sort elem_sort)
Create a finite set sort.
Z3_string Z3_API Z3_solver_to_dimacs_string(Z3_context c, Z3_solver s, bool include_names)
Convert a solver into a DIMACS formatted string.
Z3_ast Z3_API Z3_mk_finite_set_size(Z3_context c, Z3_ast set)
Get the size (cardinality) of a finite set.
Z3_ast Z3_API Z3_mk_set_difference(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Take the set difference between two sets.
void Z3_API Z3_solver_propagate_decide(Z3_context c, Z3_solver s, Z3_decide_eh decide_eh)
register a callback when the solver decides to split on a registered expression. The callback may cha...
Z3_ast Z3_API Z3_mk_lstring(Z3_context c, unsigned len, Z3_string s)
Create a string constant out of the string that is passed in It takes the length of the string as wel...
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_bvlshr(Z3_context c, Z3_ast t1, Z3_ast t2)
Logical shift right.
Z3_ast Z3_API Z3_get_decl_ast_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the expression value associated with an expression parameter.
Z3_ast Z3_API Z3_mk_finite_set_range(Z3_context c, Z3_ast low, Z3_ast high)
Create a finite set of integers in the range [low, high].
double Z3_API Z3_probe_apply(Z3_context c, Z3_probe p, Z3_goal g)
Execute the probe over the goal. The probe always produce a double value. "Boolean" probes return 0....
bool Z3_API Z3_rcf_is_transcendental(Z3_context c, Z3_rcf_num a)
Return true if a represents a transcendental number.
void Z3_API Z3_func_interp_set_else(Z3_context c, Z3_func_interp f, Z3_ast else_value)
Return the 'else' value of the given function interpretation.
void Z3_API Z3_goal_dec_ref(Z3_context c, Z3_goal g)
Decrement the reference counter of the given goal.
Z3_ast Z3_API Z3_mk_not(Z3_context c, Z3_ast a)
Create an AST node representing not(a).
void Z3_API Z3_solver_propagate_register(Z3_context c, Z3_solver s, Z3_ast e)
register an expression to propagate on with the solver. Only expressions of type Bool and type Bit-Ve...
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,...
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].
Z3_sort Z3_API Z3_mk_array_sort(Z3_context c, Z3_sort domain, Z3_sort range)
Create an array type.
Z3_tactic Z3_API Z3_tactic_or_else(Z3_context c, Z3_tactic t1, Z3_tactic t2)
Return a tactic that first applies t1 to a given goal, if it fails then returns the result of t2 appl...
void Z3_API Z3_model_inc_ref(Z3_context c, Z3_model m)
Increment the reference counter of the given model.
Z3_ast Z3_API Z3_mk_fpa_div(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point division.
Z3_sort Z3_API Z3_mk_fpa_sort(Z3_context c, unsigned ebits, unsigned sbits)
Create a FloatingPoint sort.
Z3_ast Z3_API Z3_mk_fpa_sqrt(Z3_context c, Z3_ast rm, Z3_ast t)
Floating-point square root.
bool Z3_API Z3_goal_is_decided_sat(Z3_context c, Z3_goal g)
Return true if the goal is empty, and it is precise or the product of a under approximation.
void Z3_API Z3_fixedpoint_set_params(Z3_context c, Z3_fixedpoint f, Z3_params p)
Set parameters on fixedpoint context.
void Z3_API Z3_optimize_from_string(Z3_context c, Z3_optimize o, Z3_string s)
Parse an SMT-LIB2 string with assertions, soft constraints and optimization objectives....
Z3_solver Z3_API Z3_solver_add_simplifier(Z3_context c, Z3_solver solver, Z3_simplifier simplifier)
Attach simplifier to a solver. The solver will use the simplifier for incremental pre-processing.
Z3_ast Z3_API Z3_mk_rem(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 rem arg2.
Z3_ast Z3_API Z3_fixedpoint_get_answer(Z3_context c, Z3_fixedpoint d)
Retrieve a formula that encodes satisfying answers to the query.
bool Z3_API Z3_rcf_is_rational(Z3_context c, Z3_rcf_num a)
Return true if a represents a rational number.
void Z3_API Z3_solver_propagate_fixed(Z3_context c, Z3_solver s, Z3_fixed_eh fixed_eh)
register a callback for when an expression is bound to a fixed value. The supported expression types ...
Z3_ast Z3_API Z3_mk_seq_map(Z3_context c, Z3_ast f, Z3_ast s)
Create a map of the function f over the sequence s.
void Z3_API Z3_fixedpoint_register_relation(Z3_context c, Z3_fixedpoint d, Z3_func_decl f)
Register relation as Fixedpoint defined. Fixedpoint defined relations have least-fixedpoint semantics...
void Z3_API Z3_fixedpoint_add_cover(Z3_context c, Z3_fixedpoint d, int level, Z3_func_decl pred, Z3_ast property)
Add property about the predicate pred. Add a property of predicate pred at level. It gets pushed forw...
void Z3_API Z3_func_interp_add_entry(Z3_context c, Z3_func_interp fi, Z3_ast_vector args, Z3_ast value)
add a function entry to a function interpretation.
Z3_ast Z3_API Z3_mk_bvuge(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than or equal to.
Z3_lbool Z3_API Z3_fixedpoint_query_relations(Z3_context c, Z3_fixedpoint d, unsigned num_relations, Z3_func_decl const relations[])
Pose multiple queries against the asserted rules.
Z3_ast Z3_API Z3_mk_as_array(Z3_context c, Z3_func_decl f)
Create array with the same interpretation as a function. The array satisfies the property (f x) = (se...
Z3_string Z3_API Z3_apply_result_to_string(Z3_context c, Z3_apply_result r)
Convert the Z3_apply_result object returned by Z3_tactic_apply into a string.
Z3_string Z3_API Z3_solver_to_string(Z3_context c, Z3_solver s)
Convert a solver into a string.
Z3_ast Z3_API Z3_mk_seq_foldl(Z3_context c, Z3_ast f, Z3_ast a, Z3_ast s)
Create a fold of the function f over the sequence s with accumulator a.
Z3_string Z3_API Z3_solver_get_reason_unknown(Z3_context c, Z3_solver s)
Return a brief justification for an "unknown" result (i.e., Z3_L_UNDEF) for the commands Z3_solver_ch...
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.
Z3_rcf_num Z3_API Z3_rcf_mk_e(Z3_context c)
Return e (Euler's constant)
Z3_tactic Z3_API Z3_tactic_repeat(Z3_context c, Z3_tactic t, unsigned max)
Return a tactic that keeps applying t until the goal is not modified anymore or the maximum number of...
Z3_ast Z3_API Z3_goal_formula(Z3_context c, Z3_goal g, unsigned idx)
Return a formula from the given goal.
Z3_lbool Z3_API Z3_optimize_check(Z3_context c, Z3_optimize o, unsigned num_assumptions, Z3_ast const assumptions[])
Check consistency and produce optimal values.
Z3_symbol Z3_API Z3_mk_int_symbol(Z3_context c, int i)
Create a Z3 symbol using an integer.
unsigned Z3_API Z3_func_interp_get_num_entries(Z3_context c, Z3_func_interp f)
Return the number of entries in the given function interpretation.
Z3_probe Z3_API Z3_probe_const(Z3_context x, double val)
Return a probe that always evaluates to val.
Z3_constructor Z3_API Z3_mk_constructor(Z3_context c, Z3_symbol name, Z3_symbol recognizer, unsigned num_fields, Z3_symbol const field_names[], Z3_sort const sorts[], unsigned sort_refs[])
Create a constructor.
Z3_sort Z3_API Z3_mk_fpa_rounding_mode_sort(Z3_context c)
Create the RoundingMode sort.
Z3_string Z3_API Z3_goal_to_string(Z3_context c, Z3_goal g)
Convert a goal into a string.
Z3_ast Z3_API Z3_mk_fpa_rne(Z3_context c)
Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
Z3_ast Z3_API Z3_mk_atmost(Z3_context c, unsigned num_args, Z3_ast const args[], unsigned k)
Pseudo-Boolean relations.
Z3_tactic Z3_API Z3_tactic_and_then(Z3_context c, Z3_tactic t1, Z3_tactic t2)
Return a tactic that applies t1 to a given goal and t2 to every subgoal produced by t1.
Z3_optimize Z3_API Z3_optimize_translate(Z3_context c, Z3_optimize o, Z3_context target)
Copy an optimization context from a source to a target context.
Z3_func_interp Z3_API Z3_model_get_func_interp(Z3_context c, Z3_model m, Z3_func_decl f)
Return the interpretation of the function f in the model m. Return NULL, if the model does not assign...
void Z3_API Z3_solver_inc_ref(Z3_context c, Z3_solver s)
Increment the reference counter of the given solver.
bool Z3_API Z3_solver_next_split(Z3_context c, Z3_solver_callback cb, Z3_ast t, unsigned idx, Z3_lbool phase)
Z3_probe Z3_API Z3_probe_and(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when p1 and p2 evaluates to true.
bool Z3_API Z3_is_re_sort(Z3_context c, Z3_sort s)
Check if s is a regular expression sort.
Z3_sort Z3_API Z3_mk_string_sort(Z3_context c)
Create a sort for unicode strings.
Z3_rcf_num Z3_API Z3_rcf_mul(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return the value a * b.
Z3_func_decl Z3_API Z3_get_datatype_sort_constructor_accessor(Z3_context c, Z3_sort t, unsigned idx_c, unsigned idx_a)
Return idx_a'th accessor for the idx_c'th constructor.
Z3_ast Z3_API Z3_mk_bvredor(Z3_context c, Z3_ast t1)
Take disjunction of bits in vector, return vector of length 1.
void Z3_API Z3_solver_reset(Z3_context c, Z3_solver s)
Remove all assertions from the solver.
@ Z3_APP_AST
Definition z3_api.h:144
@ Z3_VAR_AST
Definition z3_api.h:145
@ Z3_SORT_AST
Definition z3_api.h:147
@ Z3_NUMERAL_AST
Definition z3_api.h:143
@ Z3_FUNC_DECL_AST
Definition z3_api.h:148
@ Z3_QUANTIFIER_AST
Definition z3_api.h:146
System.IntPtr Z3_model
System.IntPtr Z3_app
System.IntPtr Z3_context
Definition Context.cs:29
System.IntPtr Z3_ast_vector
System.IntPtr Z3_func_interp
System.IntPtr Z3_func_decl
System.IntPtr Z3_stats
System.IntPtr Z3_ast
System.IntPtr Z3_func_entry
System.IntPtr Z3_solver
System.IntPtr Z3_solver_callback
System.IntPtr Z3_sort
System.IntPtr Z3_symbol
expr set_intersect(expr const &a, expr const &b)
Definition z3++.h:4288
expr re_intersect(expr_vector const &args)
Definition z3++.h:4418
expr store(expr const &a, expr const &i, expr const &v)
Definition z3++.h:4210
expr pw(expr const &a, expr const &b)
Definition z3++.h:1768
expr sbv_to_fpa(expr const &t, sort s)
Definition z3++.h:2192
expr bvneg_no_overflow(expr const &a)
Definition z3++.h:2393
expr finite_set_difference(expr const &a, expr const &b)
Definition z3++.h:4332
expr indexof(expr const &s, expr const &substr, expr const &offset)
Definition z3++.h:4381
tactic par_or(unsigned n, tactic const *tactics)
Definition z3++.h:3367
tactic par_and_then(tactic const &t1, tactic const &t2)
Definition z3++.h:3376
expr srem(expr const &a, expr const &b)
signed remainder operator for bitvectors
Definition z3++.h:2325
expr bvadd_no_underflow(expr const &a, expr const &b)
Definition z3++.h:2381
expr prefixof(expr const &a, expr const &b)
Definition z3++.h:4375
expr sum(expr_vector const &args)
Definition z3++.h:2590
expr ugt(expr const &a, expr const &b)
unsigned greater than operator for bitvectors.
Definition z3++.h:2304
expr operator/(expr const &a, expr const &b)
Definition z3++.h:1934
expr exists(expr const &x, expr const &b)
Definition z3++.h:2501
expr fp_eq(expr const &a, expr const &b)
Definition z3++.h:2153
func_decl tree_order(sort const &a, unsigned index)
Definition z3++.h:2418
expr concat(expr const &a, expr const &b)
Definition z3++.h:2608
expr bvmul_no_underflow(expr const &a, expr const &b)
Definition z3++.h:2399
expr lambda(expr const &x, expr const &b)
Definition z3++.h:2525
ast_vector_tpl< func_decl > func_decl_vector
Definition z3++.h:79
expr fpa_to_fpa(expr const &t, sort s)
Definition z3++.h:2206
expr operator&&(expr const &a, expr const &b)
Definition z3++.h:1812
std::function< void(expr const &proof, std::vector< unsigned > const &deps, expr_vector const &clause)> on_clause_eh_t
Definition z3++.h:4585
expr operator!=(expr const &a, expr const &b)
Definition z3++.h:1848
expr operator+(expr const &a, expr const &b)
Definition z3++.h:1860
expr set_complement(expr const &a)
Definition z3++.h:4300
check_result
Definition z3++.h:166
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition z3++.h:4180
expr const_array(sort const &d, expr const &v)
Definition z3++.h:4260
expr min(expr const &a, expr const &b)
Definition z3++.h:2082
expr set_difference(expr const &a, expr const &b)
Definition z3++.h:4296
expr forall(expr const &x, expr const &b)
Definition z3++.h:2477
expr array_default(expr const &a)
Definition z3++.h:4236
expr array_ext(expr const &a, expr const &b)
Definition z3++.h:4242
expr operator>(expr const &a, expr const &b)
Definition z3++.h:2045
sort to_sort(context &c, Z3_sort s)
Definition z3++.h:2247
expr finite_set_map(expr const &f, expr const &s)
Definition z3++.h:4348
expr to_expr(context &c, Z3_ast a)
Wraps a Z3_ast as an expr object. It also checks for errors. This function allows the user to use the...
Definition z3++.h:2238
expr bv2int(expr const &a, bool is_signed)
bit-vector and integer conversions.
Definition z3++.h:2372
expr operator%(expr const &a, expr const &b)
Definition z3++.h:1783
expr operator~(expr const &a)
Definition z3++.h:2160
expr sle(expr const &a, expr const &b)
signed less than or equal to operator for bitvectors.
Definition z3++.h:2260
expr nor(expr const &a, expr const &b)
Definition z3++.h:2080
expr fpa_fp(expr const &sgn, expr const &exp, expr const &sig)
Definition z3++.h:2170
expr bvsub_no_underflow(expr const &a, expr const &b, bool is_signed)
Definition z3++.h:2387
expr finite_set_singleton(expr const &e)
Definition z3++.h:4320
expr mk_xor(expr_vector const &args)
Definition z3++.h:2692
expr lshr(expr const &a, expr const &b)
logic shift right operator for bitvectors
Definition z3++.h:2353
expr operator*(expr const &a, expr const &b)
Definition z3++.h:1890
expr nand(expr const &a, expr const &b)
Definition z3++.h:2079
expr fpa_to_ubv(expr const &t, unsigned sz)
Definition z3++.h:2185
expr bvredor(expr const &a)
Definition z3++.h:2114
ast_vector_tpl< sort > sort_vector
Definition z3++.h:78
expr finite_set_subset(expr const &a, expr const &b)
Definition z3++.h:4344
func_decl piecewise_linear_order(sort const &a, unsigned index)
Definition z3++.h:2415
expr slt(expr const &a, expr const &b)
signed less than operator for bitvectors.
Definition z3++.h:2266
tactic when(probe const &p, tactic const &t)
Definition z3++.h:3686
expr last_indexof(expr const &s, expr const &substr)
Definition z3++.h:4387
expr int2bv(unsigned n, expr const &a)
Definition z3++.h:2373
expr max(expr const &a, expr const &b)
Definition z3++.h:2098
expr xnor(expr const &a, expr const &b)
Definition z3++.h:2081
expr udiv(expr const &a, expr const &b)
unsigned division operator for bitvectors.
Definition z3++.h:2318
expr abs(expr const &a)
Definition z3++.h:2126
expr pbge(expr_vector const &es, int const *coeffs, int bound)
Definition z3++.h:2558
expr round_fpa_to_closest_integer(expr const &t)
Definition z3++.h:2213
expr distinct(expr_vector const &args)
Definition z3++.h:2599
expr ashr(expr const &a, expr const &b)
arithmetic shift right operator for bitvectors
Definition z3++.h:2360
expr bvmul_no_overflow(expr const &a, expr const &b, bool is_signed)
Definition z3++.h:2396
expr bvsub_no_overflow(expr const &a, expr const &b)
Definition z3++.h:2384
expr star(expr const &re)
Definition z3++.h:4405
expr urem(expr const &a, expr const &b)
unsigned reminder operator for bitvectors
Definition z3++.h:2339
tactic repeat(tactic const &t, unsigned max=UINT_MAX)
Definition z3++.h:3351
expr mod(expr const &a, expr const &b)
Definition z3++.h:1772
expr fma(expr const &a, expr const &b, expr const &c, expr const &rm)
Definition z3++.h:2162
check_result to_check_result(Z3_lbool l)
Definition z3++.h:178
expr mk_or(expr_vector const &args)
Definition z3++.h:2680
expr to_re(expr const &s)
Definition z3++.h:4393
void check_context(object const &a, object const &b)
Definition z3++.h:548
expr_vector polynomial_subresultants(expr const &p, expr const &q, expr const &x)
Return the nonzero subresultants of p and q with respect to the "variable" x.
Definition z3++.h:2428
std::ostream & operator<<(std::ostream &out, exception const &e)
Definition z3++.h:128
expr ule(expr const &a, expr const &b)
unsigned less than or equal to operator for bitvectors.
Definition z3++.h:2286
func_decl to_func_decl(context &c, Z3_func_decl f)
Definition z3++.h:2252
tactic with(tactic const &t, params const &p)
Definition z3++.h:3357
expr ite(expr const &c, expr const &t, expr const &e)
Create the if-then-else expression ite(c, t, e)
Definition z3++.h:2225
expr finite_set_filter(expr const &f, expr const &s)
Definition z3++.h:4352
expr ult(expr const &a, expr const &b)
unsigned less than operator for bitvectors.
Definition z3++.h:2292
expr finite_set_union(expr const &a, expr const &b)
Definition z3++.h:4324
expr pbeq(expr_vector const &es, int const *coeffs, int bound)
Definition z3++.h:2566
expr operator^(expr const &a, expr const &b)
Definition z3++.h:2071
expr operator<=(expr const &a, expr const &b)
Definition z3++.h:1998
expr set_union(expr const &a, expr const &b)
Definition z3++.h:4280
expr operator>=(expr const &a, expr const &b)
Definition z3++.h:1914
func_decl linear_order(sort const &a, unsigned index)
Definition z3++.h:2409
expr sqrt(expr const &a, expr const &rm)
Definition z3++.h:2146
expr pble(expr_vector const &es, int const *coeffs, int bound)
Definition z3++.h:2550
expr operator==(expr const &a, expr const &b)
Definition z3++.h:1837
expr foldli(expr const &f, expr const &i, expr const &a, expr const &list)
Definition z3++.h:2673
expr full_set(sort const &s)
Definition z3++.h:4268
std::vector< rcf_num > rcf_roots(context &c, std::vector< rcf_num > const &coeffs)
Find roots of a polynomial with given coefficients.
Definition z3++.h:5106
expr smod(expr const &a, expr const &b)
signed modulus operator for bitvectors
Definition z3++.h:2332
expr implies(expr const &a, expr const &b)
Definition z3++.h:1760
expr finite_set_range(expr const &low, expr const &high)
Definition z3++.h:4356
expr empty_set(sort const &s)
Definition z3++.h:4264
expr in_re(expr const &s, expr const &re)
Definition z3++.h:4396
expr finite_set_member(expr const &e, expr const &s)
Definition z3++.h:4336
expr bvadd_no_overflow(expr const &a, expr const &b, bool is_signed)
bit-vector overflow/underflow checks
Definition z3++.h:2378
expr suffixof(expr const &a, expr const &b)
Definition z3++.h:4369
expr re_diff(expr const &a, expr const &b)
Definition z3++.h:4426
expr set_add(expr const &s, expr const &e)
Definition z3++.h:4272
rcf_num rcf_e(context &c)
Create an RCF numeral representing e (Euler's constant).
Definition z3++.h:5089
expr plus(expr const &re)
Definition z3++.h:4399
expr set_subset(expr const &a, expr const &b)
Definition z3++.h:4308
expr select(expr const &a, expr const &i)
forward declarations
Definition z3++.h:4193
expr bvredand(expr const &a)
Definition z3++.h:2120
expr operator&(expr const &a, expr const &b)
Definition z3++.h:2067
expr operator-(expr const &a)
Definition z3++.h:1956
expr set_member(expr const &s, expr const &e)
Definition z3++.h:4304
expr bvsdiv_no_overflow(expr const &a, expr const &b)
Definition z3++.h:2390
tactic try_for(tactic const &t, unsigned ms)
Definition z3++.h:3362
expr finite_set_size(expr const &s)
Definition z3++.h:4340
expr sdiv(expr const &a, expr const &b)
signed division operator for bitvectors.
Definition z3++.h:2311
func_decl partial_order(sort const &a, unsigned index)
Definition z3++.h:2412
ast_vector_tpl< expr > expr_vector
Definition z3++.h:77
expr rem(expr const &a, expr const &b)
Definition z3++.h:1788
expr sge(expr const &a, expr const &b)
signed greater than or equal to operator for bitvectors.
Definition z3++.h:2272
expr operator!(expr const &a)
Definition z3++.h:1806
expr re_empty(sort const &s)
Definition z3++.h:4408
expr foldl(expr const &f, expr const &a, expr const &list)
Definition z3++.h:2666
rcf_num rcf_pi(context &c)
Create an RCF numeral representing pi.
Definition z3++.h:5082
expr mk_and(expr_vector const &args)
Definition z3++.h:2686
@ RNE
Definition z3++.h:172
@ RNA
Definition z3++.h:171
@ RTZ
Definition z3++.h:175
@ RTN
Definition z3++.h:174
@ RTP
Definition z3++.h:173
expr finite_set_empty(sort const &s)
Definition z3++.h:4314
expr sext(expr const &a, unsigned i)
Sign-extend of the given bit-vector to the (signed) equivalent bitvector of size m+i,...
Definition z3++.h:2407
expr to_real(expr const &a)
Definition z3++.h:4150
expr shl(expr const &a, expr const &b)
shift left operator for bitvectors
Definition z3++.h:2346
expr operator||(expr const &a, expr const &b)
Definition z3++.h:1824
expr finite_set_intersect(expr const &a, expr const &b)
Definition z3++.h:4328
expr set_del(expr const &s, expr const &e)
Definition z3++.h:4276
expr ubv_to_fpa(expr const &t, sort s)
Definition z3++.h:2199
expr map(expr const &f, expr const &list)
Definition z3++.h:2652
tactic cond(probe const &p, tactic const &t1, tactic const &t2)
Definition z3++.h:3692
expr as_array(func_decl &f)
Definition z3++.h:4230
expr sgt(expr const &a, expr const &b)
signed greater than operator for bitvectors.
Definition z3++.h:2278
expr fpa_to_sbv(expr const &t, unsigned sz)
Definition z3++.h:2178
expr operator|(expr const &a, expr const &b)
Definition z3++.h:2075
expr atmost(expr_vector const &es, unsigned bound)
Definition z3++.h:2574
expr range(expr const &lo, expr const &hi)
Definition z3++.h:4436
expr zext(expr const &a, unsigned i)
Extend the given bit-vector with zeros to the (unsigned) equivalent bitvector of size m+i,...
Definition z3++.h:2367
expr atleast(expr_vector const &es, unsigned bound)
Definition z3++.h:2582
expr uge(expr const &a, expr const &b)
unsigned greater than or equal to operator for bitvectors.
Definition z3++.h:2298
expr mapi(expr const &f, expr const &i, expr const &list)
Definition z3++.h:2659
expr operator<(expr const &a, expr const &b)
Definition z3++.h:2023
expr option(expr const &re)
Definition z3++.h:4402
expr re_full(sort const &s)
Definition z3++.h:4413
expr re_complement(expr const &a)
Definition z3++.h:4433
expr empty(sort const &s)
Definition z3++.h:4364
rcf_num rcf_infinitesimal(context &c)
Create an RCF numeral representing an infinitesimal.
Definition z3++.h:5096
tactic fail_if(probe const &p)
Definition z3++.h:3681
_on_clause_eh
Definition z3py.py:12246
bool is_int(a)
Definition z3py.py:2846
bool eq(AstRef a, AstRef b)
Definition z3py.py:503
on_clause_eh(ctx, p, n, dep, clause)
Definition z3py.py:12239
#define _Z3_MK_BIN_(a, b, binop)
Definition z3++.h:1753
#define MK_EXPR1(_fn, _arg)
Definition z3++.h:4249
#define MK_EXPR2(_fn, _arg1, _arg2)
Definition z3++.h:4254
#define Z3_THROW(x)
Definition z3++.h:134
#define _Z3_MK_UN_(a, mkun)
Definition z3++.h:1800

◆ _Z3_MK_UN_

#define _Z3_MK_UN_ (   a,
  mkun 
)
Value:
Z3_ast r = mkun(a.ctx(), a); \
a.check_error(); \
return expr(a.ctx(), r); \

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

◆ MK_EXPR1

#define MK_EXPR1 (   _fn,
  _arg 
)
Value:
Z3_ast r = _fn(_arg.ctx(), _arg); \
_arg.check_error(); \
return expr(_arg.ctx(), r);

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

◆ MK_EXPR2

#define MK_EXPR2 (   _fn,
  _arg1,
  _arg2 
)
Value:
check_context(_arg1, _arg2); \
Z3_ast r = _fn(_arg1.ctx(), _arg1, _arg2); \
_arg1.check_error(); \
return expr(_arg1.ctx(), r);

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

◆ Z3_THROW

#define Z3_THROW (   x)    {}

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