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  ast_map
 A map from ASTs to ASTs. More...
 
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)
 
expr qe_lite (expr_vector const &vars, expr const &body)
 
std::vector< Z3_app > to_apps (expr_vector const &bounds)
 
expr qe_model_project (model const &m, expr_vector const &bounds, expr const &body)
 
expr qe_model_project_skolem (model const &m, expr_vector const &bounds, expr const &body, ast_map &map)
 Project variables and write the introduced Skolem terms to map.
 
expr qe_model_project_with_witness (model const &m, expr_vector const &bounds, expr const &body, ast_map &map)
 Project variables and write the introduced witnesses to map.
 
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 1833 of file z3++.h.

1839 {
1840 assert(a.is_bool() && b.is_bool());
1842 }
1843 inline expr implies(expr const & a, bool b) { return implies(a, a.ctx().bool_val(b)); }
1844 inline expr implies(bool a, expr const & b) { return implies(b.ctx().bool_val(a), b); }
1845
1846
1847 inline expr pw(expr const & a, expr const & b) { _Z3_MK_BIN_(a, b, Z3_mk_power); }
1848 inline expr pw(expr const & a, int b) { return pw(a, a.ctx().num_val(b, a.get_sort())); }
1849 inline expr pw(int a, expr const & b) { return pw(b.ctx().num_val(a, b.get_sort()), b); }
1850
1851 inline expr mod(expr const& a, expr const& b) {
1852 if (a.is_bv()) {
1853 _Z3_MK_BIN_(a, b, Z3_mk_bvsmod);
1854 }
1855 else {
1856 _Z3_MK_BIN_(a, b, Z3_mk_mod);
1857 }
1858 }
1859 inline expr mod(expr const & a, int b) { return mod(a, a.ctx().num_val(b, a.get_sort())); }
1860 inline expr mod(int a, expr const & b) { return mod(b.ctx().num_val(a, b.get_sort()), b); }
1861
1862 inline expr operator%(expr const& a, expr const& b) { return mod(a, b); }
1863 inline expr operator%(expr const& a, int b) { return mod(a, b); }
1864 inline expr operator%(int a, expr const& b) { return mod(a, b); }
1865
1866
1867 inline expr rem(expr const& a, expr const& b) {
1868 if (a.is_fpa() && b.is_fpa()) {
1870 } else {
1871 _Z3_MK_BIN_(a, b, Z3_mk_rem);
1872 }
1873 }
1874 inline expr rem(expr const & a, int b) { return rem(a, a.ctx().num_val(b, a.get_sort())); }
1875 inline expr rem(int a, expr const & b) { return rem(b.ctx().num_val(a, b.get_sort()), b); }
1876
1877#undef _Z3_MK_BIN_
1878
1879#define _Z3_MK_UN_(a, mkun) \
1880 Z3_ast r = mkun(a.ctx(), a); \
1881 a.check_error(); \
1882 return expr(a.ctx(), r); \
1883
1884
1885 inline expr operator!(expr const & a) { assert(a.is_bool()); _Z3_MK_UN_(a, Z3_mk_not); }
1886
1887 inline expr is_int(expr const& e) { _Z3_MK_UN_(e, Z3_mk_is_int); }
1888
1889#undef _Z3_MK_UN_
1890
1891 inline expr operator&&(expr const & a, expr const & b) {
1892 check_context(a, b);
1893 assert(a.is_bool() && b.is_bool());
1894 Z3_ast args[2] = { a, b };
1895 Z3_ast r = Z3_mk_and(a.ctx(), 2, args);
1896 a.check_error();
1897 return expr(a.ctx(), r);
1898 }
1899
1900 inline expr operator&&(expr const & a, bool b) { return a && a.ctx().bool_val(b); }
1901 inline expr operator&&(bool a, expr const & b) { return b.ctx().bool_val(a) && b; }
1902
1903 inline expr operator||(expr const & a, expr const & b) {
1904 check_context(a, b);
1905 assert(a.is_bool() && b.is_bool());
1906 Z3_ast args[2] = { a, b };
1907 Z3_ast r = Z3_mk_or(a.ctx(), 2, args);
1908 a.check_error();
1909 return expr(a.ctx(), r);
1910 }
1911
1912 inline expr operator||(expr const & a, bool b) { return a || a.ctx().bool_val(b); }
1913
1914 inline expr operator||(bool a, expr const & b) { return b.ctx().bool_val(a) || b; }
1915
1916 inline expr operator==(expr const & a, expr const & b) {
1917 check_context(a, b);
1918 Z3_ast r = Z3_mk_eq(a.ctx(), a, b);
1919 a.check_error();
1920 return expr(a.ctx(), r);
1921 }
1922 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()); }
1923 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; }
1924 inline expr operator==(expr const & a, double b) { assert(a.is_fpa()); return a == a.ctx().fpa_val(b); }
1925 inline expr operator==(double a, expr const & b) { assert(b.is_fpa()); return b.ctx().fpa_val(a) == b; }
1926
1927 inline expr operator!=(expr const & a, expr const & b) {
1928 check_context(a, b);
1929 Z3_ast args[2] = { a, b };
1930 Z3_ast r = Z3_mk_distinct(a.ctx(), 2, args);
1931 a.check_error();
1932 return expr(a.ctx(), r);
1933 }
1934 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()); }
1935 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; }
1936 inline expr operator!=(expr const & a, double b) { assert(a.is_fpa()); return a != a.ctx().fpa_val(b); }
1937 inline expr operator!=(double a, expr const & b) { assert(b.is_fpa()); return b.ctx().fpa_val(a) != b; }
1938
1939 inline expr operator+(expr const & a, expr const & b) {
1940 check_context(a, b);
1941 Z3_ast r = 0;
1942 if (a.is_arith() && b.is_arith()) {
1943 Z3_ast args[2] = { a, b };
1944 r = Z3_mk_add(a.ctx(), 2, args);
1945 }
1946 else if (a.is_bv() && b.is_bv()) {
1947 r = Z3_mk_bvadd(a.ctx(), a, b);
1948 }
1949 else if (a.is_seq() && b.is_seq()) {
1950 return concat(a, b);
1951 }
1952 else if (a.is_re() && b.is_re()) {
1953 Z3_ast _args[2] = { a, b };
1954 r = Z3_mk_re_union(a.ctx(), 2, _args);
1955 }
1956 else if (a.is_fpa() && b.is_fpa()) {
1957 r = Z3_mk_fpa_add(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1958 }
1959 else {
1960 // operator is not supported by given arguments.
1961 assert(false);
1962 }
1963 a.check_error();
1964 return expr(a.ctx(), r);
1965 }
1966 inline expr operator+(expr const & a, int b) { return a + a.ctx().num_val(b, a.get_sort()); }
1967 inline expr operator+(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) + b; }
1968
1969 inline expr operator*(expr const & a, expr const & b) {
1970 check_context(a, b);
1971 Z3_ast r = 0;
1972 if (a.is_arith() && b.is_arith()) {
1973 Z3_ast args[2] = { a, b };
1974 r = Z3_mk_mul(a.ctx(), 2, args);
1975 }
1976 else if (a.is_bv() && b.is_bv()) {
1977 r = Z3_mk_bvmul(a.ctx(), a, b);
1978 }
1979 else if (a.is_fpa() && b.is_fpa()) {
1980 r = Z3_mk_fpa_mul(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1981 }
1982 else {
1983 // operator is not supported by given arguments.
1984 assert(false);
1985 }
1986 a.check_error();
1987 return expr(a.ctx(), r);
1988 }
1989 inline expr operator*(expr const & a, int b) { return a * a.ctx().num_val(b, a.get_sort()); }
1990 inline expr operator*(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) * b; }
1991
1992
1993 inline expr operator>=(expr const & a, expr const & b) {
1994 check_context(a, b);
1995 Z3_ast r = 0;
1996 if (a.is_arith() && b.is_arith()) {
1997 r = Z3_mk_ge(a.ctx(), a, b);
1998 }
1999 else if (a.is_bv() && b.is_bv()) {
2000 r = Z3_mk_bvsge(a.ctx(), a, b);
2001 }
2002 else if (a.is_fpa() && b.is_fpa()) {
2003 r = Z3_mk_fpa_geq(a.ctx(), a, b);
2004 }
2005 else {
2006 // operator is not supported by given arguments.
2007 assert(false);
2008 }
2009 a.check_error();
2010 return expr(a.ctx(), r);
2011 }
2012
2013 inline expr operator/(expr const & a, expr const & b) {
2014 check_context(a, b);
2015 Z3_ast r = 0;
2016 if (a.is_arith() && b.is_arith()) {
2017 r = Z3_mk_div(a.ctx(), a, b);
2018 }
2019 else if (a.is_bv() && b.is_bv()) {
2020 r = Z3_mk_bvsdiv(a.ctx(), a, b);
2021 }
2022 else if (a.is_fpa() && b.is_fpa()) {
2023 r = Z3_mk_fpa_div(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
2024 }
2025 else {
2026 // operator is not supported by given arguments.
2027 assert(false);
2028 }
2029 a.check_error();
2030 return expr(a.ctx(), r);
2031 }
2032 inline expr operator/(expr const & a, int b) { return a / a.ctx().num_val(b, a.get_sort()); }
2033 inline expr operator/(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) / b; }
2034
2035 inline expr operator-(expr const & a) {
2036 Z3_ast r = 0;
2037 if (a.is_arith()) {
2038 r = Z3_mk_unary_minus(a.ctx(), a);
2039 }
2040 else if (a.is_bv()) {
2041 r = Z3_mk_bvneg(a.ctx(), a);
2042 }
2043 else if (a.is_fpa()) {
2044 r = Z3_mk_fpa_neg(a.ctx(), a);
2045 }
2046 else {
2047 // operator is not supported by given arguments.
2048 assert(false);
2049 }
2050 a.check_error();
2051 return expr(a.ctx(), r);
2052 }
2053
2054 inline expr operator-(expr const & a, expr const & b) {
2055 check_context(a, b);
2056 Z3_ast r = 0;
2057 if (a.is_arith() && b.is_arith()) {
2058 Z3_ast args[2] = { a, b };
2059 r = Z3_mk_sub(a.ctx(), 2, args);
2060 }
2061 else if (a.is_bv() && b.is_bv()) {
2062 r = Z3_mk_bvsub(a.ctx(), a, b);
2063 }
2064 else if (a.is_fpa() && b.is_fpa()) {
2065 r = Z3_mk_fpa_sub(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
2066 }
2067 else {
2068 // operator is not supported by given arguments.
2069 assert(false);
2070 }
2071 a.check_error();
2072 return expr(a.ctx(), r);
2073 }
2074 inline expr operator-(expr const & a, int b) { return a - a.ctx().num_val(b, a.get_sort()); }
2075 inline expr operator-(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) - b; }
2076
2077 inline expr operator<=(expr const & a, expr const & b) {
2078 check_context(a, b);
2079 Z3_ast r = 0;
2080 if (a.is_arith() && b.is_arith()) {
2081 r = Z3_mk_le(a.ctx(), a, b);
2082 }
2083 else if (a.is_bv() && b.is_bv()) {
2084 r = Z3_mk_bvsle(a.ctx(), a, b);
2085 }
2086 else if (a.is_fpa() && b.is_fpa()) {
2087 r = Z3_mk_fpa_leq(a.ctx(), a, b);
2088 }
2089 else {
2090 // operator is not supported by given arguments.
2091 assert(false);
2092 }
2093 a.check_error();
2094 return expr(a.ctx(), r);
2095 }
2096 inline expr operator<=(expr const & a, int b) { return a <= a.ctx().num_val(b, a.get_sort()); }
2097 inline expr operator<=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) <= b; }
2098
2099 inline expr operator>=(expr const & a, int b) { return a >= a.ctx().num_val(b, a.get_sort()); }
2100 inline expr operator>=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) >= b; }
2101
2102 inline expr operator<(expr const & a, expr const & b) {
2103 check_context(a, b);
2104 Z3_ast r = 0;
2105 if (a.is_arith() && b.is_arith()) {
2106 r = Z3_mk_lt(a.ctx(), a, b);
2107 }
2108 else if (a.is_bv() && b.is_bv()) {
2109 r = Z3_mk_bvslt(a.ctx(), a, b);
2110 }
2111 else if (a.is_fpa() && b.is_fpa()) {
2112 r = Z3_mk_fpa_lt(a.ctx(), a, b);
2113 }
2114 else {
2115 // operator is not supported by given arguments.
2116 assert(false);
2117 }
2118 a.check_error();
2119 return expr(a.ctx(), r);
2120 }
2121 inline expr operator<(expr const & a, int b) { return a < a.ctx().num_val(b, a.get_sort()); }
2122 inline expr operator<(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) < b; }
2123
2124 inline expr operator>(expr const & a, expr const & b) {
2125 check_context(a, b);
2126 Z3_ast r = 0;
2127 if (a.is_arith() && b.is_arith()) {
2128 r = Z3_mk_gt(a.ctx(), a, b);
2129 }
2130 else if (a.is_bv() && b.is_bv()) {
2131 r = Z3_mk_bvsgt(a.ctx(), a, b);
2132 }
2133 else if (a.is_fpa() && b.is_fpa()) {
2134 r = Z3_mk_fpa_gt(a.ctx(), a, b);
2135 }
2136 else {
2137 // operator is not supported by given arguments.
2138 assert(false);
2139 }
2140 a.check_error();
2141 return expr(a.ctx(), r);
2142 }
2143 inline expr operator>(expr const & a, int b) { return a > a.ctx().num_val(b, a.get_sort()); }
2144 inline expr operator>(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) > b; }
2145
2146 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); }
2147 inline expr operator&(expr const & a, int b) { return a & a.ctx().num_val(b, a.get_sort()); }
2148 inline expr operator&(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) & b; }
2149
2150 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); }
2151 inline expr operator^(expr const & a, int b) { return a ^ a.ctx().num_val(b, a.get_sort()); }
2152 inline expr operator^(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) ^ b; }
2153
2154 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); }
2155 inline expr operator|(expr const & a, int b) { return a | a.ctx().num_val(b, a.get_sort()); }
2156 inline expr operator|(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) | b; }
2157
2158 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); }
2159 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); }
2160 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); }
2161 inline expr min(expr const& a, expr const& b) {
2162 check_context(a, b);
2163 Z3_ast r;
2164 if (a.is_arith()) {
2165 r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), b, a);
2166 }
2167 else if (a.is_bv()) {
2168 r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), b, a);
2169 }
2170 else {
2171 assert(a.is_fpa());
2172 r = Z3_mk_fpa_min(a.ctx(), a, b);
2173 }
2174 a.check_error();
2175 return expr(a.ctx(), r);
2176 }
2177 inline expr max(expr const& a, expr const& b) {
2178 check_context(a, b);
2179 Z3_ast r;
2180 if (a.is_arith()) {
2181 r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), a, b);
2182 }
2183 else if (a.is_bv()) {
2184 r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), a, b);
2185 }
2186 else {
2187 assert(a.is_fpa());
2188 r = Z3_mk_fpa_max(a.ctx(), a, b);
2189 }
2190 a.check_error();
2191 return expr(a.ctx(), r);
2192 }
2193 inline expr bvredor(expr const & a) {
2194 assert(a.is_bv());
2195 Z3_ast r = Z3_mk_bvredor(a.ctx(), a);
2196 a.check_error();
2197 return expr(a.ctx(), r);
2198 }
2199 inline expr bvredand(expr const & a) {
2200 assert(a.is_bv());
2201 Z3_ast r = Z3_mk_bvredand(a.ctx(), a);
2202 a.check_error();
2203 return expr(a.ctx(), r);
2204 }
2205 inline expr abs(expr const & a) {
2206 Z3_ast r;
2207 if (a.is_int()) {
2208 expr zero = a.ctx().int_val(0);
2209 expr ge = a >= zero;
2210 expr na = -a;
2211 r = Z3_mk_ite(a.ctx(), ge, a, na);
2212 }
2213 else if (a.is_real()) {
2214 expr zero = a.ctx().real_val(0);
2215 expr ge = a >= zero;
2216 expr na = -a;
2217 r = Z3_mk_ite(a.ctx(), ge, a, na);
2218 }
2219 else {
2220 r = Z3_mk_fpa_abs(a.ctx(), a);
2221 }
2222 a.check_error();
2223 return expr(a.ctx(), r);
2224 }
2225 inline expr sqrt(expr const & a, expr const& rm) {
2226 check_context(a, rm);
2227 assert(a.is_fpa());
2228 Z3_ast r = Z3_mk_fpa_sqrt(a.ctx(), rm, a);
2229 a.check_error();
2230 return expr(a.ctx(), r);
2231 }
2232 inline expr fp_eq(expr const & a, expr const & b) {
2233 check_context(a, b);
2234 assert(a.is_fpa());
2235 Z3_ast r = Z3_mk_fpa_eq(a.ctx(), a, b);
2236 a.check_error();
2237 return expr(a.ctx(), r);
2238 }
2239 inline expr operator~(expr const & a) { Z3_ast r = Z3_mk_bvnot(a.ctx(), a); return expr(a.ctx(), r); }
2240
2241 inline expr fma(expr const& a, expr const& b, expr const& c, expr const& rm) {
2242 check_context(a, b); check_context(a, c); check_context(a, rm);
2243 assert(a.is_fpa() && b.is_fpa() && c.is_fpa());
2244 Z3_ast r = Z3_mk_fpa_fma(a.ctx(), rm, a, b, c);
2245 a.check_error();
2246 return expr(a.ctx(), r);
2247 }
2248
2249 inline expr fpa_fp(expr const& sgn, expr const& exp, expr const& sig) {
2250 check_context(sgn, exp); check_context(exp, sig);
2251 assert(sgn.is_bv() && exp.is_bv() && sig.is_bv());
2252 Z3_ast r = Z3_mk_fpa_fp(sgn.ctx(), sgn, exp, sig);
2253 sgn.check_error();
2254 return expr(sgn.ctx(), r);
2255 }
2256
2257 inline expr fpa_to_sbv(expr const& t, unsigned sz) {
2258 assert(t.is_fpa());
2259 Z3_ast r = Z3_mk_fpa_to_sbv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
2260 t.check_error();
2261 return expr(t.ctx(), r);
2262 }
2263
2264 inline expr fpa_to_ubv(expr const& t, unsigned sz) {
2265 assert(t.is_fpa());
2266 Z3_ast r = Z3_mk_fpa_to_ubv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
2267 t.check_error();
2268 return expr(t.ctx(), r);
2269 }
2270
2271 inline expr sbv_to_fpa(expr const& t, sort s) {
2272 assert(t.is_bv());
2273 Z3_ast r = Z3_mk_fpa_to_fp_signed(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2274 t.check_error();
2275 return expr(t.ctx(), r);
2276 }
2277
2278 inline expr ubv_to_fpa(expr const& t, sort s) {
2279 assert(t.is_bv());
2280 Z3_ast r = Z3_mk_fpa_to_fp_unsigned(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2281 t.check_error();
2282 return expr(t.ctx(), r);
2283 }
2284
2285 inline expr fpa_to_fpa(expr const& t, sort s) {
2286 assert(t.is_fpa());
2287 Z3_ast r = Z3_mk_fpa_to_fp_float(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2288 t.check_error();
2289 return expr(t.ctx(), r);
2290 }
2291
2292 inline expr round_fpa_to_closest_integer(expr const& t) {
2293 assert(t.is_fpa());
2294 Z3_ast r = Z3_mk_fpa_round_to_integral(t.ctx(), t.ctx().fpa_rounding_mode(), t);
2295 t.check_error();
2296 return expr(t.ctx(), r);
2297 }
2298
2304 inline expr ite(expr const & c, expr const & t, expr const & e) {
2305 check_context(c, t); check_context(c, e);
2306 assert(c.is_bool());
2307 Z3_ast r = Z3_mk_ite(c.ctx(), c, t, e);
2308 c.check_error();
2309 return expr(c.ctx(), r);
2310 }
2311
2312
2317 inline expr to_expr(context & c, Z3_ast a) {
2318 c.check_error();
2319 assert(Z3_get_ast_kind(c, a) == Z3_APP_AST ||
2321 Z3_get_ast_kind(c, a) == Z3_VAR_AST ||
2323 return expr(c, a);
2324 }
2325
2326 inline sort to_sort(context & c, Z3_sort s) {
2327 c.check_error();
2328 return sort(c, s);
2329 }
2330
2331 inline func_decl to_func_decl(context & c, Z3_func_decl f) {
2332 c.check_error();
2333 return func_decl(c, f);
2334 }
2335
2339 inline expr sle(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsle(a.ctx(), a, b)); }
2340 inline expr sle(expr const & a, int b) { return sle(a, a.ctx().num_val(b, a.get_sort())); }
2341 inline expr sle(int a, expr const & b) { return sle(b.ctx().num_val(a, b.get_sort()), b); }
2345 inline expr slt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvslt(a.ctx(), a, b)); }
2346 inline expr slt(expr const & a, int b) { return slt(a, a.ctx().num_val(b, a.get_sort())); }
2347 inline expr slt(int a, expr const & b) { return slt(b.ctx().num_val(a, b.get_sort()), b); }
2351 inline expr sge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsge(a.ctx(), a, b)); }
2352 inline expr sge(expr const & a, int b) { return sge(a, a.ctx().num_val(b, a.get_sort())); }
2353 inline expr sge(int a, expr const & b) { return sge(b.ctx().num_val(a, b.get_sort()), b); }
2357 inline expr sgt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsgt(a.ctx(), a, b)); }
2358 inline expr sgt(expr const & a, int b) { return sgt(a, a.ctx().num_val(b, a.get_sort())); }
2359 inline expr sgt(int a, expr const & b) { return sgt(b.ctx().num_val(a, b.get_sort()), b); }
2360
2361
2365 inline expr ule(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvule(a.ctx(), a, b)); }
2366 inline expr ule(expr const & a, int b) { return ule(a, a.ctx().num_val(b, a.get_sort())); }
2367 inline expr ule(int a, expr const & b) { return ule(b.ctx().num_val(a, b.get_sort()), b); }
2371 inline expr ult(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvult(a.ctx(), a, b)); }
2372 inline expr ult(expr const & a, int b) { return ult(a, a.ctx().num_val(b, a.get_sort())); }
2373 inline expr ult(int a, expr const & b) { return ult(b.ctx().num_val(a, b.get_sort()), b); }
2377 inline expr uge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b)); }
2378 inline expr uge(expr const & a, int b) { return uge(a, a.ctx().num_val(b, a.get_sort())); }
2379 inline expr uge(int a, expr const & b) { return uge(b.ctx().num_val(a, b.get_sort()), b); }
2383 inline expr ugt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvugt(a.ctx(), a, b)); }
2384 inline expr ugt(expr const & a, int b) { return ugt(a, a.ctx().num_val(b, a.get_sort())); }
2385 inline expr ugt(int a, expr const & b) { return ugt(b.ctx().num_val(a, b.get_sort()), b); }
2386
2390 inline expr sdiv(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsdiv(a.ctx(), a, b)); }
2391 inline expr sdiv(expr const & a, int b) { return sdiv(a, a.ctx().num_val(b, a.get_sort())); }
2392 inline expr sdiv(int a, expr const & b) { return sdiv(b.ctx().num_val(a, b.get_sort()), b); }
2393
2397 inline expr udiv(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvudiv(a.ctx(), a, b)); }
2398 inline expr udiv(expr const & a, int b) { return udiv(a, a.ctx().num_val(b, a.get_sort())); }
2399 inline expr udiv(int a, expr const & b) { return udiv(b.ctx().num_val(a, b.get_sort()), b); }
2400
2404 inline expr srem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsrem(a.ctx(), a, b)); }
2405 inline expr srem(expr const & a, int b) { return srem(a, a.ctx().num_val(b, a.get_sort())); }
2406 inline expr srem(int a, expr const & b) { return srem(b.ctx().num_val(a, b.get_sort()), b); }
2407
2411 inline expr smod(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsmod(a.ctx(), a, b)); }
2412 inline expr smod(expr const & a, int b) { return smod(a, a.ctx().num_val(b, a.get_sort())); }
2413 inline expr smod(int a, expr const & b) { return smod(b.ctx().num_val(a, b.get_sort()), b); }
2414
2418 inline expr urem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvurem(a.ctx(), a, b)); }
2419 inline expr urem(expr const & a, int b) { return urem(a, a.ctx().num_val(b, a.get_sort())); }
2420 inline expr urem(int a, expr const & b) { return urem(b.ctx().num_val(a, b.get_sort()), b); }
2421
2425 inline expr shl(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvshl(a.ctx(), a, b)); }
2426 inline expr shl(expr const & a, int b) { return shl(a, a.ctx().num_val(b, a.get_sort())); }
2427 inline expr shl(int a, expr const & b) { return shl(b.ctx().num_val(a, b.get_sort()), b); }
2428
2432 inline expr lshr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvlshr(a.ctx(), a, b)); }
2433 inline expr lshr(expr const & a, int b) { return lshr(a, a.ctx().num_val(b, a.get_sort())); }
2434 inline expr lshr(int a, expr const & b) { return lshr(b.ctx().num_val(a, b.get_sort()), b); }
2435
2439 inline expr ashr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvashr(a.ctx(), a, b)); }
2440 inline expr ashr(expr const & a, int b) { return ashr(a, a.ctx().num_val(b, a.get_sort())); }
2441 inline expr ashr(int a, expr const & b) { return ashr(b.ctx().num_val(a, b.get_sort()), b); }
2442
2446 inline expr zext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_zero_ext(a.ctx(), i, a)); }
2447
2451 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); }
2452 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); }
2453
2457 inline expr bvadd_no_overflow(expr const& a, expr const& b, bool is_signed) {
2458 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);
2459 }
2460 inline expr bvadd_no_underflow(expr const& a, expr const& b) {
2461 check_context(a, b); Z3_ast r = Z3_mk_bvadd_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2462 }
2463 inline expr bvsub_no_overflow(expr const& a, expr const& b) {
2464 check_context(a, b); Z3_ast r = Z3_mk_bvsub_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2465 }
2466 inline expr bvsub_no_underflow(expr const& a, expr const& b, bool is_signed) {
2467 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);
2468 }
2469 inline expr bvsdiv_no_overflow(expr const& a, expr const& b) {
2470 check_context(a, b); Z3_ast r = Z3_mk_bvsdiv_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2471 }
2472 inline expr bvneg_no_overflow(expr const& a) {
2473 Z3_ast r = Z3_mk_bvneg_no_overflow(a.ctx(), a); a.check_error(); return expr(a.ctx(), r);
2474 }
2475 inline expr bvmul_no_overflow(expr const& a, expr const& b, bool is_signed) {
2476 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);
2477 }
2478 inline expr bvmul_no_underflow(expr const& a, expr const& b) {
2479 check_context(a, b); Z3_ast r = Z3_mk_bvmul_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2480 }
2481
2482
2486 inline expr sext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_sign_ext(a.ctx(), i, a)); }
2487
2488 inline func_decl linear_order(sort const& a, unsigned index) {
2489 return to_func_decl(a.ctx(), Z3_mk_linear_order(a.ctx(), a, index));
2490 }
2491 inline func_decl partial_order(sort const& a, unsigned index) {
2492 return to_func_decl(a.ctx(), Z3_mk_partial_order(a.ctx(), a, index));
2493 }
2494 inline func_decl piecewise_linear_order(sort const& a, unsigned index) {
2495 return to_func_decl(a.ctx(), Z3_mk_piecewise_linear_order(a.ctx(), a, index));
2496 }
2497 inline func_decl tree_order(sort const& a, unsigned index) {
2498 return to_func_decl(a.ctx(), Z3_mk_tree_order(a.ctx(), a, index));
2499 }
2500
2507 inline expr_vector polynomial_subresultants(expr const& p, expr const& q, expr const& x) {
2508 check_context(p, q); check_context(p, x);
2509 Z3_ast_vector r = Z3_polynomial_subresultants(p.ctx(), p, q, x);
2510 p.check_error();
2511 return expr_vector(p.ctx(), r);
2512 }
2513
2514 template<> class cast_ast<ast> {
2515 public:
2516 ast operator()(context & c, Z3_ast a) { return ast(c, a); }
2517 };
2518
2519 template<> class cast_ast<expr> {
2520 public:
2521 expr operator()(context & c, Z3_ast a) {
2522 assert(Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST ||
2523 Z3_get_ast_kind(c, a) == Z3_APP_AST ||
2525 Z3_get_ast_kind(c, a) == Z3_VAR_AST);
2526 return expr(c, a);
2527 }
2528 };
2529
2530 template<> class cast_ast<sort> {
2531 public:
2532 sort operator()(context & c, Z3_ast a) {
2533 assert(Z3_get_ast_kind(c, a) == Z3_SORT_AST);
2534 return sort(c, reinterpret_cast<Z3_sort>(a));
2535 }
2536 };
2537
2538 template<> class cast_ast<func_decl> {
2539 public:
2540 func_decl operator()(context & c, Z3_ast a) {
2541 assert(Z3_get_ast_kind(c, a) == Z3_FUNC_DECL_AST);
2542 return func_decl(c, reinterpret_cast<Z3_func_decl>(a));
2543 }
2544 };
2545
2546 template<typename T>
2547 template<typename T2>
2548 array<T>::array(ast_vector_tpl<T2> const & v):m_array(new T[v.size()]), m_size(v.size()) {
2549 for (unsigned i = 0; i < m_size; ++i) {
2550 m_array[i] = v[i];
2551 }
2552 }
2553
2554 // Basic functions for creating quantified formulas.
2555 // The C API should be used for creating quantifiers with patterns, weights, many variables, etc.
2556 inline expr forall(expr const & x, expr const & b) {
2557 check_context(x, b);
2558 Z3_app vars[] = {(Z3_app) x};
2559 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2560 }
2561 inline expr forall(expr const & x1, expr const & x2, expr const & b) {
2562 check_context(x1, b); check_context(x2, b);
2563 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2564 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2565 }
2566 inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2567 check_context(x1, b); check_context(x2, b); check_context(x3, b);
2568 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2569 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2570 }
2571 inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2572 check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2573 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2574 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2575 }
2576 inline expr forall(expr_vector const & xs, expr const & b) {
2577 array<Z3_app> vars(xs);
2578 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);
2579 }
2580 inline expr exists(expr const & x, expr const & b) {
2581 check_context(x, b);
2582 Z3_app vars[] = {(Z3_app) x};
2583 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2584 }
2585 inline expr exists(expr const & x1, expr const & x2, expr const & b) {
2586 check_context(x1, b); check_context(x2, b);
2587 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2588 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2589 }
2590 inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2591 check_context(x1, b); check_context(x2, b); check_context(x3, b);
2592 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2593 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2594 }
2595 inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2596 check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2597 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2598 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2599 }
2600 inline expr exists(expr_vector const & xs, expr const & b) {
2601 array<Z3_app> vars(xs);
2602 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);
2603 }
2604 inline expr lambda(expr const & x, expr const & b) {
2605 check_context(x, b);
2606 Z3_app vars[] = {(Z3_app) x};
2607 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 1, vars, b); b.check_error(); return expr(b.ctx(), r);
2608 }
2609 inline expr lambda(expr const & x1, expr const & x2, expr const & b) {
2610 check_context(x1, b); check_context(x2, b);
2611 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2612 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 2, vars, b); b.check_error(); return expr(b.ctx(), r);
2613 }
2614 inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2615 check_context(x1, b); check_context(x2, b); check_context(x3, b);
2616 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2617 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 3, vars, b); b.check_error(); return expr(b.ctx(), r);
2618 }
2619 inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2620 check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2621 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2622 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 4, vars, b); b.check_error(); return expr(b.ctx(), r);
2623 }
2624 inline expr lambda(expr_vector const & xs, expr const & b) {
2625 array<Z3_app> vars(xs);
2626 Z3_ast r = Z3_mk_lambda_const(b.ctx(), vars.size(), vars.ptr(), b); b.check_error(); return expr(b.ctx(), r);
2627 }
2628
2629 inline expr pble(expr_vector const& es, int const* coeffs, int bound) {
2630 assert(es.size() > 0);
2631 context& ctx = es[0u].ctx();
2632 array<Z3_ast> _es(es);
2633 Z3_ast r = Z3_mk_pble(ctx, _es.size(), _es.ptr(), coeffs, bound);
2634 ctx.check_error();
2635 return expr(ctx, r);
2636 }
2637 inline expr pbge(expr_vector const& es, int const* coeffs, int bound) {
2638 assert(es.size() > 0);
2639 context& ctx = es[0u].ctx();
2640 array<Z3_ast> _es(es);
2641 Z3_ast r = Z3_mk_pbge(ctx, _es.size(), _es.ptr(), coeffs, bound);
2642 ctx.check_error();
2643 return expr(ctx, r);
2644 }
2645 inline expr pbeq(expr_vector const& es, int const* coeffs, int bound) {
2646 assert(es.size() > 0);
2647 context& ctx = es[0u].ctx();
2648 array<Z3_ast> _es(es);
2649 Z3_ast r = Z3_mk_pbeq(ctx, _es.size(), _es.ptr(), coeffs, bound);
2650 ctx.check_error();
2651 return expr(ctx, r);
2652 }
2653 inline expr atmost(expr_vector const& es, unsigned bound) {
2654 assert(es.size() > 0);
2655 context& ctx = es[0u].ctx();
2656 array<Z3_ast> _es(es);
2657 Z3_ast r = Z3_mk_atmost(ctx, _es.size(), _es.ptr(), bound);
2658 ctx.check_error();
2659 return expr(ctx, r);
2660 }
2661 inline expr atleast(expr_vector const& es, unsigned bound) {
2662 assert(es.size() > 0);
2663 context& ctx = es[0u].ctx();
2664 array<Z3_ast> _es(es);
2665 Z3_ast r = Z3_mk_atleast(ctx, _es.size(), _es.ptr(), bound);
2666 ctx.check_error();
2667 return expr(ctx, r);
2668 }
2669 inline expr sum(expr_vector const& args) {
2670 assert(args.size() > 0);
2671 context& ctx = args[0u].ctx();
2672 array<Z3_ast> _args(args);
2673 Z3_ast r = Z3_mk_add(ctx, _args.size(), _args.ptr());
2674 ctx.check_error();
2675 return expr(ctx, r);
2676 }
2677
2678 inline expr distinct(expr_vector const& args) {
2679 assert(args.size() > 0);
2680 context& ctx = args[0u].ctx();
2681 array<Z3_ast> _args(args);
2682 Z3_ast r = Z3_mk_distinct(ctx, _args.size(), _args.ptr());
2683 ctx.check_error();
2684 return expr(ctx, r);
2685 }
2686
2687 inline expr concat(expr const& a, expr const& b) {
2688 check_context(a, b);
2689 Z3_ast r;
2690 if (Z3_is_seq_sort(a.ctx(), a.get_sort())) {
2691 Z3_ast _args[2] = { a, b };
2692 r = Z3_mk_seq_concat(a.ctx(), 2, _args);
2693 }
2694 else if (Z3_is_re_sort(a.ctx(), a.get_sort())) {
2695 Z3_ast _args[2] = { a, b };
2696 r = Z3_mk_re_concat(a.ctx(), 2, _args);
2697 }
2698 else {
2699 r = Z3_mk_concat(a.ctx(), a, b);
2700 }
2701 a.ctx().check_error();
2702 return expr(a.ctx(), r);
2703 }
2704
2705 inline expr concat(expr_vector const& args) {
2706 Z3_ast r;
2707 assert(args.size() > 0);
2708 if (args.size() == 1) {
2709 return args[0u];
2710 }
2711 context& ctx = args[0u].ctx();
2712 array<Z3_ast> _args(args);
2713 if (Z3_is_seq_sort(ctx, args[0u].get_sort())) {
2714 r = Z3_mk_seq_concat(ctx, _args.size(), _args.ptr());
2715 }
2716 else if (Z3_is_re_sort(ctx, args[0u].get_sort())) {
2717 r = Z3_mk_re_concat(ctx, _args.size(), _args.ptr());
2718 }
2719 else {
2720 r = _args[args.size()-1];
2721 for (unsigned i = args.size()-1; i > 0; ) {
2722 --i;
2723 r = Z3_mk_concat(ctx, _args[i], r);
2724 ctx.check_error();
2725 }
2726 }
2727 ctx.check_error();
2728 return expr(ctx, r);
2729 }
2730
2731 inline expr map(expr const& f, expr const& list) {
2732 context& ctx = f.ctx();
2733 Z3_ast r = Z3_mk_seq_map(ctx, f, list);
2734 ctx.check_error();
2735 return expr(ctx, r);
2736 }
2737
2738 inline expr mapi(expr const& f, expr const& i, expr const& list) {
2739 context& ctx = f.ctx();
2740 Z3_ast r = Z3_mk_seq_mapi(ctx, f, i, list);
2741 ctx.check_error();
2742 return expr(ctx, r);
2743 }
2744
2745 inline expr foldl(expr const& f, expr const& a, expr const& list) {
2746 context& ctx = f.ctx();
2747 Z3_ast r = Z3_mk_seq_foldl(ctx, f, a, list);
2748 ctx.check_error();
2749 return expr(ctx, r);
2750 }
2751
2752 inline expr foldli(expr const& f, expr const& i, expr const& a, expr const& list) {
2753 context& ctx = f.ctx();
2754 Z3_ast r = Z3_mk_seq_foldli(ctx, f, i, a, list);
2755 ctx.check_error();
2756 return expr(ctx, r);
2757 }
2758
2759 inline expr mk_or(expr_vector const& args) {
2760 array<Z3_ast> _args(args);
2761 Z3_ast r = Z3_mk_or(args.ctx(), _args.size(), _args.ptr());
2762 args.check_error();
2763 return expr(args.ctx(), r);
2764 }
2765 inline expr mk_and(expr_vector const& args) {
2766 array<Z3_ast> _args(args);
2767 Z3_ast r = Z3_mk_and(args.ctx(), _args.size(), _args.ptr());
2768 args.check_error();
2769 return expr(args.ctx(), r);
2770 }
2771 inline expr mk_xor(expr_vector const& args) {
2772 if (args.empty())
2773 return args.ctx().bool_val(false);
2774 expr r = args[0u];
2775 for (unsigned i = 1; i < args.size(); ++i)
2776 r = r ^ args[i];
2777 return r;
2778 }
2779
2780
2781 class func_entry : public object {
2782 Z3_func_entry m_entry;
2783 void init(Z3_func_entry e) {
2784 m_entry = e;
2785 Z3_func_entry_inc_ref(ctx(), m_entry);
2786 }
2787 public:
2788 func_entry(context & c, Z3_func_entry e):object(c) { init(e); }
2789 func_entry(func_entry const & s):object(s) { init(s.m_entry); }
2790 ~func_entry() override { Z3_func_entry_dec_ref(ctx(), m_entry); }
2791 operator Z3_func_entry() const { return m_entry; }
2792 func_entry & operator=(func_entry const & s) {
2793 Z3_func_entry_inc_ref(s.ctx(), s.m_entry);
2794 Z3_func_entry_dec_ref(ctx(), m_entry);
2795 object::operator=(s);
2796 m_entry = s.m_entry;
2797 return *this;
2798 }
2799 expr value() const { Z3_ast r = Z3_func_entry_get_value(ctx(), m_entry); check_error(); return expr(ctx(), r); }
2800 unsigned num_args() const { unsigned r = Z3_func_entry_get_num_args(ctx(), m_entry); check_error(); return r; }
2801 expr arg(unsigned i) const { Z3_ast r = Z3_func_entry_get_arg(ctx(), m_entry, i); check_error(); return expr(ctx(), r); }
2802 };
2803
2804 class func_interp : public object {
2805 Z3_func_interp m_interp;
2806 void init(Z3_func_interp e) {
2807 m_interp = e;
2808 Z3_func_interp_inc_ref(ctx(), m_interp);
2809 }
2810 public:
2811 func_interp(context & c, Z3_func_interp e):object(c) { init(e); }
2812 func_interp(func_interp const & s):object(s) { init(s.m_interp); }
2813 ~func_interp() override { Z3_func_interp_dec_ref(ctx(), m_interp); }
2814 operator Z3_func_interp() const { return m_interp; }
2815 func_interp & operator=(func_interp const & s) {
2816 Z3_func_interp_inc_ref(s.ctx(), s.m_interp);
2817 Z3_func_interp_dec_ref(ctx(), m_interp);
2818 object::operator=(s);
2819 m_interp = s.m_interp;
2820 return *this;
2821 }
2822 expr else_value() const { Z3_ast r = Z3_func_interp_get_else(ctx(), m_interp); check_error(); return expr(ctx(), r); }
2823 unsigned num_entries() const { unsigned r = Z3_func_interp_get_num_entries(ctx(), m_interp); check_error(); return r; }
2824 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); }
2825 void add_entry(expr_vector const& args, expr& value) {
2826 Z3_func_interp_add_entry(ctx(), m_interp, args, value);
2827 check_error();
2828 }
2829 void set_else(expr& value) {
2830 Z3_func_interp_set_else(ctx(), m_interp, value);
2831 check_error();
2832 }
2833 };
2834
2835 class model : public object {
2836 Z3_model m_model;
2837 void init(Z3_model m) {
2838 m_model = m;
2839 Z3_model_inc_ref(ctx(), m);
2840 }
2841 public:
2842 struct translate {};
2843 model(context & c):object(c) { init(Z3_mk_model(c)); }
2844 model(context & c, Z3_model m):object(c) { init(m); }
2845 model(model const & s):object(s) { init(s.m_model); }
2846 model(model& src, context& dst, translate) : object(dst) { init(Z3_model_translate(src.ctx(), src, dst)); }
2847 ~model() override { Z3_model_dec_ref(ctx(), m_model); }
2848 operator Z3_model() const { return m_model; }
2849 model & operator=(model const & s) {
2850 Z3_model_inc_ref(s.ctx(), s.m_model);
2851 Z3_model_dec_ref(ctx(), m_model);
2852 object::operator=(s);
2853 m_model = s.m_model;
2854 return *this;
2855 }
2856
2857 expr eval(expr const & n, bool model_completion=false) const {
2858 check_context(*this, n);
2859 Z3_ast r = 0;
2860 bool status = Z3_model_eval(ctx(), m_model, n, model_completion, &r);
2861 check_error();
2862 if (status == false && ctx().enable_exceptions())
2863 Z3_THROW(exception("failed to evaluate expression"));
2864 return expr(ctx(), r);
2865 }
2866
2867 unsigned num_consts() const { return Z3_model_get_num_consts(ctx(), m_model); }
2868 unsigned num_funcs() const { return Z3_model_get_num_funcs(ctx(), m_model); }
2869 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); }
2870 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); }
2871 unsigned size() const { return num_consts() + num_funcs(); }
2872 func_decl operator[](int i) const {
2873 assert(0 <= i);
2874 return static_cast<unsigned>(i) < num_consts() ? get_const_decl(i) : get_func_decl(i - num_consts());
2875 }
2876
2877 // returns interpretation of constant declaration c.
2878 // If c is not assigned any value in the model it returns
2879 // an expression with a null ast reference.
2880 expr get_const_interp(func_decl c) const {
2881 check_context(*this, c);
2882 Z3_ast r = Z3_model_get_const_interp(ctx(), m_model, c);
2883 check_error();
2884 return expr(ctx(), r);
2885 }
2886 func_interp get_func_interp(func_decl f) const {
2887 check_context(*this, f);
2888 Z3_func_interp r = Z3_model_get_func_interp(ctx(), m_model, f);
2889 check_error();
2890 return func_interp(ctx(), r);
2891 }
2892
2893 // returns true iff the model contains an interpretation
2894 // for function f.
2895 bool has_interp(func_decl f) const {
2896 check_context(*this, f);
2897 return Z3_model_has_interp(ctx(), m_model, f);
2898 }
2899
2900 func_interp add_func_interp(func_decl& f, expr& else_val) {
2901 Z3_func_interp r = Z3_add_func_interp(ctx(), m_model, f, else_val);
2902 check_error();
2903 return func_interp(ctx(), r);
2904 }
2905
2906 void add_const_interp(func_decl& f, expr& value) {
2907 Z3_add_const_interp(ctx(), m_model, f, value);
2908 check_error();
2909 }
2910
2911 unsigned num_sorts() const {
2912 unsigned r = Z3_model_get_num_sorts(ctx(), m_model);
2913 check_error();
2914 return r;
2915 }
2916
2921 sort get_sort(unsigned i) const {
2922 Z3_sort s = Z3_model_get_sort(ctx(), m_model, i);
2923 check_error();
2924 return sort(ctx(), s);
2925 }
2926
2927 expr_vector sort_universe(sort const& s) const {
2928 check_context(*this, s);
2929 Z3_ast_vector r = Z3_model_get_sort_universe(ctx(), m_model, s);
2930 check_error();
2931 return expr_vector(ctx(), r);
2932 }
2933
2934 friend std::ostream & operator<<(std::ostream & out, model const & m);
2935
2936 std::string to_string() const { return m_model ? std::string(Z3_model_to_string(ctx(), m_model)) : "null"; }
2937 };
2938
2939 inline expr qe_lite(expr_vector const& vars, expr const& body) {
2940 check_context(vars, body);
2941 Z3_ast r = Z3_qe_lite(body.ctx(), vars, body);
2942 body.check_error();
2943 return expr(body.ctx(), r);
2944 }
2945
2946 inline std::vector<Z3_app> to_apps(expr_vector const& bounds) {
2947 std::vector<Z3_app> apps;
2948 for (unsigned i = 0; i < bounds.size(); ++i) {
2949 if (!Z3_is_app(bounds.ctx(), bounds[i]))
2950 Z3_THROW(exception("model projection bounds must be applications"));
2951 apps.push_back(Z3_to_app(bounds.ctx(), bounds[i]));
2952 }
2953 return apps;
2954 }
2955
2956 inline expr qe_model_project(model const& m, expr_vector const& bounds, expr const& body) {
2957 check_context(m, bounds); check_context(m, body);
2958 std::vector<Z3_app> apps = to_apps(bounds);
2959 Z3_ast r = Z3_qe_model_project(m.ctx(), m, bounds.size(), apps.data(), body);
2960 m.check_error();
2961 return expr(m.ctx(), r);
2962 }
2963
2967 inline expr qe_model_project_skolem(model const& m, expr_vector const& bounds, expr const& body, ast_map& map) {
2968 check_context(m, bounds); check_context(m, body); check_context(m, map);
2969 std::vector<Z3_app> apps = to_apps(bounds);
2970 Z3_ast r = Z3_qe_model_project_skolem(m.ctx(), m, bounds.size(), apps.data(), body, map);
2971 m.check_error();
2972 return expr(m.ctx(), r);
2973 }
2974
2978 inline expr qe_model_project_with_witness(model const& m, expr_vector const& bounds, expr const& body, ast_map& map) {
2979 check_context(m, bounds); check_context(m, body); check_context(m, map);
2980 std::vector<Z3_app> apps = to_apps(bounds);
2981 Z3_ast r = Z3_qe_model_project_with_witness(m.ctx(), m, bounds.size(), apps.data(), body, map);
2982 m.check_error();
2983 return expr(m.ctx(), r);
2984 }
2985
2986 inline std::ostream & operator<<(std::ostream & out, model const & m) { return out << m.to_string(); }
2987
2988 class stats : public object {
2989 Z3_stats m_stats;
2990 void init(Z3_stats e) {
2991 m_stats = e;
2992 Z3_stats_inc_ref(ctx(), m_stats);
2993 }
2994 public:
2995 stats(context & c):object(c), m_stats(0) {}
2996 stats(context & c, Z3_stats e):object(c) { init(e); }
2997 stats(stats const & s):object(s) { init(s.m_stats); }
2998 ~stats() override { if (m_stats) Z3_stats_dec_ref(ctx(), m_stats); }
2999 operator Z3_stats() const { return m_stats; }
3000 stats & operator=(stats const & s) {
3001 Z3_stats_inc_ref(s.ctx(), s.m_stats);
3002 if (m_stats) Z3_stats_dec_ref(ctx(), m_stats);
3003 object::operator=(s);
3004 m_stats = s.m_stats;
3005 return *this;
3006 }
3007 unsigned size() const { return Z3_stats_size(ctx(), m_stats); }
3008 std::string key(unsigned i) const { Z3_string s = Z3_stats_get_key(ctx(), m_stats, i); check_error(); return s; }
3009 bool is_uint(unsigned i) const { bool r = Z3_stats_is_uint(ctx(), m_stats, i); check_error(); return r; }
3010 bool is_double(unsigned i) const { bool r = Z3_stats_is_double(ctx(), m_stats, i); check_error(); return r; }
3011 unsigned uint_value(unsigned i) const { unsigned r = Z3_stats_get_uint_value(ctx(), m_stats, i); check_error(); return r; }
3012 double double_value(unsigned i) const { double r = Z3_stats_get_double_value(ctx(), m_stats, i); check_error(); return r; }
3013 friend std::ostream & operator<<(std::ostream & out, stats const & s);
3014 };
3015 inline std::ostream & operator<<(std::ostream & out, stats const & s) { out << Z3_stats_to_string(s.ctx(), s); return out; }
3016
3017
3018 inline std::ostream & operator<<(std::ostream & out, check_result r) {
3019 if (r == unsat) out << "unsat";
3020 else if (r == sat) out << "sat";
3021 else out << "unknown";
3022 return out;
3023 }
3024
3035 class parameter {
3036 Z3_parameter_kind m_kind;
3037 func_decl m_decl;
3038 unsigned m_index;
3039 context& ctx() const { return m_decl.ctx(); }
3040 void check_error() const { ctx().check_error(); }
3041 public:
3042 parameter(func_decl const& d, unsigned idx) : m_decl(d), m_index(idx) {
3043 if (ctx().enable_exceptions() && idx >= d.num_parameters())
3044 Z3_THROW(exception("parameter index is out of bounds"));
3045 m_kind = Z3_get_decl_parameter_kind(ctx(), d, idx);
3046 }
3047 parameter(expr const& e, unsigned idx) : m_decl(e.decl()), m_index(idx) {
3048 if (ctx().enable_exceptions() && idx >= m_decl.num_parameters())
3049 Z3_THROW(exception("parameter index is out of bounds"));
3050 m_kind = Z3_get_decl_parameter_kind(ctx(), m_decl, idx);
3051 }
3052 Z3_parameter_kind kind() const { return m_kind; }
3053 expr get_expr() const { Z3_ast a = Z3_get_decl_ast_parameter(ctx(), m_decl, m_index); check_error(); return expr(ctx(), a); }
3054 sort get_sort() const { Z3_sort s = Z3_get_decl_sort_parameter(ctx(), m_decl, m_index); check_error(); return sort(ctx(), s); }
3055 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); }
3056 symbol get_symbol() const { Z3_symbol s = Z3_get_decl_symbol_parameter(ctx(), m_decl, m_index); check_error(); return symbol(ctx(), s); }
3057 std::string get_rational() const { Z3_string s = Z3_get_decl_rational_parameter(ctx(), m_decl, m_index); check_error(); return s; }
3058 double get_double() const { double d = Z3_get_decl_double_parameter(ctx(), m_decl, m_index); check_error(); return d; }
3059 int get_int() const { int i = Z3_get_decl_int_parameter(ctx(), m_decl, m_index); check_error(); return i; }
3060 };
3061
3062
3063 class solver : public object {
3064 Z3_solver m_solver;
3065 void init(Z3_solver s) {
3066 m_solver = s;
3067 if (s)
3068 Z3_solver_inc_ref(ctx(), s);
3069 }
3070 public:
3071 struct simple {};
3072 struct translate {};
3073 solver(context & c):object(c) { init(Z3_mk_solver(c)); check_error(); }
3074 solver(context & c, simple):object(c) { init(Z3_mk_simple_solver(c)); check_error(); }
3075 solver(context & c, Z3_solver s):object(c) { init(s); }
3076 solver(context & c, char const * logic):object(c) { init(Z3_mk_solver_for_logic(c, c.str_symbol(logic))); check_error(); }
3077 solver(context & c, solver const& src, translate): object(c) { Z3_solver s = Z3_solver_translate(src.ctx(), src, c); check_error(); init(s); }
3078 solver(solver const & s):object(s) { init(s.m_solver); }
3079 solver(solver const& s, simplifier const& simp);
3080 ~solver() override { Z3_solver_dec_ref(ctx(), m_solver); }
3081 operator Z3_solver() const { return m_solver; }
3082 solver & operator=(solver const & s) {
3083 Z3_solver_inc_ref(s.ctx(), s.m_solver);
3084 Z3_solver_dec_ref(ctx(), m_solver);
3085 object::operator=(s);
3086 m_solver = s.m_solver;
3087 return *this;
3088 }
3089 void set(params const & p) { Z3_solver_set_params(ctx(), m_solver, p); check_error(); }
3090 void set(char const * k, bool v) { params p(ctx()); p.set(k, v); set(p); }
3091 void set(char const * k, unsigned v) { params p(ctx()); p.set(k, v); set(p); }
3092 void set(char const * k, double v) { params p(ctx()); p.set(k, v); set(p); }
3093 void set(char const * k, symbol const & v) { params p(ctx()); p.set(k, v); set(p); }
3094 void set(char const * k, char const* v) { params p(ctx()); p.set(k, v); set(p); }
3105 void push() { Z3_solver_push(ctx(), m_solver); check_error(); }
3106 void pop(unsigned n = 1) { Z3_solver_pop(ctx(), m_solver, n); check_error(); }
3107 void reset() { Z3_solver_reset(ctx(), m_solver); check_error(); }
3108 void add(expr const & e) { assert(e.is_bool()); Z3_solver_assert(ctx(), m_solver, e); check_error(); }
3109 void add(expr const & e, expr const & p) {
3110 assert(e.is_bool()); assert(p.is_bool()); assert(p.is_const());
3111 Z3_solver_assert_and_track(ctx(), m_solver, e, p);
3112 check_error();
3113 }
3114 void add(expr const & e, char const * p) {
3115 add(e, ctx().bool_const(p));
3116 }
3117 void add(expr_vector const& v) {
3118 check_context(*this, v);
3119 for (unsigned i = 0; i < v.size(); ++i)
3120 add(v[i]);
3121 }
3122 void from_file(char const* file) { Z3_solver_from_file(ctx(), m_solver, file); ctx().check_parser_error(); }
3123 void from_string(char const* s) { Z3_solver_from_string(ctx(), m_solver, s); ctx().check_parser_error(); }
3124
3125 check_result check() { Z3_lbool r = Z3_solver_check(ctx(), m_solver); check_error(); return to_check_result(r); }
3126 check_result check(unsigned n, expr * const assumptions) {
3127 array<Z3_ast> _assumptions(n);
3128 for (unsigned i = 0; i < n; ++i) {
3129 check_context(*this, assumptions[i]);
3130 _assumptions[i] = assumptions[i];
3131 }
3132 Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
3133 check_error();
3134 return to_check_result(r);
3135 }
3136 check_result check(expr_vector const& assumptions) {
3137 unsigned n = assumptions.size();
3138 array<Z3_ast> _assumptions(n);
3139 for (unsigned i = 0; i < n; ++i) {
3140 check_context(*this, assumptions[i]);
3141 _assumptions[i] = assumptions[i];
3142 }
3143 Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
3144 check_error();
3145 return to_check_result(r);
3146 }
3147 model get_model() const { Z3_model m = Z3_solver_get_model(ctx(), m_solver); check_error(); return model(ctx(), m); }
3148 check_result consequences(expr_vector& assumptions, expr_vector& vars, expr_vector& conseq) {
3149 Z3_lbool r = Z3_solver_get_consequences(ctx(), m_solver, assumptions, vars, conseq);
3150 check_error();
3151 return to_check_result(r);
3152 }
3153 std::string reason_unknown() const { Z3_string r = Z3_solver_get_reason_unknown(ctx(), m_solver); check_error(); return r; }
3154 stats statistics() const { Z3_stats r = Z3_solver_get_statistics(ctx(), m_solver); check_error(); return stats(ctx(), r); }
3155 expr_vector unsat_core() const { Z3_ast_vector r = Z3_solver_get_unsat_core(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
3156 expr_vector assertions() const { Z3_ast_vector r = Z3_solver_get_assertions(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
3157 expr_vector non_units() const { Z3_ast_vector r = Z3_solver_get_non_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
3158 expr_vector units() const { Z3_ast_vector r = Z3_solver_get_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
3159 expr_vector trail() const { Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
3160 expr_vector trail(array<unsigned>& levels) const {
3161 Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver);
3162 check_error();
3163 expr_vector result(ctx(), r);
3164 unsigned sz = result.size();
3165 levels.resize(sz);
3166 Z3_solver_get_levels(ctx(), m_solver, r, sz, levels.ptr());
3167 check_error();
3168 return result;
3169 }
3170 expr congruence_root(expr const& t) const {
3171 check_context(*this, t);
3172 Z3_ast r = Z3_solver_congruence_root(ctx(), m_solver, t);
3173 check_error();
3174 return expr(ctx(), r);
3175 }
3176 expr congruence_next(expr const& t) const {
3177 check_context(*this, t);
3178 Z3_ast r = Z3_solver_congruence_next(ctx(), m_solver, t);
3179 check_error();
3180 return expr(ctx(), r);
3181 }
3182 expr congruence_explain(expr const& a, expr const& b) const {
3183 check_context(*this, a);
3184 check_context(*this, b);
3185 Z3_ast r = Z3_solver_congruence_explain(ctx(), m_solver, a, b);
3186 check_error();
3187 return expr(ctx(), r);
3188 }
3189 void set_initial_value(expr const& var, expr const& value) {
3190 Z3_solver_set_initial_value(ctx(), m_solver, var, value);
3191 check_error();
3192 }
3193 void set_initial_value(expr const& var, int i) {
3194 set_initial_value(var, ctx().num_val(i, var.get_sort()));
3195 }
3196 void set_initial_value(expr const& var, bool b) {
3197 set_initial_value(var, ctx().bool_val(b));
3198 }
3199
3200 void solve_for(expr_vector const& vars, expr_vector& terms, expr_vector& guards) {
3201 // Create a copy of vars since the C API modifies the variables vector
3202 expr_vector variables(ctx());
3203 for (unsigned i = 0; i < vars.size(); ++i) {
3204 check_context(*this, vars[i]);
3205 variables.push_back(vars[i]);
3206 }
3207 // Clear output vectors before calling C API
3208 terms = expr_vector(ctx());
3209 guards = expr_vector(ctx());
3210 Z3_solver_solve_for(ctx(), m_solver, variables, terms, guards);
3211 check_error();
3212 }
3213
3214 void import_model_converter(solver const& src) {
3215 check_context(*this, src);
3216 Z3_solver_import_model_converter(ctx(), src.m_solver, m_solver);
3217 check_error();
3218 }
3219
3220 expr proof() const { Z3_ast r = Z3_solver_get_proof(ctx(), m_solver); check_error(); return expr(ctx(), r); }
3221 friend std::ostream & operator<<(std::ostream & out, solver const & s);
3222
3223 std::string to_smt2(char const* status = "unknown") {
3224 array<Z3_ast> es(assertions());
3225 Z3_ast const* fmls = es.ptr();
3226 Z3_ast fml = 0;
3227 unsigned sz = es.size();
3228 if (sz > 0) {
3229 --sz;
3230 fml = fmls[sz];
3231 }
3232 else {
3233 fml = ctx().bool_val(true);
3234 }
3235 return std::string(Z3_benchmark_to_smtlib_string(
3236 ctx(),
3237 "", "", status, "",
3238 sz,
3239 fmls,
3240 fml));
3241 }
3242
3243 std::string dimacs(bool include_names = true) const { return std::string(Z3_solver_to_dimacs_string(ctx(), m_solver, include_names)); }
3244
3245 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_solver_get_param_descrs(ctx(), m_solver)); }
3246
3247
3248 expr_vector cube(expr_vector& vars, unsigned cutoff) {
3249 Z3_ast_vector r = Z3_solver_cube(ctx(), m_solver, vars, cutoff);
3250 check_error();
3251 return expr_vector(ctx(), r);
3252 }
3253
3254 class cube_iterator {
3255 solver& m_solver;
3256 unsigned& m_cutoff;
3257 expr_vector& m_vars;
3258 expr_vector m_cube;
3259 bool m_end;
3260 bool m_empty;
3261
3262 void inc() {
3263 assert(!m_end && !m_empty);
3264 m_cube = m_solver.cube(m_vars, m_cutoff);
3265 m_cutoff = 0xFFFFFFFF;
3266 if (m_cube.size() == 1 && m_cube[0u].is_false()) {
3267 m_cube = z3::expr_vector(m_solver.ctx());
3268 m_end = true;
3269 }
3270 else if (m_cube.empty()) {
3271 m_empty = true;
3272 }
3273 }
3274 public:
3275 cube_iterator(solver& s, expr_vector& vars, unsigned& cutoff, bool end):
3276 m_solver(s),
3277 m_cutoff(cutoff),
3278 m_vars(vars),
3279 m_cube(s.ctx()),
3280 m_end(end),
3281 m_empty(false) {
3282 if (!m_end) {
3283 inc();
3284 }
3285 }
3286
3287 cube_iterator& operator++() {
3288 assert(!m_end);
3289 if (m_empty) {
3290 m_end = true;
3291 }
3292 else {
3293 inc();
3294 }
3295 return *this;
3296 }
3297 cube_iterator operator++(int) { assert(false); return *this; }
3298 expr_vector const * operator->() const { return &(operator*()); }
3299 expr_vector const& operator*() const noexcept { return m_cube; }
3300
3301 bool operator==(cube_iterator const& other) const noexcept {
3302 return other.m_end == m_end;
3303 };
3304 bool operator!=(cube_iterator const& other) const noexcept {
3305 return other.m_end != m_end;
3306 };
3307
3308 };
3309
3310 class cube_generator {
3311 solver& m_solver;
3312 unsigned m_cutoff;
3313 expr_vector m_default_vars;
3314 expr_vector& m_vars;
3315 public:
3316 cube_generator(solver& s):
3317 m_solver(s),
3318 m_cutoff(0xFFFFFFFF),
3319 m_default_vars(s.ctx()),
3320 m_vars(m_default_vars)
3321 {}
3322
3323 cube_generator(solver& s, expr_vector& vars):
3324 m_solver(s),
3325 m_cutoff(0xFFFFFFFF),
3326 m_default_vars(s.ctx()),
3327 m_vars(vars)
3328 {}
3329
3330 cube_iterator begin() { return cube_iterator(m_solver, m_vars, m_cutoff, false); }
3331 cube_iterator end() { return cube_iterator(m_solver, m_vars, m_cutoff, true); }
3332 void set_cutoff(unsigned c) noexcept { m_cutoff = c; }
3333 };
3334
3335 cube_generator cubes() { return cube_generator(*this); }
3336 cube_generator cubes(expr_vector& vars) { return cube_generator(*this, vars); }
3337
3338 };
3339 inline std::ostream & operator<<(std::ostream & out, solver const & s) { out << Z3_solver_to_string(s.ctx(), s); return out; }
3340
3341 class goal : public object {
3342 Z3_goal m_goal;
3343 void init(Z3_goal s) {
3344 m_goal = s;
3345 Z3_goal_inc_ref(ctx(), s);
3346 }
3347 public:
3348 goal(context & c, bool models=true, bool unsat_cores=false, bool proofs=false):object(c) { init(Z3_mk_goal(c, models, unsat_cores, proofs)); }
3349 goal(context & c, Z3_goal s):object(c) { init(s); }
3350 goal(goal const & s):object(s) { init(s.m_goal); }
3351 ~goal() override { Z3_goal_dec_ref(ctx(), m_goal); }
3352 operator Z3_goal() const { return m_goal; }
3353 goal & operator=(goal const & s) {
3354 Z3_goal_inc_ref(s.ctx(), s.m_goal);
3355 Z3_goal_dec_ref(ctx(), m_goal);
3356 object::operator=(s);
3357 m_goal = s.m_goal;
3358 return *this;
3359 }
3360 void add(expr const & f) { check_context(*this, f); Z3_goal_assert(ctx(), m_goal, f); check_error(); }
3361 void add(expr_vector const& v) { check_context(*this, v); for (unsigned i = 0; i < v.size(); ++i) add(v[i]); }
3362 unsigned size() const { return Z3_goal_size(ctx(), m_goal); }
3363 expr operator[](int i) const { assert(0 <= i); Z3_ast r = Z3_goal_formula(ctx(), m_goal, i); check_error(); return expr(ctx(), r); }
3364 Z3_goal_prec precision() const { return Z3_goal_precision(ctx(), m_goal); }
3365 bool inconsistent() const { return Z3_goal_inconsistent(ctx(), m_goal); }
3366 unsigned depth() const { return Z3_goal_depth(ctx(), m_goal); }
3367 void reset() { Z3_goal_reset(ctx(), m_goal); }
3368 unsigned num_exprs() const { return Z3_goal_num_exprs(ctx(), m_goal); }
3369 bool is_decided_sat() const { return Z3_goal_is_decided_sat(ctx(), m_goal); }
3370 bool is_decided_unsat() const { return Z3_goal_is_decided_unsat(ctx(), m_goal); }
3371 model convert_model(model const & m) const {
3372 check_context(*this, m);
3373 Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, m);
3374 check_error();
3375 return model(ctx(), new_m);
3376 }
3377 model get_model() const {
3378 Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, 0);
3379 check_error();
3380 return model(ctx(), new_m);
3381 }
3382 expr as_expr() const {
3383 unsigned n = size();
3384 if (n == 0)
3385 return ctx().bool_val(true);
3386 else if (n == 1)
3387 return operator[](0u);
3388 else {
3389 array<Z3_ast> args(n);
3390 for (unsigned i = 0; i < n; ++i)
3391 args[i] = operator[](i);
3392 return expr(ctx(), Z3_mk_and(ctx(), n, args.ptr()));
3393 }
3394 }
3395 std::string dimacs(bool include_names = true) const { return std::string(Z3_goal_to_dimacs_string(ctx(), m_goal, include_names)); }
3396 friend std::ostream & operator<<(std::ostream & out, goal const & g);
3397 };
3398 inline std::ostream & operator<<(std::ostream & out, goal const & g) { out << Z3_goal_to_string(g.ctx(), g); return out; }
3399
3400 class apply_result : public object {
3401 Z3_apply_result m_apply_result;
3402 void init(Z3_apply_result s) {
3403 m_apply_result = s;
3404 Z3_apply_result_inc_ref(ctx(), s);
3405 }
3406 public:
3407 apply_result(context & c, Z3_apply_result s):object(c) { init(s); }
3408 apply_result(apply_result const & s):object(s) { init(s.m_apply_result); }
3409 ~apply_result() override { Z3_apply_result_dec_ref(ctx(), m_apply_result); }
3410 operator Z3_apply_result() const { return m_apply_result; }
3411 apply_result & operator=(apply_result const & s) {
3412 Z3_apply_result_inc_ref(s.ctx(), s.m_apply_result);
3413 Z3_apply_result_dec_ref(ctx(), m_apply_result);
3414 object::operator=(s);
3415 m_apply_result = s.m_apply_result;
3416 return *this;
3417 }
3418 unsigned size() const { return Z3_apply_result_get_num_subgoals(ctx(), m_apply_result); }
3419 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); }
3420 friend std::ostream & operator<<(std::ostream & out, apply_result const & r);
3421 };
3422 inline std::ostream & operator<<(std::ostream & out, apply_result const & r) { out << Z3_apply_result_to_string(r.ctx(), r); return out; }
3423
3424 class tactic : public object {
3425 Z3_tactic m_tactic;
3426 void init(Z3_tactic s) {
3427 m_tactic = s;
3428 Z3_tactic_inc_ref(ctx(), s);
3429 }
3430 public:
3431 tactic(context & c, char const * name):object(c) { Z3_tactic r = Z3_mk_tactic(c, name); check_error(); init(r); }
3432 tactic(context & c, Z3_tactic s):object(c) { init(s); }
3433 tactic(tactic const & s):object(s) { init(s.m_tactic); }
3434 ~tactic() override { Z3_tactic_dec_ref(ctx(), m_tactic); }
3435 operator Z3_tactic() const { return m_tactic; }
3436 tactic & operator=(tactic const & s) {
3437 Z3_tactic_inc_ref(s.ctx(), s.m_tactic);
3438 Z3_tactic_dec_ref(ctx(), m_tactic);
3439 object::operator=(s);
3440 m_tactic = s.m_tactic;
3441 return *this;
3442 }
3443 solver mk_solver() const { Z3_solver r = Z3_mk_solver_from_tactic(ctx(), m_tactic); check_error(); return solver(ctx(), r); }
3444 apply_result apply(goal const & g) const {
3445 check_context(*this, g);
3446 Z3_apply_result r = Z3_tactic_apply(ctx(), m_tactic, g);
3447 check_error();
3448 return apply_result(ctx(), r);
3449 }
3450 apply_result operator()(goal const & g) const {
3451 return apply(g);
3452 }
3453 std::string help() const { char const * r = Z3_tactic_get_help(ctx(), m_tactic); check_error(); return r; }
3454 friend tactic operator&(tactic const & t1, tactic const & t2);
3455 friend tactic operator|(tactic const & t1, tactic const & t2);
3456 friend tactic repeat(tactic const & t, unsigned max);
3457 friend tactic with(tactic const & t, params const & p);
3458 friend tactic try_for(tactic const & t, unsigned ms);
3459 friend tactic par_or(unsigned n, tactic const* tactics);
3460 friend tactic par_and_then(tactic const& t1, tactic const& t2);
3461 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_tactic_get_param_descrs(ctx(), m_tactic)); }
3462 };
3463
3464 inline tactic operator&(tactic const & t1, tactic const & t2) {
3465 check_context(t1, t2);
3466 Z3_tactic r = Z3_tactic_and_then(t1.ctx(), t1, t2);
3467 t1.check_error();
3468 return tactic(t1.ctx(), r);
3469 }
3470
3471 inline tactic operator|(tactic const & t1, tactic const & t2) {
3472 check_context(t1, t2);
3473 Z3_tactic r = Z3_tactic_or_else(t1.ctx(), t1, t2);
3474 t1.check_error();
3475 return tactic(t1.ctx(), r);
3476 }
3477
3478 inline tactic repeat(tactic const & t, unsigned max=UINT_MAX) {
3479 Z3_tactic r = Z3_tactic_repeat(t.ctx(), t, max);
3480 t.check_error();
3481 return tactic(t.ctx(), r);
3482 }
3483
3484 inline tactic with(tactic const & t, params const & p) {
3485 Z3_tactic r = Z3_tactic_using_params(t.ctx(), t, p);
3486 t.check_error();
3487 return tactic(t.ctx(), r);
3488 }
3489 inline tactic try_for(tactic const & t, unsigned ms) {
3490 Z3_tactic r = Z3_tactic_try_for(t.ctx(), t, ms);
3491 t.check_error();
3492 return tactic(t.ctx(), r);
3493 }
3494 inline tactic par_or(unsigned n, tactic const* tactics) {
3495 if (n == 0) {
3496 Z3_THROW(exception("a non-zero number of tactics need to be passed to par_or"));
3497 }
3498 array<Z3_tactic> buffer(n);
3499 for (unsigned i = 0; i < n; ++i) buffer[i] = tactics[i];
3500 return tactic(tactics[0u].ctx(), Z3_tactic_par_or(tactics[0u].ctx(), n, buffer.ptr()));
3501 }
3502
3503 inline tactic par_and_then(tactic const & t1, tactic const & t2) {
3504 check_context(t1, t2);
3505 Z3_tactic r = Z3_tactic_par_and_then(t1.ctx(), t1, t2);
3506 t1.check_error();
3507 return tactic(t1.ctx(), r);
3508 }
3509
3510 class simplifier : public object {
3511 Z3_simplifier m_simplifier;
3512 void init(Z3_simplifier s) {
3513 m_simplifier = s;
3514 Z3_simplifier_inc_ref(ctx(), s);
3515 }
3516 public:
3517 simplifier(context & c, char const * name):object(c) { Z3_simplifier r = Z3_mk_simplifier(c, name); check_error(); init(r); }
3518 simplifier(context & c, Z3_simplifier s):object(c) { init(s); }
3519 simplifier(simplifier const & s):object(s) { init(s.m_simplifier); }
3520 ~simplifier() override { Z3_simplifier_dec_ref(ctx(), m_simplifier); }
3521 operator Z3_simplifier() const { return m_simplifier; }
3522 simplifier & operator=(simplifier const & s) {
3523 Z3_simplifier_inc_ref(s.ctx(), s.m_simplifier);
3524 Z3_simplifier_dec_ref(ctx(), m_simplifier);
3525 object::operator=(s);
3526 m_simplifier = s.m_simplifier;
3527 return *this;
3528 }
3529 std::string help() const { char const * r = Z3_simplifier_get_help(ctx(), m_simplifier); check_error(); return r; }
3530 friend simplifier operator&(simplifier const & t1, simplifier const & t2);
3531 friend simplifier with(simplifier const & t, params const & p);
3532 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_simplifier_get_param_descrs(ctx(), m_simplifier)); }
3533 };
3534
3535 inline solver::solver(solver const& s, simplifier const& simp):object(s) { init(Z3_solver_add_simplifier(s.ctx(), s, simp)); }
3536
3537
3538 inline simplifier operator&(simplifier const & t1, simplifier const & t2) {
3539 check_context(t1, t2);
3540 Z3_simplifier r = Z3_simplifier_and_then(t1.ctx(), t1, t2);
3541 t1.check_error();
3542 return simplifier(t1.ctx(), r);
3543 }
3544
3545 inline simplifier with(simplifier const & t, params const & p) {
3546 Z3_simplifier r = Z3_simplifier_using_params(t.ctx(), t, p);
3547 t.check_error();
3548 return simplifier(t.ctx(), r);
3549 }
3550
3551 class probe : public object {
3552 Z3_probe m_probe;
3553 void init(Z3_probe s) {
3554 m_probe = s;
3555 Z3_probe_inc_ref(ctx(), s);
3556 }
3557 public:
3558 probe(context & c, char const * name):object(c) { Z3_probe r = Z3_mk_probe(c, name); check_error(); init(r); }
3559 probe(context & c, double val):object(c) { Z3_probe r = Z3_probe_const(c, val); check_error(); init(r); }
3560 probe(context & c, Z3_probe s):object(c) { init(s); }
3561 probe(probe const & s):object(s) { init(s.m_probe); }
3562 ~probe() override { Z3_probe_dec_ref(ctx(), m_probe); }
3563 operator Z3_probe() const { return m_probe; }
3564 probe & operator=(probe const & s) {
3565 Z3_probe_inc_ref(s.ctx(), s.m_probe);
3566 Z3_probe_dec_ref(ctx(), m_probe);
3567 object::operator=(s);
3568 m_probe = s.m_probe;
3569 return *this;
3570 }
3571 double apply(goal const & g) const { double r = Z3_probe_apply(ctx(), m_probe, g); check_error(); return r; }
3572 double operator()(goal const & g) const { return apply(g); }
3573 friend probe operator<=(probe const & p1, probe const & p2);
3574 friend probe operator<=(probe const & p1, double p2);
3575 friend probe operator<=(double p1, probe const & p2);
3576 friend probe operator>=(probe const & p1, probe const & p2);
3577 friend probe operator>=(probe const & p1, double p2);
3578 friend probe operator>=(double p1, probe const & p2);
3579 friend probe operator<(probe const & p1, probe const & p2);
3580 friend probe operator<(probe const & p1, double p2);
3581 friend probe operator<(double p1, probe const & p2);
3582 friend probe operator>(probe const & p1, probe const & p2);
3583 friend probe operator>(probe const & p1, double p2);
3584 friend probe operator>(double p1, probe const & p2);
3585 friend probe operator==(probe const & p1, probe const & p2);
3586 friend probe operator==(probe const & p1, double p2);
3587 friend probe operator==(double p1, probe const & p2);
3588 friend probe operator&&(probe const & p1, probe const & p2);
3589 friend probe operator||(probe const & p1, probe const & p2);
3590 friend probe operator!(probe const & p);
3591 };
3592
3593 inline probe operator<=(probe const & p1, probe const & p2) {
3594 check_context(p1, p2); Z3_probe r = Z3_probe_le(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3595 }
3596 inline probe operator<=(probe const & p1, double p2) { return p1 <= probe(p1.ctx(), p2); }
3597 inline probe operator<=(double p1, probe const & p2) { return probe(p2.ctx(), p1) <= p2; }
3598 inline probe operator>=(probe const & p1, probe const & p2) {
3599 check_context(p1, p2); Z3_probe r = Z3_probe_ge(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3600 }
3601 inline probe operator>=(probe const & p1, double p2) { return p1 >= probe(p1.ctx(), p2); }
3602 inline probe operator>=(double p1, probe const & p2) { return probe(p2.ctx(), p1) >= p2; }
3603 inline probe operator<(probe const & p1, probe const & p2) {
3604 check_context(p1, p2); Z3_probe r = Z3_probe_lt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3605 }
3606 inline probe operator<(probe const & p1, double p2) { return p1 < probe(p1.ctx(), p2); }
3607 inline probe operator<(double p1, probe const & p2) { return probe(p2.ctx(), p1) < p2; }
3608 inline probe operator>(probe const & p1, probe const & p2) {
3609 check_context(p1, p2); Z3_probe r = Z3_probe_gt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3610 }
3611 inline probe operator>(probe const & p1, double p2) { return p1 > probe(p1.ctx(), p2); }
3612 inline probe operator>(double p1, probe const & p2) { return probe(p2.ctx(), p1) > p2; }
3613 inline probe operator==(probe const & p1, probe const & p2) {
3614 check_context(p1, p2); Z3_probe r = Z3_probe_eq(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3615 }
3616 inline probe operator==(probe const & p1, double p2) { return p1 == probe(p1.ctx(), p2); }
3617 inline probe operator==(double p1, probe const & p2) { return probe(p2.ctx(), p1) == p2; }
3618 inline probe operator&&(probe const & p1, probe const & p2) {
3619 check_context(p1, p2); Z3_probe r = Z3_probe_and(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3620 }
3621 inline probe operator||(probe const & p1, probe const & p2) {
3622 check_context(p1, p2); Z3_probe r = Z3_probe_or(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3623 }
3624 inline probe operator!(probe const & p) {
3625 Z3_probe r = Z3_probe_not(p.ctx(), p); p.check_error(); return probe(p.ctx(), r);
3626 }
3627
3628 class optimize : public object {
3629 Z3_optimize m_opt;
3630
3631 public:
3632 struct translate {};
3633 class handle final {
3634 unsigned m_h;
3635 public:
3636 handle(unsigned h): m_h(h) {}
3637 unsigned h() const { return m_h; }
3638 };
3639 optimize(context& c):object(c) { m_opt = Z3_mk_optimize(c); Z3_optimize_inc_ref(c, m_opt); }
3640 optimize(context & c, optimize const& src, translate): object(c) {
3641 Z3_optimize o = Z3_optimize_translate(src.ctx(), src, c);
3642 check_error();
3643 m_opt = o;
3644 Z3_optimize_inc_ref(c, m_opt);
3645 }
3646 optimize(optimize const & o):object(o), m_opt(o.m_opt) {
3647 Z3_optimize_inc_ref(o.ctx(), o.m_opt);
3648 }
3649 optimize(context& c, optimize& src):object(c) {
3650 m_opt = Z3_mk_optimize(c);
3651 Z3_optimize_inc_ref(c, m_opt);
3652 add(expr_vector(c, src.assertions()));
3653 expr_vector v(c, src.objectives());
3654 for (expr_vector::iterator it = v.begin(); it != v.end(); ++it) minimize(*it);
3655 }
3656 optimize& operator=(optimize const& o) {
3657 Z3_optimize_inc_ref(o.ctx(), o.m_opt);
3658 Z3_optimize_dec_ref(ctx(), m_opt);
3659 m_opt = o.m_opt;
3660 object::operator=(o);
3661 return *this;
3662 }
3663 ~optimize() override { Z3_optimize_dec_ref(ctx(), m_opt); }
3664 operator Z3_optimize() const { return m_opt; }
3665 void add(expr const& e) {
3666 assert(e.is_bool());
3667 Z3_optimize_assert(ctx(), m_opt, e);
3668 }
3669 void add(expr_vector const& es) {
3670 for (expr_vector::iterator it = es.begin(); it != es.end(); ++it) add(*it);
3671 }
3672 void add(expr const& e, expr const& t) {
3673 assert(e.is_bool());
3674 Z3_optimize_assert_and_track(ctx(), m_opt, e, t);
3675 }
3676 void add(expr const& e, char const* p) {
3677 assert(e.is_bool());
3678 add(e, ctx().bool_const(p));
3679 }
3680 handle add_soft(expr const& e, unsigned weight) {
3681 assert(e.is_bool());
3682 auto str = std::to_string(weight);
3683 return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, str.c_str(), 0));
3684 }
3685 handle add_soft(expr const& e, char const* weight) {
3686 assert(e.is_bool());
3687 return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, weight, 0));
3688 }
3689 handle add(expr const& e, unsigned weight) {
3690 return add_soft(e, weight);
3691 }
3692 void set_initial_value(expr const& var, expr const& value) {
3693 Z3_optimize_set_initial_value(ctx(), m_opt, var, value);
3694 check_error();
3695 }
3696 void set_initial_value(expr const& var, int i) {
3697 set_initial_value(var, ctx().num_val(i, var.get_sort()));
3698 }
3699 void set_initial_value(expr const& var, bool b) {
3700 set_initial_value(var, ctx().bool_val(b));
3701 }
3702
3703 handle maximize(expr const& e) {
3704 return handle(Z3_optimize_maximize(ctx(), m_opt, e));
3705 }
3706 handle minimize(expr const& e) {
3707 return handle(Z3_optimize_minimize(ctx(), m_opt, e));
3708 }
3709 void push() {
3710 Z3_optimize_push(ctx(), m_opt);
3711 }
3712 void pop() {
3713 Z3_optimize_pop(ctx(), m_opt);
3714 }
3715 check_result check() { Z3_lbool r = Z3_optimize_check(ctx(), m_opt, 0, 0); check_error(); return to_check_result(r); }
3716 check_result check(expr_vector const& asms) {
3717 unsigned n = asms.size();
3718 array<Z3_ast> _asms(n);
3719 for (unsigned i = 0; i < n; ++i) {
3720 check_context(*this, asms[i]);
3721 _asms[i] = asms[i];
3722 }
3723 Z3_lbool r = Z3_optimize_check(ctx(), m_opt, n, _asms.ptr());
3724 check_error();
3725 return to_check_result(r);
3726 }
3727 model get_model() const { Z3_model m = Z3_optimize_get_model(ctx(), m_opt); check_error(); return model(ctx(), m); }
3728 expr_vector unsat_core() const { Z3_ast_vector r = Z3_optimize_get_unsat_core(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3729 void set(params const & p) { Z3_optimize_set_params(ctx(), m_opt, p); check_error(); }
3730 expr lower(handle const& h) {
3731 Z3_ast r = Z3_optimize_get_lower(ctx(), m_opt, h.h());
3732 check_error();
3733 return expr(ctx(), r);
3734 }
3735 expr_vector lower_as_vector(handle const& h) const {
3736 Z3_ast_vector r = Z3_optimize_get_lower_as_vector(ctx(), m_opt, h.h());
3737 check_error();
3738 return expr_vector(ctx(), r);
3739 }
3740 expr upper(handle const& h) {
3741 Z3_ast r = Z3_optimize_get_upper(ctx(), m_opt, h.h());
3742 check_error();
3743 return expr(ctx(), r);
3744 }
3745 expr_vector upper_as_vector(handle const& h) const {
3746 Z3_ast_vector r = Z3_optimize_get_upper_as_vector(ctx(), m_opt, h.h());
3747 check_error();
3748 return expr_vector(ctx(), r);
3749 }
3750 expr_vector assertions() const { Z3_ast_vector r = Z3_optimize_get_assertions(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3751 expr_vector objectives() const { Z3_ast_vector r = Z3_optimize_get_objectives(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3752 stats statistics() const { Z3_stats r = Z3_optimize_get_statistics(ctx(), m_opt); check_error(); return stats(ctx(), r); }
3753 friend std::ostream & operator<<(std::ostream & out, optimize const & s);
3754 void from_file(char const* filename) { Z3_optimize_from_file(ctx(), m_opt, filename); check_error(); }
3755 void from_string(char const* constraints) { Z3_optimize_from_string(ctx(), m_opt, constraints); check_error(); }
3756 std::string help() const { char const * r = Z3_optimize_get_help(ctx(), m_opt); check_error(); return r; }
3757 };
3758 inline std::ostream & operator<<(std::ostream & out, optimize const & s) { out << Z3_optimize_to_string(s.ctx(), s.m_opt); return out; }
3759
3760 class fixedpoint : public object {
3761 Z3_fixedpoint m_fp;
3762 public:
3763 fixedpoint(context& c):object(c) { m_fp = Z3_mk_fixedpoint(c); Z3_fixedpoint_inc_ref(c, m_fp); }
3764 fixedpoint(fixedpoint const & o):object(o), m_fp(o.m_fp) { Z3_fixedpoint_inc_ref(ctx(), m_fp); }
3765 ~fixedpoint() override { Z3_fixedpoint_dec_ref(ctx(), m_fp); }
3766 fixedpoint & operator=(fixedpoint const & o) {
3767 Z3_fixedpoint_inc_ref(o.ctx(), o.m_fp);
3768 Z3_fixedpoint_dec_ref(ctx(), m_fp);
3769 m_fp = o.m_fp;
3770 object::operator=(o);
3771 return *this;
3772 }
3773 operator Z3_fixedpoint() const { return m_fp; }
3774 expr_vector from_string(char const* s) {
3775 Z3_ast_vector r = Z3_fixedpoint_from_string(ctx(), m_fp, s);
3776 check_error();
3777 return expr_vector(ctx(), r);
3778 }
3779 expr_vector from_file(char const* s) {
3780 Z3_ast_vector r = Z3_fixedpoint_from_file(ctx(), m_fp, s);
3781 check_error();
3782 return expr_vector(ctx(), r);
3783 }
3784 void add_rule(expr& rule, symbol const& name) { Z3_fixedpoint_add_rule(ctx(), m_fp, rule, name); check_error(); }
3785 void add_fact(func_decl& f, unsigned * args) { Z3_fixedpoint_add_fact(ctx(), m_fp, f, f.arity(), args); check_error(); }
3786 check_result query(expr& q) { Z3_lbool r = Z3_fixedpoint_query(ctx(), m_fp, q); check_error(); return to_check_result(r); }
3787 check_result query(func_decl_vector& relations) {
3788 array<Z3_func_decl> rs(relations);
3789 Z3_lbool r = Z3_fixedpoint_query_relations(ctx(), m_fp, rs.size(), rs.ptr());
3790 check_error();
3791 return to_check_result(r);
3792 }
3793 expr get_answer() { Z3_ast r = Z3_fixedpoint_get_answer(ctx(), m_fp); check_error(); return expr(ctx(), r); }
3794 std::string reason_unknown() { return Z3_fixedpoint_get_reason_unknown(ctx(), m_fp); }
3795 void update_rule(expr& rule, symbol const& name) { Z3_fixedpoint_update_rule(ctx(), m_fp, rule, name); check_error(); }
3796 unsigned get_num_levels(func_decl& p) { unsigned r = Z3_fixedpoint_get_num_levels(ctx(), m_fp, p); check_error(); return r; }
3797 expr get_cover_delta(int level, func_decl& p) {
3798 Z3_ast r = Z3_fixedpoint_get_cover_delta(ctx(), m_fp, level, p);
3799 check_error();
3800 return expr(ctx(), r);
3801 }
3802 void add_cover(int level, func_decl& p, expr& property) { Z3_fixedpoint_add_cover(ctx(), m_fp, level, p, property); check_error(); }
3803 stats statistics() const { Z3_stats r = Z3_fixedpoint_get_statistics(ctx(), m_fp); check_error(); return stats(ctx(), r); }
3804 void register_relation(func_decl& p) { Z3_fixedpoint_register_relation(ctx(), m_fp, p); }
3805 expr_vector assertions() const { Z3_ast_vector r = Z3_fixedpoint_get_assertions(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
3806 expr_vector rules() const { Z3_ast_vector r = Z3_fixedpoint_get_rules(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
3807 void set(params const & p) { Z3_fixedpoint_set_params(ctx(), m_fp, p); check_error(); }
3808 std::string help() const { return Z3_fixedpoint_get_help(ctx(), m_fp); }
3809 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_fixedpoint_get_param_descrs(ctx(), m_fp)); }
3810 std::string to_string() { return Z3_fixedpoint_to_string(ctx(), m_fp, 0, 0); }
3811 std::string to_string(expr_vector const& queries) {
3812 array<Z3_ast> qs(queries);
3813 return Z3_fixedpoint_to_string(ctx(), m_fp, qs.size(), qs.ptr());
3814 }
3815 };
3816 inline std::ostream & operator<<(std::ostream & out, fixedpoint const & f) { return out << Z3_fixedpoint_to_string(f.ctx(), f, 0, 0); }
3817
3818 inline tactic fail_if(probe const & p) {
3819 Z3_tactic r = Z3_tactic_fail_if(p.ctx(), p);
3820 p.check_error();
3821 return tactic(p.ctx(), r);
3822 }
3823 inline tactic when(probe const & p, tactic const & t) {
3824 check_context(p, t);
3825 Z3_tactic r = Z3_tactic_when(t.ctx(), p, t);
3826 t.check_error();
3827 return tactic(t.ctx(), r);
3828 }
3829 inline tactic cond(probe const & p, tactic const & t1, tactic const & t2) {
3830 check_context(p, t1); check_context(p, t2);
3831 Z3_tactic r = Z3_tactic_cond(t1.ctx(), p, t1, t2);
3832 t1.check_error();
3833 return tactic(t1.ctx(), r);
3834 }
3835
3836 inline symbol context::str_symbol(char const * s) { Z3_symbol r = Z3_mk_string_symbol(m_ctx, s); check_error(); return symbol(*this, r); }
3837 inline symbol context::int_symbol(int n) { Z3_symbol r = Z3_mk_int_symbol(m_ctx, n); check_error(); return symbol(*this, r); }
3838
3839 inline sort context::bool_sort() { Z3_sort s = Z3_mk_bool_sort(m_ctx); check_error(); return sort(*this, s); }
3840 inline sort context::int_sort() { Z3_sort s = Z3_mk_int_sort(m_ctx); check_error(); return sort(*this, s); }
3841 inline sort context::real_sort() { Z3_sort s = Z3_mk_real_sort(m_ctx); check_error(); return sort(*this, s); }
3842 inline sort context::bv_sort(unsigned sz) { Z3_sort s = Z3_mk_bv_sort(m_ctx, sz); check_error(); return sort(*this, s); }
3843 inline sort context::string_sort() { Z3_sort s = Z3_mk_string_sort(m_ctx); check_error(); return sort(*this, s); }
3844 inline sort context::char_sort() { Z3_sort s = Z3_mk_char_sort(m_ctx); check_error(); return sort(*this, s); }
3845 inline sort context::seq_sort(sort& s) { Z3_sort r = Z3_mk_seq_sort(m_ctx, s); check_error(); return sort(*this, r); }
3846 inline sort context::re_sort(sort& s) { Z3_sort r = Z3_mk_re_sort(m_ctx, s); check_error(); return sort(*this, r); }
3847 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); }
3848 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); }
3849
3850 template<>
3851 inline sort context::fpa_sort<16>() { return fpa_sort(5, 11); }
3852
3853 template<>
3854 inline sort context::fpa_sort<32>() { return fpa_sort(8, 24); }
3855
3856 template<>
3857 inline sort context::fpa_sort<64>() { return fpa_sort(11, 53); }
3858
3859 template<>
3860 inline sort context::fpa_sort<128>() { return fpa_sort(15, 113); }
3861
3862 inline sort context::fpa_rounding_mode_sort() { Z3_sort r = Z3_mk_fpa_rounding_mode_sort(m_ctx); check_error(); return sort(*this, r); }
3863
3864 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); }
3865 inline sort context::array_sort(sort_vector const& d, sort r) {
3866 array<Z3_sort> dom(d);
3867 Z3_sort s = Z3_mk_array_sort_n(m_ctx, dom.size(), dom.ptr(), r); check_error(); return sort(*this, s);
3868 }
3869 inline sort context::enumeration_sort(char const * name, unsigned n, char const * const * enum_names, func_decl_vector & cs, func_decl_vector & ts) {
3870 array<Z3_symbol> _enum_names(n);
3871 for (unsigned i = 0; i < n; ++i) { _enum_names[i] = Z3_mk_string_symbol(*this, enum_names[i]); }
3872 array<Z3_func_decl> _cs(n);
3873 array<Z3_func_decl> _ts(n);
3874 Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3875 sort s = to_sort(*this, Z3_mk_enumeration_sort(*this, _name, n, _enum_names.ptr(), _cs.ptr(), _ts.ptr()));
3876 check_error();
3877 for (unsigned i = 0; i < n; ++i) { cs.push_back(func_decl(*this, _cs[i])); ts.push_back(func_decl(*this, _ts[i])); }
3878 return s;
3879 }
3880 inline func_decl context::tuple_sort(char const * name, unsigned n, char const * const * names, sort const* sorts, func_decl_vector & projs) {
3881 array<Z3_symbol> _names(n);
3882 array<Z3_sort> _sorts(n);
3883 for (unsigned i = 0; i < n; ++i) { _names[i] = Z3_mk_string_symbol(*this, names[i]); _sorts[i] = sorts[i]; }
3884 array<Z3_func_decl> _projs(n);
3885 Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3886 Z3_func_decl tuple;
3887 sort _ignore_s = to_sort(*this, Z3_mk_tuple_sort(*this, _name, n, _names.ptr(), _sorts.ptr(), &tuple, _projs.ptr()));
3888 check_error();
3889 for (unsigned i = 0; i < n; ++i) { projs.push_back(func_decl(*this, _projs[i])); }
3890 return func_decl(*this, tuple);
3891 }
3892
3893 class constructor_list {
3894 context& ctx;
3895 Z3_constructor_list clist;
3896 public:
3897 constructor_list(constructors const& cs);
3898 ~constructor_list() { Z3_del_constructor_list(ctx, clist); }
3899 operator Z3_constructor_list() const { return clist; }
3900 };
3901
3902 class constructors {
3903 friend class constructor_list;
3904 context& ctx;
3905 std::vector<Z3_constructor> cons;
3906 std::vector<unsigned> num_fields;
3907 public:
3908 constructors(context& ctx): ctx(ctx) {}
3909
3910 ~constructors() {
3911 for (auto con : cons)
3912 Z3_del_constructor(ctx, con);
3913 }
3914
3915 void add(symbol const& name, symbol const& rec, unsigned n, symbol const* names, sort const* fields) {
3916 array<unsigned> sort_refs(n);
3917 array<Z3_sort> sorts(n);
3918 array<Z3_symbol> _names(n);
3919 for (unsigned i = 0; i < n; ++i) sorts[i] = fields[i], _names[i] = names[i];
3920 cons.push_back(Z3_mk_constructor(ctx, name, rec, n, _names.ptr(), sorts.ptr(), sort_refs.ptr()));
3921 num_fields.push_back(n);
3922 }
3923
3924 Z3_constructor operator[](unsigned i) const { return cons[i]; }
3925
3926 unsigned size() const { return (unsigned)cons.size(); }
3927
3928 void query(unsigned i, func_decl& constructor, func_decl& test, func_decl_vector& accs) {
3929 Z3_func_decl _constructor;
3930 Z3_func_decl _test;
3931 array<Z3_func_decl> accessors(num_fields[i]);
3932 accs.resize(0);
3934 cons[i],
3935 num_fields[i],
3936 &_constructor,
3937 &_test,
3938 accessors.ptr());
3939 constructor = func_decl(ctx, _constructor);
3940
3941 test = func_decl(ctx, _test);
3942 for (unsigned j = 0; j < num_fields[i]; ++j)
3943 accs.push_back(func_decl(ctx, accessors[j]));
3944 }
3945 };
3946
3947 inline constructor_list::constructor_list(constructors const& cs): ctx(cs.ctx) {
3948 array<Z3_constructor> cons(cs.size());
3949 for (unsigned i = 0; i < cs.size(); ++i)
3950 cons[i] = cs[i];
3951 clist = Z3_mk_constructor_list(ctx, cs.size(), cons.ptr());
3952 }
3953
3954 inline sort context::datatype(symbol const& name, constructors const& cs) {
3955 array<Z3_constructor> _cs(cs.size());
3956 for (unsigned i = 0; i < cs.size(); ++i) _cs[i] = cs[i];
3957 Z3_sort s = Z3_mk_datatype(*this, name, cs.size(), _cs.ptr());
3958 check_error();
3959 return sort(*this, s);
3960 }
3961
3962 inline sort context::datatype(symbol const &name, sort_vector const& params, constructors const &cs) {
3963 array<Z3_sort> _params(params);
3964 array<Z3_constructor> _cs(cs.size());
3965 for (unsigned i = 0; i < cs.size(); ++i)
3966 _cs[i] = cs[i];
3967 Z3_sort s = Z3_mk_polymorphic_datatype(*this, name, _params.size(), _params.ptr(), cs.size(), _cs.ptr());
3968 check_error();
3969 return sort(*this, s);
3970 }
3971
3972 inline sort_vector context::datatypes(
3973 unsigned n, symbol const* names,
3974 constructor_list *const* cons) {
3975 sort_vector result(*this);
3976 array<Z3_symbol> _names(n);
3977 array<Z3_sort> _sorts(n);
3978 array<Z3_constructor_list> _cons(n);
3979 for (unsigned i = 0; i < n; ++i)
3980 _names[i] = names[i], _cons[i] = *cons[i];
3981 Z3_mk_datatypes(*this, n, _names.ptr(), _sorts.ptr(), _cons.ptr());
3982 for (unsigned i = 0; i < n; ++i)
3983 result.push_back(sort(*this, _sorts[i]));
3984 return result;
3985 }
3986
3987
3988 inline sort context::datatype_sort(symbol const& name) {
3989 Z3_sort s = Z3_mk_datatype_sort(*this, name, 0, nullptr);
3990 check_error();
3991 return sort(*this, s);
3992 }
3993
3994 inline sort context::datatype_sort(symbol const& name, sort_vector const& params) {
3995 array<Z3_sort> _params(params);
3996 Z3_sort s = Z3_mk_datatype_sort(*this, name, _params.size(), _params.ptr());
3997 check_error();
3998 return sort(*this, s);
3999 }
4000
4001
4002 inline sort context::uninterpreted_sort(char const* name) {
4003 Z3_symbol _name = Z3_mk_string_symbol(*this, name);
4004 return to_sort(*this, Z3_mk_uninterpreted_sort(*this, _name));
4005 }
4006 inline sort context::uninterpreted_sort(symbol const& name) {
4007 return to_sort(*this, Z3_mk_uninterpreted_sort(*this, name));
4008 }
4009
4010 inline func_decl context::function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
4011 array<Z3_sort> args(arity);
4012 for (unsigned i = 0; i < arity; ++i) {
4013 check_context(domain[i], range);
4014 args[i] = domain[i];
4015 }
4016 Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, arity, args.ptr(), range);
4017 check_error();
4018 return func_decl(*this, f);
4019 }
4020
4021 inline func_decl context::function(char const * name, unsigned arity, sort const * domain, sort const & range) {
4022 return function(range.ctx().str_symbol(name), arity, domain, range);
4023 }
4024
4025 inline func_decl context::function(symbol const& name, sort_vector const& domain, sort const& range) {
4026 array<Z3_sort> args(domain.size());
4027 for (unsigned i = 0; i < domain.size(); ++i) {
4028 check_context(domain[i], range);
4029 args[i] = domain[i];
4030 }
4031 Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, domain.size(), args.ptr(), range);
4032 check_error();
4033 return func_decl(*this, f);
4034 }
4035
4036 inline func_decl context::function(char const * name, sort_vector const& domain, sort const& range) {
4037 return function(range.ctx().str_symbol(name), domain, range);
4038 }
4039
4040
4041 inline func_decl context::function(char const * name, sort const & domain, sort const & range) {
4042 check_context(domain, range);
4043 Z3_sort args[1] = { domain };
4044 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 1, args, range);
4045 check_error();
4046 return func_decl(*this, f);
4047 }
4048
4049 inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & range) {
4050 check_context(d1, range); check_context(d2, range);
4051 Z3_sort args[2] = { d1, d2 };
4052 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 2, args, range);
4053 check_error();
4054 return func_decl(*this, f);
4055 }
4056
4057 inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
4058 check_context(d1, range); check_context(d2, range); check_context(d3, range);
4059 Z3_sort args[3] = { d1, d2, d3 };
4060 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 3, args, range);
4061 check_error();
4062 return func_decl(*this, f);
4063 }
4064
4065 inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
4066 check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range);
4067 Z3_sort args[4] = { d1, d2, d3, d4 };
4068 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 4, args, range);
4069 check_error();
4070 return func_decl(*this, f);
4071 }
4072
4073 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) {
4074 check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range); check_context(d5, range);
4075 Z3_sort args[5] = { d1, d2, d3, d4, d5 };
4076 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 5, args, range);
4077 check_error();
4078 return func_decl(*this, f);
4079 }
4080
4081 inline func_decl context::recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
4082 array<Z3_sort> args(arity);
4083 for (unsigned i = 0; i < arity; ++i) {
4084 check_context(domain[i], range);
4085 args[i] = domain[i];
4086 }
4087 Z3_func_decl f = Z3_mk_rec_func_decl(m_ctx, name, arity, args.ptr(), range);
4088 check_error();
4089 return func_decl(*this, f);
4090
4091 }
4092
4093 inline func_decl context::recfun(symbol const & name, sort_vector const& domain, sort const & range) {
4094 check_context(domain, range);
4095 array<Z3_sort> domain1(domain);
4096 Z3_func_decl f = Z3_mk_rec_func_decl(m_ctx, name, domain1.size(), domain1.ptr(), range);
4097 check_error();
4098 return func_decl(*this, f);
4099 }
4100
4101 inline func_decl context::recfun(char const * name, sort_vector const& domain, sort const & range) {
4102 return recfun(str_symbol(name), domain, range);
4103
4104 }
4105
4106 inline func_decl context::recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
4107 return recfun(str_symbol(name), arity, domain, range);
4108 }
4109
4110 inline func_decl context::recfun(char const * name, sort const& d1, sort const & range) {
4111 return recfun(str_symbol(name), 1, &d1, range);
4112 }
4113
4114 inline func_decl context::recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
4115 sort dom[2] = { d1, d2 };
4116 return recfun(str_symbol(name), 2, dom, range);
4117 }
4118
4119 inline void context::recdef(func_decl f, expr_vector const& args, expr const& body) {
4120 check_context(f, args); check_context(f, body);
4121 array<Z3_ast> vars(args);
4122 Z3_add_rec_def(f.ctx(), f, vars.size(), vars.ptr(), body);
4123 }
4124
4125 inline func_decl context::user_propagate_function(symbol const& name, sort_vector const& domain, sort const& range) {
4126 check_context(domain, range);
4127 array<Z3_sort> domain1(domain);
4128 Z3_func_decl f = Z3_solver_propagate_declare(range.ctx(), name, domain1.size(), domain1.ptr(), range);
4129 check_error();
4130 return func_decl(*this, f);
4131 }
4132
4133 inline expr context::constant(symbol const & name, sort const & s) {
4134 Z3_ast r = Z3_mk_const(m_ctx, name, s);
4135 check_error();
4136 return expr(*this, r);
4137 }
4138 inline expr context::constant(char const * name, sort const & s) { return constant(str_symbol(name), s); }
4139 inline expr context::variable(unsigned idx, sort const& s) {
4140 Z3_ast r = Z3_mk_bound(m_ctx, idx, s);
4141 check_error();
4142 return expr(*this, r);
4143 }
4144 inline expr context::bool_const(char const * name) { return constant(name, bool_sort()); }
4145 inline expr context::int_const(char const * name) { return constant(name, int_sort()); }
4146 inline expr context::real_const(char const * name) { return constant(name, real_sort()); }
4147 inline expr context::string_const(char const * name) { return constant(name, string_sort()); }
4148 inline expr context::bv_const(char const * name, unsigned sz) { return constant(name, bv_sort(sz)); }
4149 inline expr context::fpa_const(char const * name, unsigned ebits, unsigned sbits) { return constant(name, fpa_sort(ebits, sbits)); }
4150
4151 template<size_t precision>
4152 inline expr context::fpa_const(char const * name) { return constant(name, fpa_sort<precision>()); }
4153
4154 inline void context::set_rounding_mode(rounding_mode rm) { m_rounding_mode = rm; }
4155
4156 inline expr context::fpa_rounding_mode() {
4157 switch (m_rounding_mode) {
4158 case RNA: return expr(*this, Z3_mk_fpa_rna(m_ctx));
4159 case RNE: return expr(*this, Z3_mk_fpa_rne(m_ctx));
4160 case RTP: return expr(*this, Z3_mk_fpa_rtp(m_ctx));
4161 case RTN: return expr(*this, Z3_mk_fpa_rtn(m_ctx));
4162 case RTZ: return expr(*this, Z3_mk_fpa_rtz(m_ctx));
4163 }
4164 assert(false);
4165 return expr(*this, Z3_mk_fpa_rne(m_ctx));
4166 }
4167
4168 inline expr context::bool_val(bool b) { return b ? expr(*this, Z3_mk_true(m_ctx)) : expr(*this, Z3_mk_false(m_ctx)); }
4169
4170 inline expr context::int_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, int_sort()); check_error(); return expr(*this, r); }
4171 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); }
4172 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); }
4173 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); }
4174 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); }
4175
4176 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); }
4177 inline expr context::real_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, real_sort()); check_error(); return expr(*this, r); }
4178 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); }
4179 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); }
4180 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); }
4181 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); }
4182
4183 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); }
4184 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); }
4185 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); }
4186 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); }
4187 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); }
4188 inline expr context::bv_val(unsigned n, bool const* bits) {
4189 array<bool> _bits(n);
4190 for (unsigned i = 0; i < n; ++i) _bits[i] = bits[i] ? 1 : 0;
4191 Z3_ast r = Z3_mk_bv_numeral(m_ctx, n, _bits.ptr()); check_error(); return expr(*this, r);
4192 }
4193
4194 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); }
4195 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); }
4196 inline expr context::fpa_nan(sort const & s) { Z3_ast r = Z3_mk_fpa_nan(m_ctx, s); check_error(); return expr(*this, r); }
4197 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); }
4198
4199 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); }
4200 inline expr context::string_val(char const* s) { Z3_ast r = Z3_mk_string(m_ctx, s); check_error(); return expr(*this, r); }
4201 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); }
4202 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); }
4203
4204 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); }
4205
4206 inline expr func_decl::operator()(unsigned n, expr const * args) const {
4207 array<Z3_ast> _args(n);
4208 for (unsigned i = 0; i < n; ++i) {
4209 check_context(*this, args[i]);
4210 _args[i] = args[i];
4211 }
4212 Z3_ast r = Z3_mk_app(ctx(), *this, n, _args.ptr());
4213 check_error();
4214 return expr(ctx(), r);
4215
4216 }
4217 inline expr func_decl::operator()(expr_vector const& args) const {
4218 array<Z3_ast> _args(args.size());
4219 for (unsigned i = 0; i < args.size(); ++i) {
4220 check_context(*this, args[i]);
4221 _args[i] = args[i];
4222 }
4223 Z3_ast r = Z3_mk_app(ctx(), *this, args.size(), _args.ptr());
4224 check_error();
4225 return expr(ctx(), r);
4226 }
4227 inline expr func_decl::operator()() const {
4228 Z3_ast r = Z3_mk_app(ctx(), *this, 0, 0);
4229 ctx().check_error();
4230 return expr(ctx(), r);
4231 }
4232 inline expr func_decl::operator()(expr const & a) const {
4233 check_context(*this, a);
4234 Z3_ast args[1] = { a };
4235 Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
4236 ctx().check_error();
4237 return expr(ctx(), r);
4238 }
4239 inline expr func_decl::operator()(int a) const {
4240 Z3_ast args[1] = { ctx().num_val(a, domain(0)) };
4241 Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
4242 ctx().check_error();
4243 return expr(ctx(), r);
4244 }
4245 inline expr func_decl::operator()(expr const & a1, expr const & a2) const {
4246 check_context(*this, a1); check_context(*this, a2);
4247 Z3_ast args[2] = { a1, a2 };
4248 Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4249 ctx().check_error();
4250 return expr(ctx(), r);
4251 }
4252 inline expr func_decl::operator()(expr const & a1, int a2) const {
4253 check_context(*this, a1);
4254 Z3_ast args[2] = { a1, ctx().num_val(a2, domain(1)) };
4255 Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4256 ctx().check_error();
4257 return expr(ctx(), r);
4258 }
4259 inline expr func_decl::operator()(int a1, expr const & a2) const {
4260 check_context(*this, a2);
4261 Z3_ast args[2] = { ctx().num_val(a1, domain(0)), a2 };
4262 Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4263 ctx().check_error();
4264 return expr(ctx(), r);
4265 }
4266 inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3) const {
4267 check_context(*this, a1); check_context(*this, a2); check_context(*this, a3);
4268 Z3_ast args[3] = { a1, a2, a3 };
4269 Z3_ast r = Z3_mk_app(ctx(), *this, 3, args);
4270 ctx().check_error();
4271 return expr(ctx(), r);
4272 }
4273 inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const {
4274 check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4);
4275 Z3_ast args[4] = { a1, a2, a3, a4 };
4276 Z3_ast r = Z3_mk_app(ctx(), *this, 4, args);
4277 ctx().check_error();
4278 return expr(ctx(), r);
4279 }
4280 inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const {
4281 check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4); check_context(*this, a5);
4282 Z3_ast args[5] = { a1, a2, a3, a4, a5 };
4283 Z3_ast r = Z3_mk_app(ctx(), *this, 5, args);
4284 ctx().check_error();
4285 return expr(ctx(), r);
4286 }
4287
4288 inline expr to_real(expr const & a) { Z3_ast r = Z3_mk_int2real(a.ctx(), a); a.check_error(); return expr(a.ctx(), r); }
4289
4290 inline func_decl function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
4291 return range.ctx().function(name, arity, domain, range);
4292 }
4293 inline func_decl function(char const * name, unsigned arity, sort const * domain, sort const & range) {
4294 return range.ctx().function(name, arity, domain, range);
4295 }
4296 inline func_decl function(char const * name, sort const & domain, sort const & range) {
4297 return range.ctx().function(name, domain, range);
4298 }
4299 inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & range) {
4300 return range.ctx().function(name, d1, d2, range);
4301 }
4302 inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
4303 return range.ctx().function(name, d1, d2, d3, range);
4304 }
4305 inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
4306 return range.ctx().function(name, d1, d2, d3, d4, range);
4307 }
4308 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) {
4309 return range.ctx().function(name, d1, d2, d3, d4, d5, range);
4310 }
4311 inline func_decl function(char const* name, sort_vector const& domain, sort const& range) {
4312 return range.ctx().function(name, domain, range);
4313 }
4314 inline func_decl function(std::string const& name, sort_vector const& domain, sort const& range) {
4315 return range.ctx().function(name.c_str(), domain, range);
4316 }
4317
4318 inline func_decl recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
4319 return range.ctx().recfun(name, arity, domain, range);
4320 }
4321 inline func_decl recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
4322 return range.ctx().recfun(name, arity, domain, range);
4323 }
4324 inline func_decl recfun(char const * name, sort const& d1, sort const & range) {
4325 return range.ctx().recfun(name, d1, range);
4326 }
4327 inline func_decl recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
4328 return range.ctx().recfun(name, d1, d2, range);
4329 }
4330
4331 inline expr select(expr const & a, expr const & i) {
4332 check_context(a, i);
4333 Z3_ast r = Z3_mk_select(a.ctx(), a, i);
4334 a.check_error();
4335 return expr(a.ctx(), r);
4336 }
4337 inline expr select(expr const & a, int i) {
4338 return select(a, a.ctx().num_val(i, a.get_sort().array_domain()));
4339 }
4340 inline expr select(expr const & a, expr_vector const & i) {
4341 check_context(a, i);
4342 array<Z3_ast> idxs(i);
4343 Z3_ast r = Z3_mk_select_n(a.ctx(), a, idxs.size(), idxs.ptr());
4344 a.check_error();
4345 return expr(a.ctx(), r);
4346 }
4347
4348 inline expr store(expr const & a, expr const & i, expr const & v) {
4349 check_context(a, i); check_context(a, v);
4350 Z3_ast r = Z3_mk_store(a.ctx(), a, i, v);
4351 a.check_error();
4352 return expr(a.ctx(), r);
4353 }
4354
4355 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); }
4356 inline expr store(expr const & a, expr i, int v) { return store(a, i, a.ctx().num_val(v, a.get_sort().array_range())); }
4357 inline expr store(expr const & a, int i, int v) {
4358 return store(a, a.ctx().num_val(i, a.get_sort().array_domain()), a.ctx().num_val(v, a.get_sort().array_range()));
4359 }
4360 inline expr store(expr const & a, expr_vector const & i, expr const & v) {
4361 check_context(a, i); check_context(a, v);
4362 array<Z3_ast> idxs(i);
4363 Z3_ast r = Z3_mk_store_n(a.ctx(), a, idxs.size(), idxs.ptr(), v);
4364 a.check_error();
4365 return expr(a.ctx(), r);
4366 }
4367
4368 inline expr as_array(func_decl & f) {
4369 Z3_ast r = Z3_mk_as_array(f.ctx(), f);
4370 f.check_error();
4371 return expr(f.ctx(), r);
4372 }
4373
4374 inline expr array_default(expr const & a) {
4375 Z3_ast r = Z3_mk_array_default(a.ctx(), a);
4376 a.check_error();
4377 return expr(a.ctx(), r);
4378 }
4379
4380 inline expr array_ext(expr const & a, expr const & b) {
4381 check_context(a, b);
4382 Z3_ast r = Z3_mk_array_ext(a.ctx(), a, b);
4383 a.check_error();
4384 return expr(a.ctx(), r);
4385 }
4386
4387#define MK_EXPR1(_fn, _arg) \
4388 Z3_ast r = _fn(_arg.ctx(), _arg); \
4389 _arg.check_error(); \
4390 return expr(_arg.ctx(), r);
4391
4392#define MK_EXPR2(_fn, _arg1, _arg2) \
4393 check_context(_arg1, _arg2); \
4394 Z3_ast r = _fn(_arg1.ctx(), _arg1, _arg2); \
4395 _arg1.check_error(); \
4396 return expr(_arg1.ctx(), r);
4397
4398 inline expr const_array(sort const & d, expr const & v) {
4400 }
4401
4402 inline expr empty_set(sort const& s) {
4404 }
4405
4406 inline expr full_set(sort const& s) {
4408 }
4409
4410 inline expr set_add(expr const& s, expr const& e) {
4411 MK_EXPR2(Z3_mk_set_add, s, e);
4412 }
4413
4414 inline expr set_del(expr const& s, expr const& e) {
4415 MK_EXPR2(Z3_mk_set_del, s, e);
4416 }
4417
4418 inline expr set_union(expr const& a, expr const& b) {
4419 check_context(a, b);
4420 Z3_ast es[2] = { a, b };
4421 Z3_ast r = Z3_mk_set_union(a.ctx(), 2, es);
4422 a.check_error();
4423 return expr(a.ctx(), r);
4424 }
4425
4426 inline expr set_intersect(expr const& a, expr const& b) {
4427 check_context(a, b);
4428 Z3_ast es[2] = { a, b };
4429 Z3_ast r = Z3_mk_set_intersect(a.ctx(), 2, es);
4430 a.check_error();
4431 return expr(a.ctx(), r);
4432 }
4433
4434 inline expr set_difference(expr const& a, expr const& b) {
4436 }
4437
4438 inline expr set_complement(expr const& a) {
4440 }
4441
4442 inline expr set_member(expr const& s, expr const& e) {
4444 }
4445
4446 inline expr set_subset(expr const& a, expr const& b) {
4448 }
4449
4450 // finite set operations
4451
4452 inline expr finite_set_empty(sort const& s) {
4453 Z3_ast r = Z3_mk_finite_set_empty(s.ctx(), s);
4454 s.check_error();
4455 return expr(s.ctx(), r);
4456 }
4457
4458 inline expr finite_set_singleton(expr const& e) {
4460 }
4461
4462 inline expr finite_set_union(expr const& a, expr const& b) {
4464 }
4465
4466 inline expr finite_set_intersect(expr const& a, expr const& b) {
4468 }
4469
4470 inline expr finite_set_difference(expr const& a, expr const& b) {
4472 }
4473
4474 inline expr finite_set_member(expr const& e, expr const& s) {
4476 }
4477
4478 inline expr finite_set_size(expr const& s) {
4480 }
4481
4482 inline expr finite_set_subset(expr const& a, expr const& b) {
4484 }
4485
4486 inline expr finite_set_map(expr const& f, expr const& s) {
4488 }
4489
4490 inline expr finite_set_filter(expr const& f, expr const& s) {
4492 }
4493
4494 inline expr finite_set_range(expr const& low, expr const& high) {
4495 MK_EXPR2(Z3_mk_finite_set_range, low, high);
4496 }
4497
4498 // sequence and regular expression operations.
4499 // union is +
4500 // concat is overloaded to handle sequences and regular expressions
4501
4502 inline expr empty(sort const& s) {
4503 Z3_ast r = Z3_mk_seq_empty(s.ctx(), s);
4504 s.check_error();
4505 return expr(s.ctx(), r);
4506 }
4507 inline expr suffixof(expr const& a, expr const& b) {
4508 check_context(a, b);
4509 Z3_ast r = Z3_mk_seq_suffix(a.ctx(), a, b);
4510 a.check_error();
4511 return expr(a.ctx(), r);
4512 }
4513 inline expr prefixof(expr const& a, expr const& b) {
4514 check_context(a, b);
4515 Z3_ast r = Z3_mk_seq_prefix(a.ctx(), a, b);
4516 a.check_error();
4517 return expr(a.ctx(), r);
4518 }
4519 inline expr indexof(expr const& s, expr const& substr, expr const& offset) {
4520 check_context(s, substr); check_context(s, offset);
4521 Z3_ast r = Z3_mk_seq_index(s.ctx(), s, substr, offset);
4522 s.check_error();
4523 return expr(s.ctx(), r);
4524 }
4525 inline expr last_indexof(expr const& s, expr const& substr) {
4526 check_context(s, substr);
4527 Z3_ast r = Z3_mk_seq_last_index(s.ctx(), s, substr);
4528 s.check_error();
4529 return expr(s.ctx(), r);
4530 }
4531 inline expr to_re(expr const& s) {
4533 }
4534 inline expr in_re(expr const& s, expr const& re) {
4535 MK_EXPR2(Z3_mk_seq_in_re, s, re);
4536 }
4537 inline expr plus(expr const& re) {
4539 }
4540 inline expr option(expr const& re) {
4542 }
4543 inline expr star(expr const& re) {
4545 }
4546 inline expr re_empty(sort const& s) {
4547 Z3_ast r = Z3_mk_re_empty(s.ctx(), s);
4548 s.check_error();
4549 return expr(s.ctx(), r);
4550 }
4551 inline expr re_full(sort const& s) {
4552 Z3_ast r = Z3_mk_re_full(s.ctx(), s);
4553 s.check_error();
4554 return expr(s.ctx(), r);
4555 }
4556 inline expr re_intersect(expr_vector const& args) {
4557 assert(args.size() > 0);
4558 context& ctx = args[0u].ctx();
4559 array<Z3_ast> _args(args);
4560 Z3_ast r = Z3_mk_re_intersect(ctx, _args.size(), _args.ptr());
4561 ctx.check_error();
4562 return expr(ctx, r);
4563 }
4564 inline expr re_diff(expr const& a, expr const& b) {
4565 check_context(a, b);
4566 context& ctx = a.ctx();
4567 Z3_ast r = Z3_mk_re_diff(ctx, a, b);
4568 ctx.check_error();
4569 return expr(ctx, r);
4570 }
4571 inline expr re_complement(expr const& a) {
4573 }
4574 inline expr range(expr const& lo, expr const& hi) {
4575 check_context(lo, hi);
4576 Z3_ast r = Z3_mk_re_range(lo.ctx(), lo, hi);
4577 lo.check_error();
4578 return expr(lo.ctx(), r);
4579 }
4580
4581
4582
4583
4584
4585 inline expr_vector context::parse_string(char const* s) {
4586 Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, 0, 0, 0, 0, 0, 0);
4587 check_error();
4588 return expr_vector(*this, r);
4589
4590 }
4591 inline expr_vector context::parse_file(char const* s) {
4592 Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, 0, 0, 0, 0, 0, 0);
4593 check_error();
4594 return expr_vector(*this, r);
4595 }
4596
4597 inline expr_vector context::parse_string(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
4598 array<Z3_symbol> sort_names(sorts.size());
4599 array<Z3_symbol> decl_names(decls.size());
4600 array<Z3_sort> sorts1(sorts);
4601 array<Z3_func_decl> decls1(decls);
4602 for (unsigned i = 0; i < sorts.size(); ++i) {
4603 sort_names[i] = sorts[i].name();
4604 }
4605 for (unsigned i = 0; i < decls.size(); ++i) {
4606 decl_names[i] = decls[i].name();
4607 }
4608
4609 Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
4610 check_error();
4611 return expr_vector(*this, r);
4612 }
4613
4614 inline expr_vector context::parse_file(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
4615 array<Z3_symbol> sort_names(sorts.size());
4616 array<Z3_symbol> decl_names(decls.size());
4617 array<Z3_sort> sorts1(sorts);
4618 array<Z3_func_decl> decls1(decls);
4619 for (unsigned i = 0; i < sorts.size(); ++i) {
4620 sort_names[i] = sorts[i].name();
4621 }
4622 for (unsigned i = 0; i < decls.size(); ++i) {
4623 decl_names[i] = decls[i].name();
4624 }
4625 Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
4626 check_error();
4627 return expr_vector(*this, r);
4628 }
4629
4630 inline func_decl_vector sort::constructors() {
4631 assert(is_datatype());
4632 func_decl_vector cs(ctx());
4633 unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), *this);
4634 for (unsigned i = 0; i < n; ++i)
4635 cs.push_back(func_decl(ctx(), Z3_get_datatype_sort_constructor(ctx(), *this, i)));
4636 return cs;
4637 }
4638
4639 inline func_decl_vector sort::recognizers() {
4640 assert(is_datatype());
4641 func_decl_vector rs(ctx());
4642 unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), *this);
4643 for (unsigned i = 0; i < n; ++i)
4644 rs.push_back(func_decl(ctx(), Z3_get_datatype_sort_recognizer(ctx(), *this, i)));
4645 return rs;
4646 }
4647
4648 inline func_decl_vector func_decl::accessors() {
4649 sort s = range();
4650 assert(s.is_datatype());
4651 unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), s);
4652 unsigned idx = 0;
4653 for (; idx < n; ++idx) {
4654 func_decl f(ctx(), Z3_get_datatype_sort_constructor(ctx(), s, idx));
4655 if (id() == f.id())
4656 break;
4657 }
4658 assert(idx < n);
4659 n = arity();
4660 func_decl_vector as(ctx());
4661 for (unsigned i = 0; i < n; ++i)
4662 as.push_back(func_decl(ctx(), Z3_get_datatype_sort_constructor_accessor(ctx(), s, idx, i)));
4663 return as;
4664 }
4665
4666
4667 inline expr expr::substitute(expr_vector const& src, expr_vector const& dst) {
4668 assert(src.size() == dst.size());
4669 array<Z3_ast> _src(src.size());
4670 array<Z3_ast> _dst(dst.size());
4671 for (unsigned i = 0; i < src.size(); ++i) {
4672 _src[i] = src[i];
4673 _dst[i] = dst[i];
4674 }
4675 Z3_ast r = Z3_substitute(ctx(), m_ast, src.size(), _src.ptr(), _dst.ptr());
4676 check_error();
4677 return expr(ctx(), r);
4678 }
4679
4680 inline expr expr::substitute(expr_vector const& dst) {
4681 array<Z3_ast> _dst(dst.size());
4682 for (unsigned i = 0; i < dst.size(); ++i) {
4683 _dst[i] = dst[i];
4684 }
4685 Z3_ast r = Z3_substitute_vars(ctx(), m_ast, dst.size(), _dst.ptr());
4686 check_error();
4687 return expr(ctx(), r);
4688 }
4689
4690 inline expr expr::substitute(func_decl_vector const& funs, expr_vector const& dst) {
4691 array<Z3_ast> _dst(dst.size());
4692 array<Z3_func_decl> _funs(funs.size());
4693 if (dst.size() != funs.size()) {
4694 Z3_THROW(exception("length of argument lists don't align"));
4695 return expr(ctx(), nullptr);
4696 }
4697 for (unsigned i = 0; i < dst.size(); ++i) {
4698 _dst[i] = dst[i];
4699 _funs[i] = funs[i];
4700 }
4701 Z3_ast r = Z3_substitute_funs(ctx(), m_ast, dst.size(), _funs.ptr(), _dst.ptr());
4702 check_error();
4703 return expr(ctx(), r);
4704 }
4705
4706 inline expr expr::update(expr_vector const& args) const {
4707 array<Z3_ast> _args(args.size());
4708 for (unsigned i = 0; i < args.size(); ++i) {
4709 _args[i] = args[i];
4710 }
4711 Z3_ast r = Z3_update_term(ctx(), m_ast, args.size(), _args.ptr());
4712 check_error();
4713 return expr(ctx(), r);
4714 }
4715
4716 inline expr expr::update_field(func_decl const& field_access, expr const& new_value) const {
4717 assert(is_datatype());
4718 Z3_ast r = Z3_datatype_update_field(ctx(), field_access, m_ast, new_value);
4719 check_error();
4720 return expr(ctx(), r);
4721 }
4722
4723 typedef std::function<void(expr const& proof, std::vector<unsigned> const& deps, expr_vector const& clause)> on_clause_eh_t;
4724
4725 class on_clause {
4726 context& c;
4727 on_clause_eh_t m_on_clause;
4728
4729 static void _on_clause_eh(void* _ctx, Z3_ast _proof, unsigned n, unsigned const* dep, Z3_ast_vector _literals) {
4730 on_clause* ctx = static_cast<on_clause*>(_ctx);
4731 expr_vector lits(ctx->c, _literals);
4732 expr proof(ctx->c, _proof);
4733 std::vector<unsigned> deps;
4734 for (unsigned i = 0; i < n; ++i)
4735 deps.push_back(dep[i]);
4736 ctx->m_on_clause(proof, deps, lits);
4737 }
4738 public:
4739 on_clause(solver& s, on_clause_eh_t& on_clause_eh): c(s.ctx()) {
4740 m_on_clause = on_clause_eh;
4741 Z3_solver_register_on_clause(c, s, this, _on_clause_eh);
4742 c.check_error();
4743 }
4744 };
4745
4746 class user_propagator_base {
4747
4748 typedef std::function<void(expr const&, expr const&)> fixed_eh_t;
4749 typedef std::function<void(void)> final_eh_t;
4750 typedef std::function<void(expr const&, expr const&)> eq_eh_t;
4751 typedef std::function<void(expr const&)> created_eh_t;
4752 typedef std::function<void(expr, unsigned, bool)> decide_eh_t;
4753 typedef std::function<bool(expr const&, expr const&)> on_binding_eh_t;
4754
4755 final_eh_t m_final_eh;
4756 eq_eh_t m_eq_eh;
4757 fixed_eh_t m_fixed_eh;
4758 created_eh_t m_created_eh;
4759 decide_eh_t m_decide_eh;
4760 on_binding_eh_t m_on_binding_eh;
4761 solver* s;
4762 context* c;
4763 std::vector<z3::context*> subcontexts;
4764
4765 unsigned m_callbackNesting = 0;
4766 Z3_solver_callback cb { nullptr };
4767
4768 struct scoped_cb {
4769 user_propagator_base& p;
4770 scoped_cb(void* _p, Z3_solver_callback cb):p(*static_cast<user_propagator_base*>(_p)) {
4771 p.cb = cb;
4772 p.m_callbackNesting++;
4773 }
4774 ~scoped_cb() {
4775 if (--p.m_callbackNesting == 0)
4776 p.cb = nullptr;
4777 }
4778 };
4779
4780 static void push_eh(void* _p, Z3_solver_callback cb) {
4781 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4782 scoped_cb _cb(p, cb);
4783 static_cast<user_propagator_base*>(p)->push();
4784 }
4785
4786 static void pop_eh(void* _p, Z3_solver_callback cb, unsigned num_scopes) {
4787 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4788 scoped_cb _cb(p, cb);
4789 static_cast<user_propagator_base*>(_p)->pop(num_scopes);
4790 }
4791
4792 static void* fresh_eh(void* _p, Z3_context ctx) {
4793 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4794 context* c = new context(ctx);
4795 p->subcontexts.push_back(c);
4796 return p->fresh(*c);
4797 }
4798
4799 static void fixed_eh(void* _p, Z3_solver_callback cb, Z3_ast _var, Z3_ast _value) {
4800 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4801 scoped_cb _cb(p, cb);
4802 expr value(p->ctx(), _value);
4803 expr var(p->ctx(), _var);
4804 p->m_fixed_eh(var, value);
4805 }
4806
4807 static void eq_eh(void* _p, Z3_solver_callback cb, Z3_ast _x, Z3_ast _y) {
4808 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4809 scoped_cb _cb(p, cb);
4810 expr x(p->ctx(), _x), y(p->ctx(), _y);
4811 p->m_eq_eh(x, y);
4812 }
4813
4814 static void final_eh(void* p, Z3_solver_callback cb) {
4815 scoped_cb _cb(p, cb);
4816 static_cast<user_propagator_base*>(p)->m_final_eh();
4817 }
4818
4819 static void created_eh(void* _p, Z3_solver_callback cb, Z3_ast _e) {
4820 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4821 scoped_cb _cb(p, cb);
4822 expr e(p->ctx(), _e);
4823 p->m_created_eh(e);
4824 }
4825
4826 static void decide_eh(void* _p, Z3_solver_callback cb, Z3_ast _val, unsigned bit, bool is_pos) {
4827 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4828 scoped_cb _cb(p, cb);
4829 expr val(p->ctx(), _val);
4830 p->m_decide_eh(val, bit, is_pos);
4831 }
4832
4833 static bool on_binding_eh(void* _p, Z3_solver_callback cb, Z3_ast _q, Z3_ast _inst) {
4834 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4835 scoped_cb _cb(p, cb);
4836 expr q(p->ctx(), _q), inst(p->ctx(), _inst);
4837 return p->m_on_binding_eh(q, inst);
4838 }
4839
4840 public:
4841 user_propagator_base(context& c) : s(nullptr), c(&c) {}
4842
4843 user_propagator_base(solver* s): s(s), c(nullptr) {
4844 Z3_solver_propagate_init(ctx(), *s, this, push_eh, pop_eh, fresh_eh);
4845 }
4846
4847 virtual void push() = 0;
4848 virtual void pop(unsigned num_scopes) = 0;
4849
4850 virtual ~user_propagator_base() {
4851 for (auto& subcontext : subcontexts) {
4852 subcontext->detach(); // detach first; the subcontexts will be freed internally!
4853 delete subcontext;
4854 }
4855 }
4856
4857 context& ctx() {
4858 return c ? *c : s->ctx();
4859 }
4860
4869 virtual user_propagator_base* fresh(context& ctx) = 0;
4870
4877 void register_fixed(fixed_eh_t& f) {
4878 m_fixed_eh = f;
4879 if (s) {
4880 Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4881 }
4882 }
4883
4884 void register_fixed() {
4885 m_fixed_eh = [this](expr const &id, expr const &e) {
4886 fixed(id, e);
4887 };
4888 if (s) {
4889 Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4890 }
4891 }
4892
4893 void register_eq(eq_eh_t& f) {
4894 m_eq_eh = f;
4895 if (s) {
4896 Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4897 }
4898 }
4899
4900 void register_eq() {
4901 m_eq_eh = [this](expr const& x, expr const& y) {
4902 eq(x, y);
4903 };
4904 if (s) {
4905 Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4906 }
4907 }
4908
4917 void register_final(final_eh_t& f) {
4918 m_final_eh = f;
4919 if (s) {
4920 Z3_solver_propagate_final(ctx(), *s, final_eh);
4921 }
4922 }
4923
4924 void register_final() {
4925 m_final_eh = [this]() {
4926 final();
4927 };
4928 if (s) {
4929 Z3_solver_propagate_final(ctx(), *s, final_eh);
4930 }
4931 }
4932
4933 void register_created(created_eh_t& c) {
4934 m_created_eh = c;
4935 if (s) {
4936 Z3_solver_propagate_created(ctx(), *s, created_eh);
4937 }
4938 }
4939
4940 void register_created() {
4941 m_created_eh = [this](expr const& e) {
4942 created(e);
4943 };
4944 if (s) {
4945 Z3_solver_propagate_created(ctx(), *s, created_eh);
4946 }
4947 }
4948
4949 void register_decide(decide_eh_t& c) {
4950 m_decide_eh = c;
4951 if (s) {
4952 Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4953 }
4954 }
4955
4956 void register_decide() {
4957 m_decide_eh = [this](expr val, unsigned bit, bool is_pos) {
4958 decide(val, bit, is_pos);
4959 };
4960 if (s) {
4961 Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4962 }
4963 }
4964
4965 void register_on_binding() {
4966 m_on_binding_eh = [this](expr const& q, expr const& inst) {
4967 return on_binding(q, inst);
4968 };
4969 if (s)
4970 Z3_solver_propagate_on_binding(ctx(), *s, on_binding_eh);
4971 }
4972
4973 virtual void fixed(expr const& /*id*/, expr const& /*e*/) { }
4974
4975 virtual void eq(expr const& /*x*/, expr const& /*y*/) { }
4976
4977 virtual void final() { }
4978
4979 virtual void created(expr const& /*e*/) {}
4980
4981 virtual void decide(expr const& /*val*/, unsigned /*bit*/, bool /*is_pos*/) {}
4982
4983 virtual bool on_binding(expr const& /*q*/, expr const& /*inst*/) { return true; }
4984
4985 bool next_split(expr const& e, unsigned idx, Z3_lbool phase) {
4986 assert(cb);
4987 return Z3_solver_next_split(ctx(), cb, e, idx, phase);
4988 }
4989
5004 void add(expr const& e) {
5005 if (cb)
5006 Z3_solver_propagate_register_cb(ctx(), cb, e);
5007 else if (s)
5008 Z3_solver_propagate_register(ctx(), *s, e);
5009 else
5010 assert(false);
5011 }
5012
5013 void conflict(expr_vector const& fixed) {
5014 assert(cb);
5015 expr conseq = ctx().bool_val(false);
5016 array<Z3_ast> _fixed(fixed);
5017 Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
5018 }
5019
5020 void conflict(expr_vector const& fixed, expr_vector const& lhs, expr_vector const& rhs) {
5021 assert(cb);
5022 assert(lhs.size() == rhs.size());
5023 expr conseq = ctx().bool_val(false);
5024 array<Z3_ast> _fixed(fixed);
5025 array<Z3_ast> _lhs(lhs);
5026 array<Z3_ast> _rhs(rhs);
5027 Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
5028 }
5029
5030 bool propagate(expr_vector const& fixed, expr const& conseq) {
5031 assert(cb);
5032 assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
5033 array<Z3_ast> _fixed(fixed);
5034 return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
5035 }
5036
5037 bool propagate(expr_vector const& fixed,
5038 expr_vector const& lhs, expr_vector const& rhs,
5039 expr const& conseq) {
5040 assert(cb);
5041 assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
5042 assert(lhs.size() == rhs.size());
5043 array<Z3_ast> _fixed(fixed);
5044 array<Z3_ast> _lhs(lhs);
5045 array<Z3_ast> _rhs(rhs);
5046
5047 return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
5048 }
5049 };
5050
5060 class rcf_num {
5061 Z3_context m_ctx;
5062 Z3_rcf_num m_num;
5063
5064 void check_context(rcf_num const& other) const {
5065 if (m_ctx != other.m_ctx) {
5066 Z3_THROW(exception("rcf_num objects from different contexts"));
5067 }
5068 }
5069
5070 public:
5071 rcf_num(context& c, Z3_rcf_num n): m_ctx(c), m_num(n) {}
5072
5073 rcf_num(context& c, int val): m_ctx(c) {
5074 m_num = Z3_rcf_mk_small_int(c, val);
5075 }
5076
5077 rcf_num(context& c, char const* val): m_ctx(c) {
5078 m_num = Z3_rcf_mk_rational(c, val);
5079 }
5080
5081 rcf_num(rcf_num const& other): m_ctx(other.m_ctx) {
5082 // Create a copy by converting to string and back
5083 std::string str = Z3_rcf_num_to_string(m_ctx, other.m_num, false, false);
5084 m_num = Z3_rcf_mk_rational(m_ctx, str.c_str());
5085 }
5086
5087 rcf_num& operator=(rcf_num const& other) {
5088 if (this != &other) {
5089 Z3_rcf_del(m_ctx, m_num);
5090 m_ctx = other.m_ctx;
5091 std::string str = Z3_rcf_num_to_string(m_ctx, other.m_num, false, false);
5092 m_num = Z3_rcf_mk_rational(m_ctx, str.c_str());
5093 }
5094 return *this;
5095 }
5096
5097 ~rcf_num() {
5098 Z3_rcf_del(m_ctx, m_num);
5099 }
5100
5101 operator Z3_rcf_num() const { return m_num; }
5102 Z3_context ctx() const { return m_ctx; }
5103
5107 std::string to_string(bool compact = false) const {
5108 return std::string(Z3_rcf_num_to_string(m_ctx, m_num, compact, false));
5109 }
5110
5114 std::string to_decimal(unsigned precision = 10) const {
5115 return std::string(Z3_rcf_num_to_decimal_string(m_ctx, m_num, precision));
5116 }
5117
5118 // Arithmetic operations
5119 rcf_num operator+(rcf_num const& other) const {
5120 check_context(other);
5121 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
5122 Z3_rcf_add(m_ctx, m_num, other.m_num));
5123 }
5124
5125 rcf_num operator-(rcf_num const& other) const {
5126 check_context(other);
5127 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
5128 Z3_rcf_sub(m_ctx, m_num, other.m_num));
5129 }
5130
5131 rcf_num operator*(rcf_num const& other) const {
5132 check_context(other);
5133 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
5134 Z3_rcf_mul(m_ctx, m_num, other.m_num));
5135 }
5136
5137 rcf_num operator/(rcf_num const& other) const {
5138 check_context(other);
5139 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
5140 Z3_rcf_div(m_ctx, m_num, other.m_num));
5141 }
5142
5143 rcf_num operator-() const {
5144 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
5145 Z3_rcf_neg(m_ctx, m_num));
5146 }
5147
5151 rcf_num power(unsigned k) const {
5152 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
5153 Z3_rcf_power(m_ctx, m_num, k));
5154 }
5155
5159 rcf_num inv() const {
5160 return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
5161 Z3_rcf_inv(m_ctx, m_num));
5162 }
5163
5164 // Comparison operations
5165 bool operator<(rcf_num const& other) const {
5166 check_context(other);
5167 return Z3_rcf_lt(m_ctx, m_num, other.m_num);
5168 }
5169
5170 bool operator>(rcf_num const& other) const {
5171 check_context(other);
5172 return Z3_rcf_gt(m_ctx, m_num, other.m_num);
5173 }
5174
5175 bool operator<=(rcf_num const& other) const {
5176 check_context(other);
5177 return Z3_rcf_le(m_ctx, m_num, other.m_num);
5178 }
5179
5180 bool operator>=(rcf_num const& other) const {
5181 check_context(other);
5182 return Z3_rcf_ge(m_ctx, m_num, other.m_num);
5183 }
5184
5185 bool operator==(rcf_num const& other) const {
5186 check_context(other);
5187 return Z3_rcf_eq(m_ctx, m_num, other.m_num);
5188 }
5189
5190 bool operator!=(rcf_num const& other) const {
5191 check_context(other);
5192 return Z3_rcf_neq(m_ctx, m_num, other.m_num);
5193 }
5194
5195 // Type queries
5196 bool is_rational() const {
5197 return Z3_rcf_is_rational(m_ctx, m_num);
5198 }
5199
5200 bool is_algebraic() const {
5201 return Z3_rcf_is_algebraic(m_ctx, m_num);
5202 }
5203
5204 bool is_infinitesimal() const {
5205 return Z3_rcf_is_infinitesimal(m_ctx, m_num);
5206 }
5207
5208 bool is_transcendental() const {
5209 return Z3_rcf_is_transcendental(m_ctx, m_num);
5210 }
5211
5212 friend std::ostream& operator<<(std::ostream& out, rcf_num const& n) {
5213 return out << n.to_string();
5214 }
5215 };
5216
5220 inline rcf_num rcf_pi(context& c) {
5221 return rcf_num(c, Z3_rcf_mk_pi(c));
5222 }
5223
5227 inline rcf_num rcf_e(context& c) {
5228 return rcf_num(c, Z3_rcf_mk_e(c));
5229 }
5230
5234 inline rcf_num rcf_infinitesimal(context& c) {
5235 return rcf_num(c, Z3_rcf_mk_infinitesimal(c));
5236 }
5237
5244 inline std::vector<rcf_num> rcf_roots(context& c, std::vector<rcf_num> const& coeffs) {
5245 if (coeffs.empty()) {
5246 Z3_THROW(exception("polynomial coefficients cannot be empty"));
5247 }
5248
5249 unsigned n = static_cast<unsigned>(coeffs.size());
5250 std::vector<Z3_rcf_num> a(n);
5251 std::vector<Z3_rcf_num> roots(n);
5252
5253 for (unsigned i = 0; i < n; ++i) {
5254 a[i] = coeffs[i];
5255 }
5256
5257 unsigned num_roots = Z3_rcf_mk_roots(c, n, a.data(), roots.data());
5258
5259 std::vector<rcf_num> result;
5260 result.reserve(num_roots);
5261 for (unsigned i = 0; i < num_roots; ++i) {
5262 result.push_back(rcf_num(c, roots[i]));
5263 }
5264
5265 return result;
5266 }
5267
5268}
5269
5272#undef Z3_THROW
symbol str_symbol(char const *s)
Create a Z3 symbol based on the given string.
Definition z3++.h:3837
expr num_val(int n, sort const &s)
Definition z3++.h:4205
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition z3++.h:4082
expr bool_val(bool b)
Definition z3++.h:4169
func_decl function(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition z3++.h:4011
Z3_error_code check_error() const
Definition z3++.h:561
context & ctx() const
Definition z3++.h:560
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:1430
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.
Z3_ast_vector Z3_API Z3_optimize_get_upper_as_vector(Z3_context c, Z3_optimize o, unsigned idx)
Retrieve upper bound value or approximation for the i'th optimization objective.
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_ast_vector Z3_API Z3_optimize_get_lower_as_vector(Z3_context c, Z3_optimize o, unsigned idx)
Retrieve lower bound value or approximation for the i'th optimization objective. The returned vector ...
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_app Z3_API Z3_to_app(Z3_context c, Z3_ast a)
Convert an ast into an APP_AST. This is just type casting.
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, including parameters for the underlying SMT solver.
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_is_app(Z3_context c, Z3_ast a)
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:4427
expr re_intersect(expr_vector const &args)
Definition z3++.h:4557
expr store(expr const &a, expr const &i, expr const &v)
Definition z3++.h:4349
expr pw(expr const &a, expr const &b)
Definition z3++.h:1848
expr sbv_to_fpa(expr const &t, sort s)
Definition z3++.h:2272
expr bvneg_no_overflow(expr const &a)
Definition z3++.h:2473
expr finite_set_difference(expr const &a, expr const &b)
Definition z3++.h:4471
expr indexof(expr const &s, expr const &substr, expr const &offset)
Definition z3++.h:4520
tactic par_or(unsigned n, tactic const *tactics)
Definition z3++.h:3495
tactic par_and_then(tactic const &t1, tactic const &t2)
Definition z3++.h:3504
expr srem(expr const &a, expr const &b)
signed remainder operator for bitvectors
Definition z3++.h:2405
expr bvadd_no_underflow(expr const &a, expr const &b)
Definition z3++.h:2461
expr prefixof(expr const &a, expr const &b)
Definition z3++.h:4514
expr sum(expr_vector const &args)
Definition z3++.h:2670
expr ugt(expr const &a, expr const &b)
unsigned greater than operator for bitvectors.
Definition z3++.h:2384
expr operator/(expr const &a, expr const &b)
Definition z3++.h:2014
expr exists(expr const &x, expr const &b)
Definition z3++.h:2581
expr fp_eq(expr const &a, expr const &b)
Definition z3++.h:2233
func_decl tree_order(sort const &a, unsigned index)
Definition z3++.h:2498
expr concat(expr const &a, expr const &b)
Definition z3++.h:2688
expr bvmul_no_underflow(expr const &a, expr const &b)
Definition z3++.h:2479
expr lambda(expr const &x, expr const &b)
Definition z3++.h:2605
ast_vector_tpl< func_decl > func_decl_vector
Definition z3++.h:79
expr fpa_to_fpa(expr const &t, sort s)
Definition z3++.h:2286
expr qe_model_project(model const &m, expr_vector const &bounds, expr const &body)
Definition z3++.h:2957
expr operator&&(expr const &a, expr const &b)
Definition z3++.h:1892
std::function< void(expr const &proof, std::vector< unsigned > const &deps, expr_vector const &clause)> on_clause_eh_t
Definition z3++.h:4724
expr operator!=(expr const &a, expr const &b)
Definition z3++.h:1928
expr operator+(expr const &a, expr const &b)
Definition z3++.h:1940
expr set_complement(expr const &a)
Definition z3++.h:4439
check_result
Definition z3++.h:166
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition z3++.h:4319
expr const_array(sort const &d, expr const &v)
Definition z3++.h:4399
expr min(expr const &a, expr const &b)
Definition z3++.h:2162
expr set_difference(expr const &a, expr const &b)
Definition z3++.h:4435
expr forall(expr const &x, expr const &b)
Definition z3++.h:2557
expr array_default(expr const &a)
Definition z3++.h:4375
expr array_ext(expr const &a, expr const &b)
Definition z3++.h:4381
expr qe_lite(expr_vector const &vars, expr const &body)
Definition z3++.h:2940
expr operator>(expr const &a, expr const &b)
Definition z3++.h:2125
sort to_sort(context &c, Z3_sort s)
Definition z3++.h:2327
expr finite_set_map(expr const &f, expr const &s)
Definition z3++.h:4487
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:2318
expr bv2int(expr const &a, bool is_signed)
bit-vector and integer conversions.
Definition z3++.h:2452
expr operator%(expr const &a, expr const &b)
Definition z3++.h:1863
expr operator~(expr const &a)
Definition z3++.h:2240
expr sle(expr const &a, expr const &b)
signed less than or equal to operator for bitvectors.
Definition z3++.h:2340
expr nor(expr const &a, expr const &b)
Definition z3++.h:2160
expr fpa_fp(expr const &sgn, expr const &exp, expr const &sig)
Definition z3++.h:2250
expr bvsub_no_underflow(expr const &a, expr const &b, bool is_signed)
Definition z3++.h:2467
expr finite_set_singleton(expr const &e)
Definition z3++.h:4459
expr mk_xor(expr_vector const &args)
Definition z3++.h:2772
expr lshr(expr const &a, expr const &b)
logic shift right operator for bitvectors
Definition z3++.h:2433
expr operator*(expr const &a, expr const &b)
Definition z3++.h:1970
expr nand(expr const &a, expr const &b)
Definition z3++.h:2159
expr fpa_to_ubv(expr const &t, unsigned sz)
Definition z3++.h:2265
expr bvredor(expr const &a)
Definition z3++.h:2194
ast_vector_tpl< sort > sort_vector
Definition z3++.h:78
expr finite_set_subset(expr const &a, expr const &b)
Definition z3++.h:4483
func_decl piecewise_linear_order(sort const &a, unsigned index)
Definition z3++.h:2495
expr slt(expr const &a, expr const &b)
signed less than operator for bitvectors.
Definition z3++.h:2346
tactic when(probe const &p, tactic const &t)
Definition z3++.h:3824
expr last_indexof(expr const &s, expr const &substr)
Definition z3++.h:4526
expr int2bv(unsigned n, expr const &a)
Definition z3++.h:2453
expr max(expr const &a, expr const &b)
Definition z3++.h:2178
expr xnor(expr const &a, expr const &b)
Definition z3++.h:2161
expr udiv(expr const &a, expr const &b)
unsigned division operator for bitvectors.
Definition z3++.h:2398
expr abs(expr const &a)
Definition z3++.h:2206
expr pbge(expr_vector const &es, int const *coeffs, int bound)
Definition z3++.h:2638
expr round_fpa_to_closest_integer(expr const &t)
Definition z3++.h:2293
expr distinct(expr_vector const &args)
Definition z3++.h:2679
expr ashr(expr const &a, expr const &b)
arithmetic shift right operator for bitvectors
Definition z3++.h:2440
expr bvmul_no_overflow(expr const &a, expr const &b, bool is_signed)
Definition z3++.h:2476
expr bvsub_no_overflow(expr const &a, expr const &b)
Definition z3++.h:2464
expr star(expr const &re)
Definition z3++.h:4544
expr urem(expr const &a, expr const &b)
unsigned reminder operator for bitvectors
Definition z3++.h:2419
tactic repeat(tactic const &t, unsigned max=UINT_MAX)
Definition z3++.h:3479
expr mod(expr const &a, expr const &b)
Definition z3++.h:1852
expr fma(expr const &a, expr const &b, expr const &c, expr const &rm)
Definition z3++.h:2242
check_result to_check_result(Z3_lbool l)
Definition z3++.h:178
expr mk_or(expr_vector const &args)
Definition z3++.h:2760
expr to_re(expr const &s)
Definition z3++.h:4532
void check_context(object const &a, object const &b)
Definition z3++.h:564
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:2508
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:2366
func_decl to_func_decl(context &c, Z3_func_decl f)
Definition z3++.h:2332
tactic with(tactic const &t, params const &p)
Definition z3++.h:3485
expr ite(expr const &c, expr const &t, expr const &e)
Create the if-then-else expression ite(c, t, e)
Definition z3++.h:2305
expr finite_set_filter(expr const &f, expr const &s)
Definition z3++.h:4491
expr ult(expr const &a, expr const &b)
unsigned less than operator for bitvectors.
Definition z3++.h:2372
expr finite_set_union(expr const &a, expr const &b)
Definition z3++.h:4463
expr qe_model_project_skolem(model const &m, expr_vector const &bounds, expr const &body, ast_map &map)
Project variables and write the introduced Skolem terms to map.
Definition z3++.h:2968
expr pbeq(expr_vector const &es, int const *coeffs, int bound)
Definition z3++.h:2646
expr operator^(expr const &a, expr const &b)
Definition z3++.h:2151
expr operator<=(expr const &a, expr const &b)
Definition z3++.h:2078
expr set_union(expr const &a, expr const &b)
Definition z3++.h:4419
expr operator>=(expr const &a, expr const &b)
Definition z3++.h:1994
func_decl linear_order(sort const &a, unsigned index)
Definition z3++.h:2489
expr sqrt(expr const &a, expr const &rm)
Definition z3++.h:2226
expr pble(expr_vector const &es, int const *coeffs, int bound)
Definition z3++.h:2630
expr operator==(expr const &a, expr const &b)
Definition z3++.h:1917
expr foldli(expr const &f, expr const &i, expr const &a, expr const &list)
Definition z3++.h:2753
expr full_set(sort const &s)
Definition z3++.h:4407
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:5245
expr smod(expr const &a, expr const &b)
signed modulus operator for bitvectors
Definition z3++.h:2412
expr implies(expr const &a, expr const &b)
Definition z3++.h:1840
expr finite_set_range(expr const &low, expr const &high)
Definition z3++.h:4495
expr empty_set(sort const &s)
Definition z3++.h:4403
expr in_re(expr const &s, expr const &re)
Definition z3++.h:4535
expr finite_set_member(expr const &e, expr const &s)
Definition z3++.h:4475
expr bvadd_no_overflow(expr const &a, expr const &b, bool is_signed)
bit-vector overflow/underflow checks
Definition z3++.h:2458
expr suffixof(expr const &a, expr const &b)
Definition z3++.h:4508
expr re_diff(expr const &a, expr const &b)
Definition z3++.h:4565
expr set_add(expr const &s, expr const &e)
Definition z3++.h:4411
rcf_num rcf_e(context &c)
Create an RCF numeral representing e (Euler's constant).
Definition z3++.h:5228
expr plus(expr const &re)
Definition z3++.h:4538
expr set_subset(expr const &a, expr const &b)
Definition z3++.h:4447
expr select(expr const &a, expr const &i)
forward declarations
Definition z3++.h:4332
expr bvredand(expr const &a)
Definition z3++.h:2200
expr operator&(expr const &a, expr const &b)
Definition z3++.h:2147
expr operator-(expr const &a)
Definition z3++.h:2036
expr set_member(expr const &s, expr const &e)
Definition z3++.h:4443
expr bvsdiv_no_overflow(expr const &a, expr const &b)
Definition z3++.h:2470
tactic try_for(tactic const &t, unsigned ms)
Definition z3++.h:3490
expr finite_set_size(expr const &s)
Definition z3++.h:4479
expr sdiv(expr const &a, expr const &b)
signed division operator for bitvectors.
Definition z3++.h:2391
func_decl partial_order(sort const &a, unsigned index)
Definition z3++.h:2492
ast_vector_tpl< expr > expr_vector
Definition z3++.h:77
expr rem(expr const &a, expr const &b)
Definition z3++.h:1868
expr sge(expr const &a, expr const &b)
signed greater than or equal to operator for bitvectors.
Definition z3++.h:2352
expr operator!(expr const &a)
Definition z3++.h:1886
expr re_empty(sort const &s)
Definition z3++.h:4547
expr foldl(expr const &f, expr const &a, expr const &list)
Definition z3++.h:2746
rcf_num rcf_pi(context &c)
Create an RCF numeral representing pi.
Definition z3++.h:5221
expr mk_and(expr_vector const &args)
Definition z3++.h:2766
@ 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:4453
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:2487
expr to_real(expr const &a)
Definition z3++.h:4289
expr shl(expr const &a, expr const &b)
shift left operator for bitvectors
Definition z3++.h:2426
std::vector< Z3_app > to_apps(expr_vector const &bounds)
Definition z3++.h:2947
expr operator||(expr const &a, expr const &b)
Definition z3++.h:1904
expr finite_set_intersect(expr const &a, expr const &b)
Definition z3++.h:4467
expr set_del(expr const &s, expr const &e)
Definition z3++.h:4415
expr ubv_to_fpa(expr const &t, sort s)
Definition z3++.h:2279
expr map(expr const &f, expr const &list)
Definition z3++.h:2732
tactic cond(probe const &p, tactic const &t1, tactic const &t2)
Definition z3++.h:3830
expr as_array(func_decl &f)
Definition z3++.h:4369
expr sgt(expr const &a, expr const &b)
signed greater than operator for bitvectors.
Definition z3++.h:2358
expr fpa_to_sbv(expr const &t, unsigned sz)
Definition z3++.h:2258
expr operator|(expr const &a, expr const &b)
Definition z3++.h:2155
expr atmost(expr_vector const &es, unsigned bound)
Definition z3++.h:2654
expr range(expr const &lo, expr const &hi)
Definition z3++.h:4575
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:2447
expr atleast(expr_vector const &es, unsigned bound)
Definition z3++.h:2662
expr qe_model_project_with_witness(model const &m, expr_vector const &bounds, expr const &body, ast_map &map)
Project variables and write the introduced witnesses to map.
Definition z3++.h:2979
expr uge(expr const &a, expr const &b)
unsigned greater than or equal to operator for bitvectors.
Definition z3++.h:2378
expr mapi(expr const &f, expr const &i, expr const &list)
Definition z3++.h:2739
expr operator<(expr const &a, expr const &b)
Definition z3++.h:2103
expr option(expr const &re)
Definition z3++.h:4541
expr re_full(sort const &s)
Definition z3++.h:4552
expr re_complement(expr const &a)
Definition z3++.h:4572
expr empty(sort const &s)
Definition z3++.h:4503
rcf_num rcf_infinitesimal(context &c)
Create an RCF numeral representing an infinitesimal.
Definition z3++.h:5235
tactic fail_if(probe const &p)
Definition z3++.h:3819
_on_clause_eh
Definition z3py.py:12274
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:12267
#define _Z3_MK_BIN_(a, b, binop)
Definition z3++.h:1833
#define MK_EXPR1(_fn, _arg)
Definition z3++.h:4388
#define MK_EXPR2(_fn, _arg1, _arg2)
Definition z3++.h:4393
#define Z3_THROW(x)
Definition z3++.h:134
#define _Z3_MK_UN_(a, mkun)
Definition z3++.h:1880

◆ _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 1880 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 4388 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 4393 of file z3++.h.

◆ Z3_THROW

#define Z3_THROW (   x)    {}

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