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

Go to the source code of this file.

Data Structures

class  exception
 Exception used to sign API usage errors. More...
 
class  config
 Z3 global configuration object. More...
 
class  context
 A Context manages all other Z3 objects, global configuration options, etc. More...
 
class  array< T >
 
class  object
 
class  symbol
 
class  param_descrs
 
class  params
 
class  ast
 
class  ast_vector_tpl< T >
 
class  ast_vector_tpl< T >::iterator
 
class  sort
 A Z3 sort (aka type). Every expression (i.e., formula or term) in Z3 has a sort. More...
 
class  func_decl
 Function declaration (aka function definition). It is the signature of interpreted and uninterpreted functions in Z3. The basic building block in Z3 is the function application. More...
 
class  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
 

Namespaces

namespace  z3
 Z3 C++ namespace.
 

Macros

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

Typedefs

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

Enumerations

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

Functions

void set_param (char const *param, char const *value)
 
void set_param (char const *param, bool value)
 
void set_param (char const *param, int value)
 
void reset_params ()
 
void get_version (unsigned &major, unsigned &minor, unsigned &build_number, unsigned &revision_number)
 Return Z3 version number information.
 
std::string get_full_version ()
 Return a string that fully describes the version of Z3 in use.
 
void enable_trace (char const *tag)
 Enable tracing messages tagged as tag when Z3 is compiled in debug mode. It is a NOOP otherwise.
 
void disable_trace (char const *tag)
 Disable tracing messages tagged as tag when Z3 is compiled in debug mode. It is a NOOP otherwise.
 
std::ostream & operator<< (std::ostream &out, exception const &e)
 
check_result to_check_result (Z3_lbool l)
 
void check_context (object const &a, object const &b)
 
std::ostream & operator<< (std::ostream &out, symbol const &s)
 
std::ostream & operator<< (std::ostream &out, param_descrs const &d)
 
std::ostream & operator<< (std::ostream &out, params const &p)
 
std::ostream & operator<< (std::ostream &out, ast const &n)
 
bool eq (ast const &a, ast const &b)
 
expr select (expr const &a, expr const &i)
 forward declarations
 
expr select (expr const &a, expr_vector const &i)
 
expr implies (expr const &a, expr const &b)
 
expr implies (expr const &a, bool b)
 
expr implies (bool a, expr const &b)
 
expr pw (expr const &a, expr const &b)
 
expr pw (expr const &a, int b)
 
expr pw (int a, expr const &b)
 
expr mod (expr const &a, expr const &b)
 
expr mod (expr const &a, int b)
 
expr mod (int a, expr const &b)
 
expr operator% (expr const &a, expr const &b)
 
expr operator% (expr const &a, int b)
 
expr operator% (int a, expr const &b)
 
expr rem (expr const &a, expr const &b)
 
expr rem (expr const &a, int b)
 
expr rem (int a, expr const &b)
 
expr operator! (expr const &a)
 
expr is_int (expr const &e)
 
expr operator&& (expr const &a, expr const &b)
 
expr operator&& (expr const &a, bool b)
 
expr operator&& (bool a, expr const &b)
 
expr operator|| (expr const &a, expr const &b)
 
expr operator|| (expr const &a, bool b)
 
expr operator|| (bool a, expr const &b)
 
expr operator== (expr const &a, expr const &b)
 
expr operator== (expr const &a, int b)
 
expr operator== (int a, expr const &b)
 
expr operator== (expr const &a, double b)
 
expr operator== (double a, expr const &b)
 
expr operator!= (expr const &a, expr const &b)
 
expr operator!= (expr const &a, int b)
 
expr operator!= (int a, expr const &b)
 
expr operator!= (expr const &a, double b)
 
expr operator!= (double a, expr const &b)
 
expr operator+ (expr const &a, expr const &b)
 
expr operator+ (expr const &a, int b)
 
expr operator+ (int a, expr const &b)
 
expr operator* (expr const &a, expr const &b)
 
expr operator* (expr const &a, int b)
 
expr operator* (int a, expr const &b)
 
expr operator>= (expr const &a, expr const &b)
 
expr operator/ (expr const &a, expr const &b)
 
expr operator/ (expr const &a, int b)
 
expr operator/ (int a, expr const &b)
 
expr operator- (expr const &a)
 
expr operator- (expr const &a, expr const &b)
 
expr operator- (expr const &a, int b)
 
expr operator- (int a, expr const &b)
 
expr operator<= (expr const &a, expr const &b)
 
expr operator<= (expr const &a, int b)
 
expr operator<= (int a, expr const &b)
 
expr operator>= (expr const &a, int b)
 
expr operator>= (int a, expr const &b)
 
expr operator< (expr const &a, expr const &b)
 
expr operator< (expr const &a, int b)
 
expr operator< (int a, expr const &b)
 
expr operator> (expr const &a, expr const &b)
 
expr operator> (expr const &a, int b)
 
expr operator> (int a, expr const &b)
 
expr operator& (expr const &a, expr const &b)
 
expr operator& (expr const &a, int b)
 
expr operator& (int a, expr const &b)
 
expr operator^ (expr const &a, expr const &b)
 
expr operator^ (expr const &a, int b)
 
expr operator^ (int a, expr const &b)
 
expr operator| (expr const &a, expr const &b)
 
expr operator| (expr const &a, int b)
 
expr operator| (int a, expr const &b)
 
expr nand (expr const &a, expr const &b)
 
expr nor (expr const &a, expr const &b)
 
expr xnor (expr const &a, expr const &b)
 
expr min (expr const &a, expr const &b)
 
expr max (expr const &a, expr const &b)
 
expr bvredor (expr const &a)
 
expr bvredand (expr const &a)
 
expr abs (expr const &a)
 
expr sqrt (expr const &a, expr const &rm)
 
expr fp_eq (expr const &a, expr const &b)
 
expr operator~ (expr const &a)
 
expr fma (expr const &a, expr const &b, expr const &c, expr const &rm)
 
expr fpa_fp (expr const &sgn, expr const &exp, expr const &sig)
 
expr fpa_to_sbv (expr const &t, unsigned sz)
 
expr fpa_to_ubv (expr const &t, unsigned sz)
 
expr sbv_to_fpa (expr const &t, sort s)
 
expr ubv_to_fpa (expr const &t, sort s)
 
expr fpa_to_fpa (expr const &t, sort s)
 
expr round_fpa_to_closest_integer (expr const &t)
 
expr ite (expr const &c, expr const &t, expr const &e)
 Create the if-then-else expression ite(c, t, e)
 
expr to_expr (context &c, Z3_ast a)
 Wraps a Z3_ast as an expr object. It also checks for errors. This function allows the user to use the whole C API with the C++ layer defined in this file.
 
sort to_sort (context &c, Z3_sort s)
 
func_decl to_func_decl (context &c, Z3_func_decl f)
 
expr sle (expr const &a, expr const &b)
 signed less than or equal to operator for bitvectors.
 
expr sle (expr const &a, int b)
 
expr sle (int a, expr const &b)
 
expr slt (expr const &a, expr const &b)
 signed less than operator for bitvectors.
 
expr slt (expr const &a, int b)
 
expr slt (int a, expr const &b)
 
expr sge (expr const &a, expr const &b)
 signed greater than or equal to operator for bitvectors.
 
expr sge (expr const &a, int b)
 
expr sge (int a, expr const &b)
 
expr sgt (expr const &a, expr const &b)
 signed greater than operator for bitvectors.
 
expr sgt (expr const &a, int b)
 
expr sgt (int a, expr const &b)
 
expr ule (expr const &a, expr const &b)
 unsigned less than or equal to operator for bitvectors.
 
expr ule (expr const &a, int b)
 
expr ule (int a, expr const &b)
 
expr ult (expr const &a, expr const &b)
 unsigned less than operator for bitvectors.
 
expr ult (expr const &a, int b)
 
expr ult (int a, expr const &b)
 
expr uge (expr const &a, expr const &b)
 unsigned greater than or equal to operator for bitvectors.
 
expr uge (expr const &a, int b)
 
expr uge (int a, expr const &b)
 
expr ugt (expr const &a, expr const &b)
 unsigned greater than operator for bitvectors.
 
expr ugt (expr const &a, int b)
 
expr ugt (int a, expr const &b)
 
expr sdiv (expr const &a, expr const &b)
 signed division operator for bitvectors.
 
expr sdiv (expr const &a, int b)
 
expr sdiv (int a, expr const &b)
 
expr udiv (expr const &a, expr const &b)
 unsigned division operator for bitvectors.
 
expr udiv (expr const &a, int b)
 
expr udiv (int a, expr const &b)
 
expr srem (expr const &a, expr const &b)
 signed remainder operator for bitvectors
 
expr srem (expr const &a, int b)
 
expr srem (int a, expr const &b)
 
expr smod (expr const &a, expr const &b)
 signed modulus operator for bitvectors
 
expr smod (expr const &a, int b)
 
expr smod (int a, expr const &b)
 
expr urem (expr const &a, expr const &b)
 unsigned reminder operator for bitvectors
 
expr urem (expr const &a, int b)
 
expr urem (int a, expr const &b)
 
expr shl (expr const &a, expr const &b)
 shift left operator for bitvectors
 
expr shl (expr const &a, int b)
 
expr shl (int a, expr const &b)
 
expr lshr (expr const &a, expr const &b)
 logic shift right operator for bitvectors
 
expr lshr (expr const &a, int b)
 
expr lshr (int a, expr const &b)
 
expr ashr (expr const &a, expr const &b)
 arithmetic shift right operator for bitvectors
 
expr ashr (expr const &a, int b)
 
expr ashr (int a, expr const &b)
 
expr zext (expr const &a, unsigned i)
 Extend the given bit-vector with zeros to the (unsigned) equivalent bitvector of size m+i, where m is the size of the given bit-vector.
 
expr bv2int (expr const &a, bool is_signed)
 bit-vector and integer conversions.
 
expr int2bv (unsigned n, expr const &a)
 
expr bvadd_no_overflow (expr const &a, expr const &b, bool is_signed)
 bit-vector overflow/underflow checks
 
expr bvadd_no_underflow (expr const &a, expr const &b)
 
expr bvsub_no_overflow (expr const &a, expr const &b)
 
expr bvsub_no_underflow (expr const &a, expr const &b, bool is_signed)
 
expr bvsdiv_no_overflow (expr const &a, expr const &b)
 
expr bvneg_no_overflow (expr const &a)
 
expr bvmul_no_overflow (expr const &a, expr const &b, bool is_signed)
 
expr bvmul_no_underflow (expr const &a, expr const &b)
 
expr sext (expr const &a, unsigned i)
 Sign-extend of the given bit-vector to the (signed) equivalent bitvector of size m+i, where m is the size of the given bit-vector.
 
func_decl linear_order (sort const &a, unsigned index)
 
func_decl partial_order (sort const &a, unsigned index)
 
func_decl piecewise_linear_order (sort const &a, unsigned index)
 
func_decl tree_order (sort const &a, unsigned index)
 
expr_vector polynomial_subresultants (expr const &p, expr const &q, expr const &x)
 Return the nonzero subresultants of p and q with respect to the "variable" x.
 
expr forall (expr const &x, expr const &b)
 
expr forall (expr const &x1, expr const &x2, expr const &b)
 
expr forall (expr const &x1, expr const &x2, expr const &x3, expr const &b)
 
expr forall (expr const &x1, expr const &x2, expr const &x3, expr const &x4, expr const &b)
 
expr forall (expr_vector const &xs, expr const &b)
 
expr exists (expr const &x, expr const &b)
 
expr exists (expr const &x1, expr const &x2, expr const &b)
 
expr exists (expr const &x1, expr const &x2, expr const &x3, expr const &b)
 
expr exists (expr const &x1, expr const &x2, expr const &x3, expr const &x4, expr const &b)
 
expr exists (expr_vector const &xs, expr const &b)
 
expr lambda (expr const &x, expr const &b)
 
expr lambda (expr const &x1, expr const &x2, expr const &b)
 
expr lambda (expr const &x1, expr const &x2, expr const &x3, expr const &b)
 
expr lambda (expr const &x1, expr const &x2, expr const &x3, expr const &x4, expr const &b)
 
expr lambda (expr_vector const &xs, expr const &b)
 
expr pble (expr_vector const &es, int const *coeffs, int bound)
 
expr pbge (expr_vector const &es, int const *coeffs, int bound)
 
expr pbeq (expr_vector const &es, int const *coeffs, int bound)
 
expr atmost (expr_vector const &es, unsigned bound)
 
expr atleast (expr_vector const &es, unsigned bound)
 
expr sum (expr_vector const &args)
 
expr distinct (expr_vector const &args)
 
expr concat (expr const &a, expr const &b)
 
expr concat (expr_vector const &args)
 
expr map (expr const &f, expr const &list)
 
expr mapi (expr const &f, expr const &i, expr const &list)
 
expr foldl (expr const &f, expr const &a, expr const &list)
 
expr foldli (expr const &f, expr const &i, expr const &a, expr const &list)
 
expr mk_or (expr_vector const &args)
 
expr mk_and (expr_vector const &args)
 
expr mk_xor (expr_vector const &args)
 
std::ostream & operator<< (std::ostream &out, model const &m)
 
std::ostream & operator<< (std::ostream &out, stats const &s)
 
std::ostream & operator<< (std::ostream &out, check_result r)
 
std::ostream & operator<< (std::ostream &out, solver const &s)
 
std::ostream & operator<< (std::ostream &out, goal const &g)
 
std::ostream & operator<< (std::ostream &out, apply_result const &r)
 
tactic operator& (tactic const &t1, tactic const &t2)
 
tactic operator| (tactic const &t1, tactic const &t2)
 
tactic repeat (tactic const &t, unsigned max=UINT_MAX)
 
tactic with (tactic const &t, params const &p)
 
tactic try_for (tactic const &t, unsigned ms)
 
tactic par_or (unsigned n, tactic const *tactics)
 
tactic par_and_then (tactic const &t1, tactic const &t2)
 
simplifier operator& (simplifier const &t1, simplifier const &t2)
 
simplifier with (simplifier const &t, params const &p)
 
probe operator<= (probe const &p1, probe const &p2)
 
probe operator<= (probe const &p1, double p2)
 
probe operator<= (double p1, probe const &p2)
 
probe operator>= (probe const &p1, probe const &p2)
 
probe operator>= (probe const &p1, double p2)
 
probe operator>= (double p1, probe const &p2)
 
probe operator< (probe const &p1, probe const &p2)
 
probe operator< (probe const &p1, double p2)
 
probe operator< (double p1, probe const &p2)
 
probe operator> (probe const &p1, probe const &p2)
 
probe operator> (probe const &p1, double p2)
 
probe operator> (double p1, probe const &p2)
 
probe operator== (probe const &p1, probe const &p2)
 
probe operator== (probe const &p1, double p2)
 
probe operator== (double p1, probe const &p2)
 
probe operator&& (probe const &p1, probe const &p2)
 
probe operator|| (probe const &p1, probe const &p2)
 
probe operator! (probe const &p)
 
std::ostream & operator<< (std::ostream &out, optimize const &s)
 
std::ostream & operator<< (std::ostream &out, fixedpoint const &f)
 
tactic fail_if (probe const &p)
 
tactic when (probe const &p, tactic const &t)
 
tactic cond (probe const &p, tactic const &t1, tactic const &t2)
 
expr to_real (expr const &a)
 
func_decl function (symbol const &name, unsigned arity, sort const *domain, sort const &range)
 
func_decl function (char const *name, unsigned arity, sort const *domain, sort const &range)
 
func_decl function (char const *name, sort const &domain, sort const &range)
 
func_decl function (char const *name, sort const &d1, sort const &d2, sort const &range)
 
func_decl function (char const *name, sort const &d1, sort const &d2, sort const &d3, sort const &range)
 
func_decl function (char const *name, sort const &d1, sort const &d2, sort const &d3, sort const &d4, sort const &range)
 
func_decl function (char const *name, sort const &d1, sort const &d2, sort const &d3, sort const &d4, sort const &d5, sort const &range)
 
func_decl function (char const *name, sort_vector const &domain, sort const &range)
 
func_decl function (std::string const &name, sort_vector const &domain, sort const &range)
 
func_decl recfun (symbol const &name, unsigned arity, sort const *domain, sort const &range)
 
func_decl recfun (char const *name, unsigned arity, sort const *domain, sort const &range)
 
func_decl recfun (char const *name, sort const &d1, sort const &range)
 
func_decl recfun (char const *name, sort const &d1, sort const &d2, sort const &range)
 
expr select (expr const &a, int i)
 
expr store (expr const &a, expr const &i, expr const &v)
 
expr store (expr const &a, int i, expr const &v)
 
expr store (expr const &a, expr i, int v)
 
expr store (expr const &a, int i, int v)
 
expr store (expr const &a, expr_vector const &i, expr const &v)
 
expr as_array (func_decl &f)
 
expr array_default (expr const &a)
 
expr array_ext (expr const &a, expr const &b)
 
expr const_array (sort const &d, expr const &v)
 
expr empty_set (sort const &s)
 
expr full_set (sort const &s)
 
expr set_add (expr const &s, expr const &e)
 
expr set_del (expr const &s, expr const &e)
 
expr set_union (expr const &a, expr const &b)
 
expr set_intersect (expr const &a, expr const &b)
 
expr set_difference (expr const &a, expr const &b)
 
expr set_complement (expr const &a)
 
expr set_member (expr const &s, expr const &e)
 
expr set_subset (expr const &a, expr const &b)
 
expr 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)
 

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 1679 of file z3++.h.

1685 {
1686 assert(a.is_bool() && b.is_bool());
1688 }
1689 inline expr implies(expr const & a, bool b) { return implies(a, a.ctx().bool_val(b)); }
1690 inline expr implies(bool a, expr const & b) { return implies(b.ctx().bool_val(a), b); }
1691
1692
1693 inline expr pw(expr const & a, expr const & b) { _Z3_MK_BIN_(a, b, Z3_mk_power); }
1694 inline expr pw(expr const & a, int b) { return pw(a, a.ctx().num_val(b, a.get_sort())); }
1695 inline expr pw(int a, expr const & b) { return pw(b.ctx().num_val(a, b.get_sort()), b); }
1696
1697 inline expr mod(expr const& a, expr const& b) {
1698 if (a.is_bv()) {
1699 _Z3_MK_BIN_(a, b, Z3_mk_bvsmod);
1700 }
1701 else {
1702 _Z3_MK_BIN_(a, b, Z3_mk_mod);
1703 }
1704 }
1705 inline expr mod(expr const & a, int b) { return mod(a, a.ctx().num_val(b, a.get_sort())); }
1706 inline expr mod(int a, expr const & b) { return mod(b.ctx().num_val(a, b.get_sort()), b); }
1707
1708 inline expr operator%(expr const& a, expr const& b) { return mod(a, b); }
1709 inline expr operator%(expr const& a, int b) { return mod(a, b); }
1710 inline expr operator%(int a, expr const& b) { return mod(a, b); }
1711
1712
1713 inline expr rem(expr const& a, expr const& b) {
1714 if (a.is_fpa() && b.is_fpa()) {
1716 } else {
1717 _Z3_MK_BIN_(a, b, Z3_mk_rem);
1718 }
1719 }
1720 inline expr rem(expr const & a, int b) { return rem(a, a.ctx().num_val(b, a.get_sort())); }
1721 inline expr rem(int a, expr const & b) { return rem(b.ctx().num_val(a, b.get_sort()), b); }
1722
1723#undef _Z3_MK_BIN_
1724
1725#define _Z3_MK_UN_(a, mkun) \
1726 Z3_ast r = mkun(a.ctx(), a); \
1727 a.check_error(); \
1728 return expr(a.ctx(), r); \
1729
1730
1731 inline expr operator!(expr const & a) { assert(a.is_bool()); _Z3_MK_UN_(a, Z3_mk_not); }
1732
1733 inline expr is_int(expr const& e) { _Z3_MK_UN_(e, Z3_mk_is_int); }
1734
1735#undef _Z3_MK_UN_
1736
1737 inline expr operator&&(expr const & a, expr const & b) {
1738 check_context(a, b);
1739 assert(a.is_bool() && b.is_bool());
1740 Z3_ast args[2] = { a, b };
1741 Z3_ast r = Z3_mk_and(a.ctx(), 2, args);
1742 a.check_error();
1743 return expr(a.ctx(), r);
1744 }
1745
1746 inline expr operator&&(expr const & a, bool b) { return a && a.ctx().bool_val(b); }
1747 inline expr operator&&(bool a, expr const & b) { return b.ctx().bool_val(a) && b; }
1748
1749 inline expr operator||(expr const & a, expr const & b) {
1750 check_context(a, b);
1751 assert(a.is_bool() && b.is_bool());
1752 Z3_ast args[2] = { a, b };
1753 Z3_ast r = Z3_mk_or(a.ctx(), 2, args);
1754 a.check_error();
1755 return expr(a.ctx(), r);
1756 }
1757
1758 inline expr operator||(expr const & a, bool b) { return a || a.ctx().bool_val(b); }
1759
1760 inline expr operator||(bool a, expr const & b) { return b.ctx().bool_val(a) || b; }
1761
1762 inline expr operator==(expr const & a, expr const & b) {
1763 check_context(a, b);
1764 Z3_ast r = Z3_mk_eq(a.ctx(), a, b);
1765 a.check_error();
1766 return expr(a.ctx(), r);
1767 }
1768 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()); }
1769 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; }
1770 inline expr operator==(expr const & a, double b) { assert(a.is_fpa()); return a == a.ctx().fpa_val(b); }
1771 inline expr operator==(double a, expr const & b) { assert(b.is_fpa()); return b.ctx().fpa_val(a) == b; }
1772
1773 inline expr operator!=(expr const & a, expr const & b) {
1774 check_context(a, b);
1775 Z3_ast args[2] = { a, b };
1776 Z3_ast r = Z3_mk_distinct(a.ctx(), 2, args);
1777 a.check_error();
1778 return expr(a.ctx(), r);
1779 }
1780 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()); }
1781 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; }
1782 inline expr operator!=(expr const & a, double b) { assert(a.is_fpa()); return a != a.ctx().fpa_val(b); }
1783 inline expr operator!=(double a, expr const & b) { assert(b.is_fpa()); return b.ctx().fpa_val(a) != b; }
1784
1785 inline expr operator+(expr const & a, expr const & b) {
1786 check_context(a, b);
1787 Z3_ast r = 0;
1788 if (a.is_arith() && b.is_arith()) {
1789 Z3_ast args[2] = { a, b };
1790 r = Z3_mk_add(a.ctx(), 2, args);
1791 }
1792 else if (a.is_bv() && b.is_bv()) {
1793 r = Z3_mk_bvadd(a.ctx(), a, b);
1794 }
1795 else if (a.is_seq() && b.is_seq()) {
1796 return concat(a, b);
1797 }
1798 else if (a.is_re() && b.is_re()) {
1799 Z3_ast _args[2] = { a, b };
1800 r = Z3_mk_re_union(a.ctx(), 2, _args);
1801 }
1802 else if (a.is_fpa() && b.is_fpa()) {
1803 r = Z3_mk_fpa_add(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1804 }
1805 else {
1806 // operator is not supported by given arguments.
1807 assert(false);
1808 }
1809 a.check_error();
1810 return expr(a.ctx(), r);
1811 }
1812 inline expr operator+(expr const & a, int b) { return a + a.ctx().num_val(b, a.get_sort()); }
1813 inline expr operator+(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) + b; }
1814
1815 inline expr operator*(expr const & a, expr const & b) {
1816 check_context(a, b);
1817 Z3_ast r = 0;
1818 if (a.is_arith() && b.is_arith()) {
1819 Z3_ast args[2] = { a, b };
1820 r = Z3_mk_mul(a.ctx(), 2, args);
1821 }
1822 else if (a.is_bv() && b.is_bv()) {
1823 r = Z3_mk_bvmul(a.ctx(), a, b);
1824 }
1825 else if (a.is_fpa() && b.is_fpa()) {
1826 r = Z3_mk_fpa_mul(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1827 }
1828 else {
1829 // operator is not supported by given arguments.
1830 assert(false);
1831 }
1832 a.check_error();
1833 return expr(a.ctx(), r);
1834 }
1835 inline expr operator*(expr const & a, int b) { return a * a.ctx().num_val(b, a.get_sort()); }
1836 inline expr operator*(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) * b; }
1837
1838
1839 inline expr operator>=(expr const & a, expr const & b) {
1840 check_context(a, b);
1841 Z3_ast r = 0;
1842 if (a.is_arith() && b.is_arith()) {
1843 r = Z3_mk_ge(a.ctx(), a, b);
1844 }
1845 else if (a.is_bv() && b.is_bv()) {
1846 r = Z3_mk_bvsge(a.ctx(), a, b);
1847 }
1848 else if (a.is_fpa() && b.is_fpa()) {
1849 r = Z3_mk_fpa_geq(a.ctx(), a, b);
1850 }
1851 else {
1852 // operator is not supported by given arguments.
1853 assert(false);
1854 }
1855 a.check_error();
1856 return expr(a.ctx(), r);
1857 }
1858
1859 inline expr operator/(expr const & a, expr const & b) {
1860 check_context(a, b);
1861 Z3_ast r = 0;
1862 if (a.is_arith() && b.is_arith()) {
1863 r = Z3_mk_div(a.ctx(), a, b);
1864 }
1865 else if (a.is_bv() && b.is_bv()) {
1866 r = Z3_mk_bvsdiv(a.ctx(), a, b);
1867 }
1868 else if (a.is_fpa() && b.is_fpa()) {
1869 r = Z3_mk_fpa_div(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1870 }
1871 else {
1872 // operator is not supported by given arguments.
1873 assert(false);
1874 }
1875 a.check_error();
1876 return expr(a.ctx(), r);
1877 }
1878 inline expr operator/(expr const & a, int b) { return a / a.ctx().num_val(b, a.get_sort()); }
1879 inline expr operator/(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) / b; }
1880
1881 inline expr operator-(expr const & a) {
1882 Z3_ast r = 0;
1883 if (a.is_arith()) {
1884 r = Z3_mk_unary_minus(a.ctx(), a);
1885 }
1886 else if (a.is_bv()) {
1887 r = Z3_mk_bvneg(a.ctx(), a);
1888 }
1889 else if (a.is_fpa()) {
1890 r = Z3_mk_fpa_neg(a.ctx(), a);
1891 }
1892 else {
1893 // operator is not supported by given arguments.
1894 assert(false);
1895 }
1896 a.check_error();
1897 return expr(a.ctx(), r);
1898 }
1899
1900 inline expr operator-(expr const & a, expr const & b) {
1901 check_context(a, b);
1902 Z3_ast r = 0;
1903 if (a.is_arith() && b.is_arith()) {
1904 Z3_ast args[2] = { a, b };
1905 r = Z3_mk_sub(a.ctx(), 2, args);
1906 }
1907 else if (a.is_bv() && b.is_bv()) {
1908 r = Z3_mk_bvsub(a.ctx(), a, b);
1909 }
1910 else if (a.is_fpa() && b.is_fpa()) {
1911 r = Z3_mk_fpa_sub(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1912 }
1913 else {
1914 // operator is not supported by given arguments.
1915 assert(false);
1916 }
1917 a.check_error();
1918 return expr(a.ctx(), r);
1919 }
1920 inline expr operator-(expr const & a, int b) { return a - a.ctx().num_val(b, a.get_sort()); }
1921 inline expr operator-(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) - b; }
1922
1923 inline expr operator<=(expr const & a, expr const & b) {
1924 check_context(a, b);
1925 Z3_ast r = 0;
1926 if (a.is_arith() && b.is_arith()) {
1927 r = Z3_mk_le(a.ctx(), a, b);
1928 }
1929 else if (a.is_bv() && b.is_bv()) {
1930 r = Z3_mk_bvsle(a.ctx(), a, b);
1931 }
1932 else if (a.is_fpa() && b.is_fpa()) {
1933 r = Z3_mk_fpa_leq(a.ctx(), a, b);
1934 }
1935 else {
1936 // operator is not supported by given arguments.
1937 assert(false);
1938 }
1939 a.check_error();
1940 return expr(a.ctx(), r);
1941 }
1942 inline expr operator<=(expr const & a, int b) { return a <= a.ctx().num_val(b, a.get_sort()); }
1943 inline expr operator<=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) <= b; }
1944
1945 inline expr operator>=(expr const & a, int b) { return a >= a.ctx().num_val(b, a.get_sort()); }
1946 inline expr operator>=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) >= b; }
1947
1948 inline expr operator<(expr const & a, expr const & b) {
1949 check_context(a, b);
1950 Z3_ast r = 0;
1951 if (a.is_arith() && b.is_arith()) {
1952 r = Z3_mk_lt(a.ctx(), a, b);
1953 }
1954 else if (a.is_bv() && b.is_bv()) {
1955 r = Z3_mk_bvslt(a.ctx(), a, b);
1956 }
1957 else if (a.is_fpa() && b.is_fpa()) {
1958 r = Z3_mk_fpa_lt(a.ctx(), a, b);
1959 }
1960 else {
1961 // operator is not supported by given arguments.
1962 assert(false);
1963 }
1964 a.check_error();
1965 return expr(a.ctx(), r);
1966 }
1967 inline expr operator<(expr const & a, int b) { return a < a.ctx().num_val(b, a.get_sort()); }
1968 inline expr operator<(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) < b; }
1969
1970 inline expr operator>(expr const & a, expr const & b) {
1971 check_context(a, b);
1972 Z3_ast r = 0;
1973 if (a.is_arith() && b.is_arith()) {
1974 r = Z3_mk_gt(a.ctx(), a, b);
1975 }
1976 else if (a.is_bv() && b.is_bv()) {
1977 r = Z3_mk_bvsgt(a.ctx(), a, b);
1978 }
1979 else if (a.is_fpa() && b.is_fpa()) {
1980 r = Z3_mk_fpa_gt(a.ctx(), 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 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); }
1993 inline expr operator&(expr const & a, int b) { return a & a.ctx().num_val(b, a.get_sort()); }
1994 inline expr operator&(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) & b; }
1995
1996 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); }
1997 inline expr operator^(expr const & a, int b) { return a ^ a.ctx().num_val(b, a.get_sort()); }
1998 inline expr operator^(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) ^ b; }
1999
2000 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); }
2001 inline expr operator|(expr const & a, int b) { return a | a.ctx().num_val(b, a.get_sort()); }
2002 inline expr operator|(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) | b; }
2003
2004 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); }
2005 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); }
2006 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); }
2007 inline expr min(expr const& a, expr const& b) {
2008 check_context(a, b);
2009 Z3_ast r;
2010 if (a.is_arith()) {
2011 r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), b, a);
2012 }
2013 else if (a.is_bv()) {
2014 r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), b, a);
2015 }
2016 else {
2017 assert(a.is_fpa());
2018 r = Z3_mk_fpa_min(a.ctx(), a, b);
2019 }
2020 a.check_error();
2021 return expr(a.ctx(), r);
2022 }
2023 inline expr max(expr const& a, expr const& b) {
2024 check_context(a, b);
2025 Z3_ast r;
2026 if (a.is_arith()) {
2027 r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), a, b);
2028 }
2029 else if (a.is_bv()) {
2030 r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), a, b);
2031 }
2032 else {
2033 assert(a.is_fpa());
2034 r = Z3_mk_fpa_max(a.ctx(), a, b);
2035 }
2036 a.check_error();
2037 return expr(a.ctx(), r);
2038 }
2039 inline expr bvredor(expr const & a) {
2040 assert(a.is_bv());
2041 Z3_ast r = Z3_mk_bvredor(a.ctx(), a);
2042 a.check_error();
2043 return expr(a.ctx(), r);
2044 }
2045 inline expr bvredand(expr const & a) {
2046 assert(a.is_bv());
2047 Z3_ast r = Z3_mk_bvredand(a.ctx(), a);
2048 a.check_error();
2049 return expr(a.ctx(), r);
2050 }
2051 inline expr abs(expr const & a) {
2052 Z3_ast r;
2053 if (a.is_int()) {
2054 expr zero = a.ctx().int_val(0);
2055 expr ge = a >= zero;
2056 expr na = -a;
2057 r = Z3_mk_ite(a.ctx(), ge, a, na);
2058 }
2059 else if (a.is_real()) {
2060 expr zero = a.ctx().real_val(0);
2061 expr ge = a >= zero;
2062 expr na = -a;
2063 r = Z3_mk_ite(a.ctx(), ge, a, na);
2064 }
2065 else {
2066 r = Z3_mk_fpa_abs(a.ctx(), a);
2067 }
2068 a.check_error();
2069 return expr(a.ctx(), r);
2070 }
2071 inline expr sqrt(expr const & a, expr const& rm) {
2072 check_context(a, rm);
2073 assert(a.is_fpa());
2074 Z3_ast r = Z3_mk_fpa_sqrt(a.ctx(), rm, a);
2075 a.check_error();
2076 return expr(a.ctx(), r);
2077 }
2078 inline expr fp_eq(expr const & a, expr const & b) {
2079 check_context(a, b);
2080 assert(a.is_fpa());
2081 Z3_ast r = Z3_mk_fpa_eq(a.ctx(), a, b);
2082 a.check_error();
2083 return expr(a.ctx(), r);
2084 }
2085 inline expr operator~(expr const & a) { Z3_ast r = Z3_mk_bvnot(a.ctx(), a); return expr(a.ctx(), r); }
2086
2087 inline expr fma(expr const& a, expr const& b, expr const& c, expr const& rm) {
2088 check_context(a, b); check_context(a, c); check_context(a, rm);
2089 assert(a.is_fpa() && b.is_fpa() && c.is_fpa());
2090 Z3_ast r = Z3_mk_fpa_fma(a.ctx(), rm, a, b, c);
2091 a.check_error();
2092 return expr(a.ctx(), r);
2093 }
2094
2095 inline expr fpa_fp(expr const& sgn, expr const& exp, expr const& sig) {
2096 check_context(sgn, exp); check_context(exp, sig);
2097 assert(sgn.is_bv() && exp.is_bv() && sig.is_bv());
2098 Z3_ast r = Z3_mk_fpa_fp(sgn.ctx(), sgn, exp, sig);
2099 sgn.check_error();
2100 return expr(sgn.ctx(), r);
2101 }
2102
2103 inline expr fpa_to_sbv(expr const& t, unsigned sz) {
2104 assert(t.is_fpa());
2105 Z3_ast r = Z3_mk_fpa_to_sbv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
2106 t.check_error();
2107 return expr(t.ctx(), r);
2108 }
2109
2110 inline expr fpa_to_ubv(expr const& t, unsigned sz) {
2111 assert(t.is_fpa());
2112 Z3_ast r = Z3_mk_fpa_to_ubv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
2113 t.check_error();
2114 return expr(t.ctx(), r);
2115 }
2116
2117 inline expr sbv_to_fpa(expr const& t, sort s) {
2118 assert(t.is_bv());
2119 Z3_ast r = Z3_mk_fpa_to_fp_signed(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2120 t.check_error();
2121 return expr(t.ctx(), r);
2122 }
2123
2124 inline expr ubv_to_fpa(expr const& t, sort s) {
2125 assert(t.is_bv());
2126 Z3_ast r = Z3_mk_fpa_to_fp_unsigned(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2127 t.check_error();
2128 return expr(t.ctx(), r);
2129 }
2130
2131 inline expr fpa_to_fpa(expr const& t, sort s) {
2132 assert(t.is_fpa());
2133 Z3_ast r = Z3_mk_fpa_to_fp_float(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2134 t.check_error();
2135 return expr(t.ctx(), r);
2136 }
2137
2138 inline expr round_fpa_to_closest_integer(expr const& t) {
2139 assert(t.is_fpa());
2140 Z3_ast r = Z3_mk_fpa_round_to_integral(t.ctx(), t.ctx().fpa_rounding_mode(), t);
2141 t.check_error();
2142 return expr(t.ctx(), r);
2143 }
2144
2150 inline expr ite(expr const & c, expr const & t, expr const & e) {
2151 check_context(c, t); check_context(c, e);
2152 assert(c.is_bool());
2153 Z3_ast r = Z3_mk_ite(c.ctx(), c, t, e);
2154 c.check_error();
2155 return expr(c.ctx(), r);
2156 }
2157
2158
2163 inline expr to_expr(context & c, Z3_ast a) {
2164 c.check_error();
2165 assert(Z3_get_ast_kind(c, a) == Z3_APP_AST ||
2167 Z3_get_ast_kind(c, a) == Z3_VAR_AST ||
2169 return expr(c, a);
2170 }
2171
2172 inline sort to_sort(context & c, Z3_sort s) {
2173 c.check_error();
2174 return sort(c, s);
2175 }
2176
2177 inline func_decl to_func_decl(context & c, Z3_func_decl f) {
2178 c.check_error();
2179 return func_decl(c, f);
2180 }
2181
2185 inline expr sle(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsle(a.ctx(), a, b)); }
2186 inline expr sle(expr const & a, int b) { return sle(a, a.ctx().num_val(b, a.get_sort())); }
2187 inline expr sle(int a, expr const & b) { return sle(b.ctx().num_val(a, b.get_sort()), b); }
2191 inline expr slt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvslt(a.ctx(), a, b)); }
2192 inline expr slt(expr const & a, int b) { return slt(a, a.ctx().num_val(b, a.get_sort())); }
2193 inline expr slt(int a, expr const & b) { return slt(b.ctx().num_val(a, b.get_sort()), b); }
2197 inline expr sge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsge(a.ctx(), a, b)); }
2198 inline expr sge(expr const & a, int b) { return sge(a, a.ctx().num_val(b, a.get_sort())); }
2199 inline expr sge(int a, expr const & b) { return sge(b.ctx().num_val(a, b.get_sort()), b); }
2203 inline expr sgt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsgt(a.ctx(), a, b)); }
2204 inline expr sgt(expr const & a, int b) { return sgt(a, a.ctx().num_val(b, a.get_sort())); }
2205 inline expr sgt(int a, expr const & b) { return sgt(b.ctx().num_val(a, b.get_sort()), b); }
2206
2207
2211 inline expr ule(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvule(a.ctx(), a, b)); }
2212 inline expr ule(expr const & a, int b) { return ule(a, a.ctx().num_val(b, a.get_sort())); }
2213 inline expr ule(int a, expr const & b) { return ule(b.ctx().num_val(a, b.get_sort()), b); }
2217 inline expr ult(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvult(a.ctx(), a, b)); }
2218 inline expr ult(expr const & a, int b) { return ult(a, a.ctx().num_val(b, a.get_sort())); }
2219 inline expr ult(int a, expr const & b) { return ult(b.ctx().num_val(a, b.get_sort()), b); }
2223 inline expr uge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b)); }
2224 inline expr uge(expr const & a, int b) { return uge(a, a.ctx().num_val(b, a.get_sort())); }
2225 inline expr uge(int a, expr const & b) { return uge(b.ctx().num_val(a, b.get_sort()), b); }
2229 inline expr ugt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvugt(a.ctx(), a, b)); }
2230 inline expr ugt(expr const & a, int b) { return ugt(a, a.ctx().num_val(b, a.get_sort())); }
2231 inline expr ugt(int a, expr const & b) { return ugt(b.ctx().num_val(a, b.get_sort()), b); }
2232
2236 inline expr sdiv(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsdiv(a.ctx(), a, b)); }
2237 inline expr sdiv(expr const & a, int b) { return sdiv(a, a.ctx().num_val(b, a.get_sort())); }
2238 inline expr sdiv(int a, expr const & b) { return sdiv(b.ctx().num_val(a, b.get_sort()), b); }
2239
2243 inline expr udiv(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvudiv(a.ctx(), a, b)); }
2244 inline expr udiv(expr const & a, int b) { return udiv(a, a.ctx().num_val(b, a.get_sort())); }
2245 inline expr udiv(int a, expr const & b) { return udiv(b.ctx().num_val(a, b.get_sort()), b); }
2246
2250 inline expr srem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsrem(a.ctx(), a, b)); }
2251 inline expr srem(expr const & a, int b) { return srem(a, a.ctx().num_val(b, a.get_sort())); }
2252 inline expr srem(int a, expr const & b) { return srem(b.ctx().num_val(a, b.get_sort()), b); }
2253
2257 inline expr smod(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsmod(a.ctx(), a, b)); }
2258 inline expr smod(expr const & a, int b) { return smod(a, a.ctx().num_val(b, a.get_sort())); }
2259 inline expr smod(int a, expr const & b) { return smod(b.ctx().num_val(a, b.get_sort()), b); }
2260
2264 inline expr urem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvurem(a.ctx(), a, b)); }
2265 inline expr urem(expr const & a, int b) { return urem(a, a.ctx().num_val(b, a.get_sort())); }
2266 inline expr urem(int a, expr const & b) { return urem(b.ctx().num_val(a, b.get_sort()), b); }
2267
2271 inline expr shl(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvshl(a.ctx(), a, b)); }
2272 inline expr shl(expr const & a, int b) { return shl(a, a.ctx().num_val(b, a.get_sort())); }
2273 inline expr shl(int a, expr const & b) { return shl(b.ctx().num_val(a, b.get_sort()), b); }
2274
2278 inline expr lshr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvlshr(a.ctx(), a, b)); }
2279 inline expr lshr(expr const & a, int b) { return lshr(a, a.ctx().num_val(b, a.get_sort())); }
2280 inline expr lshr(int a, expr const & b) { return lshr(b.ctx().num_val(a, b.get_sort()), b); }
2281
2285 inline expr ashr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvashr(a.ctx(), a, b)); }
2286 inline expr ashr(expr const & a, int b) { return ashr(a, a.ctx().num_val(b, a.get_sort())); }
2287 inline expr ashr(int a, expr const & b) { return ashr(b.ctx().num_val(a, b.get_sort()), b); }
2288
2292 inline expr zext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_zero_ext(a.ctx(), i, a)); }
2293
2297 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); }
2298 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); }
2299
2303 inline expr bvadd_no_overflow(expr const& a, expr const& b, bool is_signed) {
2304 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);
2305 }
2306 inline expr bvadd_no_underflow(expr const& a, expr const& b) {
2307 check_context(a, b); Z3_ast r = Z3_mk_bvadd_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2308 }
2309 inline expr bvsub_no_overflow(expr const& a, expr const& b) {
2310 check_context(a, b); Z3_ast r = Z3_mk_bvsub_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2311 }
2312 inline expr bvsub_no_underflow(expr const& a, expr const& b, bool is_signed) {
2313 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);
2314 }
2315 inline expr bvsdiv_no_overflow(expr const& a, expr const& b) {
2316 check_context(a, b); Z3_ast r = Z3_mk_bvsdiv_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2317 }
2318 inline expr bvneg_no_overflow(expr const& a) {
2319 Z3_ast r = Z3_mk_bvneg_no_overflow(a.ctx(), a); a.check_error(); return expr(a.ctx(), r);
2320 }
2321 inline expr bvmul_no_overflow(expr const& a, expr const& b, bool is_signed) {
2322 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);
2323 }
2324 inline expr bvmul_no_underflow(expr const& a, expr const& b) {
2325 check_context(a, b); Z3_ast r = Z3_mk_bvmul_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2326 }
2327
2328
2332 inline expr sext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_sign_ext(a.ctx(), i, a)); }
2333
2334 inline func_decl linear_order(sort const& a, unsigned index) {
2335 return to_func_decl(a.ctx(), Z3_mk_linear_order(a.ctx(), a, index));
2336 }
2337 inline func_decl partial_order(sort const& a, unsigned index) {
2338 return to_func_decl(a.ctx(), Z3_mk_partial_order(a.ctx(), a, index));
2339 }
2340 inline func_decl piecewise_linear_order(sort const& a, unsigned index) {
2341 return to_func_decl(a.ctx(), Z3_mk_piecewise_linear_order(a.ctx(), a, index));
2342 }
2343 inline func_decl tree_order(sort const& a, unsigned index) {
2344 return to_func_decl(a.ctx(), Z3_mk_tree_order(a.ctx(), a, index));
2345 }
2346
2353 inline expr_vector polynomial_subresultants(expr const& p, expr const& q, expr const& x) {
2354 check_context(p, q); check_context(p, x);
2355 Z3_ast_vector r = Z3_polynomial_subresultants(p.ctx(), p, q, x);
2356 p.check_error();
2357 return expr_vector(p.ctx(), r);
2358 }
2359
2360 template<> class cast_ast<ast> {
2361 public:
2362 ast operator()(context & c, Z3_ast a) { return ast(c, a); }
2363 };
2364
2365 template<> class cast_ast<expr> {
2366 public:
2367 expr operator()(context & c, Z3_ast a) {
2368 assert(Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST ||
2369 Z3_get_ast_kind(c, a) == Z3_APP_AST ||
2371 Z3_get_ast_kind(c, a) == Z3_VAR_AST);
2372 return expr(c, a);
2373 }
2374 };
2375
2376 template<> class cast_ast<sort> {
2377 public:
2378 sort operator()(context & c, Z3_ast a) {
2379 assert(Z3_get_ast_kind(c, a) == Z3_SORT_AST);
2380 return sort(c, reinterpret_cast<Z3_sort>(a));
2381 }
2382 };
2383
2384 template<> class cast_ast<func_decl> {
2385 public:
2386 func_decl operator()(context & c, Z3_ast a) {
2387 assert(Z3_get_ast_kind(c, a) == Z3_FUNC_DECL_AST);
2388 return func_decl(c, reinterpret_cast<Z3_func_decl>(a));
2389 }
2390 };
2391
2392 template<typename T>
2393 template<typename T2>
2394 array<T>::array(ast_vector_tpl<T2> const & v):m_array(new T[v.size()]), m_size(v.size()) {
2395 for (unsigned i = 0; i < m_size; i++) {
2396 m_array[i] = v[i];
2397 }
2398 }
2399
2400 // Basic functions for creating quantified formulas.
2401 // The C API should be used for creating quantifiers with patterns, weights, many variables, etc.
2402 inline expr forall(expr const & x, expr const & b) {
2403 check_context(x, b);
2404 Z3_app vars[] = {(Z3_app) x};
2405 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2406 }
2407 inline expr forall(expr const & x1, expr const & x2, expr const & b) {
2408 check_context(x1, b); check_context(x2, b);
2409 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2410 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2411 }
2412 inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2413 check_context(x1, b); check_context(x2, b); check_context(x3, b);
2414 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2415 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2416 }
2417 inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2418 check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2419 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2420 Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2421 }
2422 inline expr forall(expr_vector const & xs, expr const & b) {
2423 array<Z3_app> vars(xs);
2424 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);
2425 }
2426 inline expr exists(expr const & x, expr const & b) {
2427 check_context(x, b);
2428 Z3_app vars[] = {(Z3_app) x};
2429 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2430 }
2431 inline expr exists(expr const & x1, expr const & x2, expr const & b) {
2432 check_context(x1, b); check_context(x2, b);
2433 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2434 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2435 }
2436 inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2437 check_context(x1, b); check_context(x2, b); check_context(x3, b);
2438 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2439 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2440 }
2441 inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2442 check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2443 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2444 Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2445 }
2446 inline expr exists(expr_vector const & xs, expr const & b) {
2447 array<Z3_app> vars(xs);
2448 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);
2449 }
2450 inline expr lambda(expr const & x, expr const & b) {
2451 check_context(x, b);
2452 Z3_app vars[] = {(Z3_app) x};
2453 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 1, vars, b); b.check_error(); return expr(b.ctx(), r);
2454 }
2455 inline expr lambda(expr const & x1, expr const & x2, expr const & b) {
2456 check_context(x1, b); check_context(x2, b);
2457 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2458 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 2, vars, b); b.check_error(); return expr(b.ctx(), r);
2459 }
2460 inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2461 check_context(x1, b); check_context(x2, b); check_context(x3, b);
2462 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2463 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 3, vars, b); b.check_error(); return expr(b.ctx(), r);
2464 }
2465 inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2466 check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2467 Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2468 Z3_ast r = Z3_mk_lambda_const(b.ctx(), 4, vars, b); b.check_error(); return expr(b.ctx(), r);
2469 }
2470 inline expr lambda(expr_vector const & xs, expr const & b) {
2471 array<Z3_app> vars(xs);
2472 Z3_ast r = Z3_mk_lambda_const(b.ctx(), vars.size(), vars.ptr(), b); b.check_error(); return expr(b.ctx(), r);
2473 }
2474
2475 inline expr pble(expr_vector const& es, int const* coeffs, int bound) {
2476 assert(es.size() > 0);
2477 context& ctx = es[0u].ctx();
2478 array<Z3_ast> _es(es);
2479 Z3_ast r = Z3_mk_pble(ctx, _es.size(), _es.ptr(), coeffs, bound);
2480 ctx.check_error();
2481 return expr(ctx, r);
2482 }
2483 inline expr pbge(expr_vector const& es, int const* coeffs, int bound) {
2484 assert(es.size() > 0);
2485 context& ctx = es[0u].ctx();
2486 array<Z3_ast> _es(es);
2487 Z3_ast r = Z3_mk_pbge(ctx, _es.size(), _es.ptr(), coeffs, bound);
2488 ctx.check_error();
2489 return expr(ctx, r);
2490 }
2491 inline expr pbeq(expr_vector const& es, int const* coeffs, int bound) {
2492 assert(es.size() > 0);
2493 context& ctx = es[0u].ctx();
2494 array<Z3_ast> _es(es);
2495 Z3_ast r = Z3_mk_pbeq(ctx, _es.size(), _es.ptr(), coeffs, bound);
2496 ctx.check_error();
2497 return expr(ctx, r);
2498 }
2499 inline expr atmost(expr_vector const& es, unsigned bound) {
2500 assert(es.size() > 0);
2501 context& ctx = es[0u].ctx();
2502 array<Z3_ast> _es(es);
2503 Z3_ast r = Z3_mk_atmost(ctx, _es.size(), _es.ptr(), bound);
2504 ctx.check_error();
2505 return expr(ctx, r);
2506 }
2507 inline expr atleast(expr_vector const& es, unsigned bound) {
2508 assert(es.size() > 0);
2509 context& ctx = es[0u].ctx();
2510 array<Z3_ast> _es(es);
2511 Z3_ast r = Z3_mk_atleast(ctx, _es.size(), _es.ptr(), bound);
2512 ctx.check_error();
2513 return expr(ctx, r);
2514 }
2515 inline expr sum(expr_vector const& args) {
2516 assert(args.size() > 0);
2517 context& ctx = args[0u].ctx();
2518 array<Z3_ast> _args(args);
2519 Z3_ast r = Z3_mk_add(ctx, _args.size(), _args.ptr());
2520 ctx.check_error();
2521 return expr(ctx, r);
2522 }
2523
2524 inline expr distinct(expr_vector const& args) {
2525 assert(args.size() > 0);
2526 context& ctx = args[0u].ctx();
2527 array<Z3_ast> _args(args);
2528 Z3_ast r = Z3_mk_distinct(ctx, _args.size(), _args.ptr());
2529 ctx.check_error();
2530 return expr(ctx, r);
2531 }
2532
2533 inline expr concat(expr const& a, expr const& b) {
2534 check_context(a, b);
2535 Z3_ast r;
2536 if (Z3_is_seq_sort(a.ctx(), a.get_sort())) {
2537 Z3_ast _args[2] = { a, b };
2538 r = Z3_mk_seq_concat(a.ctx(), 2, _args);
2539 }
2540 else if (Z3_is_re_sort(a.ctx(), a.get_sort())) {
2541 Z3_ast _args[2] = { a, b };
2542 r = Z3_mk_re_concat(a.ctx(), 2, _args);
2543 }
2544 else {
2545 r = Z3_mk_concat(a.ctx(), a, b);
2546 }
2547 a.ctx().check_error();
2548 return expr(a.ctx(), r);
2549 }
2550
2551 inline expr concat(expr_vector const& args) {
2552 Z3_ast r;
2553 assert(args.size() > 0);
2554 if (args.size() == 1) {
2555 return args[0u];
2556 }
2557 context& ctx = args[0u].ctx();
2558 array<Z3_ast> _args(args);
2559 if (Z3_is_seq_sort(ctx, args[0u].get_sort())) {
2560 r = Z3_mk_seq_concat(ctx, _args.size(), _args.ptr());
2561 }
2562 else if (Z3_is_re_sort(ctx, args[0u].get_sort())) {
2563 r = Z3_mk_re_concat(ctx, _args.size(), _args.ptr());
2564 }
2565 else {
2566 r = _args[args.size()-1];
2567 for (unsigned i = args.size()-1; i > 0; ) {
2568 --i;
2569 r = Z3_mk_concat(ctx, _args[i], r);
2570 ctx.check_error();
2571 }
2572 }
2573 ctx.check_error();
2574 return expr(ctx, r);
2575 }
2576
2577 inline expr map(expr const& f, expr const& list) {
2578 context& ctx = f.ctx();
2579 Z3_ast r = Z3_mk_seq_map(ctx, f, list);
2580 ctx.check_error();
2581 return expr(ctx, r);
2582 }
2583
2584 inline expr mapi(expr const& f, expr const& i, expr const& list) {
2585 context& ctx = f.ctx();
2586 Z3_ast r = Z3_mk_seq_mapi(ctx, f, i, list);
2587 ctx.check_error();
2588 return expr(ctx, r);
2589 }
2590
2591 inline expr foldl(expr const& f, expr const& a, expr const& list) {
2592 context& ctx = f.ctx();
2593 Z3_ast r = Z3_mk_seq_foldl(ctx, f, a, list);
2594 ctx.check_error();
2595 return expr(ctx, r);
2596 }
2597
2598 inline expr foldli(expr const& f, expr const& i, expr const& a, expr const& list) {
2599 context& ctx = f.ctx();
2600 Z3_ast r = Z3_mk_seq_foldli(ctx, f, i, a, list);
2601 ctx.check_error();
2602 return expr(ctx, r);
2603 }
2604
2605 inline expr mk_or(expr_vector const& args) {
2606 array<Z3_ast> _args(args);
2607 Z3_ast r = Z3_mk_or(args.ctx(), _args.size(), _args.ptr());
2608 args.check_error();
2609 return expr(args.ctx(), r);
2610 }
2611 inline expr mk_and(expr_vector const& args) {
2612 array<Z3_ast> _args(args);
2613 Z3_ast r = Z3_mk_and(args.ctx(), _args.size(), _args.ptr());
2614 args.check_error();
2615 return expr(args.ctx(), r);
2616 }
2617 inline expr mk_xor(expr_vector const& args) {
2618 if (args.empty())
2619 return args.ctx().bool_val(false);
2620 expr r = args[0u];
2621 for (unsigned i = 1; i < args.size(); ++i)
2622 r = r ^ args[i];
2623 return r;
2624 }
2625
2626
2627 class func_entry : public object {
2628 Z3_func_entry m_entry;
2629 void init(Z3_func_entry e) {
2630 m_entry = e;
2631 Z3_func_entry_inc_ref(ctx(), m_entry);
2632 }
2633 public:
2634 func_entry(context & c, Z3_func_entry e):object(c) { init(e); }
2635 func_entry(func_entry const & s):object(s) { init(s.m_entry); }
2636 ~func_entry() override { Z3_func_entry_dec_ref(ctx(), m_entry); }
2637 operator Z3_func_entry() const { return m_entry; }
2638 func_entry & operator=(func_entry const & s) {
2639 Z3_func_entry_inc_ref(s.ctx(), s.m_entry);
2640 Z3_func_entry_dec_ref(ctx(), m_entry);
2641 object::operator=(s);
2642 m_entry = s.m_entry;
2643 return *this;
2644 }
2645 expr value() const { Z3_ast r = Z3_func_entry_get_value(ctx(), m_entry); check_error(); return expr(ctx(), r); }
2646 unsigned num_args() const { unsigned r = Z3_func_entry_get_num_args(ctx(), m_entry); check_error(); return r; }
2647 expr arg(unsigned i) const { Z3_ast r = Z3_func_entry_get_arg(ctx(), m_entry, i); check_error(); return expr(ctx(), r); }
2648 };
2649
2650 class func_interp : public object {
2651 Z3_func_interp m_interp;
2652 void init(Z3_func_interp e) {
2653 m_interp = e;
2654 Z3_func_interp_inc_ref(ctx(), m_interp);
2655 }
2656 public:
2657 func_interp(context & c, Z3_func_interp e):object(c) { init(e); }
2658 func_interp(func_interp const & s):object(s) { init(s.m_interp); }
2659 ~func_interp() override { Z3_func_interp_dec_ref(ctx(), m_interp); }
2660 operator Z3_func_interp() const { return m_interp; }
2661 func_interp & operator=(func_interp const & s) {
2662 Z3_func_interp_inc_ref(s.ctx(), s.m_interp);
2663 Z3_func_interp_dec_ref(ctx(), m_interp);
2664 object::operator=(s);
2665 m_interp = s.m_interp;
2666 return *this;
2667 }
2668 expr else_value() const { Z3_ast r = Z3_func_interp_get_else(ctx(), m_interp); check_error(); return expr(ctx(), r); }
2669 unsigned num_entries() const { unsigned r = Z3_func_interp_get_num_entries(ctx(), m_interp); check_error(); return r; }
2670 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); }
2671 void add_entry(expr_vector const& args, expr& value) {
2672 Z3_func_interp_add_entry(ctx(), m_interp, args, value);
2673 check_error();
2674 }
2675 void set_else(expr& value) {
2676 Z3_func_interp_set_else(ctx(), m_interp, value);
2677 check_error();
2678 }
2679 };
2680
2681 class model : public object {
2682 Z3_model m_model;
2683 void init(Z3_model m) {
2684 m_model = m;
2685 Z3_model_inc_ref(ctx(), m);
2686 }
2687 public:
2688 struct translate {};
2689 model(context & c):object(c) { init(Z3_mk_model(c)); }
2690 model(context & c, Z3_model m):object(c) { init(m); }
2691 model(model const & s):object(s) { init(s.m_model); }
2692 model(model& src, context& dst, translate) : object(dst) { init(Z3_model_translate(src.ctx(), src, dst)); }
2693 ~model() override { Z3_model_dec_ref(ctx(), m_model); }
2694 operator Z3_model() const { return m_model; }
2695 model & operator=(model const & s) {
2696 Z3_model_inc_ref(s.ctx(), s.m_model);
2697 Z3_model_dec_ref(ctx(), m_model);
2698 object::operator=(s);
2699 m_model = s.m_model;
2700 return *this;
2701 }
2702
2703 expr eval(expr const & n, bool model_completion=false) const {
2704 check_context(*this, n);
2705 Z3_ast r = 0;
2706 bool status = Z3_model_eval(ctx(), m_model, n, model_completion, &r);
2707 check_error();
2708 if (status == false && ctx().enable_exceptions())
2709 Z3_THROW(exception("failed to evaluate expression"));
2710 return expr(ctx(), r);
2711 }
2712
2713 unsigned num_consts() const { return Z3_model_get_num_consts(ctx(), m_model); }
2714 unsigned num_funcs() const { return Z3_model_get_num_funcs(ctx(), m_model); }
2715 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); }
2716 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); }
2717 unsigned size() const { return num_consts() + num_funcs(); }
2718 func_decl operator[](int i) const {
2719 assert(0 <= i);
2720 return static_cast<unsigned>(i) < num_consts() ? get_const_decl(i) : get_func_decl(i - num_consts());
2721 }
2722
2723 // returns interpretation of constant declaration c.
2724 // If c is not assigned any value in the model it returns
2725 // an expression with a null ast reference.
2726 expr get_const_interp(func_decl c) const {
2727 check_context(*this, c);
2728 Z3_ast r = Z3_model_get_const_interp(ctx(), m_model, c);
2729 check_error();
2730 return expr(ctx(), r);
2731 }
2732 func_interp get_func_interp(func_decl f) const {
2733 check_context(*this, f);
2734 Z3_func_interp r = Z3_model_get_func_interp(ctx(), m_model, f);
2735 check_error();
2736 return func_interp(ctx(), r);
2737 }
2738
2739 // returns true iff the model contains an interpretation
2740 // for function f.
2741 bool has_interp(func_decl f) const {
2742 check_context(*this, f);
2743 return Z3_model_has_interp(ctx(), m_model, f);
2744 }
2745
2746 func_interp add_func_interp(func_decl& f, expr& else_val) {
2747 Z3_func_interp r = Z3_add_func_interp(ctx(), m_model, f, else_val);
2748 check_error();
2749 return func_interp(ctx(), r);
2750 }
2751
2752 void add_const_interp(func_decl& f, expr& value) {
2753 Z3_add_const_interp(ctx(), m_model, f, value);
2754 check_error();
2755 }
2756
2757 unsigned num_sorts() const {
2758 unsigned r = Z3_model_get_num_sorts(ctx(), m_model);
2759 check_error();
2760 return r;
2761 }
2762
2767 sort get_sort(unsigned i) const {
2768 Z3_sort s = Z3_model_get_sort(ctx(), m_model, i);
2769 check_error();
2770 return sort(ctx(), s);
2771 }
2772
2773 expr_vector sort_universe(sort const& s) const {
2774 check_context(*this, s);
2775 Z3_ast_vector r = Z3_model_get_sort_universe(ctx(), m_model, s);
2776 check_error();
2777 return expr_vector(ctx(), r);
2778 }
2779
2780 friend std::ostream & operator<<(std::ostream & out, model const & m);
2781
2782 std::string to_string() const { return m_model ? std::string(Z3_model_to_string(ctx(), m_model)) : "null"; }
2783 };
2784 inline std::ostream & operator<<(std::ostream & out, model const & m) { return out << m.to_string(); }
2785
2786 class stats : public object {
2787 Z3_stats m_stats;
2788 void init(Z3_stats e) {
2789 m_stats = e;
2790 Z3_stats_inc_ref(ctx(), m_stats);
2791 }
2792 public:
2793 stats(context & c):object(c), m_stats(0) {}
2794 stats(context & c, Z3_stats e):object(c) { init(e); }
2795 stats(stats const & s):object(s) { init(s.m_stats); }
2796 ~stats() override { if (m_stats) Z3_stats_dec_ref(ctx(), m_stats); }
2797 operator Z3_stats() const { return m_stats; }
2798 stats & operator=(stats const & s) {
2799 Z3_stats_inc_ref(s.ctx(), s.m_stats);
2800 if (m_stats) Z3_stats_dec_ref(ctx(), m_stats);
2801 object::operator=(s);
2802 m_stats = s.m_stats;
2803 return *this;
2804 }
2805 unsigned size() const { return Z3_stats_size(ctx(), m_stats); }
2806 std::string key(unsigned i) const { Z3_string s = Z3_stats_get_key(ctx(), m_stats, i); check_error(); return s; }
2807 bool is_uint(unsigned i) const { bool r = Z3_stats_is_uint(ctx(), m_stats, i); check_error(); return r; }
2808 bool is_double(unsigned i) const { bool r = Z3_stats_is_double(ctx(), m_stats, i); check_error(); return r; }
2809 unsigned uint_value(unsigned i) const { unsigned r = Z3_stats_get_uint_value(ctx(), m_stats, i); check_error(); return r; }
2810 double double_value(unsigned i) const { double r = Z3_stats_get_double_value(ctx(), m_stats, i); check_error(); return r; }
2811 friend std::ostream & operator<<(std::ostream & out, stats const & s);
2812 };
2813 inline std::ostream & operator<<(std::ostream & out, stats const & s) { out << Z3_stats_to_string(s.ctx(), s); return out; }
2814
2815
2816 inline std::ostream & operator<<(std::ostream & out, check_result r) {
2817 if (r == unsat) out << "unsat";
2818 else if (r == sat) out << "sat";
2819 else out << "unknown";
2820 return out;
2821 }
2822
2833 class parameter {
2834 Z3_parameter_kind m_kind;
2835 func_decl m_decl;
2836 unsigned m_index;
2837 context& ctx() const { return m_decl.ctx(); }
2838 void check_error() const { ctx().check_error(); }
2839 public:
2840 parameter(func_decl const& d, unsigned idx) : m_decl(d), m_index(idx) {
2841 if (ctx().enable_exceptions() && idx >= d.num_parameters())
2842 Z3_THROW(exception("parameter index is out of bounds"));
2843 m_kind = Z3_get_decl_parameter_kind(ctx(), d, idx);
2844 }
2845 parameter(expr const& e, unsigned idx) : m_decl(e.decl()), m_index(idx) {
2846 if (ctx().enable_exceptions() && idx >= m_decl.num_parameters())
2847 Z3_THROW(exception("parameter index is out of bounds"));
2848 m_kind = Z3_get_decl_parameter_kind(ctx(), m_decl, idx);
2849 }
2850 Z3_parameter_kind kind() const { return m_kind; }
2851 expr get_expr() const { Z3_ast a = Z3_get_decl_ast_parameter(ctx(), m_decl, m_index); check_error(); return expr(ctx(), a); }
2852 sort get_sort() const { Z3_sort s = Z3_get_decl_sort_parameter(ctx(), m_decl, m_index); check_error(); return sort(ctx(), s); }
2853 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); }
2854 symbol get_symbol() const { Z3_symbol s = Z3_get_decl_symbol_parameter(ctx(), m_decl, m_index); check_error(); return symbol(ctx(), s); }
2855 std::string get_rational() const { Z3_string s = Z3_get_decl_rational_parameter(ctx(), m_decl, m_index); check_error(); return s; }
2856 double get_double() const { double d = Z3_get_decl_double_parameter(ctx(), m_decl, m_index); check_error(); return d; }
2857 int get_int() const { int i = Z3_get_decl_int_parameter(ctx(), m_decl, m_index); check_error(); return i; }
2858 };
2859
2860
2861 class solver : public object {
2862 Z3_solver m_solver;
2863 void init(Z3_solver s) {
2864 m_solver = s;
2865 if (s)
2866 Z3_solver_inc_ref(ctx(), s);
2867 }
2868 public:
2869 struct simple {};
2870 struct translate {};
2871 solver(context & c):object(c) { init(Z3_mk_solver(c)); check_error(); }
2872 solver(context & c, simple):object(c) { init(Z3_mk_simple_solver(c)); check_error(); }
2873 solver(context & c, Z3_solver s):object(c) { init(s); }
2874 solver(context & c, char const * logic):object(c) { init(Z3_mk_solver_for_logic(c, c.str_symbol(logic))); check_error(); }
2875 solver(context & c, solver const& src, translate): object(c) { Z3_solver s = Z3_solver_translate(src.ctx(), src, c); check_error(); init(s); }
2876 solver(solver const & s):object(s) { init(s.m_solver); }
2877 solver(solver const& s, simplifier const& simp);
2878 ~solver() override { Z3_solver_dec_ref(ctx(), m_solver); }
2879 operator Z3_solver() const { return m_solver; }
2880 solver & operator=(solver const & s) {
2881 Z3_solver_inc_ref(s.ctx(), s.m_solver);
2882 Z3_solver_dec_ref(ctx(), m_solver);
2883 object::operator=(s);
2884 m_solver = s.m_solver;
2885 return *this;
2886 }
2887 void set(params const & p) { Z3_solver_set_params(ctx(), m_solver, p); check_error(); }
2888 void set(char const * k, bool v) { params p(ctx()); p.set(k, v); set(p); }
2889 void set(char const * k, unsigned v) { params p(ctx()); p.set(k, v); set(p); }
2890 void set(char const * k, double v) { params p(ctx()); p.set(k, v); set(p); }
2891 void set(char const * k, symbol const & v) { params p(ctx()); p.set(k, v); set(p); }
2892 void set(char const * k, char const* v) { params p(ctx()); p.set(k, v); set(p); }
2903 void push() { Z3_solver_push(ctx(), m_solver); check_error(); }
2904 void pop(unsigned n = 1) { Z3_solver_pop(ctx(), m_solver, n); check_error(); }
2905 void reset() { Z3_solver_reset(ctx(), m_solver); check_error(); }
2906 void add(expr const & e) { assert(e.is_bool()); Z3_solver_assert(ctx(), m_solver, e); check_error(); }
2907 void add(expr const & e, expr const & p) {
2908 assert(e.is_bool()); assert(p.is_bool()); assert(p.is_const());
2909 Z3_solver_assert_and_track(ctx(), m_solver, e, p);
2910 check_error();
2911 }
2912 void add(expr const & e, char const * p) {
2913 add(e, ctx().bool_const(p));
2914 }
2915 void add(expr_vector const& v) {
2916 check_context(*this, v);
2917 for (unsigned i = 0; i < v.size(); ++i)
2918 add(v[i]);
2919 }
2920 void from_file(char const* file) { Z3_solver_from_file(ctx(), m_solver, file); ctx().check_parser_error(); }
2921 void from_string(char const* s) { Z3_solver_from_string(ctx(), m_solver, s); ctx().check_parser_error(); }
2922
2923 check_result check() { Z3_lbool r = Z3_solver_check(ctx(), m_solver); check_error(); return to_check_result(r); }
2924 check_result check(unsigned n, expr * const assumptions) {
2925 array<Z3_ast> _assumptions(n);
2926 for (unsigned i = 0; i < n; i++) {
2927 check_context(*this, assumptions[i]);
2928 _assumptions[i] = assumptions[i];
2929 }
2930 Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
2931 check_error();
2932 return to_check_result(r);
2933 }
2934 check_result check(expr_vector const& assumptions) {
2935 unsigned n = assumptions.size();
2936 array<Z3_ast> _assumptions(n);
2937 for (unsigned i = 0; i < n; i++) {
2938 check_context(*this, assumptions[i]);
2939 _assumptions[i] = assumptions[i];
2940 }
2941 Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
2942 check_error();
2943 return to_check_result(r);
2944 }
2945 model get_model() const { Z3_model m = Z3_solver_get_model(ctx(), m_solver); check_error(); return model(ctx(), m); }
2946 check_result consequences(expr_vector& assumptions, expr_vector& vars, expr_vector& conseq) {
2947 Z3_lbool r = Z3_solver_get_consequences(ctx(), m_solver, assumptions, vars, conseq);
2948 check_error();
2949 return to_check_result(r);
2950 }
2951 std::string reason_unknown() const { Z3_string r = Z3_solver_get_reason_unknown(ctx(), m_solver); check_error(); return r; }
2952 stats statistics() const { Z3_stats r = Z3_solver_get_statistics(ctx(), m_solver); check_error(); return stats(ctx(), r); }
2953 expr_vector unsat_core() const { Z3_ast_vector r = Z3_solver_get_unsat_core(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2954 expr_vector assertions() const { Z3_ast_vector r = Z3_solver_get_assertions(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2955 expr_vector non_units() const { Z3_ast_vector r = Z3_solver_get_non_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2956 expr_vector units() const { Z3_ast_vector r = Z3_solver_get_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2957 expr_vector trail() const { Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2958 expr_vector trail(array<unsigned>& levels) const {
2959 Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver);
2960 check_error();
2961 expr_vector result(ctx(), r);
2962 unsigned sz = result.size();
2963 levels.resize(sz);
2964 Z3_solver_get_levels(ctx(), m_solver, r, sz, levels.ptr());
2965 check_error();
2966 return result;
2967 }
2968 expr congruence_root(expr const& t) const {
2969 check_context(*this, t);
2970 Z3_ast r = Z3_solver_congruence_root(ctx(), m_solver, t);
2971 check_error();
2972 return expr(ctx(), r);
2973 }
2974 expr congruence_next(expr const& t) const {
2975 check_context(*this, t);
2976 Z3_ast r = Z3_solver_congruence_next(ctx(), m_solver, t);
2977 check_error();
2978 return expr(ctx(), r);
2979 }
2980 expr congruence_explain(expr const& a, expr const& b) const {
2981 check_context(*this, a);
2982 check_context(*this, b);
2983 Z3_ast r = Z3_solver_congruence_explain(ctx(), m_solver, a, b);
2984 check_error();
2985 return expr(ctx(), r);
2986 }
2987 void set_initial_value(expr const& var, expr const& value) {
2988 Z3_solver_set_initial_value(ctx(), m_solver, var, value);
2989 check_error();
2990 }
2991 void set_initial_value(expr const& var, int i) {
2992 set_initial_value(var, ctx().num_val(i, var.get_sort()));
2993 }
2994 void set_initial_value(expr const& var, bool b) {
2995 set_initial_value(var, ctx().bool_val(b));
2996 }
2997
2998 expr proof() const { Z3_ast r = Z3_solver_get_proof(ctx(), m_solver); check_error(); return expr(ctx(), r); }
2999 friend std::ostream & operator<<(std::ostream & out, solver const & s);
3000
3001 std::string to_smt2(char const* status = "unknown") {
3002 array<Z3_ast> es(assertions());
3003 Z3_ast const* fmls = es.ptr();
3004 Z3_ast fml = 0;
3005 unsigned sz = es.size();
3006 if (sz > 0) {
3007 --sz;
3008 fml = fmls[sz];
3009 }
3010 else {
3011 fml = ctx().bool_val(true);
3012 }
3013 return std::string(Z3_benchmark_to_smtlib_string(
3014 ctx(),
3015 "", "", status, "",
3016 sz,
3017 fmls,
3018 fml));
3019 }
3020
3021 std::string dimacs(bool include_names = true) const { return std::string(Z3_solver_to_dimacs_string(ctx(), m_solver, include_names)); }
3022
3023 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_solver_get_param_descrs(ctx(), m_solver)); }
3024
3025
3026 expr_vector cube(expr_vector& vars, unsigned cutoff) {
3027 Z3_ast_vector r = Z3_solver_cube(ctx(), m_solver, vars, cutoff);
3028 check_error();
3029 return expr_vector(ctx(), r);
3030 }
3031
3032 class cube_iterator {
3033 solver& m_solver;
3034 unsigned& m_cutoff;
3035 expr_vector& m_vars;
3036 expr_vector m_cube;
3037 bool m_end;
3038 bool m_empty;
3039
3040 void inc() {
3041 assert(!m_end && !m_empty);
3042 m_cube = m_solver.cube(m_vars, m_cutoff);
3043 m_cutoff = 0xFFFFFFFF;
3044 if (m_cube.size() == 1 && m_cube[0u].is_false()) {
3045 m_cube = z3::expr_vector(m_solver.ctx());
3046 m_end = true;
3047 }
3048 else if (m_cube.empty()) {
3049 m_empty = true;
3050 }
3051 }
3052 public:
3053 cube_iterator(solver& s, expr_vector& vars, unsigned& cutoff, bool end):
3054 m_solver(s),
3055 m_cutoff(cutoff),
3056 m_vars(vars),
3057 m_cube(s.ctx()),
3058 m_end(end),
3059 m_empty(false) {
3060 if (!m_end) {
3061 inc();
3062 }
3063 }
3064
3065 cube_iterator& operator++() {
3066 assert(!m_end);
3067 if (m_empty) {
3068 m_end = true;
3069 }
3070 else {
3071 inc();
3072 }
3073 return *this;
3074 }
3075 cube_iterator operator++(int) { assert(false); return *this; }
3076 expr_vector const * operator->() const { return &(operator*()); }
3077 expr_vector const& operator*() const noexcept { return m_cube; }
3078
3079 bool operator==(cube_iterator const& other) const noexcept {
3080 return other.m_end == m_end;
3081 };
3082 bool operator!=(cube_iterator const& other) const noexcept {
3083 return other.m_end != m_end;
3084 };
3085
3086 };
3087
3088 class cube_generator {
3089 solver& m_solver;
3090 unsigned m_cutoff;
3091 expr_vector m_default_vars;
3092 expr_vector& m_vars;
3093 public:
3094 cube_generator(solver& s):
3095 m_solver(s),
3096 m_cutoff(0xFFFFFFFF),
3097 m_default_vars(s.ctx()),
3098 m_vars(m_default_vars)
3099 {}
3100
3101 cube_generator(solver& s, expr_vector& vars):
3102 m_solver(s),
3103 m_cutoff(0xFFFFFFFF),
3104 m_default_vars(s.ctx()),
3105 m_vars(vars)
3106 {}
3107
3108 cube_iterator begin() { return cube_iterator(m_solver, m_vars, m_cutoff, false); }
3109 cube_iterator end() { return cube_iterator(m_solver, m_vars, m_cutoff, true); }
3110 void set_cutoff(unsigned c) noexcept { m_cutoff = c; }
3111 };
3112
3113 cube_generator cubes() { return cube_generator(*this); }
3114 cube_generator cubes(expr_vector& vars) { return cube_generator(*this, vars); }
3115
3116 };
3117 inline std::ostream & operator<<(std::ostream & out, solver const & s) { out << Z3_solver_to_string(s.ctx(), s); return out; }
3118
3119 class goal : public object {
3120 Z3_goal m_goal;
3121 void init(Z3_goal s) {
3122 m_goal = s;
3123 Z3_goal_inc_ref(ctx(), s);
3124 }
3125 public:
3126 goal(context & c, bool models=true, bool unsat_cores=false, bool proofs=false):object(c) { init(Z3_mk_goal(c, models, unsat_cores, proofs)); }
3127 goal(context & c, Z3_goal s):object(c) { init(s); }
3128 goal(goal const & s):object(s) { init(s.m_goal); }
3129 ~goal() override { Z3_goal_dec_ref(ctx(), m_goal); }
3130 operator Z3_goal() const { return m_goal; }
3131 goal & operator=(goal const & s) {
3132 Z3_goal_inc_ref(s.ctx(), s.m_goal);
3133 Z3_goal_dec_ref(ctx(), m_goal);
3134 object::operator=(s);
3135 m_goal = s.m_goal;
3136 return *this;
3137 }
3138 void add(expr const & f) { check_context(*this, f); Z3_goal_assert(ctx(), m_goal, f); check_error(); }
3139 void add(expr_vector const& v) { check_context(*this, v); for (unsigned i = 0; i < v.size(); ++i) add(v[i]); }
3140 unsigned size() const { return Z3_goal_size(ctx(), m_goal); }
3141 expr operator[](int i) const { assert(0 <= i); Z3_ast r = Z3_goal_formula(ctx(), m_goal, i); check_error(); return expr(ctx(), r); }
3142 Z3_goal_prec precision() const { return Z3_goal_precision(ctx(), m_goal); }
3143 bool inconsistent() const { return Z3_goal_inconsistent(ctx(), m_goal); }
3144 unsigned depth() const { return Z3_goal_depth(ctx(), m_goal); }
3145 void reset() { Z3_goal_reset(ctx(), m_goal); }
3146 unsigned num_exprs() const { return Z3_goal_num_exprs(ctx(), m_goal); }
3147 bool is_decided_sat() const { return Z3_goal_is_decided_sat(ctx(), m_goal); }
3148 bool is_decided_unsat() const { return Z3_goal_is_decided_unsat(ctx(), m_goal); }
3149 model convert_model(model const & m) const {
3150 check_context(*this, m);
3151 Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, m);
3152 check_error();
3153 return model(ctx(), new_m);
3154 }
3155 model get_model() const {
3156 Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, 0);
3157 check_error();
3158 return model(ctx(), new_m);
3159 }
3160 expr as_expr() const {
3161 unsigned n = size();
3162 if (n == 0)
3163 return ctx().bool_val(true);
3164 else if (n == 1)
3165 return operator[](0u);
3166 else {
3167 array<Z3_ast> args(n);
3168 for (unsigned i = 0; i < n; i++)
3169 args[i] = operator[](i);
3170 return expr(ctx(), Z3_mk_and(ctx(), n, args.ptr()));
3171 }
3172 }
3173 std::string dimacs(bool include_names = true) const { return std::string(Z3_goal_to_dimacs_string(ctx(), m_goal, include_names)); }
3174 friend std::ostream & operator<<(std::ostream & out, goal const & g);
3175 };
3176 inline std::ostream & operator<<(std::ostream & out, goal const & g) { out << Z3_goal_to_string(g.ctx(), g); return out; }
3177
3178 class apply_result : public object {
3179 Z3_apply_result m_apply_result;
3180 void init(Z3_apply_result s) {
3181 m_apply_result = s;
3182 Z3_apply_result_inc_ref(ctx(), s);
3183 }
3184 public:
3185 apply_result(context & c, Z3_apply_result s):object(c) { init(s); }
3186 apply_result(apply_result const & s):object(s) { init(s.m_apply_result); }
3187 ~apply_result() override { Z3_apply_result_dec_ref(ctx(), m_apply_result); }
3188 operator Z3_apply_result() const { return m_apply_result; }
3189 apply_result & operator=(apply_result const & s) {
3190 Z3_apply_result_inc_ref(s.ctx(), s.m_apply_result);
3191 Z3_apply_result_dec_ref(ctx(), m_apply_result);
3192 object::operator=(s);
3193 m_apply_result = s.m_apply_result;
3194 return *this;
3195 }
3196 unsigned size() const { return Z3_apply_result_get_num_subgoals(ctx(), m_apply_result); }
3197 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); }
3198 friend std::ostream & operator<<(std::ostream & out, apply_result const & r);
3199 };
3200 inline std::ostream & operator<<(std::ostream & out, apply_result const & r) { out << Z3_apply_result_to_string(r.ctx(), r); return out; }
3201
3202 class tactic : public object {
3203 Z3_tactic m_tactic;
3204 void init(Z3_tactic s) {
3205 m_tactic = s;
3206 Z3_tactic_inc_ref(ctx(), s);
3207 }
3208 public:
3209 tactic(context & c, char const * name):object(c) { Z3_tactic r = Z3_mk_tactic(c, name); check_error(); init(r); }
3210 tactic(context & c, Z3_tactic s):object(c) { init(s); }
3211 tactic(tactic const & s):object(s) { init(s.m_tactic); }
3212 ~tactic() override { Z3_tactic_dec_ref(ctx(), m_tactic); }
3213 operator Z3_tactic() const { return m_tactic; }
3214 tactic & operator=(tactic const & s) {
3215 Z3_tactic_inc_ref(s.ctx(), s.m_tactic);
3216 Z3_tactic_dec_ref(ctx(), m_tactic);
3217 object::operator=(s);
3218 m_tactic = s.m_tactic;
3219 return *this;
3220 }
3221 solver mk_solver() const { Z3_solver r = Z3_mk_solver_from_tactic(ctx(), m_tactic); check_error(); return solver(ctx(), r); }
3222 apply_result apply(goal const & g) const {
3223 check_context(*this, g);
3224 Z3_apply_result r = Z3_tactic_apply(ctx(), m_tactic, g);
3225 check_error();
3226 return apply_result(ctx(), r);
3227 }
3228 apply_result operator()(goal const & g) const {
3229 return apply(g);
3230 }
3231 std::string help() const { char const * r = Z3_tactic_get_help(ctx(), m_tactic); check_error(); return r; }
3232 friend tactic operator&(tactic const & t1, tactic const & t2);
3233 friend tactic operator|(tactic const & t1, tactic const & t2);
3234 friend tactic repeat(tactic const & t, unsigned max);
3235 friend tactic with(tactic const & t, params const & p);
3236 friend tactic try_for(tactic const & t, unsigned ms);
3237 friend tactic par_or(unsigned n, tactic const* tactics);
3238 friend tactic par_and_then(tactic const& t1, tactic const& t2);
3239 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_tactic_get_param_descrs(ctx(), m_tactic)); }
3240 };
3241
3242 inline tactic operator&(tactic const & t1, tactic const & t2) {
3243 check_context(t1, t2);
3244 Z3_tactic r = Z3_tactic_and_then(t1.ctx(), t1, t2);
3245 t1.check_error();
3246 return tactic(t1.ctx(), r);
3247 }
3248
3249 inline tactic operator|(tactic const & t1, tactic const & t2) {
3250 check_context(t1, t2);
3251 Z3_tactic r = Z3_tactic_or_else(t1.ctx(), t1, t2);
3252 t1.check_error();
3253 return tactic(t1.ctx(), r);
3254 }
3255
3256 inline tactic repeat(tactic const & t, unsigned max=UINT_MAX) {
3257 Z3_tactic r = Z3_tactic_repeat(t.ctx(), t, max);
3258 t.check_error();
3259 return tactic(t.ctx(), r);
3260 }
3261
3262 inline tactic with(tactic const & t, params const & p) {
3263 Z3_tactic r = Z3_tactic_using_params(t.ctx(), t, p);
3264 t.check_error();
3265 return tactic(t.ctx(), r);
3266 }
3267 inline tactic try_for(tactic const & t, unsigned ms) {
3268 Z3_tactic r = Z3_tactic_try_for(t.ctx(), t, ms);
3269 t.check_error();
3270 return tactic(t.ctx(), r);
3271 }
3272 inline tactic par_or(unsigned n, tactic const* tactics) {
3273 if (n == 0) {
3274 Z3_THROW(exception("a non-zero number of tactics need to be passed to par_or"));
3275 }
3276 array<Z3_tactic> buffer(n);
3277 for (unsigned i = 0; i < n; ++i) buffer[i] = tactics[i];
3278 return tactic(tactics[0u].ctx(), Z3_tactic_par_or(tactics[0u].ctx(), n, buffer.ptr()));
3279 }
3280
3281 inline tactic par_and_then(tactic const & t1, tactic const & t2) {
3282 check_context(t1, t2);
3283 Z3_tactic r = Z3_tactic_par_and_then(t1.ctx(), t1, t2);
3284 t1.check_error();
3285 return tactic(t1.ctx(), r);
3286 }
3287
3288 class simplifier : public object {
3289 Z3_simplifier m_simplifier;
3290 void init(Z3_simplifier s) {
3291 m_simplifier = s;
3292 Z3_simplifier_inc_ref(ctx(), s);
3293 }
3294 public:
3295 simplifier(context & c, char const * name):object(c) { Z3_simplifier r = Z3_mk_simplifier(c, name); check_error(); init(r); }
3296 simplifier(context & c, Z3_simplifier s):object(c) { init(s); }
3297 simplifier(simplifier const & s):object(s) { init(s.m_simplifier); }
3298 ~simplifier() override { Z3_simplifier_dec_ref(ctx(), m_simplifier); }
3299 operator Z3_simplifier() const { return m_simplifier; }
3300 simplifier & operator=(simplifier const & s) {
3301 Z3_simplifier_inc_ref(s.ctx(), s.m_simplifier);
3302 Z3_simplifier_dec_ref(ctx(), m_simplifier);
3303 object::operator=(s);
3304 m_simplifier = s.m_simplifier;
3305 return *this;
3306 }
3307 std::string help() const { char const * r = Z3_simplifier_get_help(ctx(), m_simplifier); check_error(); return r; }
3308 friend simplifier operator&(simplifier const & t1, simplifier const & t2);
3309 friend simplifier with(simplifier const & t, params const & p);
3310 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_simplifier_get_param_descrs(ctx(), m_simplifier)); }
3311 };
3312
3313 inline solver::solver(solver const& s, simplifier const& simp):object(s) { init(Z3_solver_add_simplifier(s.ctx(), s, simp)); }
3314
3315
3316 inline simplifier operator&(simplifier const & t1, simplifier const & t2) {
3317 check_context(t1, t2);
3318 Z3_simplifier r = Z3_simplifier_and_then(t1.ctx(), t1, t2);
3319 t1.check_error();
3320 return simplifier(t1.ctx(), r);
3321 }
3322
3323 inline simplifier with(simplifier const & t, params const & p) {
3324 Z3_simplifier r = Z3_simplifier_using_params(t.ctx(), t, p);
3325 t.check_error();
3326 return simplifier(t.ctx(), r);
3327 }
3328
3329 class probe : public object {
3330 Z3_probe m_probe;
3331 void init(Z3_probe s) {
3332 m_probe = s;
3333 Z3_probe_inc_ref(ctx(), s);
3334 }
3335 public:
3336 probe(context & c, char const * name):object(c) { Z3_probe r = Z3_mk_probe(c, name); check_error(); init(r); }
3337 probe(context & c, double val):object(c) { Z3_probe r = Z3_probe_const(c, val); check_error(); init(r); }
3338 probe(context & c, Z3_probe s):object(c) { init(s); }
3339 probe(probe const & s):object(s) { init(s.m_probe); }
3340 ~probe() override { Z3_probe_dec_ref(ctx(), m_probe); }
3341 operator Z3_probe() const { return m_probe; }
3342 probe & operator=(probe const & s) {
3343 Z3_probe_inc_ref(s.ctx(), s.m_probe);
3344 Z3_probe_dec_ref(ctx(), m_probe);
3345 object::operator=(s);
3346 m_probe = s.m_probe;
3347 return *this;
3348 }
3349 double apply(goal const & g) const { double r = Z3_probe_apply(ctx(), m_probe, g); check_error(); return r; }
3350 double operator()(goal const & g) const { return apply(g); }
3351 friend probe operator<=(probe const & p1, probe const & p2);
3352 friend probe operator<=(probe const & p1, double p2);
3353 friend probe operator<=(double p1, probe const & p2);
3354 friend probe operator>=(probe const & p1, probe const & p2);
3355 friend probe operator>=(probe const & p1, double p2);
3356 friend probe operator>=(double p1, probe const & p2);
3357 friend probe operator<(probe const & p1, probe const & p2);
3358 friend probe operator<(probe const & p1, double p2);
3359 friend probe operator<(double p1, probe const & p2);
3360 friend probe operator>(probe const & p1, probe const & p2);
3361 friend probe operator>(probe const & p1, double p2);
3362 friend probe operator>(double p1, probe const & p2);
3363 friend probe operator==(probe const & p1, probe const & p2);
3364 friend probe operator==(probe const & p1, double p2);
3365 friend probe operator==(double p1, probe const & p2);
3366 friend probe operator&&(probe const & p1, probe const & p2);
3367 friend probe operator||(probe const & p1, probe const & p2);
3368 friend probe operator!(probe const & p);
3369 };
3370
3371 inline probe operator<=(probe const & p1, probe const & p2) {
3372 check_context(p1, p2); Z3_probe r = Z3_probe_le(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3373 }
3374 inline probe operator<=(probe const & p1, double p2) { return p1 <= probe(p1.ctx(), p2); }
3375 inline probe operator<=(double p1, probe const & p2) { return probe(p2.ctx(), p1) <= p2; }
3376 inline probe operator>=(probe const & p1, probe const & p2) {
3377 check_context(p1, p2); Z3_probe r = Z3_probe_ge(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3378 }
3379 inline probe operator>=(probe const & p1, double p2) { return p1 >= probe(p1.ctx(), p2); }
3380 inline probe operator>=(double p1, probe const & p2) { return probe(p2.ctx(), p1) >= p2; }
3381 inline probe operator<(probe const & p1, probe const & p2) {
3382 check_context(p1, p2); Z3_probe r = Z3_probe_lt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3383 }
3384 inline probe operator<(probe const & p1, double p2) { return p1 < probe(p1.ctx(), p2); }
3385 inline probe operator<(double p1, probe const & p2) { return probe(p2.ctx(), p1) < p2; }
3386 inline probe operator>(probe const & p1, probe const & p2) {
3387 check_context(p1, p2); Z3_probe r = Z3_probe_gt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3388 }
3389 inline probe operator>(probe const & p1, double p2) { return p1 > probe(p1.ctx(), p2); }
3390 inline probe operator>(double p1, probe const & p2) { return probe(p2.ctx(), p1) > p2; }
3391 inline probe operator==(probe const & p1, probe const & p2) {
3392 check_context(p1, p2); Z3_probe r = Z3_probe_eq(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3393 }
3394 inline probe operator==(probe const & p1, double p2) { return p1 == probe(p1.ctx(), p2); }
3395 inline probe operator==(double p1, probe const & p2) { return probe(p2.ctx(), p1) == p2; }
3396 inline probe operator&&(probe const & p1, probe const & p2) {
3397 check_context(p1, p2); Z3_probe r = Z3_probe_and(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3398 }
3399 inline probe operator||(probe const & p1, probe const & p2) {
3400 check_context(p1, p2); Z3_probe r = Z3_probe_or(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3401 }
3402 inline probe operator!(probe const & p) {
3403 Z3_probe r = Z3_probe_not(p.ctx(), p); p.check_error(); return probe(p.ctx(), r);
3404 }
3405
3406 class optimize : public object {
3407 Z3_optimize m_opt;
3408
3409 public:
3410 struct translate {};
3411 class handle final {
3412 unsigned m_h;
3413 public:
3414 handle(unsigned h): m_h(h) {}
3415 unsigned h() const { return m_h; }
3416 };
3417 optimize(context& c):object(c) { m_opt = Z3_mk_optimize(c); Z3_optimize_inc_ref(c, m_opt); }
3418 optimize(context & c, optimize const& src, translate): object(c) {
3419 Z3_optimize o = Z3_optimize_translate(src.ctx(), src, c);
3420 check_error();
3421 m_opt = o;
3422 Z3_optimize_inc_ref(c, m_opt);
3423 }
3424 optimize(optimize const & o):object(o), m_opt(o.m_opt) {
3425 Z3_optimize_inc_ref(o.ctx(), o.m_opt);
3426 }
3427 optimize(context& c, optimize& src):object(c) {
3428 m_opt = Z3_mk_optimize(c);
3429 Z3_optimize_inc_ref(c, m_opt);
3430 add(expr_vector(c, src.assertions()));
3431 expr_vector v(c, src.objectives());
3432 for (expr_vector::iterator it = v.begin(); it != v.end(); ++it) minimize(*it);
3433 }
3434 optimize& operator=(optimize const& o) {
3435 Z3_optimize_inc_ref(o.ctx(), o.m_opt);
3436 Z3_optimize_dec_ref(ctx(), m_opt);
3437 m_opt = o.m_opt;
3438 object::operator=(o);
3439 return *this;
3440 }
3441 ~optimize() override { Z3_optimize_dec_ref(ctx(), m_opt); }
3442 operator Z3_optimize() const { return m_opt; }
3443 void add(expr const& e) {
3444 assert(e.is_bool());
3445 Z3_optimize_assert(ctx(), m_opt, e);
3446 }
3447 void add(expr_vector const& es) {
3448 for (expr_vector::iterator it = es.begin(); it != es.end(); ++it) add(*it);
3449 }
3450 void add(expr const& e, expr const& t) {
3451 assert(e.is_bool());
3452 Z3_optimize_assert_and_track(ctx(), m_opt, e, t);
3453 }
3454 void add(expr const& e, char const* p) {
3455 assert(e.is_bool());
3456 add(e, ctx().bool_const(p));
3457 }
3458 handle add_soft(expr const& e, unsigned weight) {
3459 assert(e.is_bool());
3460 auto str = std::to_string(weight);
3461 return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, str.c_str(), 0));
3462 }
3463 handle add_soft(expr const& e, char const* weight) {
3464 assert(e.is_bool());
3465 return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, weight, 0));
3466 }
3467 handle add(expr const& e, unsigned weight) {
3468 return add_soft(e, weight);
3469 }
3470 void set_initial_value(expr const& var, expr const& value) {
3471 Z3_optimize_set_initial_value(ctx(), m_opt, var, value);
3472 check_error();
3473 }
3474 void set_initial_value(expr const& var, int i) {
3475 set_initial_value(var, ctx().num_val(i, var.get_sort()));
3476 }
3477 void set_initial_value(expr const& var, bool b) {
3478 set_initial_value(var, ctx().bool_val(b));
3479 }
3480
3481 handle maximize(expr const& e) {
3482 return handle(Z3_optimize_maximize(ctx(), m_opt, e));
3483 }
3484 handle minimize(expr const& e) {
3485 return handle(Z3_optimize_minimize(ctx(), m_opt, e));
3486 }
3487 void push() {
3488 Z3_optimize_push(ctx(), m_opt);
3489 }
3490 void pop() {
3491 Z3_optimize_pop(ctx(), m_opt);
3492 }
3493 check_result check() { Z3_lbool r = Z3_optimize_check(ctx(), m_opt, 0, 0); check_error(); return to_check_result(r); }
3494 check_result check(expr_vector const& asms) {
3495 unsigned n = asms.size();
3496 array<Z3_ast> _asms(n);
3497 for (unsigned i = 0; i < n; i++) {
3498 check_context(*this, asms[i]);
3499 _asms[i] = asms[i];
3500 }
3501 Z3_lbool r = Z3_optimize_check(ctx(), m_opt, n, _asms.ptr());
3502 check_error();
3503 return to_check_result(r);
3504 }
3505 model get_model() const { Z3_model m = Z3_optimize_get_model(ctx(), m_opt); check_error(); return model(ctx(), m); }
3506 expr_vector unsat_core() const { Z3_ast_vector r = Z3_optimize_get_unsat_core(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3507 void set(params const & p) { Z3_optimize_set_params(ctx(), m_opt, p); check_error(); }
3508 expr lower(handle const& h) {
3509 Z3_ast r = Z3_optimize_get_lower(ctx(), m_opt, h.h());
3510 check_error();
3511 return expr(ctx(), r);
3512 }
3513 expr upper(handle const& h) {
3514 Z3_ast r = Z3_optimize_get_upper(ctx(), m_opt, h.h());
3515 check_error();
3516 return expr(ctx(), r);
3517 }
3518 expr_vector assertions() const { Z3_ast_vector r = Z3_optimize_get_assertions(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3519 expr_vector objectives() const { Z3_ast_vector r = Z3_optimize_get_objectives(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3520 stats statistics() const { Z3_stats r = Z3_optimize_get_statistics(ctx(), m_opt); check_error(); return stats(ctx(), r); }
3521 friend std::ostream & operator<<(std::ostream & out, optimize const & s);
3522 void from_file(char const* filename) { Z3_optimize_from_file(ctx(), m_opt, filename); check_error(); }
3523 void from_string(char const* constraints) { Z3_optimize_from_string(ctx(), m_opt, constraints); check_error(); }
3524 std::string help() const { char const * r = Z3_optimize_get_help(ctx(), m_opt); check_error(); return r; }
3525 };
3526 inline std::ostream & operator<<(std::ostream & out, optimize const & s) { out << Z3_optimize_to_string(s.ctx(), s.m_opt); return out; }
3527
3528 class fixedpoint : public object {
3529 Z3_fixedpoint m_fp;
3530 public:
3531 fixedpoint(context& c):object(c) { m_fp = Z3_mk_fixedpoint(c); Z3_fixedpoint_inc_ref(c, m_fp); }
3532 fixedpoint(fixedpoint const & o):object(o), m_fp(o.m_fp) { Z3_fixedpoint_inc_ref(ctx(), m_fp); }
3533 ~fixedpoint() override { Z3_fixedpoint_dec_ref(ctx(), m_fp); }
3534 fixedpoint & operator=(fixedpoint const & o) {
3535 Z3_fixedpoint_inc_ref(o.ctx(), o.m_fp);
3536 Z3_fixedpoint_dec_ref(ctx(), m_fp);
3537 m_fp = o.m_fp;
3538 object::operator=(o);
3539 return *this;
3540 }
3541 operator Z3_fixedpoint() const { return m_fp; }
3542 expr_vector from_string(char const* s) {
3543 Z3_ast_vector r = Z3_fixedpoint_from_string(ctx(), m_fp, s);
3544 check_error();
3545 return expr_vector(ctx(), r);
3546 }
3547 expr_vector from_file(char const* s) {
3548 Z3_ast_vector r = Z3_fixedpoint_from_file(ctx(), m_fp, s);
3549 check_error();
3550 return expr_vector(ctx(), r);
3551 }
3552 void add_rule(expr& rule, symbol const& name) { Z3_fixedpoint_add_rule(ctx(), m_fp, rule, name); check_error(); }
3553 void add_fact(func_decl& f, unsigned * args) { Z3_fixedpoint_add_fact(ctx(), m_fp, f, f.arity(), args); check_error(); }
3554 check_result query(expr& q) { Z3_lbool r = Z3_fixedpoint_query(ctx(), m_fp, q); check_error(); return to_check_result(r); }
3555 check_result query(func_decl_vector& relations) {
3556 array<Z3_func_decl> rs(relations);
3557 Z3_lbool r = Z3_fixedpoint_query_relations(ctx(), m_fp, rs.size(), rs.ptr());
3558 check_error();
3559 return to_check_result(r);
3560 }
3561 expr get_answer() { Z3_ast r = Z3_fixedpoint_get_answer(ctx(), m_fp); check_error(); return expr(ctx(), r); }
3562 std::string reason_unknown() { return Z3_fixedpoint_get_reason_unknown(ctx(), m_fp); }
3563 void update_rule(expr& rule, symbol const& name) { Z3_fixedpoint_update_rule(ctx(), m_fp, rule, name); check_error(); }
3564 unsigned get_num_levels(func_decl& p) { unsigned r = Z3_fixedpoint_get_num_levels(ctx(), m_fp, p); check_error(); return r; }
3565 expr get_cover_delta(int level, func_decl& p) {
3566 Z3_ast r = Z3_fixedpoint_get_cover_delta(ctx(), m_fp, level, p);
3567 check_error();
3568 return expr(ctx(), r);
3569 }
3570 void add_cover(int level, func_decl& p, expr& property) { Z3_fixedpoint_add_cover(ctx(), m_fp, level, p, property); check_error(); }
3571 stats statistics() const { Z3_stats r = Z3_fixedpoint_get_statistics(ctx(), m_fp); check_error(); return stats(ctx(), r); }
3572 void register_relation(func_decl& p) { Z3_fixedpoint_register_relation(ctx(), m_fp, p); }
3573 expr_vector assertions() const { Z3_ast_vector r = Z3_fixedpoint_get_assertions(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
3574 expr_vector rules() const { Z3_ast_vector r = Z3_fixedpoint_get_rules(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
3575 void set(params const & p) { Z3_fixedpoint_set_params(ctx(), m_fp, p); check_error(); }
3576 std::string help() const { return Z3_fixedpoint_get_help(ctx(), m_fp); }
3577 param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_fixedpoint_get_param_descrs(ctx(), m_fp)); }
3578 std::string to_string() { return Z3_fixedpoint_to_string(ctx(), m_fp, 0, 0); }
3579 std::string to_string(expr_vector const& queries) {
3580 array<Z3_ast> qs(queries);
3581 return Z3_fixedpoint_to_string(ctx(), m_fp, qs.size(), qs.ptr());
3582 }
3583 };
3584 inline std::ostream & operator<<(std::ostream & out, fixedpoint const & f) { return out << Z3_fixedpoint_to_string(f.ctx(), f, 0, 0); }
3585
3586 inline tactic fail_if(probe const & p) {
3587 Z3_tactic r = Z3_tactic_fail_if(p.ctx(), p);
3588 p.check_error();
3589 return tactic(p.ctx(), r);
3590 }
3591 inline tactic when(probe const & p, tactic const & t) {
3592 check_context(p, t);
3593 Z3_tactic r = Z3_tactic_when(t.ctx(), p, t);
3594 t.check_error();
3595 return tactic(t.ctx(), r);
3596 }
3597 inline tactic cond(probe const & p, tactic const & t1, tactic const & t2) {
3598 check_context(p, t1); check_context(p, t2);
3599 Z3_tactic r = Z3_tactic_cond(t1.ctx(), p, t1, t2);
3600 t1.check_error();
3601 return tactic(t1.ctx(), r);
3602 }
3603
3604 inline symbol context::str_symbol(char const * s) { Z3_symbol r = Z3_mk_string_symbol(m_ctx, s); check_error(); return symbol(*this, r); }
3605 inline symbol context::int_symbol(int n) { Z3_symbol r = Z3_mk_int_symbol(m_ctx, n); check_error(); return symbol(*this, r); }
3606
3607 inline sort context::bool_sort() { Z3_sort s = Z3_mk_bool_sort(m_ctx); check_error(); return sort(*this, s); }
3608 inline sort context::int_sort() { Z3_sort s = Z3_mk_int_sort(m_ctx); check_error(); return sort(*this, s); }
3609 inline sort context::real_sort() { Z3_sort s = Z3_mk_real_sort(m_ctx); check_error(); return sort(*this, s); }
3610 inline sort context::bv_sort(unsigned sz) { Z3_sort s = Z3_mk_bv_sort(m_ctx, sz); check_error(); return sort(*this, s); }
3611 inline sort context::string_sort() { Z3_sort s = Z3_mk_string_sort(m_ctx); check_error(); return sort(*this, s); }
3612 inline sort context::char_sort() { Z3_sort s = Z3_mk_char_sort(m_ctx); check_error(); return sort(*this, s); }
3613 inline sort context::seq_sort(sort& s) { Z3_sort r = Z3_mk_seq_sort(m_ctx, s); check_error(); return sort(*this, r); }
3614 inline sort context::re_sort(sort& s) { Z3_sort r = Z3_mk_re_sort(m_ctx, s); check_error(); return sort(*this, r); }
3615 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); }
3616
3617 template<>
3618 inline sort context::fpa_sort<16>() { return fpa_sort(5, 11); }
3619
3620 template<>
3621 inline sort context::fpa_sort<32>() { return fpa_sort(8, 24); }
3622
3623 template<>
3624 inline sort context::fpa_sort<64>() { return fpa_sort(11, 53); }
3625
3626 template<>
3627 inline sort context::fpa_sort<128>() { return fpa_sort(15, 113); }
3628
3629 inline sort context::fpa_rounding_mode_sort() { Z3_sort r = Z3_mk_fpa_rounding_mode_sort(m_ctx); check_error(); return sort(*this, r); }
3630
3631 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); }
3632 inline sort context::array_sort(sort_vector const& d, sort r) {
3633 array<Z3_sort> dom(d);
3634 Z3_sort s = Z3_mk_array_sort_n(m_ctx, dom.size(), dom.ptr(), r); check_error(); return sort(*this, s);
3635 }
3636 inline sort context::enumeration_sort(char const * name, unsigned n, char const * const * enum_names, func_decl_vector & cs, func_decl_vector & ts) {
3637 array<Z3_symbol> _enum_names(n);
3638 for (unsigned i = 0; i < n; i++) { _enum_names[i] = Z3_mk_string_symbol(*this, enum_names[i]); }
3639 array<Z3_func_decl> _cs(n);
3640 array<Z3_func_decl> _ts(n);
3641 Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3642 sort s = to_sort(*this, Z3_mk_enumeration_sort(*this, _name, n, _enum_names.ptr(), _cs.ptr(), _ts.ptr()));
3643 check_error();
3644 for (unsigned i = 0; i < n; i++) { cs.push_back(func_decl(*this, _cs[i])); ts.push_back(func_decl(*this, _ts[i])); }
3645 return s;
3646 }
3647 inline func_decl context::tuple_sort(char const * name, unsigned n, char const * const * names, sort const* sorts, func_decl_vector & projs) {
3648 array<Z3_symbol> _names(n);
3649 array<Z3_sort> _sorts(n);
3650 for (unsigned i = 0; i < n; i++) { _names[i] = Z3_mk_string_symbol(*this, names[i]); _sorts[i] = sorts[i]; }
3651 array<Z3_func_decl> _projs(n);
3652 Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3653 Z3_func_decl tuple;
3654 sort _ignore_s = to_sort(*this, Z3_mk_tuple_sort(*this, _name, n, _names.ptr(), _sorts.ptr(), &tuple, _projs.ptr()));
3655 check_error();
3656 for (unsigned i = 0; i < n; i++) { projs.push_back(func_decl(*this, _projs[i])); }
3657 return func_decl(*this, tuple);
3658 }
3659
3660 class constructor_list {
3661 context& ctx;
3662 Z3_constructor_list clist;
3663 public:
3664 constructor_list(constructors const& cs);
3665 ~constructor_list() { Z3_del_constructor_list(ctx, clist); }
3666 operator Z3_constructor_list() const { return clist; }
3667 };
3668
3669 class constructors {
3670 friend class constructor_list;
3671 context& ctx;
3672 std::vector<Z3_constructor> cons;
3673 std::vector<unsigned> num_fields;
3674 public:
3675 constructors(context& ctx): ctx(ctx) {}
3676
3677 ~constructors() {
3678 for (auto con : cons)
3679 Z3_del_constructor(ctx, con);
3680 }
3681
3682 void add(symbol const& name, symbol const& rec, unsigned n, symbol const* names, sort const* fields) {
3683 array<unsigned> sort_refs(n);
3684 array<Z3_sort> sorts(n);
3685 array<Z3_symbol> _names(n);
3686 for (unsigned i = 0; i < n; ++i) sorts[i] = fields[i], _names[i] = names[i];
3687 cons.push_back(Z3_mk_constructor(ctx, name, rec, n, _names.ptr(), sorts.ptr(), sort_refs.ptr()));
3688 num_fields.push_back(n);
3689 }
3690
3691 Z3_constructor operator[](unsigned i) const { return cons[i]; }
3692
3693 unsigned size() const { return (unsigned)cons.size(); }
3694
3695 void query(unsigned i, func_decl& constructor, func_decl& test, func_decl_vector& accs) {
3696 Z3_func_decl _constructor;
3697 Z3_func_decl _test;
3698 array<Z3_func_decl> accessors(num_fields[i]);
3699 accs.resize(0);
3701 cons[i],
3702 num_fields[i],
3703 &_constructor,
3704 &_test,
3705 accessors.ptr());
3706 constructor = func_decl(ctx, _constructor);
3707
3708 test = func_decl(ctx, _test);
3709 for (unsigned j = 0; j < num_fields[i]; ++j)
3710 accs.push_back(func_decl(ctx, accessors[j]));
3711 }
3712 };
3713
3714 inline constructor_list::constructor_list(constructors const& cs): ctx(cs.ctx) {
3715 array<Z3_constructor> cons(cs.size());
3716 for (unsigned i = 0; i < cs.size(); ++i)
3717 cons[i] = cs[i];
3718 clist = Z3_mk_constructor_list(ctx, cs.size(), cons.ptr());
3719 }
3720
3721 inline sort context::datatype(symbol const& name, constructors const& cs) {
3722 array<Z3_constructor> _cs(cs.size());
3723 for (unsigned i = 0; i < cs.size(); ++i) _cs[i] = cs[i];
3724 Z3_sort s = Z3_mk_datatype(*this, name, cs.size(), _cs.ptr());
3725 check_error();
3726 return sort(*this, s);
3727 }
3728
3729 inline sort context::datatype(symbol const &name, sort_vector const& params, constructors const &cs) {
3730 array<Z3_sort> _params(params);
3731 array<Z3_constructor> _cs(cs.size());
3732 for (unsigned i = 0; i < cs.size(); ++i)
3733 _cs[i] = cs[i];
3734 Z3_sort s = Z3_mk_polymorphic_datatype(*this, name, _params.size(), _params.ptr(), cs.size(), _cs.ptr());
3735 check_error();
3736 return sort(*this, s);
3737 }
3738
3739 inline sort_vector context::datatypes(
3740 unsigned n, symbol const* names,
3741 constructor_list *const* cons) {
3742 sort_vector result(*this);
3743 array<Z3_symbol> _names(n);
3744 array<Z3_sort> _sorts(n);
3745 array<Z3_constructor_list> _cons(n);
3746 for (unsigned i = 0; i < n; ++i)
3747 _names[i] = names[i], _cons[i] = *cons[i];
3748 Z3_mk_datatypes(*this, n, _names.ptr(), _sorts.ptr(), _cons.ptr());
3749 for (unsigned i = 0; i < n; ++i)
3750 result.push_back(sort(*this, _sorts[i]));
3751 return result;
3752 }
3753
3754
3755 inline sort context::datatype_sort(symbol const& name) {
3756 Z3_sort s = Z3_mk_datatype_sort(*this, name, 0, nullptr);
3757 check_error();
3758 return sort(*this, s);
3759 }
3760
3761 inline sort context::datatype_sort(symbol const& name, sort_vector const& params) {
3762 array<Z3_sort> _params(params);
3763 Z3_sort s = Z3_mk_datatype_sort(*this, name, _params.size(), _params.ptr());
3764 check_error();
3765 return sort(*this, s);
3766 }
3767
3768
3769 inline sort context::uninterpreted_sort(char const* name) {
3770 Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3771 return to_sort(*this, Z3_mk_uninterpreted_sort(*this, _name));
3772 }
3773 inline sort context::uninterpreted_sort(symbol const& name) {
3774 return to_sort(*this, Z3_mk_uninterpreted_sort(*this, name));
3775 }
3776
3777 inline func_decl context::function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3778 array<Z3_sort> args(arity);
3779 for (unsigned i = 0; i < arity; i++) {
3780 check_context(domain[i], range);
3781 args[i] = domain[i];
3782 }
3783 Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, arity, args.ptr(), range);
3784 check_error();
3785 return func_decl(*this, f);
3786 }
3787
3788 inline func_decl context::function(char const * name, unsigned arity, sort const * domain, sort const & range) {
3789 return function(range.ctx().str_symbol(name), arity, domain, range);
3790 }
3791
3792 inline func_decl context::function(symbol const& name, sort_vector const& domain, sort const& range) {
3793 array<Z3_sort> args(domain.size());
3794 for (unsigned i = 0; i < domain.size(); i++) {
3795 check_context(domain[i], range);
3796 args[i] = domain[i];
3797 }
3798 Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, domain.size(), args.ptr(), range);
3799 check_error();
3800 return func_decl(*this, f);
3801 }
3802
3803 inline func_decl context::function(char const * name, sort_vector const& domain, sort const& range) {
3804 return function(range.ctx().str_symbol(name), domain, range);
3805 }
3806
3807
3808 inline func_decl context::function(char const * name, sort const & domain, sort const & range) {
3809 check_context(domain, range);
3810 Z3_sort args[1] = { domain };
3811 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 1, args, range);
3812 check_error();
3813 return func_decl(*this, f);
3814 }
3815
3816 inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & range) {
3817 check_context(d1, range); check_context(d2, range);
3818 Z3_sort args[2] = { d1, d2 };
3819 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 2, args, range);
3820 check_error();
3821 return func_decl(*this, f);
3822 }
3823
3824 inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
3825 check_context(d1, range); check_context(d2, range); check_context(d3, range);
3826 Z3_sort args[3] = { d1, d2, d3 };
3827 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 3, args, range);
3828 check_error();
3829 return func_decl(*this, f);
3830 }
3831
3832 inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
3833 check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range);
3834 Z3_sort args[4] = { d1, d2, d3, d4 };
3835 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 4, args, range);
3836 check_error();
3837 return func_decl(*this, f);
3838 }
3839
3840 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) {
3841 check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range); check_context(d5, range);
3842 Z3_sort args[5] = { d1, d2, d3, d4, d5 };
3843 Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 5, args, range);
3844 check_error();
3845 return func_decl(*this, f);
3846 }
3847
3848 inline func_decl context::recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3849 array<Z3_sort> args(arity);
3850 for (unsigned i = 0; i < arity; i++) {
3851 check_context(domain[i], range);
3852 args[i] = domain[i];
3853 }
3854 Z3_func_decl f = Z3_mk_rec_func_decl(m_ctx, name, arity, args.ptr(), range);
3855 check_error();
3856 return func_decl(*this, f);
3857
3858 }
3859
3860 inline func_decl context::recfun(symbol const & name, sort_vector const& domain, sort const & range) {
3861 check_context(domain, range);
3862 array<Z3_sort> domain1(domain);
3863 Z3_func_decl f = Z3_mk_rec_func_decl(m_ctx, name, domain1.size(), domain1.ptr(), range);
3864 check_error();
3865 return func_decl(*this, f);
3866 }
3867
3868 inline func_decl context::recfun(char const * name, sort_vector const& domain, sort const & range) {
3869 return recfun(str_symbol(name), domain, range);
3870
3871 }
3872
3873 inline func_decl context::recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
3874 return recfun(str_symbol(name), arity, domain, range);
3875 }
3876
3877 inline func_decl context::recfun(char const * name, sort const& d1, sort const & range) {
3878 return recfun(str_symbol(name), 1, &d1, range);
3879 }
3880
3881 inline func_decl context::recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
3882 sort dom[2] = { d1, d2 };
3883 return recfun(str_symbol(name), 2, dom, range);
3884 }
3885
3886 inline void context::recdef(func_decl f, expr_vector const& args, expr const& body) {
3887 check_context(f, args); check_context(f, body);
3888 array<Z3_ast> vars(args);
3889 Z3_add_rec_def(f.ctx(), f, vars.size(), vars.ptr(), body);
3890 }
3891
3892 inline func_decl context::user_propagate_function(symbol const& name, sort_vector const& domain, sort const& range) {
3893 check_context(domain, range);
3894 array<Z3_sort> domain1(domain);
3895 Z3_func_decl f = Z3_solver_propagate_declare(range.ctx(), name, domain1.size(), domain1.ptr(), range);
3896 check_error();
3897 return func_decl(*this, f);
3898 }
3899
3900 inline expr context::constant(symbol const & name, sort const & s) {
3901 Z3_ast r = Z3_mk_const(m_ctx, name, s);
3902 check_error();
3903 return expr(*this, r);
3904 }
3905 inline expr context::constant(char const * name, sort const & s) { return constant(str_symbol(name), s); }
3906 inline expr context::variable(unsigned idx, sort const& s) {
3907 Z3_ast r = Z3_mk_bound(m_ctx, idx, s);
3908 check_error();
3909 return expr(*this, r);
3910 }
3911 inline expr context::bool_const(char const * name) { return constant(name, bool_sort()); }
3912 inline expr context::int_const(char const * name) { return constant(name, int_sort()); }
3913 inline expr context::real_const(char const * name) { return constant(name, real_sort()); }
3914 inline expr context::string_const(char const * name) { return constant(name, string_sort()); }
3915 inline expr context::bv_const(char const * name, unsigned sz) { return constant(name, bv_sort(sz)); }
3916 inline expr context::fpa_const(char const * name, unsigned ebits, unsigned sbits) { return constant(name, fpa_sort(ebits, sbits)); }
3917
3918 template<size_t precision>
3919 inline expr context::fpa_const(char const * name) { return constant(name, fpa_sort<precision>()); }
3920
3921 inline void context::set_rounding_mode(rounding_mode rm) { m_rounding_mode = rm; }
3922
3923 inline expr context::fpa_rounding_mode() {
3924 switch (m_rounding_mode) {
3925 case RNA: return expr(*this, Z3_mk_fpa_rna(m_ctx));
3926 case RNE: return expr(*this, Z3_mk_fpa_rne(m_ctx));
3927 case RTP: return expr(*this, Z3_mk_fpa_rtp(m_ctx));
3928 case RTN: return expr(*this, Z3_mk_fpa_rtn(m_ctx));
3929 case RTZ: return expr(*this, Z3_mk_fpa_rtz(m_ctx));
3930 default: return expr(*this);
3931 }
3932 }
3933
3934 inline expr context::bool_val(bool b) { return b ? expr(*this, Z3_mk_true(m_ctx)) : expr(*this, Z3_mk_false(m_ctx)); }
3935
3936 inline expr context::int_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, int_sort()); check_error(); return expr(*this, r); }
3937 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); }
3938 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); }
3939 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); }
3940 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); }
3941
3942 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); }
3943 inline expr context::real_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, real_sort()); check_error(); return expr(*this, r); }
3944 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); }
3945 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); }
3946 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); }
3947 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); }
3948
3949 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); }
3950 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); }
3951 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); }
3952 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); }
3953 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); }
3954 inline expr context::bv_val(unsigned n, bool const* bits) {
3955 array<bool> _bits(n);
3956 for (unsigned i = 0; i < n; ++i) _bits[i] = bits[i] ? 1 : 0;
3957 Z3_ast r = Z3_mk_bv_numeral(m_ctx, n, _bits.ptr()); check_error(); return expr(*this, r);
3958 }
3959
3960 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); }
3961 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); }
3962 inline expr context::fpa_nan(sort const & s) { Z3_ast r = Z3_mk_fpa_nan(m_ctx, s); check_error(); return expr(*this, r); }
3963 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); }
3964
3965 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); }
3966 inline expr context::string_val(char const* s) { Z3_ast r = Z3_mk_string(m_ctx, s); check_error(); return expr(*this, r); }
3967 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); }
3968 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); }
3969
3970 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); }
3971
3972 inline expr func_decl::operator()(unsigned n, expr const * args) const {
3973 array<Z3_ast> _args(n);
3974 for (unsigned i = 0; i < n; i++) {
3975 check_context(*this, args[i]);
3976 _args[i] = args[i];
3977 }
3978 Z3_ast r = Z3_mk_app(ctx(), *this, n, _args.ptr());
3979 check_error();
3980 return expr(ctx(), r);
3981
3982 }
3983 inline expr func_decl::operator()(expr_vector const& args) const {
3984 array<Z3_ast> _args(args.size());
3985 for (unsigned i = 0; i < args.size(); i++) {
3986 check_context(*this, args[i]);
3987 _args[i] = args[i];
3988 }
3989 Z3_ast r = Z3_mk_app(ctx(), *this, args.size(), _args.ptr());
3990 check_error();
3991 return expr(ctx(), r);
3992 }
3993 inline expr func_decl::operator()() const {
3994 Z3_ast r = Z3_mk_app(ctx(), *this, 0, 0);
3995 ctx().check_error();
3996 return expr(ctx(), r);
3997 }
3998 inline expr func_decl::operator()(expr const & a) const {
3999 check_context(*this, a);
4000 Z3_ast args[1] = { a };
4001 Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
4002 ctx().check_error();
4003 return expr(ctx(), r);
4004 }
4005 inline expr func_decl::operator()(int a) const {
4006 Z3_ast args[1] = { ctx().num_val(a, domain(0)) };
4007 Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
4008 ctx().check_error();
4009 return expr(ctx(), r);
4010 }
4011 inline expr func_decl::operator()(expr const & a1, expr const & a2) const {
4012 check_context(*this, a1); check_context(*this, a2);
4013 Z3_ast args[2] = { a1, a2 };
4014 Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4015 ctx().check_error();
4016 return expr(ctx(), r);
4017 }
4018 inline expr func_decl::operator()(expr const & a1, int a2) const {
4019 check_context(*this, a1);
4020 Z3_ast args[2] = { a1, ctx().num_val(a2, domain(1)) };
4021 Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4022 ctx().check_error();
4023 return expr(ctx(), r);
4024 }
4025 inline expr func_decl::operator()(int a1, expr const & a2) const {
4026 check_context(*this, a2);
4027 Z3_ast args[2] = { ctx().num_val(a1, domain(0)), a2 };
4028 Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4029 ctx().check_error();
4030 return expr(ctx(), r);
4031 }
4032 inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3) const {
4033 check_context(*this, a1); check_context(*this, a2); check_context(*this, a3);
4034 Z3_ast args[3] = { a1, a2, a3 };
4035 Z3_ast r = Z3_mk_app(ctx(), *this, 3, args);
4036 ctx().check_error();
4037 return expr(ctx(), r);
4038 }
4039 inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const {
4040 check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4);
4041 Z3_ast args[4] = { a1, a2, a3, a4 };
4042 Z3_ast r = Z3_mk_app(ctx(), *this, 4, args);
4043 ctx().check_error();
4044 return expr(ctx(), r);
4045 }
4046 inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const {
4047 check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4); check_context(*this, a5);
4048 Z3_ast args[5] = { a1, a2, a3, a4, a5 };
4049 Z3_ast r = Z3_mk_app(ctx(), *this, 5, args);
4050 ctx().check_error();
4051 return expr(ctx(), r);
4052 }
4053
4054 inline expr to_real(expr const & a) { Z3_ast r = Z3_mk_int2real(a.ctx(), a); a.check_error(); return expr(a.ctx(), r); }
4055
4056 inline func_decl function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
4057 return range.ctx().function(name, arity, domain, range);
4058 }
4059 inline func_decl function(char const * name, unsigned arity, sort const * domain, sort const & range) {
4060 return range.ctx().function(name, arity, domain, range);
4061 }
4062 inline func_decl function(char const * name, sort const & domain, sort const & range) {
4063 return range.ctx().function(name, domain, range);
4064 }
4065 inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & range) {
4066 return range.ctx().function(name, d1, d2, range);
4067 }
4068 inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
4069 return range.ctx().function(name, d1, d2, d3, range);
4070 }
4071 inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
4072 return range.ctx().function(name, d1, d2, d3, d4, range);
4073 }
4074 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) {
4075 return range.ctx().function(name, d1, d2, d3, d4, d5, range);
4076 }
4077 inline func_decl function(char const* name, sort_vector const& domain, sort const& range) {
4078 return range.ctx().function(name, domain, range);
4079 }
4080 inline func_decl function(std::string const& name, sort_vector const& domain, sort const& range) {
4081 return range.ctx().function(name.c_str(), domain, range);
4082 }
4083
4084 inline func_decl recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
4085 return range.ctx().recfun(name, arity, domain, range);
4086 }
4087 inline func_decl recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
4088 return range.ctx().recfun(name, arity, domain, range);
4089 }
4090 inline func_decl recfun(char const * name, sort const& d1, sort const & range) {
4091 return range.ctx().recfun(name, d1, range);
4092 }
4093 inline func_decl recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
4094 return range.ctx().recfun(name, d1, d2, range);
4095 }
4096
4097 inline expr select(expr const & a, expr const & i) {
4098 check_context(a, i);
4099 Z3_ast r = Z3_mk_select(a.ctx(), a, i);
4100 a.check_error();
4101 return expr(a.ctx(), r);
4102 }
4103 inline expr select(expr const & a, int i) {
4104 return select(a, a.ctx().num_val(i, a.get_sort().array_domain()));
4105 }
4106 inline expr select(expr const & a, expr_vector const & i) {
4107 check_context(a, i);
4108 array<Z3_ast> idxs(i);
4109 Z3_ast r = Z3_mk_select_n(a.ctx(), a, idxs.size(), idxs.ptr());
4110 a.check_error();
4111 return expr(a.ctx(), r);
4112 }
4113
4114 inline expr store(expr const & a, expr const & i, expr const & v) {
4115 check_context(a, i); check_context(a, v);
4116 Z3_ast r = Z3_mk_store(a.ctx(), a, i, v);
4117 a.check_error();
4118 return expr(a.ctx(), r);
4119 }
4120
4121 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); }
4122 inline expr store(expr const & a, expr i, int v) { return store(a, i, a.ctx().num_val(v, a.get_sort().array_range())); }
4123 inline expr store(expr const & a, int i, int v) {
4124 return store(a, a.ctx().num_val(i, a.get_sort().array_domain()), a.ctx().num_val(v, a.get_sort().array_range()));
4125 }
4126 inline expr store(expr const & a, expr_vector const & i, expr const & v) {
4127 check_context(a, i); check_context(a, v);
4128 array<Z3_ast> idxs(i);
4129 Z3_ast r = Z3_mk_store_n(a.ctx(), a, idxs.size(), idxs.ptr(), v);
4130 a.check_error();
4131 return expr(a.ctx(), r);
4132 }
4133
4134 inline expr as_array(func_decl & f) {
4135 Z3_ast r = Z3_mk_as_array(f.ctx(), f);
4136 f.check_error();
4137 return expr(f.ctx(), r);
4138 }
4139
4140 inline expr array_default(expr const & a) {
4141 Z3_ast r = Z3_mk_array_default(a.ctx(), a);
4142 a.check_error();
4143 return expr(a.ctx(), r);
4144 }
4145
4146 inline expr array_ext(expr const & a, expr const & b) {
4147 check_context(a, b);
4148 Z3_ast r = Z3_mk_array_ext(a.ctx(), a, b);
4149 a.check_error();
4150 return expr(a.ctx(), r);
4151 }
4152
4153#define MK_EXPR1(_fn, _arg) \
4154 Z3_ast r = _fn(_arg.ctx(), _arg); \
4155 _arg.check_error(); \
4156 return expr(_arg.ctx(), r);
4157
4158#define MK_EXPR2(_fn, _arg1, _arg2) \
4159 check_context(_arg1, _arg2); \
4160 Z3_ast r = _fn(_arg1.ctx(), _arg1, _arg2); \
4161 _arg1.check_error(); \
4162 return expr(_arg1.ctx(), r);
4163
4164 inline expr const_array(sort const & d, expr const & v) {
4166 }
4167
4168 inline expr empty_set(sort const& s) {
4170 }
4171
4172 inline expr full_set(sort const& s) {
4174 }
4175
4176 inline expr set_add(expr const& s, expr const& e) {
4177 MK_EXPR2(Z3_mk_set_add, s, e);
4178 }
4179
4180 inline expr set_del(expr const& s, expr const& e) {
4181 MK_EXPR2(Z3_mk_set_del, s, e);
4182 }
4183
4184 inline expr set_union(expr const& a, expr const& b) {
4185 check_context(a, b);
4186 Z3_ast es[2] = { a, b };
4187 Z3_ast r = Z3_mk_set_union(a.ctx(), 2, es);
4188 a.check_error();
4189 return expr(a.ctx(), r);
4190 }
4191
4192 inline expr set_intersect(expr const& a, expr const& b) {
4193 check_context(a, b);
4194 Z3_ast es[2] = { a, b };
4195 Z3_ast r = Z3_mk_set_intersect(a.ctx(), 2, es);
4196 a.check_error();
4197 return expr(a.ctx(), r);
4198 }
4199
4200 inline expr set_difference(expr const& a, expr const& b) {
4202 }
4203
4204 inline expr set_complement(expr const& a) {
4206 }
4207
4208 inline expr set_member(expr const& s, expr const& e) {
4210 }
4211
4212 inline expr set_subset(expr const& a, expr const& b) {
4214 }
4215
4216 // sequence and regular expression operations.
4217 // union is +
4218 // concat is overloaded to handle sequences and regular expressions
4219
4220 inline expr empty(sort const& s) {
4221 Z3_ast r = Z3_mk_seq_empty(s.ctx(), s);
4222 s.check_error();
4223 return expr(s.ctx(), r);
4224 }
4225 inline expr suffixof(expr const& a, expr const& b) {
4226 check_context(a, b);
4227 Z3_ast r = Z3_mk_seq_suffix(a.ctx(), a, b);
4228 a.check_error();
4229 return expr(a.ctx(), r);
4230 }
4231 inline expr prefixof(expr const& a, expr const& b) {
4232 check_context(a, b);
4233 Z3_ast r = Z3_mk_seq_prefix(a.ctx(), a, b);
4234 a.check_error();
4235 return expr(a.ctx(), r);
4236 }
4237 inline expr indexof(expr const& s, expr const& substr, expr const& offset) {
4238 check_context(s, substr); check_context(s, offset);
4239 Z3_ast r = Z3_mk_seq_index(s.ctx(), s, substr, offset);
4240 s.check_error();
4241 return expr(s.ctx(), r);
4242 }
4243 inline expr last_indexof(expr const& s, expr const& substr) {
4244 check_context(s, substr);
4245 Z3_ast r = Z3_mk_seq_last_index(s.ctx(), s, substr);
4246 s.check_error();
4247 return expr(s.ctx(), r);
4248 }
4249 inline expr to_re(expr const& s) {
4251 }
4252 inline expr in_re(expr const& s, expr const& re) {
4253 MK_EXPR2(Z3_mk_seq_in_re, s, re);
4254 }
4255 inline expr plus(expr const& re) {
4257 }
4258 inline expr option(expr const& re) {
4260 }
4261 inline expr star(expr const& re) {
4263 }
4264 inline expr re_empty(sort const& s) {
4265 Z3_ast r = Z3_mk_re_empty(s.ctx(), s);
4266 s.check_error();
4267 return expr(s.ctx(), r);
4268 }
4269 inline expr re_full(sort const& s) {
4270 Z3_ast r = Z3_mk_re_full(s.ctx(), s);
4271 s.check_error();
4272 return expr(s.ctx(), r);
4273 }
4274 inline expr re_intersect(expr_vector const& args) {
4275 assert(args.size() > 0);
4276 context& ctx = args[0u].ctx();
4277 array<Z3_ast> _args(args);
4278 Z3_ast r = Z3_mk_re_intersect(ctx, _args.size(), _args.ptr());
4279 ctx.check_error();
4280 return expr(ctx, r);
4281 }
4282 inline expr re_diff(expr const& a, expr const& b) {
4283 check_context(a, b);
4284 context& ctx = a.ctx();
4285 Z3_ast r = Z3_mk_re_diff(ctx, a, b);
4286 ctx.check_error();
4287 return expr(ctx, r);
4288 }
4289 inline expr re_complement(expr const& a) {
4291 }
4292 inline expr range(expr const& lo, expr const& hi) {
4293 check_context(lo, hi);
4294 Z3_ast r = Z3_mk_re_range(lo.ctx(), lo, hi);
4295 lo.check_error();
4296 return expr(lo.ctx(), r);
4297 }
4298
4299
4300
4301
4302
4303 inline expr_vector context::parse_string(char const* s) {
4304 Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, 0, 0, 0, 0, 0, 0);
4305 check_error();
4306 return expr_vector(*this, r);
4307
4308 }
4309 inline expr_vector context::parse_file(char const* s) {
4310 Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, 0, 0, 0, 0, 0, 0);
4311 check_error();
4312 return expr_vector(*this, r);
4313 }
4314
4315 inline expr_vector context::parse_string(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
4316 array<Z3_symbol> sort_names(sorts.size());
4317 array<Z3_symbol> decl_names(decls.size());
4318 array<Z3_sort> sorts1(sorts);
4319 array<Z3_func_decl> decls1(decls);
4320 for (unsigned i = 0; i < sorts.size(); ++i) {
4321 sort_names[i] = sorts[i].name();
4322 }
4323 for (unsigned i = 0; i < decls.size(); ++i) {
4324 decl_names[i] = decls[i].name();
4325 }
4326
4327 Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
4328 check_error();
4329 return expr_vector(*this, r);
4330 }
4331
4332 inline expr_vector context::parse_file(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
4333 array<Z3_symbol> sort_names(sorts.size());
4334 array<Z3_symbol> decl_names(decls.size());
4335 array<Z3_sort> sorts1(sorts);
4336 array<Z3_func_decl> decls1(decls);
4337 for (unsigned i = 0; i < sorts.size(); ++i) {
4338 sort_names[i] = sorts[i].name();
4339 }
4340 for (unsigned i = 0; i < decls.size(); ++i) {
4341 decl_names[i] = decls[i].name();
4342 }
4343 Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
4344 check_error();
4345 return expr_vector(*this, r);
4346 }
4347
4348 inline func_decl_vector sort::constructors() {
4349 assert(is_datatype());
4350 func_decl_vector cs(ctx());
4351 unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), *this);
4352 for (unsigned i = 0; i < n; ++i)
4353 cs.push_back(func_decl(ctx(), Z3_get_datatype_sort_constructor(ctx(), *this, i)));
4354 return cs;
4355 }
4356
4357 inline func_decl_vector sort::recognizers() {
4358 assert(is_datatype());
4359 func_decl_vector rs(ctx());
4360 unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), *this);
4361 for (unsigned i = 0; i < n; ++i)
4362 rs.push_back(func_decl(ctx(), Z3_get_datatype_sort_recognizer(ctx(), *this, i)));
4363 return rs;
4364 }
4365
4366 inline func_decl_vector func_decl::accessors() {
4367 sort s = range();
4368 assert(s.is_datatype());
4369 unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), s);
4370 unsigned idx = 0;
4371 for (; idx < n; ++idx) {
4372 func_decl f(ctx(), Z3_get_datatype_sort_constructor(ctx(), s, idx));
4373 if (id() == f.id())
4374 break;
4375 }
4376 assert(idx < n);
4377 n = arity();
4378 func_decl_vector as(ctx());
4379 for (unsigned i = 0; i < n; ++i)
4380 as.push_back(func_decl(ctx(), Z3_get_datatype_sort_constructor_accessor(ctx(), s, idx, i)));
4381 return as;
4382 }
4383
4384
4385 inline expr expr::substitute(expr_vector const& src, expr_vector const& dst) {
4386 assert(src.size() == dst.size());
4387 array<Z3_ast> _src(src.size());
4388 array<Z3_ast> _dst(dst.size());
4389 for (unsigned i = 0; i < src.size(); ++i) {
4390 _src[i] = src[i];
4391 _dst[i] = dst[i];
4392 }
4393 Z3_ast r = Z3_substitute(ctx(), m_ast, src.size(), _src.ptr(), _dst.ptr());
4394 check_error();
4395 return expr(ctx(), r);
4396 }
4397
4398 inline expr expr::substitute(expr_vector const& dst) {
4399 array<Z3_ast> _dst(dst.size());
4400 for (unsigned i = 0; i < dst.size(); ++i) {
4401 _dst[i] = dst[i];
4402 }
4403 Z3_ast r = Z3_substitute_vars(ctx(), m_ast, dst.size(), _dst.ptr());
4404 check_error();
4405 return expr(ctx(), r);
4406 }
4407
4408 inline expr expr::substitute(func_decl_vector const& funs, expr_vector const& dst) {
4409 array<Z3_ast> _dst(dst.size());
4410 array<Z3_func_decl> _funs(funs.size());
4411 if (dst.size() != funs.size()) {
4412 Z3_THROW(exception("length of argument lists don't align"));
4413 return expr(ctx(), nullptr);
4414 }
4415 for (unsigned i = 0; i < dst.size(); ++i) {
4416 _dst[i] = dst[i];
4417 _funs[i] = funs[i];
4418 }
4419 Z3_ast r = Z3_substitute_funs(ctx(), m_ast, dst.size(), _funs.ptr(), _dst.ptr());
4420 check_error();
4421 return expr(ctx(), r);
4422 }
4423
4424 inline expr expr::update(expr_vector const& args) const {
4425 array<Z3_ast> _args(args.size());
4426 for (unsigned i = 0; i < args.size(); ++i) {
4427 _args[i] = args[i];
4428 }
4429 Z3_ast r = Z3_update_term(ctx(), m_ast, args.size(), _args.ptr());
4430 check_error();
4431 return expr(ctx(), r);
4432 }
4433
4434 typedef std::function<void(expr const& proof, std::vector<unsigned> const& deps, expr_vector const& clause)> on_clause_eh_t;
4435
4436 class on_clause {
4437 context& c;
4438 on_clause_eh_t m_on_clause;
4439
4440 static void _on_clause_eh(void* _ctx, Z3_ast _proof, unsigned n, unsigned const* dep, Z3_ast_vector _literals) {
4441 on_clause* ctx = static_cast<on_clause*>(_ctx);
4442 expr_vector lits(ctx->c, _literals);
4443 expr proof(ctx->c, _proof);
4444 std::vector<unsigned> deps;
4445 for (unsigned i = 0; i < n; ++i)
4446 deps.push_back(dep[i]);
4447 ctx->m_on_clause(proof, deps, lits);
4448 }
4449 public:
4450 on_clause(solver& s, on_clause_eh_t& on_clause_eh): c(s.ctx()) {
4451 m_on_clause = on_clause_eh;
4452 Z3_solver_register_on_clause(c, s, this, _on_clause_eh);
4453 c.check_error();
4454 }
4455 };
4456
4457 class user_propagator_base {
4458
4459 typedef std::function<void(expr const&, expr const&)> fixed_eh_t;
4460 typedef std::function<void(void)> final_eh_t;
4461 typedef std::function<void(expr const&, expr const&)> eq_eh_t;
4462 typedef std::function<void(expr const&)> created_eh_t;
4463 typedef std::function<void(expr, unsigned, bool)> decide_eh_t;
4464 typedef std::function<bool(expr const&, expr const&)> on_binding_eh_t;
4465
4466 final_eh_t m_final_eh;
4467 eq_eh_t m_eq_eh;
4468 fixed_eh_t m_fixed_eh;
4469 created_eh_t m_created_eh;
4470 decide_eh_t m_decide_eh;
4471 on_binding_eh_t m_on_binding_eh;
4472 solver* s;
4473 context* c;
4474 std::vector<z3::context*> subcontexts;
4475
4476 unsigned m_callbackNesting = 0;
4477 Z3_solver_callback cb { nullptr };
4478
4479 struct scoped_cb {
4480 user_propagator_base& p;
4481 scoped_cb(void* _p, Z3_solver_callback cb):p(*static_cast<user_propagator_base*>(_p)) {
4482 p.cb = cb;
4483 p.m_callbackNesting++;
4484 }
4485 ~scoped_cb() {
4486 if (--p.m_callbackNesting == 0)
4487 p.cb = nullptr;
4488 }
4489 };
4490
4491 static void push_eh(void* _p, Z3_solver_callback cb) {
4492 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4493 scoped_cb _cb(p, cb);
4494 static_cast<user_propagator_base*>(p)->push();
4495 }
4496
4497 static void pop_eh(void* _p, Z3_solver_callback cb, unsigned num_scopes) {
4498 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4499 scoped_cb _cb(p, cb);
4500 static_cast<user_propagator_base*>(_p)->pop(num_scopes);
4501 }
4502
4503 static void* fresh_eh(void* _p, Z3_context ctx) {
4504 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4505 context* c = new context(ctx);
4506 p->subcontexts.push_back(c);
4507 return p->fresh(*c);
4508 }
4509
4510 static void fixed_eh(void* _p, Z3_solver_callback cb, Z3_ast _var, Z3_ast _value) {
4511 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4512 scoped_cb _cb(p, cb);
4513 expr value(p->ctx(), _value);
4514 expr var(p->ctx(), _var);
4515 p->m_fixed_eh(var, value);
4516 }
4517
4518 static void eq_eh(void* _p, Z3_solver_callback cb, Z3_ast _x, Z3_ast _y) {
4519 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4520 scoped_cb _cb(p, cb);
4521 expr x(p->ctx(), _x), y(p->ctx(), _y);
4522 p->m_eq_eh(x, y);
4523 }
4524
4525 static void final_eh(void* p, Z3_solver_callback cb) {
4526 scoped_cb _cb(p, cb);
4527 static_cast<user_propagator_base*>(p)->m_final_eh();
4528 }
4529
4530 static void created_eh(void* _p, Z3_solver_callback cb, Z3_ast _e) {
4531 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4532 scoped_cb _cb(p, cb);
4533 expr e(p->ctx(), _e);
4534 p->m_created_eh(e);
4535 }
4536
4537 static void decide_eh(void* _p, Z3_solver_callback cb, Z3_ast _val, unsigned bit, bool is_pos) {
4538 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4539 scoped_cb _cb(p, cb);
4540 expr val(p->ctx(), _val);
4541 p->m_decide_eh(val, bit, is_pos);
4542 }
4543
4544 static bool on_binding_eh(void* _p, Z3_solver_callback cb, Z3_ast _q, Z3_ast _inst) {
4545 user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4546 scoped_cb _cb(p, cb);
4547 expr q(p->ctx(), _q), inst(p->ctx(), _inst);
4548 return p->m_on_binding_eh(q, inst);
4549 }
4550
4551 public:
4552 user_propagator_base(context& c) : s(nullptr), c(&c) {}
4553
4554 user_propagator_base(solver* s): s(s), c(nullptr) {
4555 Z3_solver_propagate_init(ctx(), *s, this, push_eh, pop_eh, fresh_eh);
4556 }
4557
4558 virtual void push() = 0;
4559 virtual void pop(unsigned num_scopes) = 0;
4560
4561 virtual ~user_propagator_base() {
4562 for (auto& subcontext : subcontexts) {
4563 subcontext->detach(); // detach first; the subcontexts will be freed internally!
4564 delete subcontext;
4565 }
4566 }
4567
4568 context& ctx() {
4569 return c ? *c : s->ctx();
4570 }
4571
4580 virtual user_propagator_base* fresh(context& ctx) = 0;
4581
4588 void register_fixed(fixed_eh_t& f) {
4589 m_fixed_eh = f;
4590 if (s) {
4591 Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4592 }
4593 }
4594
4595 void register_fixed() {
4596 m_fixed_eh = [this](expr const &id, expr const &e) {
4597 fixed(id, e);
4598 };
4599 if (s) {
4600 Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4601 }
4602 }
4603
4604 void register_eq(eq_eh_t& f) {
4605 m_eq_eh = f;
4606 if (s) {
4607 Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4608 }
4609 }
4610
4611 void register_eq() {
4612 m_eq_eh = [this](expr const& x, expr const& y) {
4613 eq(x, y);
4614 };
4615 if (s) {
4616 Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4617 }
4618 }
4619
4628 void register_final(final_eh_t& f) {
4629 m_final_eh = f;
4630 if (s) {
4631 Z3_solver_propagate_final(ctx(), *s, final_eh);
4632 }
4633 }
4634
4635 void register_final() {
4636 m_final_eh = [this]() {
4637 final();
4638 };
4639 if (s) {
4640 Z3_solver_propagate_final(ctx(), *s, final_eh);
4641 }
4642 }
4643
4644 void register_created(created_eh_t& c) {
4645 m_created_eh = c;
4646 if (s) {
4647 Z3_solver_propagate_created(ctx(), *s, created_eh);
4648 }
4649 }
4650
4651 void register_created() {
4652 m_created_eh = [this](expr const& e) {
4653 created(e);
4654 };
4655 if (s) {
4656 Z3_solver_propagate_created(ctx(), *s, created_eh);
4657 }
4658 }
4659
4660 void register_decide(decide_eh_t& c) {
4661 m_decide_eh = c;
4662 if (s) {
4663 Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4664 }
4665 }
4666
4667 void register_decide() {
4668 m_decide_eh = [this](expr val, unsigned bit, bool is_pos) {
4669 decide(val, bit, is_pos);
4670 };
4671 if (s) {
4672 Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4673 }
4674 }
4675
4676 void register_on_binding() {
4677 m_on_binding_eh = [this](expr const& q, expr const& inst) {
4678 return on_binding(q, inst);
4679 };
4680 if (s)
4681 Z3_solver_propagate_on_binding(ctx(), *s, on_binding_eh);
4682 }
4683
4684 virtual void fixed(expr const& /*id*/, expr const& /*e*/) { }
4685
4686 virtual void eq(expr const& /*x*/, expr const& /*y*/) { }
4687
4688 virtual void final() { }
4689
4690 virtual void created(expr const& /*e*/) {}
4691
4692 virtual void decide(expr const& /*val*/, unsigned /*bit*/, bool /*is_pos*/) {}
4693
4694 virtual bool on_binding(expr const& /*q*/, expr const& /*inst*/) { return true; }
4695
4696 bool next_split(expr const& e, unsigned idx, Z3_lbool phase) {
4697 assert(cb);
4698 return Z3_solver_next_split(ctx(), cb, e, idx, phase);
4699 }
4700
4715 void add(expr const& e) {
4716 if (cb)
4717 Z3_solver_propagate_register_cb(ctx(), cb, e);
4718 else if (s)
4719 Z3_solver_propagate_register(ctx(), *s, e);
4720 else
4721 assert(false);
4722 }
4723
4724 void conflict(expr_vector const& fixed) {
4725 assert(cb);
4726 expr conseq = ctx().bool_val(false);
4727 array<Z3_ast> _fixed(fixed);
4728 Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
4729 }
4730
4731 void conflict(expr_vector const& fixed, expr_vector const& lhs, expr_vector const& rhs) {
4732 assert(cb);
4733 assert(lhs.size() == rhs.size());
4734 expr conseq = ctx().bool_val(false);
4735 array<Z3_ast> _fixed(fixed);
4736 array<Z3_ast> _lhs(lhs);
4737 array<Z3_ast> _rhs(rhs);
4738 Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
4739 }
4740
4741 bool propagate(expr_vector const& fixed, expr const& conseq) {
4742 assert(cb);
4743 assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
4744 array<Z3_ast> _fixed(fixed);
4745 return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
4746 }
4747
4748 bool propagate(expr_vector const& fixed,
4749 expr_vector const& lhs, expr_vector const& rhs,
4750 expr const& conseq) {
4751 assert(cb);
4752 assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
4753 assert(lhs.size() == rhs.size());
4754 array<Z3_ast> _fixed(fixed);
4755 array<Z3_ast> _lhs(lhs);
4756 array<Z3_ast> _rhs(rhs);
4757
4758 return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
4759 }
4760 };
4761
4762}
4763
4766#undef Z3_THROW
4767
symbol str_symbol(char const *s)
Create a Z3 symbol based on the given string.
Definition z3++.h:3605
expr num_val(int n, sort const &s)
Definition z3++.h:3971
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition z3++.h:3849
expr bool_val(bool b)
Definition z3++.h:3935
func_decl function(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition z3++.h:3778
Z3_error_code check_error() const
Definition z3++.h:522
context & ctx() const
Definition z3++.h:521
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.
void Z3_API Z3_simplifier_inc_ref(Z3_context c, Z3_simplifier t)
Increment the reference counter of the given simplifier.
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:1388
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_ast Z3_API Z3_mk_fpa_to_fp_signed(Z3_context c, Z3_ast rm, Z3_ast t, Z3_sort s)
Conversion of a 2's complement signed bit-vector term into a term of FloatingPoint sort.
void Z3_API Z3_add_rec_def(Z3_context c, Z3_func_decl f, unsigned n, Z3_ast args[], Z3_ast body)
Define the body of a recursive function.
Z3_param_descrs Z3_API Z3_solver_get_param_descrs(Z3_context c, Z3_solver s)
Return the parameter description set for the given solver object.
Z3_ast Z3_API Z3_mk_fpa_to_sbv(Z3_context c, Z3_ast rm, Z3_ast t, unsigned sz)
Conversion of a floating-point term into a signed bit-vector.
Z3_ast Z3_API Z3_mk_true(Z3_context c)
Create an AST node representing true.
Z3_ast Z3_API Z3_optimize_get_lower(Z3_context c, Z3_optimize o, unsigned idx)
Retrieve lower bound value or approximation for the i'th optimization objective.
Z3_ast Z3_API Z3_mk_set_union(Z3_context c, unsigned num_args, Z3_ast const args[])
Take the union of a list of sets.
Z3_model Z3_API Z3_optimize_get_model(Z3_context c, Z3_optimize o)
Retrieve the model for the last Z3_optimize_check.
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.
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_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].
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.
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.
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 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_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.
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_ast Z3_API Z3_mk_fpa_max(Z3_context c, Z3_ast t1, Z3_ast t2)
Maximum of floating-point numbers.
void Z3_API Z3_optimize_assert_and_track(Z3_context c, Z3_optimize o, Z3_ast a, Z3_ast t)
Assert tracked hard constraint to the optimization context.
unsigned Z3_API Z3_optimize_assert_soft(Z3_context c, Z3_optimize o, Z3_ast a, Z3_string weight, Z3_symbol id)
Assert soft constraint to the optimization context.
Z3_ast Z3_API Z3_mk_bvudiv(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned division.
Z3_ast_vector Z3_API Z3_solver_get_trail(Z3_context c, Z3_solver s)
Return the trail modulo model conversion, in order of decision level The decision level can be retrie...
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_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.
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_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_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...
Z3_ast Z3_API Z3_mk_set_del(Z3_context c, Z3_ast set, Z3_ast elem)
Remove an element to a set.
Z3_ast Z3_API Z3_mk_bvmul_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2, bool is_signed)
Create a predicate that checks that the bit-wise multiplication of t1 and t2 does not overflow.
Z3_ast Z3_API Z3_mk_re_union(Z3_context c, unsigned n, Z3_ast const args[])
Create the union of the regular languages.
Z3_param_descrs Z3_API Z3_simplifier_get_param_descrs(Z3_context c, Z3_simplifier t)
Return the parameter description set for the given simplifier object.
void Z3_API Z3_optimize_set_params(Z3_context c, Z3_optimize o, Z3_params p)
Set parameters on optimization context.
Z3_ast Z3_API Z3_mk_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_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_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_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_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.
Z3_ast Z3_API Z3_mk_fpa_neg(Z3_context c, Z3_ast t)
Floating-point negation.
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_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_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_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.
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...
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_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_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.
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....
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.
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_tactic Z3_API Z3_tactic_repeat(Z3_context c, Z3_tactic t, unsigned max)
Return a tactic that keeps applying t until the goal is not modified anymore or the maximum number of...
Z3_ast Z3_API Z3_goal_formula(Z3_context c, Z3_goal g, unsigned idx)
Return a formula from the given goal.
Z3_lbool Z3_API Z3_optimize_check(Z3_context c, Z3_optimize o, unsigned num_assumptions, Z3_ast const assumptions[])
Check consistency and produce optimal values.
Z3_symbol Z3_API Z3_mk_int_symbol(Z3_context c, int i)
Create a Z3 symbol using an integer.
unsigned Z3_API Z3_func_interp_get_num_entries(Z3_context c, Z3_func_interp f)
Return the number of entries in the given function interpretation.
Z3_probe Z3_API Z3_probe_const(Z3_context x, double val)
Return a probe that always evaluates to val.
Z3_constructor Z3_API Z3_mk_constructor(Z3_context c, Z3_symbol name, Z3_symbol recognizer, unsigned num_fields, Z3_symbol const field_names[], Z3_sort const sorts[], unsigned sort_refs[])
Create a constructor.
Z3_sort Z3_API Z3_mk_fpa_rounding_mode_sort(Z3_context c)
Create the RoundingMode sort.
Z3_string Z3_API Z3_goal_to_string(Z3_context c, Z3_goal g)
Convert a goal into a string.
Z3_ast Z3_API Z3_mk_fpa_rne(Z3_context c)
Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
Z3_ast Z3_API Z3_mk_atmost(Z3_context c, unsigned num_args, Z3_ast const args[], unsigned k)
Pseudo-Boolean relations.
Z3_tactic Z3_API Z3_tactic_and_then(Z3_context c, Z3_tactic t1, Z3_tactic t2)
Return a tactic that applies t1 to a given goal and t2 to every subgoal produced by t1.
Z3_optimize Z3_API Z3_optimize_translate(Z3_context c, Z3_optimize o, Z3_context target)
Copy an optimization context from a source to a target context.
Z3_func_interp Z3_API Z3_model_get_func_interp(Z3_context c, Z3_model m, Z3_func_decl f)
Return the interpretation of the function f in the model m. Return NULL, if the model does not assign...
void Z3_API Z3_solver_inc_ref(Z3_context c, Z3_solver s)
Increment the reference counter of the given solver.
bool Z3_API Z3_solver_next_split(Z3_context c, Z3_solver_callback cb, Z3_ast t, unsigned idx, Z3_lbool phase)
Z3_probe Z3_API Z3_probe_and(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when p1 and p2 evaluates to true.
bool Z3_API Z3_is_re_sort(Z3_context c, Z3_sort s)
Check if s is a regular expression sort.
Z3_sort Z3_API Z3_mk_string_sort(Z3_context c)
Create a sort for unicode strings.
Z3_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_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:4193
expr re_intersect(expr_vector const &args)
Definition z3++.h:4275
expr store(expr const &a, expr const &i, expr const &v)
Definition z3++.h:4115
expr pw(expr const &a, expr const &b)
Definition z3++.h:1694
expr sbv_to_fpa(expr const &t, sort s)
Definition z3++.h:2118
expr bvneg_no_overflow(expr const &a)
Definition z3++.h:2319
expr indexof(expr const &s, expr const &substr, expr const &offset)
Definition z3++.h:4238
tactic par_or(unsigned n, tactic const *tactics)
Definition z3++.h:3273
tactic par_and_then(tactic const &t1, tactic const &t2)
Definition z3++.h:3282
expr srem(expr const &a, expr const &b)
signed remainder operator for bitvectors
Definition z3++.h:2251
expr bvadd_no_underflow(expr const &a, expr const &b)
Definition z3++.h:2307
expr prefixof(expr const &a, expr const &b)
Definition z3++.h:4232
expr sum(expr_vector const &args)
Definition z3++.h:2516
expr ugt(expr const &a, expr const &b)
unsigned greater than operator for bitvectors.
Definition z3++.h:2230
expr operator/(expr const &a, expr const &b)
Definition z3++.h:1860
expr exists(expr const &x, expr const &b)
Definition z3++.h:2427
expr fp_eq(expr const &a, expr const &b)
Definition z3++.h:2079
func_decl tree_order(sort const &a, unsigned index)
Definition z3++.h:2344
expr concat(expr const &a, expr const &b)
Definition z3++.h:2534
expr bvmul_no_underflow(expr const &a, expr const &b)
Definition z3++.h:2325
expr lambda(expr const &x, expr const &b)
Definition z3++.h:2451
ast_vector_tpl< func_decl > func_decl_vector
Definition z3++.h:78
expr fpa_to_fpa(expr const &t, sort s)
Definition z3++.h:2132
expr operator&&(expr const &a, expr const &b)
Definition z3++.h:1738
std::function< void(expr const &proof, std::vector< unsigned > const &deps, expr_vector const &clause)> on_clause_eh_t
Definition z3++.h:4435
expr operator!=(expr const &a, expr const &b)
Definition z3++.h:1774
expr operator+(expr const &a, expr const &b)
Definition z3++.h:1786
expr set_complement(expr const &a)
Definition z3++.h:4205
check_result
Definition z3++.h:165
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition z3++.h:4085
expr const_array(sort const &d, expr const &v)
Definition z3++.h:4165
expr min(expr const &a, expr const &b)
Definition z3++.h:2008
expr set_difference(expr const &a, expr const &b)
Definition z3++.h:4201
expr forall(expr const &x, expr const &b)
Definition z3++.h:2403
expr array_default(expr const &a)
Definition z3++.h:4141
expr array_ext(expr const &a, expr const &b)
Definition z3++.h:4147
expr operator>(expr const &a, expr const &b)
Definition z3++.h:1971
sort to_sort(context &c, Z3_sort s)
Definition z3++.h:2173
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:2164
expr bv2int(expr const &a, bool is_signed)
bit-vector and integer conversions.
Definition z3++.h:2298
expr operator%(expr const &a, expr const &b)
Definition z3++.h:1709
expr operator~(expr const &a)
Definition z3++.h:2086
expr sle(expr const &a, expr const &b)
signed less than or equal to operator for bitvectors.
Definition z3++.h:2186
expr nor(expr const &a, expr const &b)
Definition z3++.h:2006
expr fpa_fp(expr const &sgn, expr const &exp, expr const &sig)
Definition z3++.h:2096
expr bvsub_no_underflow(expr const &a, expr const &b, bool is_signed)
Definition z3++.h:2313
expr mk_xor(expr_vector const &args)
Definition z3++.h:2618
expr lshr(expr const &a, expr const &b)
logic shift right operator for bitvectors
Definition z3++.h:2279
expr operator*(expr const &a, expr const &b)
Definition z3++.h:1816
expr nand(expr const &a, expr const &b)
Definition z3++.h:2005
expr fpa_to_ubv(expr const &t, unsigned sz)
Definition z3++.h:2111
expr bvredor(expr const &a)
Definition z3++.h:2040
ast_vector_tpl< sort > sort_vector
Definition z3++.h:77
func_decl piecewise_linear_order(sort const &a, unsigned index)
Definition z3++.h:2341
expr slt(expr const &a, expr const &b)
signed less than operator for bitvectors.
Definition z3++.h:2192
tactic when(probe const &p, tactic const &t)
Definition z3++.h:3592
expr last_indexof(expr const &s, expr const &substr)
Definition z3++.h:4244
expr int2bv(unsigned n, expr const &a)
Definition z3++.h:2299
expr max(expr const &a, expr const &b)
Definition z3++.h:2024
expr xnor(expr const &a, expr const &b)
Definition z3++.h:2007
expr udiv(expr const &a, expr const &b)
unsigned division operator for bitvectors.
Definition z3++.h:2244
expr abs(expr const &a)
Definition z3++.h:2052
expr pbge(expr_vector const &es, int const *coeffs, int bound)
Definition z3++.h:2484
expr round_fpa_to_closest_integer(expr const &t)
Definition z3++.h:2139
expr distinct(expr_vector const &args)
Definition z3++.h:2525
expr ashr(expr const &a, expr const &b)
arithmetic shift right operator for bitvectors
Definition z3++.h:2286
expr bvmul_no_overflow(expr const &a, expr const &b, bool is_signed)
Definition z3++.h:2322
expr bvsub_no_overflow(expr const &a, expr const &b)
Definition z3++.h:2310
expr star(expr const &re)
Definition z3++.h:4262
expr urem(expr const &a, expr const &b)
unsigned reminder operator for bitvectors
Definition z3++.h:2265
tactic repeat(tactic const &t, unsigned max=UINT_MAX)
Definition z3++.h:3257
expr mod(expr const &a, expr const &b)
Definition z3++.h:1698
expr fma(expr const &a, expr const &b, expr const &c, expr const &rm)
Definition z3++.h:2088
check_result to_check_result(Z3_lbool l)
Definition z3++.h:177
expr mk_or(expr_vector const &args)
Definition z3++.h:2606
expr to_re(expr const &s)
Definition z3++.h:4250
void check_context(object const &a, object const &b)
Definition z3++.h:525
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:2354
std::ostream & operator<<(std::ostream &out, exception const &e)
Definition z3++.h:127
expr ule(expr const &a, expr const &b)
unsigned less than or equal to operator for bitvectors.
Definition z3++.h:2212
func_decl to_func_decl(context &c, Z3_func_decl f)
Definition z3++.h:2178
tactic with(tactic const &t, params const &p)
Definition z3++.h:3263
expr ite(expr const &c, expr const &t, expr const &e)
Create the if-then-else expression ite(c, t, e)
Definition z3++.h:2151
expr ult(expr const &a, expr const &b)
unsigned less than operator for bitvectors.
Definition z3++.h:2218
expr pbeq(expr_vector const &es, int const *coeffs, int bound)
Definition z3++.h:2492
expr operator^(expr const &a, expr const &b)
Definition z3++.h:1997
expr operator<=(expr const &a, expr const &b)
Definition z3++.h:1924
expr set_union(expr const &a, expr const &b)
Definition z3++.h:4185
expr operator>=(expr const &a, expr const &b)
Definition z3++.h:1840
func_decl linear_order(sort const &a, unsigned index)
Definition z3++.h:2335
expr sqrt(expr const &a, expr const &rm)
Definition z3++.h:2072
expr pble(expr_vector const &es, int const *coeffs, int bound)
Definition z3++.h:2476
expr operator==(expr const &a, expr const &b)
Definition z3++.h:1763
expr foldli(expr const &f, expr const &i, expr const &a, expr const &list)
Definition z3++.h:2599
expr full_set(sort const &s)
Definition z3++.h:4173
expr smod(expr const &a, expr const &b)
signed modulus operator for bitvectors
Definition z3++.h:2258
expr implies(expr const &a, expr const &b)
Definition z3++.h:1686
expr empty_set(sort const &s)
Definition z3++.h:4169
expr in_re(expr const &s, expr const &re)
Definition z3++.h:4253
expr bvadd_no_overflow(expr const &a, expr const &b, bool is_signed)
bit-vector overflow/underflow checks
Definition z3++.h:2304
expr suffixof(expr const &a, expr const &b)
Definition z3++.h:4226
expr re_diff(expr const &a, expr const &b)
Definition z3++.h:4283
expr set_add(expr const &s, expr const &e)
Definition z3++.h:4177
expr plus(expr const &re)
Definition z3++.h:4256
expr set_subset(expr const &a, expr const &b)
Definition z3++.h:4213
expr select(expr const &a, expr const &i)
forward declarations
Definition z3++.h:4098
expr bvredand(expr const &a)
Definition z3++.h:2046
expr operator&(expr const &a, expr const &b)
Definition z3++.h:1993
expr operator-(expr const &a)
Definition z3++.h:1882
expr set_member(expr const &s, expr const &e)
Definition z3++.h:4209
expr bvsdiv_no_overflow(expr const &a, expr const &b)
Definition z3++.h:2316
tactic try_for(tactic const &t, unsigned ms)
Definition z3++.h:3268
expr sdiv(expr const &a, expr const &b)
signed division operator for bitvectors.
Definition z3++.h:2237
func_decl partial_order(sort const &a, unsigned index)
Definition z3++.h:2338
ast_vector_tpl< expr > expr_vector
Definition z3++.h:76
expr rem(expr const &a, expr const &b)
Definition z3++.h:1714
expr sge(expr const &a, expr const &b)
signed greater than or equal to operator for bitvectors.
Definition z3++.h:2198
expr operator!(expr const &a)
Definition z3++.h:1732
expr re_empty(sort const &s)
Definition z3++.h:4265
expr foldl(expr const &f, expr const &a, expr const &list)
Definition z3++.h:2592
expr mk_and(expr_vector const &args)
Definition z3++.h:2612
@ RNE
Definition z3++.h:171
@ RNA
Definition z3++.h:170
@ RTZ
Definition z3++.h:174
@ RTN
Definition z3++.h:173
@ RTP
Definition z3++.h:172
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:2333
expr to_real(expr const &a)
Definition z3++.h:4055
expr shl(expr const &a, expr const &b)
shift left operator for bitvectors
Definition z3++.h:2272
expr operator||(expr const &a, expr const &b)
Definition z3++.h:1750
expr set_del(expr const &s, expr const &e)
Definition z3++.h:4181
expr ubv_to_fpa(expr const &t, sort s)
Definition z3++.h:2125
expr map(expr const &f, expr const &list)
Definition z3++.h:2578
tactic cond(probe const &p, tactic const &t1, tactic const &t2)
Definition z3++.h:3598
expr as_array(func_decl &f)
Definition z3++.h:4135
expr sgt(expr const &a, expr const &b)
signed greater than operator for bitvectors.
Definition z3++.h:2204
expr fpa_to_sbv(expr const &t, unsigned sz)
Definition z3++.h:2104
expr operator|(expr const &a, expr const &b)
Definition z3++.h:2001
expr atmost(expr_vector const &es, unsigned bound)
Definition z3++.h:2500
expr range(expr const &lo, expr const &hi)
Definition z3++.h:4293
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:2293
expr atleast(expr_vector const &es, unsigned bound)
Definition z3++.h:2508
expr uge(expr const &a, expr const &b)
unsigned greater than or equal to operator for bitvectors.
Definition z3++.h:2224
expr mapi(expr const &f, expr const &i, expr const &list)
Definition z3++.h:2585
expr operator<(expr const &a, expr const &b)
Definition z3++.h:1949
expr option(expr const &re)
Definition z3++.h:4259
expr re_full(sort const &s)
Definition z3++.h:4270
expr re_complement(expr const &a)
Definition z3++.h:4290
expr empty(sort const &s)
Definition z3++.h:4221
tactic fail_if(probe const &p)
Definition z3++.h:3587
_on_clause_eh
Definition z3py.py:11759
bool is_int(a)
Definition z3py.py:2832
bool eq(AstRef a, AstRef b)
Definition z3py.py:506
on_clause_eh(ctx, p, n, dep, clause)
Definition z3py.py:11752
#define _Z3_MK_BIN_(a, b, binop)
Definition z3++.h:1679
#define MK_EXPR1(_fn, _arg)
Definition z3++.h:4154
#define MK_EXPR2(_fn, _arg1, _arg2)
Definition z3++.h:4159
#define Z3_THROW(x)
Definition z3++.h:133
#define _Z3_MK_UN_(a, mkun)
Definition z3++.h:1726

◆ _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 1726 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 4154 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 4159 of file z3++.h.

◆ Z3_THROW

#define Z3_THROW (   x)    {}

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