Z3
z3++.h
Go to the documentation of this file.
1 /*++
2 Copyright (c) 2012 Microsoft Corporation
3 
4  Thin C++ layer on top of the Z3 C API.
5  Main features:
6  - Smart pointers for all Z3 objects.
7  - Object-Oriented interface.
8  - Operator overloading.
9  - Exceptions for signaling Z3 errors
10 
11  The C API can be used simultaneously with the C++ layer.
12  However, if you use the C API directly, you will have to check the error conditions manually.
13  Of course, you can invoke the method check_error() of the context object.
14 Author:
15 
16  Leonardo (leonardo) 2012-03-28
17 
18 Notes:
19 
20 --*/
21 #pragma once
22 
23 #include<cassert>
24 #include<ostream>
25 #include<string>
26 #include<memory>
27 #include<vector>
28 #include<z3.h>
29 #include<z3_rcf.h>
30 #include<limits.h>
31 #include<functional>
32 
33 #undef min
34 #undef max
35 
50 namespace z3 {
51 
52  class exception;
53  class config;
54  class context;
55  class symbol;
56  class params;
57  class param_descrs;
58  class ast;
59  class sort;
60  class constructors;
61  class constructor_list;
62  class func_decl;
63  class expr;
64  class solver;
65  class goal;
66  class tactic;
67  class simplifier;
68  class probe;
69  class model;
70  class func_interp;
71  class func_entry;
72  class statistics;
73  class apply_result;
74  template<typename T> class cast_ast;
75  template<typename T> class ast_vector_tpl;
80 
81  inline void set_param(char const * param, char const * value) { Z3_global_param_set(param, value); }
82  inline void set_param(char const * param, bool value) { Z3_global_param_set(param, value ? "true" : "false"); }
83  inline void set_param(char const * param, int value) { auto str = std::to_string(value); Z3_global_param_set(param, str.c_str()); }
85 
89  inline void get_version(unsigned& major, unsigned& minor, unsigned& build_number, unsigned& revision_number) {
90  Z3_get_version(&major, &minor, &build_number, &revision_number);
91  }
92 
96  inline std::string get_full_version() {
97  return std::string(Z3_get_full_version());
98  }
99 
104  inline void enable_trace(char const * tag) {
105  Z3_enable_trace(tag);
106  }
107 
112  inline void disable_trace(char const * tag) {
113  Z3_disable_trace(tag);
114  }
115 
119  class exception : public std::exception {
120  std::string m_msg;
121  public:
122  virtual ~exception() throw() = default;
123  exception(char const * msg):m_msg(msg) {}
124  char const * msg() const { return m_msg.c_str(); }
125  char const * what() const throw() { return m_msg.c_str(); }
126  friend std::ostream & operator<<(std::ostream & out, exception const & e);
127  };
128  inline std::ostream & operator<<(std::ostream & out, exception const & e) { out << e.msg(); return out; }
129 
130 #if !defined(Z3_THROW)
131 #if __cpp_exceptions || _CPPUNWIND || __EXCEPTIONS
132 #define Z3_THROW(x) throw x
133 #else
134 #define Z3_THROW(x) {}
135 #endif
136 #endif // !defined(Z3_THROW)
137 
141  class config {
142  Z3_config m_cfg;
143  config(config const &) = delete;
144  config & operator=(config const &) = delete;
145  public:
146  config() { m_cfg = Z3_mk_config(); }
147  ~config() { Z3_del_config(m_cfg); }
148  operator Z3_config() const { return m_cfg; }
152  void set(char const * param, char const * value) { Z3_set_param_value(m_cfg, param, value); }
156  void set(char const * param, bool value) { Z3_set_param_value(m_cfg, param, value ? "true" : "false"); }
160  void set(char const * param, int value) {
161  auto str = std::to_string(value);
162  Z3_set_param_value(m_cfg, param, str.c_str());
163  }
164  };
165 
168  };
169 
176  };
177 
179  if (l == Z3_L_TRUE) return sat;
180  else if (l == Z3_L_FALSE) return unsat;
181  return unknown;
182  }
183 
184 
185 
191  class context {
192  private:
193  friend class user_propagator_base;
194  bool m_enable_exceptions = true;
195  rounding_mode m_rounding_mode;
196  Z3_context m_ctx = nullptr;
197  void init(config & c) {
198  set_context(Z3_mk_context_rc(c));
199  }
200  void set_context(Z3_context ctx) {
201  m_ctx = ctx;
202  m_enable_exceptions = true;
203  m_rounding_mode = RNE;
204  Z3_set_error_handler(m_ctx, 0);
206  }
207 
208 
209  context(context const &) = delete;
210  context & operator=(context const &) = delete;
211 
212  context(Z3_context c) { set_context(c); }
213  void detach() { m_ctx = nullptr; }
214  public:
215  context() { config c; init(c); }
216  context(config & c) { init(c); }
217 
218  context(context && other) noexcept
219  : m_enable_exceptions(other.m_enable_exceptions),
220  m_rounding_mode(other.m_rounding_mode),
221  m_ctx(other.m_ctx) {
222  other.m_ctx = nullptr;
223  }
224 
225  context & operator=(context && other) noexcept {
226  if (this != &other) {
227  if (m_ctx) Z3_del_context(m_ctx);
228  m_enable_exceptions = other.m_enable_exceptions;
229  m_rounding_mode = other.m_rounding_mode;
230  m_ctx = other.m_ctx;
231  other.m_ctx = nullptr;
232  }
233  return *this;
234  }
235  ~context() { if (m_ctx) Z3_del_context(m_ctx); }
236  operator Z3_context() const { return m_ctx; }
237 
242  Z3_error_code e = Z3_get_error_code(m_ctx);
243  if (e != Z3_OK && enable_exceptions())
244  Z3_THROW(exception(Z3_get_error_msg(m_ctx, e)));
245  return e;
246  }
247 
248  void check_parser_error() const {
249  check_error();
250  }
251 
259  void set_enable_exceptions(bool f) { m_enable_exceptions = f; }
260 
261  bool enable_exceptions() const { return m_enable_exceptions; }
262 
266  void set(char const * param, char const * value) { Z3_update_param_value(m_ctx, param, value); }
270  void set(char const * param, bool value) { Z3_update_param_value(m_ctx, param, value ? "true" : "false"); }
274  void set(char const * param, int value) {
275  auto str = std::to_string(value);
276  Z3_update_param_value(m_ctx, param, str.c_str());
277  }
278 
283  void interrupt() { Z3_interrupt(m_ctx); }
284 
288  symbol str_symbol(char const * s);
292  symbol int_symbol(int n);
296  sort bool_sort();
300  sort int_sort();
304  sort real_sort();
308  sort bv_sort(unsigned sz);
309 
313  sort char_sort();
317  sort string_sort();
321  sort seq_sort(sort& s);
331  sort array_sort(sort d, sort r);
332  sort array_sort(sort_vector const& d, sort r);
339  sort fpa_sort(unsigned ebits, unsigned sbits);
343  template<size_t precision>
344  sort fpa_sort();
358  sort enumeration_sort(char const * name, unsigned n, char const * const * enum_names, func_decl_vector & cs, func_decl_vector & ts);
359 
366  func_decl tuple_sort(char const * name, unsigned n, char const * const * names, sort const* sorts, func_decl_vector & projs);
367 
368 
377  sort datatype(symbol const& name, constructors const& cs);
378 
386  sort datatype(symbol const &name, sort_vector const &params, constructors const &cs);
387 
394  sort_vector datatypes(unsigned n, symbol const* names,
395  constructor_list *const* cons);
396 
397 
402  sort datatype_sort(symbol const& name);
403 
410  sort datatype_sort(symbol const& name, sort_vector const& params);
411 
412 
416  sort uninterpreted_sort(char const* name);
417  sort uninterpreted_sort(symbol const& name);
418 
419  func_decl function(symbol const & name, unsigned arity, sort const * domain, sort const & range);
420  func_decl function(char const * name, unsigned arity, sort const * domain, sort const & range);
421  func_decl function(symbol const& name, sort_vector const& domain, sort const& range);
422  func_decl function(char const * name, sort_vector const& domain, sort const& range);
423  func_decl function(char const * name, sort const & domain, sort const & range);
424  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & range);
425  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range);
426  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range);
427  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & d5, sort const & range);
428 
429  func_decl recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range);
430  func_decl recfun(symbol const & name, const sort_vector& domain, sort const & range);
431  func_decl recfun(char const * name, sort_vector const& domain, sort const & range);
432  func_decl recfun(char const * name, unsigned arity, sort const * domain, sort const & range);
433  func_decl recfun(char const * name, sort const & domain, sort const & range);
434  func_decl recfun(char const * name, sort const & d1, sort const & d2, sort const & range);
435 
442  void recdef(func_decl decl, expr_vector const& args, expr const& body);
443  func_decl user_propagate_function(symbol const& name, sort_vector const& domain, sort const& range);
444 
448  expr constant(symbol const & name, sort const & s);
449  expr constant(char const * name, sort const & s);
453  expr bool_const(char const * name);
454  expr int_const(char const * name);
455  expr real_const(char const * name);
456  expr string_const(char const * name);
457  expr bv_const(char const * name, unsigned sz);
458  expr fpa_const(char const * name, unsigned ebits, unsigned sbits);
459 
460  template<size_t precision>
461  expr fpa_const(char const * name);
462 
466  expr variable(unsigned index, sort const& s);
467 
468 
470 
471  expr bool_val(bool b);
472 
473  expr int_val(int n);
474  expr int_val(unsigned n);
475  expr int_val(int64_t n);
476  expr int_val(uint64_t n);
477  expr int_val(char const * n);
478 
479  expr real_val(int n);
480  expr real_val(unsigned n);
481  expr real_val(int64_t n);
482  expr real_val(uint64_t n);
483  expr real_val(int64_t n, int64_t d);
484  expr real_val(char const * n);
485 
486  expr bv_val(int n, unsigned sz);
487  expr bv_val(unsigned n, unsigned sz);
488  expr bv_val(int64_t n, unsigned sz);
489  expr bv_val(uint64_t n, unsigned sz);
490  expr bv_val(char const * n, unsigned sz);
491  expr bv_val(unsigned n, bool const* bits);
492 
493  expr fpa_val(double n);
494  expr fpa_val(float n);
495  expr fpa_nan(sort const & s);
496  expr fpa_inf(sort const & s, bool sgn);
497 
498  expr string_val(char const* s);
499  expr string_val(char const* s, unsigned n);
500  expr string_val(std::string const& s);
501  expr string_val(std::u32string const& s);
502 
503  expr num_val(int n, sort const & s);
504 
508  expr_vector parse_string(char const* s);
509  expr_vector parse_file(char const* file);
510 
511  expr_vector parse_string(char const* s, sort_vector const& sorts, func_decl_vector const& decls);
512  expr_vector parse_file(char const* s, sort_vector const& sorts, func_decl_vector const& decls);
513  };
514 
515 
516  template<typename T>
517  class array {
518  std::unique_ptr<T[]> m_array;
519  unsigned m_size;
520  array(array const &) = delete;
521  array & operator=(array const &) = delete;
522  public:
523  array(unsigned sz):m_array(new T[sz]),m_size(sz) {}
524  template<typename T2>
525  array(ast_vector_tpl<T2> const & v);
526  void resize(unsigned sz) { m_array.reset(new T[sz]); m_size = sz; }
527  unsigned size() const { return m_size; }
528  T & operator[](int i) { assert(0 <= i); assert(static_cast<unsigned>(i) < m_size); return m_array[i]; }
529  T const & operator[](int i) const { assert(0 <= i); assert(static_cast<unsigned>(i) < m_size); return m_array[i]; }
530  T const * ptr() const { return m_array.get(); }
531  T * ptr() { return m_array.get(); }
532  };
533 
534  class object {
535  protected:
537  public:
538  object(context & c):m_ctx(&c) {}
539  virtual ~object() = default;
540  context & ctx() const { return *m_ctx; }
541  Z3_error_code check_error() const { return m_ctx->check_error(); }
542  friend void check_context(object const & a, object const & b);
543  };
544  inline void check_context(object const & a, object const & b) { (void)a; (void)b; assert(a.m_ctx == b.m_ctx); }
545 
546  class symbol : public object {
547  Z3_symbol m_sym;
548  public:
549  symbol(context & c, Z3_symbol s):object(c), m_sym(s) {}
550  operator Z3_symbol() const { return m_sym; }
551  Z3_symbol_kind kind() const { return Z3_get_symbol_kind(ctx(), m_sym); }
552  std::string str() const { assert(kind() == Z3_STRING_SYMBOL); return Z3_get_symbol_string(ctx(), m_sym); }
553  int to_int() const { assert(kind() == Z3_INT_SYMBOL); return Z3_get_symbol_int(ctx(), m_sym); }
554  friend std::ostream & operator<<(std::ostream & out, symbol const & s);
555  };
556 
557  inline std::ostream & operator<<(std::ostream & out, symbol const & s) {
558  if (s.kind() == Z3_INT_SYMBOL)
559  out << "k!" << s.to_int();
560  else
561  out << s.str();
562  return out;
563  }
564 
565 
566  class param_descrs : public object {
567  Z3_param_descrs m_descrs;
568  public:
569  param_descrs(context& c, Z3_param_descrs d): object(c), m_descrs(d) { Z3_param_descrs_inc_ref(c, d); }
570  param_descrs(param_descrs const& o): object(o.ctx()), m_descrs(o.m_descrs) { Z3_param_descrs_inc_ref(ctx(), m_descrs); }
572  Z3_param_descrs_inc_ref(o.ctx(), o.m_descrs);
573  Z3_param_descrs_dec_ref(ctx(), m_descrs);
574  m_descrs = o.m_descrs;
575  object::operator=(o);
576  return *this;
577  }
578  ~param_descrs() override { Z3_param_descrs_dec_ref(ctx(), m_descrs); }
581 
582  unsigned size() { return Z3_param_descrs_size(ctx(), m_descrs); }
583  symbol name(unsigned i) { return symbol(ctx(), Z3_param_descrs_get_name(ctx(), m_descrs, i)); }
584  Z3_param_kind kind(symbol const& s) { return Z3_param_descrs_get_kind(ctx(), m_descrs, s); }
585  std::string documentation(symbol const& s) { char const* r = Z3_param_descrs_get_documentation(ctx(), m_descrs, s); check_error(); return r; }
586  std::string to_string() const { return Z3_param_descrs_to_string(ctx(), m_descrs); }
587  };
588 
589  inline std::ostream& operator<<(std::ostream & out, param_descrs const & d) { return out << d.to_string(); }
590 
591  class params : public object {
592  Z3_params m_params;
593  public:
594  params(context & c):object(c) { m_params = Z3_mk_params(c); Z3_params_inc_ref(ctx(), m_params); }
595  params(params const & s):object(s), m_params(s.m_params) { Z3_params_inc_ref(ctx(), m_params); }
596  ~params() override { Z3_params_dec_ref(ctx(), m_params); }
597  operator Z3_params() const { return m_params; }
598  params & operator=(params const & s) {
599  Z3_params_inc_ref(s.ctx(), s.m_params);
600  Z3_params_dec_ref(ctx(), m_params);
601  object::operator=(s);
602  m_params = s.m_params;
603  return *this;
604  }
605  void set(char const * k, bool b) { Z3_params_set_bool(ctx(), m_params, ctx().str_symbol(k), b); }
606  void set(char const * k, unsigned n) { Z3_params_set_uint(ctx(), m_params, ctx().str_symbol(k), n); }
607  void set(char const * k, double n) { Z3_params_set_double(ctx(), m_params, ctx().str_symbol(k), n); }
608  void set(char const * k, symbol const & s) { Z3_params_set_symbol(ctx(), m_params, ctx().str_symbol(k), s); }
609  void set(char const * k, char const* s) { Z3_params_set_symbol(ctx(), m_params, ctx().str_symbol(k), ctx().str_symbol(s)); }
610  friend std::ostream & operator<<(std::ostream & out, params const & p);
611  };
612 
613  inline std::ostream & operator<<(std::ostream & out, params const & p) {
614  out << Z3_params_to_string(p.ctx(), p); return out;
615  }
616 
617  class ast : public object {
618  protected:
619  Z3_ast m_ast;
620  public:
621  ast(context & c):object(c), m_ast(0) {}
622  ast(context & c, Z3_ast n):object(c), m_ast(n) { Z3_inc_ref(ctx(), m_ast); }
623  ast(ast const & s) :object(s), m_ast(s.m_ast) { Z3_inc_ref(ctx(), m_ast); }
624  ~ast() override { if (m_ast) { Z3_dec_ref(*m_ctx, m_ast); } }
625  operator Z3_ast() const { return m_ast; }
626  operator bool() const { return m_ast != 0; }
627  ast & operator=(ast const & s) {
628  Z3_inc_ref(s.ctx(), s.m_ast);
629  if (m_ast)
630  Z3_dec_ref(ctx(), m_ast);
631  object::operator=(s);
632  m_ast = s.m_ast;
633  return *this;
634  }
635  Z3_ast_kind kind() const { Z3_ast_kind r = Z3_get_ast_kind(ctx(), m_ast); check_error(); return r; }
636  unsigned hash() const { unsigned r = Z3_get_ast_hash(ctx(), m_ast); check_error(); return r; }
637  friend std::ostream & operator<<(std::ostream & out, ast const & n);
638  std::string to_string() const { return std::string(Z3_ast_to_string(ctx(), m_ast)); }
639 
640 
644  friend bool eq(ast const & a, ast const & b);
645  };
646  inline std::ostream & operator<<(std::ostream & out, ast const & n) {
647  out << Z3_ast_to_string(n.ctx(), n.m_ast); return out;
648  }
649 
650  inline bool eq(ast const & a, ast const & b) { return Z3_is_eq_ast(a.ctx(), a, b); }
651 
652  template<typename T>
653  class ast_vector_tpl : public object {
654  Z3_ast_vector m_vector;
655  void init(Z3_ast_vector v) { Z3_ast_vector_inc_ref(ctx(), v); m_vector = v; }
656  public:
658  ast_vector_tpl(context & c, Z3_ast_vector v):object(c) { init(v); }
659  ast_vector_tpl(ast_vector_tpl const & s):object(s), m_vector(s.m_vector) { Z3_ast_vector_inc_ref(ctx(), m_vector); }
660  ast_vector_tpl(context& c, ast_vector_tpl const& src): object(c) { init(Z3_ast_vector_translate(src.ctx(), src, c)); }
661 
662  ~ast_vector_tpl() override { Z3_ast_vector_dec_ref(ctx(), m_vector); }
663  operator Z3_ast_vector() const { return m_vector; }
664  unsigned size() const { return Z3_ast_vector_size(ctx(), m_vector); }
665  T operator[](unsigned i) const { Z3_ast r = Z3_ast_vector_get(ctx(), m_vector, i); check_error(); return cast_ast<T>()(ctx(), r); }
666  void push_back(T const & e) { Z3_ast_vector_push(ctx(), m_vector, e); check_error(); }
667  void resize(unsigned sz) { Z3_ast_vector_resize(ctx(), m_vector, sz); check_error(); }
668  T back() const { return operator[](size() - 1); }
669  void pop_back() { assert(size() > 0); resize(size() - 1); }
670  bool empty() const { return size() == 0; }
672  Z3_ast_vector_inc_ref(s.ctx(), s.m_vector);
673  Z3_ast_vector_dec_ref(ctx(), m_vector);
674  object::operator=(s);
675  m_vector = s.m_vector;
676  return *this;
677  }
678  ast_vector_tpl& set(unsigned idx, ast& a) {
679  Z3_ast_vector_set(ctx(), m_vector, idx, a);
680  return *this;
681  }
682  /*
683  Disabled pending C++98 build upgrade
684  bool contains(T const& x) const {
685  for (T y : *this) if (eq(x, y)) return true;
686  return false;
687  }
688  */
689 
690  class iterator final {
691  ast_vector_tpl const* m_vector;
692  unsigned m_index;
693  public:
694  iterator(ast_vector_tpl const* v, unsigned i): m_vector(v), m_index(i) {}
695 
696  bool operator==(iterator const& other) const noexcept {
697  return other.m_index == m_index;
698  };
699  bool operator!=(iterator const& other) const noexcept {
700  return other.m_index != m_index;
701  };
702  iterator& operator++() noexcept {
703  ++m_index;
704  return *this;
705  }
706  void set(T& arg) {
707  Z3_ast_vector_set(m_vector->ctx(), *m_vector, m_index, arg);
708  }
709  iterator operator++(int) noexcept { iterator tmp = *this; ++m_index; return tmp; }
710  T * operator->() const { return &(operator*()); }
711  T operator*() const { return (*m_vector)[m_index]; }
712  };
713  iterator begin() const noexcept { return iterator(this, 0); }
714  iterator end() const { return iterator(this, size()); }
715  friend std::ostream & operator<<(std::ostream & out, ast_vector_tpl const & v) { out << Z3_ast_vector_to_string(v.ctx(), v); return out; }
716  std::string to_string() const { return std::string(Z3_ast_vector_to_string(ctx(), m_vector)); }
717  };
718 
719 
723  class sort : public ast {
724  public:
725  sort(context & c):ast(c) {}
726  sort(context & c, Z3_sort s):ast(c, reinterpret_cast<Z3_ast>(s)) {}
727  sort(context & c, Z3_ast a):ast(c, a) {}
728  operator Z3_sort() const { return reinterpret_cast<Z3_sort>(m_ast); }
729 
733  unsigned id() const { unsigned r = Z3_get_sort_id(ctx(), *this); check_error(); return r; }
734 
738  Z3_sort_kind sort_kind() const { return Z3_get_sort_kind(*m_ctx, *this); }
742  symbol name() const { Z3_symbol s = Z3_get_sort_name(ctx(), *this); check_error(); return symbol(ctx(), s); }
746  bool is_bool() const { return sort_kind() == Z3_BOOL_SORT; }
750  bool is_int() const { return sort_kind() == Z3_INT_SORT; }
754  bool is_real() const { return sort_kind() == Z3_REAL_SORT; }
758  bool is_arith() const { return is_int() || is_real(); }
762  bool is_bv() const { return sort_kind() == Z3_BV_SORT; }
766  bool is_array() const { return sort_kind() == Z3_ARRAY_SORT; }
770  bool is_datatype() const { return sort_kind() == Z3_DATATYPE_SORT; }
774  bool is_relation() const { return sort_kind() == Z3_RELATION_SORT; }
778  bool is_seq() const { return sort_kind() == Z3_SEQ_SORT; }
782  bool is_re() const { return sort_kind() == Z3_RE_SORT; }
786  bool is_finite_domain() const { return sort_kind() == Z3_FINITE_DOMAIN_SORT; }
790  bool is_fpa() const { return sort_kind() == Z3_FLOATING_POINT_SORT; }
791 
797  unsigned bv_size() const { assert(is_bv()); unsigned r = Z3_get_bv_sort_size(ctx(), *this); check_error(); return r; }
798 
799  unsigned fpa_ebits() const { assert(is_fpa()); unsigned r = Z3_fpa_get_ebits(ctx(), *this); check_error(); return r; }
800 
801  unsigned fpa_sbits() const { assert(is_fpa()); unsigned r = Z3_fpa_get_sbits(ctx(), *this); check_error(); return r; }
807  sort array_domain() const { assert(is_array()); Z3_sort s = Z3_get_array_sort_domain(ctx(), *this); check_error(); return sort(ctx(), s); }
813  sort array_range() const { assert(is_array()); Z3_sort s = Z3_get_array_sort_range(ctx(), *this); check_error(); return sort(ctx(), s); }
814 
815  friend std::ostream & operator<<(std::ostream & out, sort const & s) { return out << Z3_sort_to_string(s.ctx(), Z3_sort(s.m_ast)); }
816 
817  func_decl_vector constructors();
818  func_decl_vector recognizers();
819  };
820 
821 
826  class func_decl : public ast {
827  public:
828  func_decl(context & c):ast(c) {}
829  func_decl(context & c, Z3_func_decl n):ast(c, reinterpret_cast<Z3_ast>(n)) {}
830  operator Z3_func_decl() const { return reinterpret_cast<Z3_func_decl>(m_ast); }
831 
835  unsigned id() const { unsigned r = Z3_get_func_decl_id(ctx(), *this); check_error(); return r; }
836 
837  unsigned arity() const { return Z3_get_arity(ctx(), *this); }
838  sort domain(unsigned i) const { assert(i < arity()); Z3_sort r = Z3_get_domain(ctx(), *this, i); check_error(); return sort(ctx(), r); }
839  sort range() const { Z3_sort r = Z3_get_range(ctx(), *this); check_error(); return sort(ctx(), r); }
840  symbol name() const { Z3_symbol s = Z3_get_decl_name(ctx(), *this); check_error(); return symbol(ctx(), s); }
841  Z3_decl_kind decl_kind() const { return Z3_get_decl_kind(ctx(), *this); }
842  unsigned num_parameters() const { return Z3_get_decl_num_parameters(ctx(), *this); }
843 
844 
846  Z3_func_decl tc = Z3_mk_transitive_closure(ctx(), *this); check_error(); return func_decl(ctx(), tc);
847  }
848 
849  bool is_const() const { return arity() == 0; }
850 
851  expr operator()() const;
852  expr operator()(unsigned n, expr const * args) const;
853  expr operator()(expr_vector const& v) const;
854  expr operator()(expr const & a) const;
855  expr operator()(int a) const;
856  expr operator()(expr const & a1, expr const & a2) const;
857  expr operator()(expr const & a1, int a2) const;
858  expr operator()(int a1, expr const & a2) const;
859  expr operator()(expr const & a1, expr const & a2, expr const & a3) const;
860  expr operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const;
861  expr operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const;
862 
863  func_decl_vector accessors();
864 
865  };
866 
870  expr select(expr const & a, expr const& i);
871  expr select(expr const & a, expr_vector const & i);
872 
877  class expr : public ast {
878  public:
879  expr(context & c):ast(c) {}
880  expr(context & c, Z3_ast n):ast(c, reinterpret_cast<Z3_ast>(n)) {}
881 
885  sort get_sort() const { Z3_sort s = Z3_get_sort(*m_ctx, m_ast); check_error(); return sort(*m_ctx, s); }
886 
890  bool is_bool() const { return get_sort().is_bool(); }
894  bool is_int() const { return get_sort().is_int(); }
898  bool is_real() const { return get_sort().is_real(); }
902  bool is_arith() const { return get_sort().is_arith(); }
906  bool is_bv() const { return get_sort().is_bv(); }
910  bool is_array() const { return get_sort().is_array(); }
914  bool is_datatype() const { return get_sort().is_datatype(); }
918  bool is_relation() const { return get_sort().is_relation(); }
922  bool is_seq() const { return get_sort().is_seq(); }
926  bool is_re() const { return get_sort().is_re(); }
927 
936  bool is_finite_domain() const { return get_sort().is_finite_domain(); }
940  bool is_fpa() const { return get_sort().is_fpa(); }
941 
947  bool is_numeral() const { return kind() == Z3_NUMERAL_AST; }
948  bool is_numeral_i64(int64_t& i) const { bool r = Z3_get_numeral_int64(ctx(), m_ast, &i); check_error(); return r;}
949  bool is_numeral_u64(uint64_t& i) const { bool r = Z3_get_numeral_uint64(ctx(), m_ast, &i); check_error(); return r;}
950  bool is_numeral_i(int& i) const { bool r = Z3_get_numeral_int(ctx(), m_ast, &i); check_error(); return r;}
951  bool is_numeral_u(unsigned& i) const { bool r = Z3_get_numeral_uint(ctx(), m_ast, &i); check_error(); return r;}
952  bool is_numeral(std::string& s) const { if (!is_numeral()) return false; s = Z3_get_numeral_string(ctx(), m_ast); check_error(); return true; }
953  bool is_numeral(std::string& s, unsigned precision) const { if (!is_numeral()) return false; s = Z3_get_numeral_decimal_string(ctx(), m_ast, precision); check_error(); return true; }
954  bool is_numeral(double& d) const { if (!is_numeral()) return false; d = Z3_get_numeral_double(ctx(), m_ast); check_error(); return true; }
955  bool as_binary(std::string& s) const { if (!is_numeral()) return false; s = Z3_get_numeral_binary_string(ctx(), m_ast); check_error(); return true; }
956 
957  double as_double() const { double d = 0; is_numeral(d); return d; }
958  uint64_t as_uint64() const { uint64_t r = 0; is_numeral_u64(r); return r; }
959  int64_t as_int64() const { int64_t r = 0; is_numeral_i64(r); return r; }
960 
961 
965  bool is_app() const { return kind() == Z3_APP_AST || kind() == Z3_NUMERAL_AST; }
969  bool is_const() const { return is_app() && num_args() == 0; }
973  bool is_quantifier() const { return kind() == Z3_QUANTIFIER_AST; }
974 
978  bool is_forall() const { return Z3_is_quantifier_forall(ctx(), m_ast); }
982  bool is_exists() const { return Z3_is_quantifier_exists(ctx(), m_ast); }
986  bool is_lambda() const { return Z3_is_lambda(ctx(), m_ast); }
991  bool is_var() const { return kind() == Z3_VAR_AST; }
995  bool is_algebraic() const { return Z3_is_algebraic_number(ctx(), m_ast); }
996 
1000  bool is_well_sorted() const { bool r = Z3_is_well_sorted(ctx(), m_ast); check_error(); return r; }
1001 
1005  expr mk_is_inf() const {
1006  assert(is_fpa());
1007  Z3_ast r = Z3_mk_fpa_is_infinite(ctx(), m_ast);
1008  check_error();
1009  return expr(ctx(), r);
1010  }
1011 
1015  expr mk_is_nan() const {
1016  assert(is_fpa());
1017  Z3_ast r = Z3_mk_fpa_is_nan(ctx(), m_ast);
1018  check_error();
1019  return expr(ctx(), r);
1020  }
1021 
1025  expr mk_is_normal() const {
1026  assert(is_fpa());
1027  Z3_ast r = Z3_mk_fpa_is_normal(ctx(), m_ast);
1028  check_error();
1029  return expr(ctx(), r);
1030  }
1031 
1036  assert(is_fpa());
1037  Z3_ast r = Z3_mk_fpa_is_subnormal(ctx(), m_ast);
1038  check_error();
1039  return expr(ctx(), r);
1040  }
1041 
1045  expr mk_is_zero() const {
1046  assert(is_fpa());
1047  Z3_ast r = Z3_mk_fpa_is_zero(ctx(), m_ast);
1048  check_error();
1049  return expr(ctx(), r);
1050  }
1051 
1056  assert(is_fpa());
1057  Z3_ast r = Z3_mk_fpa_to_ieee_bv(ctx(), m_ast);
1058  check_error();
1059  return expr(ctx(), r);
1060  }
1061 
1065  expr mk_from_ieee_bv(sort const &s) const {
1066  assert(is_bv());
1067  Z3_ast r = Z3_mk_fpa_to_fp_bv(ctx(), m_ast, s);
1068  check_error();
1069  return expr(ctx(), r);
1070  }
1071 
1078  std::string get_decimal_string(int precision) const {
1079  assert(is_numeral() || is_algebraic());
1080  return std::string(Z3_get_numeral_decimal_string(ctx(), m_ast, precision));
1081  }
1082 
1086  expr algebraic_lower(unsigned precision) const {
1087  assert(is_algebraic());
1088  Z3_ast r = Z3_get_algebraic_number_lower(ctx(), m_ast, precision);
1089  check_error();
1090  return expr(ctx(), r);
1091  }
1092 
1093  expr algebraic_upper(unsigned precision) const {
1094  assert(is_algebraic());
1095  Z3_ast r = Z3_get_algebraic_number_upper(ctx(), m_ast, precision);
1096  check_error();
1097  return expr(ctx(), r);
1098  }
1099 
1103  expr_vector algebraic_poly() const {
1104  assert(is_algebraic());
1105  Z3_ast_vector r = Z3_algebraic_get_poly(ctx(), m_ast);
1106  check_error();
1107  return expr_vector(ctx(), r);
1108  }
1109 
1113  unsigned algebraic_i() const {
1114  assert(is_algebraic());
1115  unsigned i = Z3_algebraic_get_i(ctx(), m_ast);
1116  check_error();
1117  return i;
1118  }
1119 
1123  unsigned id() const { unsigned r = Z3_get_ast_id(ctx(), m_ast); check_error(); return r; }
1124 
1135  int get_numeral_int() const {
1136  int result = 0;
1137  if (!is_numeral_i(result)) {
1138  assert(ctx().enable_exceptions());
1139  if (!ctx().enable_exceptions()) return 0;
1140  Z3_THROW(exception("numeral does not fit in machine int"));
1141  }
1142  return result;
1143  }
1144 
1154  unsigned get_numeral_uint() const {
1155  assert(is_numeral());
1156  unsigned result = 0;
1157  if (!is_numeral_u(result)) {
1158  assert(ctx().enable_exceptions());
1159  if (!ctx().enable_exceptions()) return 0;
1160  Z3_THROW(exception("numeral does not fit in machine uint"));
1161  }
1162  return result;
1163  }
1164 
1171  int64_t get_numeral_int64() const {
1172  assert(is_numeral());
1173  int64_t result = 0;
1174  if (!is_numeral_i64(result)) {
1175  assert(ctx().enable_exceptions());
1176  if (!ctx().enable_exceptions()) return 0;
1177  Z3_THROW(exception("numeral does not fit in machine int64_t"));
1178  }
1179  return result;
1180  }
1181 
1188  uint64_t get_numeral_uint64() const {
1189  assert(is_numeral());
1190  uint64_t result = 0;
1191  if (!is_numeral_u64(result)) {
1192  assert(ctx().enable_exceptions());
1193  if (!ctx().enable_exceptions()) return 0;
1194  Z3_THROW(exception("numeral does not fit in machine uint64_t"));
1195  }
1196  return result;
1197  }
1198 
1200  return Z3_get_bool_value(ctx(), m_ast);
1201  }
1202 
1203  expr numerator() const {
1204  assert(is_numeral());
1205  Z3_ast r = Z3_get_numerator(ctx(), m_ast);
1206  check_error();
1207  return expr(ctx(),r);
1208  }
1209 
1210 
1211  expr denominator() const {
1212  assert(is_numeral());
1213  Z3_ast r = Z3_get_denominator(ctx(), m_ast);
1214  check_error();
1215  return expr(ctx(),r);
1216  }
1217 
1218 
1223  bool is_string_value() const { return Z3_is_string(ctx(), m_ast); }
1224 
1230  std::string get_string() const {
1231  assert(is_string_value());
1232  char const* s = Z3_get_string(ctx(), m_ast);
1233  check_error();
1234  return std::string(s);
1235  }
1236 
1242  std::u32string get_u32string() const {
1243  assert(is_string_value());
1244  unsigned n = Z3_get_string_length(ctx(), m_ast);
1245  std::u32string s;
1246  s.resize(n);
1247  Z3_get_string_contents(ctx(), m_ast, n, (unsigned*)s.data());
1248  return s;
1249  }
1250 
1251  operator Z3_app() const { assert(is_app()); return reinterpret_cast<Z3_app>(m_ast); }
1252 
1259  func_decl decl() const { Z3_func_decl f = Z3_get_app_decl(ctx(), *this); check_error(); return func_decl(ctx(), f); }
1266  unsigned num_args() const { unsigned r = Z3_get_app_num_args(ctx(), *this); check_error(); return r; }
1274  expr arg(unsigned i) const { Z3_ast r = Z3_get_app_arg(ctx(), *this, i); check_error(); return expr(ctx(), r); }
1281  expr_vector args() const {
1282  expr_vector vec(ctx());
1283  unsigned argCnt = num_args();
1284  for (unsigned i = 0; i < argCnt; ++i)
1285  vec.push_back(arg(i));
1286  return vec;
1287  }
1288 
1297  expr update(expr_vector const& args) const;
1298 
1308  expr update_field(func_decl const& field_access, expr const& new_value) const;
1309 
1315  expr body() const { assert(is_quantifier()); Z3_ast r = Z3_get_quantifier_body(ctx(), *this); check_error(); return expr(ctx(), r); }
1316 
1322  friend expr operator!(expr const & a);
1323 
1330  friend expr operator&&(expr const & a, expr const & b);
1331 
1332 
1339  friend expr operator&&(expr const & a, bool b);
1346  friend expr operator&&(bool a, expr const & b);
1347 
1354  friend expr operator||(expr const & a, expr const & b);
1361  friend expr operator||(expr const & a, bool b);
1362 
1369  friend expr operator||(bool a, expr const & b);
1370 
1371  friend expr implies(expr const & a, expr const & b);
1372  friend expr implies(expr const & a, bool b);
1373  friend expr implies(bool a, expr const & b);
1374 
1375  friend expr mk_or(expr_vector const& args);
1376  friend expr mk_xor(expr_vector const& args);
1377  friend expr mk_and(expr_vector const& args);
1378 
1379  friend expr ite(expr const & c, expr const & t, expr const & e);
1380 
1381  bool is_true() const { return is_app() && Z3_OP_TRUE == decl().decl_kind(); }
1382  bool is_false() const { return is_app() && Z3_OP_FALSE == decl().decl_kind(); }
1383  bool is_not() const { return is_app() && Z3_OP_NOT == decl().decl_kind(); }
1384  bool is_and() const { return is_app() && Z3_OP_AND == decl().decl_kind(); }
1385  bool is_or() const { return is_app() && Z3_OP_OR == decl().decl_kind(); }
1386  bool is_xor() const { return is_app() && Z3_OP_XOR == decl().decl_kind(); }
1387  bool is_implies() const { return is_app() && Z3_OP_IMPLIES == decl().decl_kind(); }
1388  bool is_eq() const { return is_app() && Z3_OP_EQ == decl().decl_kind(); }
1389  bool is_ite() const { return is_app() && Z3_OP_ITE == decl().decl_kind(); }
1390  bool is_distinct() const { return is_app() && Z3_OP_DISTINCT == decl().decl_kind(); }
1391 
1392  friend expr distinct(expr_vector const& args);
1393  friend expr concat(expr const& a, expr const& b);
1394  friend expr concat(expr_vector const& args);
1395 
1396  friend expr operator==(expr const & a, expr const & b);
1397  friend expr operator==(expr const & a, int b);
1398  friend expr operator==(int a, expr const & b);
1399 
1400  friend expr operator!=(expr const & a, expr const & b);
1401  friend expr operator!=(expr const & a, int b);
1402  friend expr operator!=(int a, expr const & b);
1403 
1404  friend expr operator+(expr const & a, expr const & b);
1405  friend expr operator+(expr const & a, int b);
1406  friend expr operator+(int a, expr const & b);
1407  friend expr sum(expr_vector const& args);
1408 
1409  friend expr operator*(expr const & a, expr const & b);
1410  friend expr operator*(expr const & a, int b);
1411  friend expr operator*(int a, expr const & b);
1412 
1413  /* \brief Power operator */
1414  friend expr pw(expr const & a, expr const & b);
1415  friend expr pw(expr const & a, int b);
1416  friend expr pw(int a, expr const & b);
1417 
1418  /* \brief mod operator */
1419  friend expr mod(expr const& a, expr const& b);
1420  friend expr mod(expr const& a, int b);
1421  friend expr mod(int a, expr const& b);
1422 
1423  /* \brief rem operator */
1424  friend expr rem(expr const& a, expr const& b);
1425  friend expr rem(expr const& a, int b);
1426  friend expr rem(int a, expr const& b);
1427 
1428  friend expr is_int(expr const& e);
1429 
1430  friend expr operator/(expr const & a, expr const & b);
1431  friend expr operator/(expr const & a, int b);
1432  friend expr operator/(int a, expr const & b);
1433 
1434  friend expr operator-(expr const & a);
1435 
1436  friend expr operator-(expr const & a, expr const & b);
1437  friend expr operator-(expr const & a, int b);
1438  friend expr operator-(int a, expr const & b);
1439 
1440  friend expr operator<=(expr const & a, expr const & b);
1441  friend expr operator<=(expr const & a, int b);
1442  friend expr operator<=(int a, expr const & b);
1443 
1444 
1445  friend expr operator>=(expr const & a, expr const & b);
1446  friend expr operator>=(expr const & a, int b);
1447  friend expr operator>=(int a, expr const & b);
1448 
1449  friend expr operator<(expr const & a, expr const & b);
1450  friend expr operator<(expr const & a, int b);
1451  friend expr operator<(int a, expr const & b);
1452 
1453  friend expr operator>(expr const & a, expr const & b);
1454  friend expr operator>(expr const & a, int b);
1455  friend expr operator>(int a, expr const & b);
1456 
1457  friend expr pble(expr_vector const& es, int const * coeffs, int bound);
1458  friend expr pbge(expr_vector const& es, int const * coeffs, int bound);
1459  friend expr pbeq(expr_vector const& es, int const * coeffs, int bound);
1460  friend expr atmost(expr_vector const& es, unsigned bound);
1461  friend expr atleast(expr_vector const& es, unsigned bound);
1462 
1463  friend expr operator&(expr const & a, expr const & b);
1464  friend expr operator&(expr const & a, int b);
1465  friend expr operator&(int a, expr const & b);
1466 
1467  friend expr operator^(expr const & a, expr const & b);
1468  friend expr operator^(expr const & a, int b);
1469  friend expr operator^(int a, expr const & b);
1470 
1471  friend expr operator|(expr const & a, expr const & b);
1472  friend expr operator|(expr const & a, int b);
1473  friend expr operator|(int a, expr const & b);
1474  friend expr nand(expr const& a, expr const& b);
1475  friend expr nor(expr const& a, expr const& b);
1476  friend expr xnor(expr const& a, expr const& b);
1477 
1478  friend expr min(expr const& a, expr const& b);
1479  friend expr max(expr const& a, expr const& b);
1480 
1481  friend expr bv2int(expr const& a, bool is_signed);
1482  friend expr int2bv(unsigned n, expr const& a);
1483  friend expr bvadd_no_overflow(expr const& a, expr const& b, bool is_signed);
1484  friend expr bvadd_no_underflow(expr const& a, expr const& b);
1485  friend expr bvsub_no_overflow(expr const& a, expr const& b);
1486  friend expr bvsub_no_underflow(expr const& a, expr const& b, bool is_signed);
1487  friend expr bvsdiv_no_overflow(expr const& a, expr const& b);
1488  friend expr bvneg_no_overflow(expr const& a);
1489  friend expr bvmul_no_overflow(expr const& a, expr const& b, bool is_signed);
1490  friend expr bvmul_no_underflow(expr const& a, expr const& b);
1491 
1492  expr rotate_left(unsigned i) const { Z3_ast r = Z3_mk_rotate_left(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1493  expr rotate_right(unsigned i) const { Z3_ast r = Z3_mk_rotate_right(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1494  expr repeat(unsigned i) const { Z3_ast r = Z3_mk_repeat(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1495 
1496  friend expr bvredor(expr const & a);
1497  friend expr bvredand(expr const & a);
1498 
1499  friend expr abs(expr const & a);
1500  friend expr sqrt(expr const & a, expr const & rm);
1501  friend expr fp_eq(expr const & a, expr const & b);
1502 
1503  friend expr operator~(expr const & a);
1504  expr extract(unsigned hi, unsigned lo) const { Z3_ast r = Z3_mk_extract(ctx(), hi, lo, *this); ctx().check_error(); return expr(ctx(), r); }
1505  expr bit2bool(unsigned i) const { Z3_ast r = Z3_mk_bit2bool(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1506  unsigned lo() const { assert (is_app() && Z3_get_decl_num_parameters(ctx(), decl()) == 2); return static_cast<unsigned>(Z3_get_decl_int_parameter(ctx(), decl(), 1)); }
1507  unsigned hi() const { assert (is_app() && Z3_get_decl_num_parameters(ctx(), decl()) == 2); return static_cast<unsigned>(Z3_get_decl_int_parameter(ctx(), decl(), 0)); }
1508 
1512  friend expr fma(expr const& a, expr const& b, expr const& c, expr const& rm);
1513 
1517  friend expr fpa_fp(expr const& sgn, expr const& exp, expr const& sig);
1518 
1522  friend expr fpa_to_sbv(expr const& t, unsigned sz);
1523 
1527  friend expr fpa_to_ubv(expr const& t, unsigned sz);
1528 
1532  friend expr sbv_to_fpa(expr const& t, sort s);
1533 
1537  friend expr ubv_to_fpa(expr const& t, sort s);
1538 
1542  friend expr fpa_to_fpa(expr const& t, sort s);
1543 
1547  friend expr round_fpa_to_closest_integer(expr const& t);
1548 
1554  expr extract(expr const& offset, expr const& length) const {
1555  check_context(*this, offset); check_context(offset, length);
1556  Z3_ast r = Z3_mk_seq_extract(ctx(), *this, offset, length); check_error(); return expr(ctx(), r);
1557  }
1558  expr replace(expr const& src, expr const& dst) const {
1559  check_context(*this, src); check_context(src, dst);
1560  Z3_ast r = Z3_mk_seq_replace(ctx(), *this, src, dst);
1561  check_error();
1562  return expr(ctx(), r);
1563  }
1564  expr unit() const {
1565  Z3_ast r = Z3_mk_seq_unit(ctx(), *this);
1566  check_error();
1567  return expr(ctx(), r);
1568  }
1569  expr contains(expr const& s) const {
1570  check_context(*this, s);
1571  Z3_ast r = Z3_mk_seq_contains(ctx(), *this, s);
1572  check_error();
1573  return expr(ctx(), r);
1574  }
1575  expr at(expr const& index) const {
1576  check_context(*this, index);
1577  Z3_ast r = Z3_mk_seq_at(ctx(), *this, index);
1578  check_error();
1579  return expr(ctx(), r);
1580  }
1581  expr nth(expr const& index) const {
1582  check_context(*this, index);
1583  Z3_ast r = Z3_mk_seq_nth(ctx(), *this, index);
1584  check_error();
1585  return expr(ctx(), r);
1586  }
1587  expr length() const {
1588  Z3_ast r = Z3_mk_seq_length(ctx(), *this);
1589  check_error();
1590  return expr(ctx(), r);
1591  }
1592  expr stoi() const {
1593  Z3_ast r = Z3_mk_str_to_int(ctx(), *this);
1594  check_error();
1595  return expr(ctx(), r);
1596  }
1597  expr itos() const {
1598  Z3_ast r = Z3_mk_int_to_str(ctx(), *this);
1599  check_error();
1600  return expr(ctx(), r);
1601  }
1602  expr ubvtos() const {
1603  Z3_ast r = Z3_mk_ubv_to_str(ctx(), *this);
1604  check_error();
1605  return expr(ctx(), r);
1606  }
1607  expr sbvtos() const {
1608  Z3_ast r = Z3_mk_sbv_to_str(ctx(), *this);
1609  check_error();
1610  return expr(ctx(), r);
1611  }
1612  expr char_to_int() const {
1613  Z3_ast r = Z3_mk_char_to_int(ctx(), *this);
1614  check_error();
1615  return expr(ctx(), r);
1616  }
1617  expr char_to_bv() const {
1618  Z3_ast r = Z3_mk_char_to_bv(ctx(), *this);
1619  check_error();
1620  return expr(ctx(), r);
1621  }
1622  expr char_from_bv() const {
1623  Z3_ast r = Z3_mk_char_from_bv(ctx(), *this);
1624  check_error();
1625  return expr(ctx(), r);
1626  }
1627  expr is_digit() const {
1628  Z3_ast r = Z3_mk_char_is_digit(ctx(), *this);
1629  check_error();
1630  return expr(ctx(), r);
1631  }
1632 
1633  friend expr range(expr const& lo, expr const& hi);
1637  expr loop(unsigned lo) {
1638  Z3_ast r = Z3_mk_re_loop(ctx(), m_ast, lo, 0);
1639  check_error();
1640  return expr(ctx(), r);
1641  }
1642  expr loop(unsigned lo, unsigned hi) {
1643  Z3_ast r = Z3_mk_re_loop(ctx(), m_ast, lo, hi);
1644  check_error();
1645  return expr(ctx(), r);
1646  }
1647 
1651  expr operator[](expr const& index) const {
1652  assert(is_array() || is_seq());
1653  if (is_array()) {
1654  return select(*this, index);
1655  }
1656  return nth(index);
1657  }
1658 
1659  expr operator[](expr_vector const& index) const {
1660  return select(*this, index);
1661  }
1662 
1666  expr simplify() const { Z3_ast r = Z3_simplify(ctx(), m_ast); check_error(); return expr(ctx(), r); }
1670  expr simplify(params const & p) const { Z3_ast r = Z3_simplify_ex(ctx(), m_ast, p); check_error(); return expr(ctx(), r); }
1671 
1675  expr substitute(expr_vector const& src, expr_vector const& dst);
1676 
1680  expr substitute(expr_vector const& dst);
1681 
1685  expr substitute(func_decl_vector const& funs, expr_vector const& bodies);
1686 
1687 
1688  class iterator {
1689  expr& e;
1690  unsigned i;
1691  public:
1692  iterator(expr& e, unsigned i): e(e), i(i) {}
1693  bool operator==(iterator const& other) const noexcept {
1694  return i == other.i;
1695  }
1696  bool operator!=(iterator const& other) const noexcept {
1697  return i != other.i;
1698  }
1699  expr operator*() const { return e.arg(i); }
1700  iterator& operator++() { ++i; return *this; }
1701  iterator operator++(int) { assert(false); return *this; }
1702  };
1703 
1704  iterator begin() { return iterator(*this, 0); }
1705  iterator end() { return iterator(*this, is_app() ? num_args() : 0); }
1706 
1707  };
1708 
1709 #define _Z3_MK_BIN_(a, b, binop) \
1710  check_context(a, b); \
1711  Z3_ast r = binop(a.ctx(), a, b); \
1712  a.check_error(); \
1713  return expr(a.ctx(), r); \
1714 
1715 
1716  inline expr implies(expr const & a, expr const & b) {
1717  assert(a.is_bool() && b.is_bool());
1718  _Z3_MK_BIN_(a, b, Z3_mk_implies);
1719  }
1720  inline expr implies(expr const & a, bool b) { return implies(a, a.ctx().bool_val(b)); }
1721  inline expr implies(bool a, expr const & b) { return implies(b.ctx().bool_val(a), b); }
1722 
1723 
1724  inline expr pw(expr const & a, expr const & b) { _Z3_MK_BIN_(a, b, Z3_mk_power); }
1725  inline expr pw(expr const & a, int b) { return pw(a, a.ctx().num_val(b, a.get_sort())); }
1726  inline expr pw(int a, expr const & b) { return pw(b.ctx().num_val(a, b.get_sort()), b); }
1727 
1728  inline expr mod(expr const& a, expr const& b) {
1729  if (a.is_bv()) {
1730  _Z3_MK_BIN_(a, b, Z3_mk_bvsmod);
1731  }
1732  else {
1733  _Z3_MK_BIN_(a, b, Z3_mk_mod);
1734  }
1735  }
1736  inline expr mod(expr const & a, int b) { return mod(a, a.ctx().num_val(b, a.get_sort())); }
1737  inline expr mod(int a, expr const & b) { return mod(b.ctx().num_val(a, b.get_sort()), b); }
1738 
1739  inline expr operator%(expr const& a, expr const& b) { return mod(a, b); }
1740  inline expr operator%(expr const& a, int b) { return mod(a, b); }
1741  inline expr operator%(int a, expr const& b) { return mod(a, b); }
1742 
1743 
1744  inline expr rem(expr const& a, expr const& b) {
1745  if (a.is_fpa() && b.is_fpa()) {
1746  _Z3_MK_BIN_(a, b, Z3_mk_fpa_rem);
1747  } else {
1748  _Z3_MK_BIN_(a, b, Z3_mk_rem);
1749  }
1750  }
1751  inline expr rem(expr const & a, int b) { return rem(a, a.ctx().num_val(b, a.get_sort())); }
1752  inline expr rem(int a, expr const & b) { return rem(b.ctx().num_val(a, b.get_sort()), b); }
1753 
1754 #undef _Z3_MK_BIN_
1755 
1756 #define _Z3_MK_UN_(a, mkun) \
1757  Z3_ast r = mkun(a.ctx(), a); \
1758  a.check_error(); \
1759  return expr(a.ctx(), r); \
1760 
1761 
1762  inline expr operator!(expr const & a) { assert(a.is_bool()); _Z3_MK_UN_(a, Z3_mk_not); }
1763 
1764  inline expr is_int(expr const& e) { _Z3_MK_UN_(e, Z3_mk_is_int); }
1765 
1766 #undef _Z3_MK_UN_
1767 
1768  inline expr operator&&(expr const & a, expr const & b) {
1769  check_context(a, b);
1770  assert(a.is_bool() && b.is_bool());
1771  Z3_ast args[2] = { a, b };
1772  Z3_ast r = Z3_mk_and(a.ctx(), 2, args);
1773  a.check_error();
1774  return expr(a.ctx(), r);
1775  }
1776 
1777  inline expr operator&&(expr const & a, bool b) { return a && a.ctx().bool_val(b); }
1778  inline expr operator&&(bool a, expr const & b) { return b.ctx().bool_val(a) && b; }
1779 
1780  inline expr operator||(expr const & a, expr const & b) {
1781  check_context(a, b);
1782  assert(a.is_bool() && b.is_bool());
1783  Z3_ast args[2] = { a, b };
1784  Z3_ast r = Z3_mk_or(a.ctx(), 2, args);
1785  a.check_error();
1786  return expr(a.ctx(), r);
1787  }
1788 
1789  inline expr operator||(expr const & a, bool b) { return a || a.ctx().bool_val(b); }
1790 
1791  inline expr operator||(bool a, expr const & b) { return b.ctx().bool_val(a) || b; }
1792 
1793  inline expr operator==(expr const & a, expr const & b) {
1794  check_context(a, b);
1795  Z3_ast r = Z3_mk_eq(a.ctx(), a, b);
1796  a.check_error();
1797  return expr(a.ctx(), r);
1798  }
1799  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()); }
1800  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; }
1801  inline expr operator==(expr const & a, double b) { assert(a.is_fpa()); return a == a.ctx().fpa_val(b); }
1802  inline expr operator==(double a, expr const & b) { assert(b.is_fpa()); return b.ctx().fpa_val(a) == b; }
1803 
1804  inline expr operator!=(expr const & a, expr const & b) {
1805  check_context(a, b);
1806  Z3_ast args[2] = { a, b };
1807  Z3_ast r = Z3_mk_distinct(a.ctx(), 2, args);
1808  a.check_error();
1809  return expr(a.ctx(), r);
1810  }
1811  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()); }
1812  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; }
1813  inline expr operator!=(expr const & a, double b) { assert(a.is_fpa()); return a != a.ctx().fpa_val(b); }
1814  inline expr operator!=(double a, expr const & b) { assert(b.is_fpa()); return b.ctx().fpa_val(a) != b; }
1815 
1816  inline expr operator+(expr const & a, expr const & b) {
1817  check_context(a, b);
1818  Z3_ast r = 0;
1819  if (a.is_arith() && b.is_arith()) {
1820  Z3_ast args[2] = { a, b };
1821  r = Z3_mk_add(a.ctx(), 2, args);
1822  }
1823  else if (a.is_bv() && b.is_bv()) {
1824  r = Z3_mk_bvadd(a.ctx(), a, b);
1825  }
1826  else if (a.is_seq() && b.is_seq()) {
1827  return concat(a, b);
1828  }
1829  else if (a.is_re() && b.is_re()) {
1830  Z3_ast _args[2] = { a, b };
1831  r = Z3_mk_re_union(a.ctx(), 2, _args);
1832  }
1833  else if (a.is_fpa() && b.is_fpa()) {
1834  r = Z3_mk_fpa_add(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1835  }
1836  else {
1837  // operator is not supported by given arguments.
1838  assert(false);
1839  }
1840  a.check_error();
1841  return expr(a.ctx(), r);
1842  }
1843  inline expr operator+(expr const & a, int b) { return a + a.ctx().num_val(b, a.get_sort()); }
1844  inline expr operator+(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) + b; }
1845 
1846  inline expr operator*(expr const & a, expr const & b) {
1847  check_context(a, b);
1848  Z3_ast r = 0;
1849  if (a.is_arith() && b.is_arith()) {
1850  Z3_ast args[2] = { a, b };
1851  r = Z3_mk_mul(a.ctx(), 2, args);
1852  }
1853  else if (a.is_bv() && b.is_bv()) {
1854  r = Z3_mk_bvmul(a.ctx(), a, b);
1855  }
1856  else if (a.is_fpa() && b.is_fpa()) {
1857  r = Z3_mk_fpa_mul(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1858  }
1859  else {
1860  // operator is not supported by given arguments.
1861  assert(false);
1862  }
1863  a.check_error();
1864  return expr(a.ctx(), r);
1865  }
1866  inline expr operator*(expr const & a, int b) { return a * a.ctx().num_val(b, a.get_sort()); }
1867  inline expr operator*(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) * b; }
1868 
1869 
1870  inline expr operator>=(expr const & a, expr const & b) {
1871  check_context(a, b);
1872  Z3_ast r = 0;
1873  if (a.is_arith() && b.is_arith()) {
1874  r = Z3_mk_ge(a.ctx(), a, b);
1875  }
1876  else if (a.is_bv() && b.is_bv()) {
1877  r = Z3_mk_bvsge(a.ctx(), a, b);
1878  }
1879  else if (a.is_fpa() && b.is_fpa()) {
1880  r = Z3_mk_fpa_geq(a.ctx(), a, b);
1881  }
1882  else {
1883  // operator is not supported by given arguments.
1884  assert(false);
1885  }
1886  a.check_error();
1887  return expr(a.ctx(), r);
1888  }
1889 
1890  inline expr operator/(expr const & a, expr const & b) {
1891  check_context(a, b);
1892  Z3_ast r = 0;
1893  if (a.is_arith() && b.is_arith()) {
1894  r = Z3_mk_div(a.ctx(), a, b);
1895  }
1896  else if (a.is_bv() && b.is_bv()) {
1897  r = Z3_mk_bvsdiv(a.ctx(), a, b);
1898  }
1899  else if (a.is_fpa() && b.is_fpa()) {
1900  r = Z3_mk_fpa_div(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1901  }
1902  else {
1903  // operator is not supported by given arguments.
1904  assert(false);
1905  }
1906  a.check_error();
1907  return expr(a.ctx(), r);
1908  }
1909  inline expr operator/(expr const & a, int b) { return a / a.ctx().num_val(b, a.get_sort()); }
1910  inline expr operator/(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) / b; }
1911 
1912  inline expr operator-(expr const & a) {
1913  Z3_ast r = 0;
1914  if (a.is_arith()) {
1915  r = Z3_mk_unary_minus(a.ctx(), a);
1916  }
1917  else if (a.is_bv()) {
1918  r = Z3_mk_bvneg(a.ctx(), a);
1919  }
1920  else if (a.is_fpa()) {
1921  r = Z3_mk_fpa_neg(a.ctx(), a);
1922  }
1923  else {
1924  // operator is not supported by given arguments.
1925  assert(false);
1926  }
1927  a.check_error();
1928  return expr(a.ctx(), r);
1929  }
1930 
1931  inline expr operator-(expr const & a, expr const & b) {
1932  check_context(a, b);
1933  Z3_ast r = 0;
1934  if (a.is_arith() && b.is_arith()) {
1935  Z3_ast args[2] = { a, b };
1936  r = Z3_mk_sub(a.ctx(), 2, args);
1937  }
1938  else if (a.is_bv() && b.is_bv()) {
1939  r = Z3_mk_bvsub(a.ctx(), a, b);
1940  }
1941  else if (a.is_fpa() && b.is_fpa()) {
1942  r = Z3_mk_fpa_sub(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1943  }
1944  else {
1945  // operator is not supported by given arguments.
1946  assert(false);
1947  }
1948  a.check_error();
1949  return expr(a.ctx(), r);
1950  }
1951  inline expr operator-(expr const & a, int b) { return a - a.ctx().num_val(b, a.get_sort()); }
1952  inline expr operator-(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) - b; }
1953 
1954  inline expr operator<=(expr const & a, expr const & b) {
1955  check_context(a, b);
1956  Z3_ast r = 0;
1957  if (a.is_arith() && b.is_arith()) {
1958  r = Z3_mk_le(a.ctx(), a, b);
1959  }
1960  else if (a.is_bv() && b.is_bv()) {
1961  r = Z3_mk_bvsle(a.ctx(), a, b);
1962  }
1963  else if (a.is_fpa() && b.is_fpa()) {
1964  r = Z3_mk_fpa_leq(a.ctx(), a, b);
1965  }
1966  else {
1967  // operator is not supported by given arguments.
1968  assert(false);
1969  }
1970  a.check_error();
1971  return expr(a.ctx(), r);
1972  }
1973  inline expr operator<=(expr const & a, int b) { return a <= a.ctx().num_val(b, a.get_sort()); }
1974  inline expr operator<=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) <= b; }
1975 
1976  inline expr operator>=(expr const & a, int b) { return a >= a.ctx().num_val(b, a.get_sort()); }
1977  inline expr operator>=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) >= b; }
1978 
1979  inline expr operator<(expr const & a, expr const & b) {
1980  check_context(a, b);
1981  Z3_ast r = 0;
1982  if (a.is_arith() && b.is_arith()) {
1983  r = Z3_mk_lt(a.ctx(), a, b);
1984  }
1985  else if (a.is_bv() && b.is_bv()) {
1986  r = Z3_mk_bvslt(a.ctx(), a, b);
1987  }
1988  else if (a.is_fpa() && b.is_fpa()) {
1989  r = Z3_mk_fpa_lt(a.ctx(), a, b);
1990  }
1991  else {
1992  // operator is not supported by given arguments.
1993  assert(false);
1994  }
1995  a.check_error();
1996  return expr(a.ctx(), r);
1997  }
1998  inline expr operator<(expr const & a, int b) { return a < a.ctx().num_val(b, a.get_sort()); }
1999  inline expr operator<(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) < b; }
2000 
2001  inline expr operator>(expr const & a, expr const & b) {
2002  check_context(a, b);
2003  Z3_ast r = 0;
2004  if (a.is_arith() && b.is_arith()) {
2005  r = Z3_mk_gt(a.ctx(), a, b);
2006  }
2007  else if (a.is_bv() && b.is_bv()) {
2008  r = Z3_mk_bvsgt(a.ctx(), a, b);
2009  }
2010  else if (a.is_fpa() && b.is_fpa()) {
2011  r = Z3_mk_fpa_gt(a.ctx(), a, b);
2012  }
2013  else {
2014  // operator is not supported by given arguments.
2015  assert(false);
2016  }
2017  a.check_error();
2018  return expr(a.ctx(), r);
2019  }
2020  inline expr operator>(expr const & a, int b) { return a > a.ctx().num_val(b, a.get_sort()); }
2021  inline expr operator>(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) > b; }
2022 
2023  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); }
2024  inline expr operator&(expr const & a, int b) { return a & a.ctx().num_val(b, a.get_sort()); }
2025  inline expr operator&(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) & b; }
2026 
2027  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); }
2028  inline expr operator^(expr const & a, int b) { return a ^ a.ctx().num_val(b, a.get_sort()); }
2029  inline expr operator^(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) ^ b; }
2030 
2031  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); }
2032  inline expr operator|(expr const & a, int b) { return a | a.ctx().num_val(b, a.get_sort()); }
2033  inline expr operator|(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) | b; }
2034 
2035  inline expr 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); }
2036  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); }
2037  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); }
2038  inline expr min(expr const& a, expr const& b) {
2039  check_context(a, b);
2040  Z3_ast r;
2041  if (a.is_arith()) {
2042  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), b, a);
2043  }
2044  else if (a.is_bv()) {
2045  r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), b, a);
2046  }
2047  else {
2048  assert(a.is_fpa());
2049  r = Z3_mk_fpa_min(a.ctx(), a, b);
2050  }
2051  a.check_error();
2052  return expr(a.ctx(), r);
2053  }
2054  inline expr max(expr const& a, expr const& b) {
2055  check_context(a, b);
2056  Z3_ast r;
2057  if (a.is_arith()) {
2058  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), a, b);
2059  }
2060  else if (a.is_bv()) {
2061  r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), a, b);
2062  }
2063  else {
2064  assert(a.is_fpa());
2065  r = Z3_mk_fpa_max(a.ctx(), a, b);
2066  }
2067  a.check_error();
2068  return expr(a.ctx(), r);
2069  }
2070  inline expr bvredor(expr const & a) {
2071  assert(a.is_bv());
2072  Z3_ast r = Z3_mk_bvredor(a.ctx(), a);
2073  a.check_error();
2074  return expr(a.ctx(), r);
2075  }
2076  inline expr bvredand(expr const & a) {
2077  assert(a.is_bv());
2078  Z3_ast r = Z3_mk_bvredand(a.ctx(), a);
2079  a.check_error();
2080  return expr(a.ctx(), r);
2081  }
2082  inline expr abs(expr const & a) {
2083  Z3_ast r;
2084  if (a.is_int()) {
2085  expr zero = a.ctx().int_val(0);
2086  expr ge = a >= zero;
2087  expr na = -a;
2088  r = Z3_mk_ite(a.ctx(), ge, a, na);
2089  }
2090  else if (a.is_real()) {
2091  expr zero = a.ctx().real_val(0);
2092  expr ge = a >= zero;
2093  expr na = -a;
2094  r = Z3_mk_ite(a.ctx(), ge, a, na);
2095  }
2096  else {
2097  r = Z3_mk_fpa_abs(a.ctx(), a);
2098  }
2099  a.check_error();
2100  return expr(a.ctx(), r);
2101  }
2102  inline expr sqrt(expr const & a, expr const& rm) {
2103  check_context(a, rm);
2104  assert(a.is_fpa());
2105  Z3_ast r = Z3_mk_fpa_sqrt(a.ctx(), rm, a);
2106  a.check_error();
2107  return expr(a.ctx(), r);
2108  }
2109  inline expr fp_eq(expr const & a, expr const & b) {
2110  check_context(a, b);
2111  assert(a.is_fpa());
2112  Z3_ast r = Z3_mk_fpa_eq(a.ctx(), a, b);
2113  a.check_error();
2114  return expr(a.ctx(), r);
2115  }
2116  inline expr operator~(expr const & a) { Z3_ast r = Z3_mk_bvnot(a.ctx(), a); return expr(a.ctx(), r); }
2117 
2118  inline expr fma(expr const& a, expr const& b, expr const& c, expr const& rm) {
2119  check_context(a, b); check_context(a, c); check_context(a, rm);
2120  assert(a.is_fpa() && b.is_fpa() && c.is_fpa());
2121  Z3_ast r = Z3_mk_fpa_fma(a.ctx(), rm, a, b, c);
2122  a.check_error();
2123  return expr(a.ctx(), r);
2124  }
2125 
2126  inline expr fpa_fp(expr const& sgn, expr const& exp, expr const& sig) {
2127  check_context(sgn, exp); check_context(exp, sig);
2128  assert(sgn.is_bv() && exp.is_bv() && sig.is_bv());
2129  Z3_ast r = Z3_mk_fpa_fp(sgn.ctx(), sgn, exp, sig);
2130  sgn.check_error();
2131  return expr(sgn.ctx(), r);
2132  }
2133 
2134  inline expr fpa_to_sbv(expr const& t, unsigned sz) {
2135  assert(t.is_fpa());
2136  Z3_ast r = Z3_mk_fpa_to_sbv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
2137  t.check_error();
2138  return expr(t.ctx(), r);
2139  }
2140 
2141  inline expr fpa_to_ubv(expr const& t, unsigned sz) {
2142  assert(t.is_fpa());
2143  Z3_ast r = Z3_mk_fpa_to_ubv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
2144  t.check_error();
2145  return expr(t.ctx(), r);
2146  }
2147 
2148  inline expr sbv_to_fpa(expr const& t, sort s) {
2149  assert(t.is_bv());
2150  Z3_ast r = Z3_mk_fpa_to_fp_signed(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2151  t.check_error();
2152  return expr(t.ctx(), r);
2153  }
2154 
2155  inline expr ubv_to_fpa(expr const& t, sort s) {
2156  assert(t.is_bv());
2157  Z3_ast r = Z3_mk_fpa_to_fp_unsigned(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2158  t.check_error();
2159  return expr(t.ctx(), r);
2160  }
2161 
2162  inline expr fpa_to_fpa(expr const& t, sort s) {
2163  assert(t.is_fpa());
2164  Z3_ast r = Z3_mk_fpa_to_fp_float(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2165  t.check_error();
2166  return expr(t.ctx(), r);
2167  }
2168 
2170  assert(t.is_fpa());
2171  Z3_ast r = Z3_mk_fpa_round_to_integral(t.ctx(), t.ctx().fpa_rounding_mode(), t);
2172  t.check_error();
2173  return expr(t.ctx(), r);
2174  }
2175 
2181  inline expr ite(expr const & c, expr const & t, expr const & e) {
2182  check_context(c, t); check_context(c, e);
2183  assert(c.is_bool());
2184  Z3_ast r = Z3_mk_ite(c.ctx(), c, t, e);
2185  c.check_error();
2186  return expr(c.ctx(), r);
2187  }
2188 
2189 
2194  inline expr to_expr(context & c, Z3_ast a) {
2195  c.check_error();
2196  assert(Z3_get_ast_kind(c, a) == Z3_APP_AST ||
2197  Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST ||
2198  Z3_get_ast_kind(c, a) == Z3_VAR_AST ||
2200  return expr(c, a);
2201  }
2202 
2203  inline sort to_sort(context & c, Z3_sort s) {
2204  c.check_error();
2205  return sort(c, s);
2206  }
2207 
2208  inline func_decl to_func_decl(context & c, Z3_func_decl f) {
2209  c.check_error();
2210  return func_decl(c, f);
2211  }
2212 
2216  inline expr sle(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsle(a.ctx(), a, b)); }
2217  inline expr sle(expr const & a, int b) { return sle(a, a.ctx().num_val(b, a.get_sort())); }
2218  inline expr sle(int a, expr const & b) { return sle(b.ctx().num_val(a, b.get_sort()), b); }
2222  inline expr slt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvslt(a.ctx(), a, b)); }
2223  inline expr slt(expr const & a, int b) { return slt(a, a.ctx().num_val(b, a.get_sort())); }
2224  inline expr slt(int a, expr const & b) { return slt(b.ctx().num_val(a, b.get_sort()), b); }
2228  inline expr sge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsge(a.ctx(), a, b)); }
2229  inline expr sge(expr const & a, int b) { return sge(a, a.ctx().num_val(b, a.get_sort())); }
2230  inline expr sge(int a, expr const & b) { return sge(b.ctx().num_val(a, b.get_sort()), b); }
2234  inline expr sgt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsgt(a.ctx(), a, b)); }
2235  inline expr sgt(expr const & a, int b) { return sgt(a, a.ctx().num_val(b, a.get_sort())); }
2236  inline expr sgt(int a, expr const & b) { return sgt(b.ctx().num_val(a, b.get_sort()), b); }
2237 
2238 
2242  inline expr ule(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvule(a.ctx(), a, b)); }
2243  inline expr ule(expr const & a, int b) { return ule(a, a.ctx().num_val(b, a.get_sort())); }
2244  inline expr ule(int a, expr const & b) { return ule(b.ctx().num_val(a, b.get_sort()), b); }
2248  inline expr ult(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvult(a.ctx(), a, b)); }
2249  inline expr ult(expr const & a, int b) { return ult(a, a.ctx().num_val(b, a.get_sort())); }
2250  inline expr ult(int a, expr const & b) { return ult(b.ctx().num_val(a, b.get_sort()), b); }
2254  inline expr uge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b)); }
2255  inline expr uge(expr const & a, int b) { return uge(a, a.ctx().num_val(b, a.get_sort())); }
2256  inline expr uge(int a, expr const & b) { return uge(b.ctx().num_val(a, b.get_sort()), b); }
2260  inline expr ugt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvugt(a.ctx(), a, b)); }
2261  inline expr ugt(expr const & a, int b) { return ugt(a, a.ctx().num_val(b, a.get_sort())); }
2262  inline expr ugt(int a, expr const & b) { return ugt(b.ctx().num_val(a, b.get_sort()), b); }
2263 
2267  inline expr sdiv(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsdiv(a.ctx(), a, b)); }
2268  inline expr sdiv(expr const & a, int b) { return sdiv(a, a.ctx().num_val(b, a.get_sort())); }
2269  inline expr sdiv(int a, expr const & b) { return sdiv(b.ctx().num_val(a, b.get_sort()), b); }
2270 
2274  inline expr udiv(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvudiv(a.ctx(), a, b)); }
2275  inline expr udiv(expr const & a, int b) { return udiv(a, a.ctx().num_val(b, a.get_sort())); }
2276  inline expr udiv(int a, expr const & b) { return udiv(b.ctx().num_val(a, b.get_sort()), b); }
2277 
2281  inline expr srem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsrem(a.ctx(), a, b)); }
2282  inline expr srem(expr const & a, int b) { return srem(a, a.ctx().num_val(b, a.get_sort())); }
2283  inline expr srem(int a, expr const & b) { return srem(b.ctx().num_val(a, b.get_sort()), b); }
2284 
2288  inline expr smod(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsmod(a.ctx(), a, b)); }
2289  inline expr smod(expr const & a, int b) { return smod(a, a.ctx().num_val(b, a.get_sort())); }
2290  inline expr smod(int a, expr const & b) { return smod(b.ctx().num_val(a, b.get_sort()), b); }
2291 
2295  inline expr urem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvurem(a.ctx(), a, b)); }
2296  inline expr urem(expr const & a, int b) { return urem(a, a.ctx().num_val(b, a.get_sort())); }
2297  inline expr urem(int a, expr const & b) { return urem(b.ctx().num_val(a, b.get_sort()), b); }
2298 
2302  inline expr shl(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvshl(a.ctx(), a, b)); }
2303  inline expr shl(expr const & a, int b) { return shl(a, a.ctx().num_val(b, a.get_sort())); }
2304  inline expr shl(int a, expr const & b) { return shl(b.ctx().num_val(a, b.get_sort()), b); }
2305 
2309  inline expr lshr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvlshr(a.ctx(), a, b)); }
2310  inline expr lshr(expr const & a, int b) { return lshr(a, a.ctx().num_val(b, a.get_sort())); }
2311  inline expr lshr(int a, expr const & b) { return lshr(b.ctx().num_val(a, b.get_sort()), b); }
2312 
2316  inline expr ashr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvashr(a.ctx(), a, b)); }
2317  inline expr ashr(expr const & a, int b) { return ashr(a, a.ctx().num_val(b, a.get_sort())); }
2318  inline expr ashr(int a, expr const & b) { return ashr(b.ctx().num_val(a, b.get_sort()), b); }
2319 
2323  inline expr zext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_zero_ext(a.ctx(), i, a)); }
2324 
2328  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); }
2329  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); }
2330 
2334  inline expr bvadd_no_overflow(expr const& a, expr const& b, bool is_signed) {
2335  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);
2336  }
2337  inline expr bvadd_no_underflow(expr const& a, expr const& b) {
2338  check_context(a, b); Z3_ast r = Z3_mk_bvadd_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2339  }
2340  inline expr bvsub_no_overflow(expr const& a, expr const& b) {
2341  check_context(a, b); Z3_ast r = Z3_mk_bvsub_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2342  }
2343  inline expr bvsub_no_underflow(expr const& a, expr const& b, bool is_signed) {
2344  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);
2345  }
2346  inline expr bvsdiv_no_overflow(expr const& a, expr const& b) {
2347  check_context(a, b); Z3_ast r = Z3_mk_bvsdiv_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2348  }
2349  inline expr bvneg_no_overflow(expr const& a) {
2350  Z3_ast r = Z3_mk_bvneg_no_overflow(a.ctx(), a); a.check_error(); return expr(a.ctx(), r);
2351  }
2352  inline expr bvmul_no_overflow(expr const& a, expr const& b, bool is_signed) {
2353  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);
2354  }
2355  inline expr bvmul_no_underflow(expr const& a, expr const& b) {
2356  check_context(a, b); Z3_ast r = Z3_mk_bvmul_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2357  }
2358 
2359 
2363  inline expr sext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_sign_ext(a.ctx(), i, a)); }
2364 
2365  inline func_decl linear_order(sort const& a, unsigned index) {
2366  return to_func_decl(a.ctx(), Z3_mk_linear_order(a.ctx(), a, index));
2367  }
2368  inline func_decl partial_order(sort const& a, unsigned index) {
2369  return to_func_decl(a.ctx(), Z3_mk_partial_order(a.ctx(), a, index));
2370  }
2371  inline func_decl piecewise_linear_order(sort const& a, unsigned index) {
2372  return to_func_decl(a.ctx(), Z3_mk_piecewise_linear_order(a.ctx(), a, index));
2373  }
2374  inline func_decl tree_order(sort const& a, unsigned index) {
2375  return to_func_decl(a.ctx(), Z3_mk_tree_order(a.ctx(), a, index));
2376  }
2377 
2384  inline expr_vector polynomial_subresultants(expr const& p, expr const& q, expr const& x) {
2385  check_context(p, q); check_context(p, x);
2386  Z3_ast_vector r = Z3_polynomial_subresultants(p.ctx(), p, q, x);
2387  p.check_error();
2388  return expr_vector(p.ctx(), r);
2389  }
2390 
2391  template<> class cast_ast<ast> {
2392  public:
2393  ast operator()(context & c, Z3_ast a) { return ast(c, a); }
2394  };
2395 
2396  template<> class cast_ast<expr> {
2397  public:
2398  expr operator()(context & c, Z3_ast a) {
2399  assert(Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST ||
2400  Z3_get_ast_kind(c, a) == Z3_APP_AST ||
2402  Z3_get_ast_kind(c, a) == Z3_VAR_AST);
2403  return expr(c, a);
2404  }
2405  };
2406 
2407  template<> class cast_ast<sort> {
2408  public:
2409  sort operator()(context & c, Z3_ast a) {
2410  assert(Z3_get_ast_kind(c, a) == Z3_SORT_AST);
2411  return sort(c, reinterpret_cast<Z3_sort>(a));
2412  }
2413  };
2414 
2415  template<> class cast_ast<func_decl> {
2416  public:
2417  func_decl operator()(context & c, Z3_ast a) {
2418  assert(Z3_get_ast_kind(c, a) == Z3_FUNC_DECL_AST);
2419  return func_decl(c, reinterpret_cast<Z3_func_decl>(a));
2420  }
2421  };
2422 
2423  template<typename T>
2424  template<typename T2>
2425  array<T>::array(ast_vector_tpl<T2> const & v):m_array(new T[v.size()]), m_size(v.size()) {
2426  for (unsigned i = 0; i < m_size; ++i) {
2427  m_array[i] = v[i];
2428  }
2429  }
2430 
2431  // Basic functions for creating quantified formulas.
2432  // The C API should be used for creating quantifiers with patterns, weights, many variables, etc.
2433  inline expr forall(expr const & x, expr const & b) {
2434  check_context(x, b);
2435  Z3_app vars[] = {(Z3_app) x};
2436  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2437  }
2438  inline expr forall(expr const & x1, expr const & x2, expr const & b) {
2439  check_context(x1, b); check_context(x2, b);
2440  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2441  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2442  }
2443  inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2444  check_context(x1, b); check_context(x2, b); check_context(x3, b);
2445  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2446  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2447  }
2448  inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2449  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2450  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2451  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2452  }
2453  inline expr forall(expr_vector const & xs, expr const & b) {
2454  array<Z3_app> vars(xs);
2455  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);
2456  }
2457  inline expr exists(expr const & x, expr const & b) {
2458  check_context(x, b);
2459  Z3_app vars[] = {(Z3_app) x};
2460  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2461  }
2462  inline expr exists(expr const & x1, expr const & x2, expr const & b) {
2463  check_context(x1, b); check_context(x2, b);
2464  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2465  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2466  }
2467  inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2468  check_context(x1, b); check_context(x2, b); check_context(x3, b);
2469  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2470  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2471  }
2472  inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2473  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2474  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2475  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2476  }
2477  inline expr exists(expr_vector const & xs, expr const & b) {
2478  array<Z3_app> vars(xs);
2479  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);
2480  }
2481  inline expr lambda(expr const & x, expr const & b) {
2482  check_context(x, b);
2483  Z3_app vars[] = {(Z3_app) x};
2484  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 1, vars, b); b.check_error(); return expr(b.ctx(), r);
2485  }
2486  inline expr lambda(expr const & x1, expr const & x2, expr const & b) {
2487  check_context(x1, b); check_context(x2, b);
2488  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2489  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 2, vars, b); b.check_error(); return expr(b.ctx(), r);
2490  }
2491  inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2492  check_context(x1, b); check_context(x2, b); check_context(x3, b);
2493  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2494  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 3, vars, b); b.check_error(); return expr(b.ctx(), r);
2495  }
2496  inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2497  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2498  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2499  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 4, vars, b); b.check_error(); return expr(b.ctx(), r);
2500  }
2501  inline expr lambda(expr_vector const & xs, expr const & b) {
2502  array<Z3_app> vars(xs);
2503  Z3_ast r = Z3_mk_lambda_const(b.ctx(), vars.size(), vars.ptr(), b); b.check_error(); return expr(b.ctx(), r);
2504  }
2505 
2506  inline expr pble(expr_vector const& es, int const* coeffs, int bound) {
2507  assert(es.size() > 0);
2508  context& ctx = es[0u].ctx();
2509  array<Z3_ast> _es(es);
2510  Z3_ast r = Z3_mk_pble(ctx, _es.size(), _es.ptr(), coeffs, bound);
2511  ctx.check_error();
2512  return expr(ctx, r);
2513  }
2514  inline expr pbge(expr_vector const& es, int const* coeffs, int bound) {
2515  assert(es.size() > 0);
2516  context& ctx = es[0u].ctx();
2517  array<Z3_ast> _es(es);
2518  Z3_ast r = Z3_mk_pbge(ctx, _es.size(), _es.ptr(), coeffs, bound);
2519  ctx.check_error();
2520  return expr(ctx, r);
2521  }
2522  inline expr pbeq(expr_vector const& es, int const* coeffs, int bound) {
2523  assert(es.size() > 0);
2524  context& ctx = es[0u].ctx();
2525  array<Z3_ast> _es(es);
2526  Z3_ast r = Z3_mk_pbeq(ctx, _es.size(), _es.ptr(), coeffs, bound);
2527  ctx.check_error();
2528  return expr(ctx, r);
2529  }
2530  inline expr atmost(expr_vector const& es, unsigned bound) {
2531  assert(es.size() > 0);
2532  context& ctx = es[0u].ctx();
2533  array<Z3_ast> _es(es);
2534  Z3_ast r = Z3_mk_atmost(ctx, _es.size(), _es.ptr(), bound);
2535  ctx.check_error();
2536  return expr(ctx, r);
2537  }
2538  inline expr atleast(expr_vector const& es, unsigned bound) {
2539  assert(es.size() > 0);
2540  context& ctx = es[0u].ctx();
2541  array<Z3_ast> _es(es);
2542  Z3_ast r = Z3_mk_atleast(ctx, _es.size(), _es.ptr(), bound);
2543  ctx.check_error();
2544  return expr(ctx, r);
2545  }
2546  inline expr sum(expr_vector const& args) {
2547  assert(args.size() > 0);
2548  context& ctx = args[0u].ctx();
2549  array<Z3_ast> _args(args);
2550  Z3_ast r = Z3_mk_add(ctx, _args.size(), _args.ptr());
2551  ctx.check_error();
2552  return expr(ctx, r);
2553  }
2554 
2555  inline expr distinct(expr_vector const& args) {
2556  assert(args.size() > 0);
2557  context& ctx = args[0u].ctx();
2558  array<Z3_ast> _args(args);
2559  Z3_ast r = Z3_mk_distinct(ctx, _args.size(), _args.ptr());
2560  ctx.check_error();
2561  return expr(ctx, r);
2562  }
2563 
2564  inline expr concat(expr const& a, expr const& b) {
2565  check_context(a, b);
2566  Z3_ast r;
2567  if (Z3_is_seq_sort(a.ctx(), a.get_sort())) {
2568  Z3_ast _args[2] = { a, b };
2569  r = Z3_mk_seq_concat(a.ctx(), 2, _args);
2570  }
2571  else if (Z3_is_re_sort(a.ctx(), a.get_sort())) {
2572  Z3_ast _args[2] = { a, b };
2573  r = Z3_mk_re_concat(a.ctx(), 2, _args);
2574  }
2575  else {
2576  r = Z3_mk_concat(a.ctx(), a, b);
2577  }
2578  a.ctx().check_error();
2579  return expr(a.ctx(), r);
2580  }
2581 
2582  inline expr concat(expr_vector const& args) {
2583  Z3_ast r;
2584  assert(args.size() > 0);
2585  if (args.size() == 1) {
2586  return args[0u];
2587  }
2588  context& ctx = args[0u].ctx();
2589  array<Z3_ast> _args(args);
2590  if (Z3_is_seq_sort(ctx, args[0u].get_sort())) {
2591  r = Z3_mk_seq_concat(ctx, _args.size(), _args.ptr());
2592  }
2593  else if (Z3_is_re_sort(ctx, args[0u].get_sort())) {
2594  r = Z3_mk_re_concat(ctx, _args.size(), _args.ptr());
2595  }
2596  else {
2597  r = _args[args.size()-1];
2598  for (unsigned i = args.size()-1; i > 0; ) {
2599  --i;
2600  r = Z3_mk_concat(ctx, _args[i], r);
2601  ctx.check_error();
2602  }
2603  }
2604  ctx.check_error();
2605  return expr(ctx, r);
2606  }
2607 
2608  inline expr map(expr const& f, expr const& list) {
2609  context& ctx = f.ctx();
2610  Z3_ast r = Z3_mk_seq_map(ctx, f, list);
2611  ctx.check_error();
2612  return expr(ctx, r);
2613  }
2614 
2615  inline expr mapi(expr const& f, expr const& i, expr const& list) {
2616  context& ctx = f.ctx();
2617  Z3_ast r = Z3_mk_seq_mapi(ctx, f, i, list);
2618  ctx.check_error();
2619  return expr(ctx, r);
2620  }
2621 
2622  inline expr foldl(expr const& f, expr const& a, expr const& list) {
2623  context& ctx = f.ctx();
2624  Z3_ast r = Z3_mk_seq_foldl(ctx, f, a, list);
2625  ctx.check_error();
2626  return expr(ctx, r);
2627  }
2628 
2629  inline expr foldli(expr const& f, expr const& i, expr const& a, expr const& list) {
2630  context& ctx = f.ctx();
2631  Z3_ast r = Z3_mk_seq_foldli(ctx, f, i, a, list);
2632  ctx.check_error();
2633  return expr(ctx, r);
2634  }
2635 
2636  inline expr mk_or(expr_vector const& args) {
2637  array<Z3_ast> _args(args);
2638  Z3_ast r = Z3_mk_or(args.ctx(), _args.size(), _args.ptr());
2639  args.check_error();
2640  return expr(args.ctx(), r);
2641  }
2642  inline expr mk_and(expr_vector const& args) {
2643  array<Z3_ast> _args(args);
2644  Z3_ast r = Z3_mk_and(args.ctx(), _args.size(), _args.ptr());
2645  args.check_error();
2646  return expr(args.ctx(), r);
2647  }
2648  inline expr mk_xor(expr_vector const& args) {
2649  if (args.empty())
2650  return args.ctx().bool_val(false);
2651  expr r = args[0u];
2652  for (unsigned i = 1; i < args.size(); ++i)
2653  r = r ^ args[i];
2654  return r;
2655  }
2656 
2657 
2658  class func_entry : public object {
2659  Z3_func_entry m_entry;
2660  void init(Z3_func_entry e) {
2661  m_entry = e;
2662  Z3_func_entry_inc_ref(ctx(), m_entry);
2663  }
2664  public:
2665  func_entry(context & c, Z3_func_entry e):object(c) { init(e); }
2666  func_entry(func_entry const & s):object(s) { init(s.m_entry); }
2667  ~func_entry() override { Z3_func_entry_dec_ref(ctx(), m_entry); }
2668  operator Z3_func_entry() const { return m_entry; }
2670  Z3_func_entry_inc_ref(s.ctx(), s.m_entry);
2671  Z3_func_entry_dec_ref(ctx(), m_entry);
2672  object::operator=(s);
2673  m_entry = s.m_entry;
2674  return *this;
2675  }
2676  expr value() const { Z3_ast r = Z3_func_entry_get_value(ctx(), m_entry); check_error(); return expr(ctx(), r); }
2677  unsigned num_args() const { unsigned r = Z3_func_entry_get_num_args(ctx(), m_entry); check_error(); return r; }
2678  expr arg(unsigned i) const { Z3_ast r = Z3_func_entry_get_arg(ctx(), m_entry, i); check_error(); return expr(ctx(), r); }
2679  };
2680 
2681  class func_interp : public object {
2682  Z3_func_interp m_interp;
2683  void init(Z3_func_interp e) {
2684  m_interp = e;
2685  Z3_func_interp_inc_ref(ctx(), m_interp);
2686  }
2687  public:
2688  func_interp(context & c, Z3_func_interp e):object(c) { init(e); }
2689  func_interp(func_interp const & s):object(s) { init(s.m_interp); }
2690  ~func_interp() override { Z3_func_interp_dec_ref(ctx(), m_interp); }
2691  operator Z3_func_interp() const { return m_interp; }
2693  Z3_func_interp_inc_ref(s.ctx(), s.m_interp);
2694  Z3_func_interp_dec_ref(ctx(), m_interp);
2695  object::operator=(s);
2696  m_interp = s.m_interp;
2697  return *this;
2698  }
2699  expr else_value() const { Z3_ast r = Z3_func_interp_get_else(ctx(), m_interp); check_error(); return expr(ctx(), r); }
2700  unsigned num_entries() const { unsigned r = Z3_func_interp_get_num_entries(ctx(), m_interp); check_error(); return r; }
2701  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); }
2702  void add_entry(expr_vector const& args, expr& value) {
2703  Z3_func_interp_add_entry(ctx(), m_interp, args, value);
2704  check_error();
2705  }
2706  void set_else(expr& value) {
2707  Z3_func_interp_set_else(ctx(), m_interp, value);
2708  check_error();
2709  }
2710  };
2711 
2712  class model : public object {
2713  Z3_model m_model;
2714  void init(Z3_model m) {
2715  m_model = m;
2716  Z3_model_inc_ref(ctx(), m);
2717  }
2718  public:
2719  struct translate {};
2720  model(context & c):object(c) { init(Z3_mk_model(c)); }
2721  model(context & c, Z3_model m):object(c) { init(m); }
2722  model(model const & s):object(s) { init(s.m_model); }
2723  model(model& src, context& dst, translate) : object(dst) { init(Z3_model_translate(src.ctx(), src, dst)); }
2724  ~model() override { Z3_model_dec_ref(ctx(), m_model); }
2725  operator Z3_model() const { return m_model; }
2726  model & operator=(model const & s) {
2727  Z3_model_inc_ref(s.ctx(), s.m_model);
2728  Z3_model_dec_ref(ctx(), m_model);
2729  object::operator=(s);
2730  m_model = s.m_model;
2731  return *this;
2732  }
2733 
2734  expr eval(expr const & n, bool model_completion=false) const {
2735  check_context(*this, n);
2736  Z3_ast r = 0;
2737  bool status = Z3_model_eval(ctx(), m_model, n, model_completion, &r);
2738  check_error();
2739  if (status == false && ctx().enable_exceptions())
2740  Z3_THROW(exception("failed to evaluate expression"));
2741  return expr(ctx(), r);
2742  }
2743 
2744  unsigned num_consts() const { return Z3_model_get_num_consts(ctx(), m_model); }
2745  unsigned num_funcs() const { return Z3_model_get_num_funcs(ctx(), m_model); }
2746  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); }
2747  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); }
2748  unsigned size() const { return num_consts() + num_funcs(); }
2749  func_decl operator[](int i) const {
2750  assert(0 <= i);
2751  return static_cast<unsigned>(i) < num_consts() ? get_const_decl(i) : get_func_decl(i - num_consts());
2752  }
2753 
2754  // returns interpretation of constant declaration c.
2755  // If c is not assigned any value in the model it returns
2756  // an expression with a null ast reference.
2758  check_context(*this, c);
2759  Z3_ast r = Z3_model_get_const_interp(ctx(), m_model, c);
2760  check_error();
2761  return expr(ctx(), r);
2762  }
2764  check_context(*this, f);
2765  Z3_func_interp r = Z3_model_get_func_interp(ctx(), m_model, f);
2766  check_error();
2767  return func_interp(ctx(), r);
2768  }
2769 
2770  // returns true iff the model contains an interpretation
2771  // for function f.
2772  bool has_interp(func_decl f) const {
2773  check_context(*this, f);
2774  return Z3_model_has_interp(ctx(), m_model, f);
2775  }
2776 
2778  Z3_func_interp r = Z3_add_func_interp(ctx(), m_model, f, else_val);
2779  check_error();
2780  return func_interp(ctx(), r);
2781  }
2782 
2783  void add_const_interp(func_decl& f, expr& value) {
2784  Z3_add_const_interp(ctx(), m_model, f, value);
2785  check_error();
2786  }
2787 
2788  unsigned num_sorts() const {
2789  unsigned r = Z3_model_get_num_sorts(ctx(), m_model);
2790  check_error();
2791  return r;
2792  }
2793 
2798  sort get_sort(unsigned i) const {
2799  Z3_sort s = Z3_model_get_sort(ctx(), m_model, i);
2800  check_error();
2801  return sort(ctx(), s);
2802  }
2803 
2804  expr_vector sort_universe(sort const& s) const {
2805  check_context(*this, s);
2806  Z3_ast_vector r = Z3_model_get_sort_universe(ctx(), m_model, s);
2807  check_error();
2808  return expr_vector(ctx(), r);
2809  }
2810 
2811  friend std::ostream & operator<<(std::ostream & out, model const & m);
2812 
2813  std::string to_string() const { return m_model ? std::string(Z3_model_to_string(ctx(), m_model)) : "null"; }
2814  };
2815  inline std::ostream & operator<<(std::ostream & out, model const & m) { return out << m.to_string(); }
2816 
2817  class stats : public object {
2818  Z3_stats m_stats;
2819  void init(Z3_stats e) {
2820  m_stats = e;
2821  Z3_stats_inc_ref(ctx(), m_stats);
2822  }
2823  public:
2824  stats(context & c):object(c), m_stats(0) {}
2825  stats(context & c, Z3_stats e):object(c) { init(e); }
2826  stats(stats const & s):object(s) { init(s.m_stats); }
2827  ~stats() override { if (m_stats) Z3_stats_dec_ref(ctx(), m_stats); }
2828  operator Z3_stats() const { return m_stats; }
2829  stats & operator=(stats const & s) {
2830  Z3_stats_inc_ref(s.ctx(), s.m_stats);
2831  if (m_stats) Z3_stats_dec_ref(ctx(), m_stats);
2832  object::operator=(s);
2833  m_stats = s.m_stats;
2834  return *this;
2835  }
2836  unsigned size() const { return Z3_stats_size(ctx(), m_stats); }
2837  std::string key(unsigned i) const { Z3_string s = Z3_stats_get_key(ctx(), m_stats, i); check_error(); return s; }
2838  bool is_uint(unsigned i) const { bool r = Z3_stats_is_uint(ctx(), m_stats, i); check_error(); return r; }
2839  bool is_double(unsigned i) const { bool r = Z3_stats_is_double(ctx(), m_stats, i); check_error(); return r; }
2840  unsigned uint_value(unsigned i) const { unsigned r = Z3_stats_get_uint_value(ctx(), m_stats, i); check_error(); return r; }
2841  double double_value(unsigned i) const { double r = Z3_stats_get_double_value(ctx(), m_stats, i); check_error(); return r; }
2842  friend std::ostream & operator<<(std::ostream & out, stats const & s);
2843  };
2844  inline std::ostream & operator<<(std::ostream & out, stats const & s) { out << Z3_stats_to_string(s.ctx(), s); return out; }
2845 
2846 
2847  inline std::ostream & operator<<(std::ostream & out, check_result r) {
2848  if (r == unsat) out << "unsat";
2849  else if (r == sat) out << "sat";
2850  else out << "unknown";
2851  return out;
2852  }
2853 
2864  class parameter {
2865  Z3_parameter_kind m_kind;
2866  func_decl m_decl;
2867  unsigned m_index;
2868  context& ctx() const { return m_decl.ctx(); }
2869  void check_error() const { ctx().check_error(); }
2870  public:
2871  parameter(func_decl const& d, unsigned idx) : m_decl(d), m_index(idx) {
2872  if (ctx().enable_exceptions() && idx >= d.num_parameters())
2873  Z3_THROW(exception("parameter index is out of bounds"));
2874  m_kind = Z3_get_decl_parameter_kind(ctx(), d, idx);
2875  }
2876  parameter(expr const& e, unsigned idx) : m_decl(e.decl()), m_index(idx) {
2877  if (ctx().enable_exceptions() && idx >= m_decl.num_parameters())
2878  Z3_THROW(exception("parameter index is out of bounds"));
2879  m_kind = Z3_get_decl_parameter_kind(ctx(), m_decl, idx);
2880  }
2881  Z3_parameter_kind kind() const { return m_kind; }
2882  expr get_expr() const { Z3_ast a = Z3_get_decl_ast_parameter(ctx(), m_decl, m_index); check_error(); return expr(ctx(), a); }
2883  sort get_sort() const { Z3_sort s = Z3_get_decl_sort_parameter(ctx(), m_decl, m_index); check_error(); return sort(ctx(), s); }
2884  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); }
2885  symbol get_symbol() const { Z3_symbol s = Z3_get_decl_symbol_parameter(ctx(), m_decl, m_index); check_error(); return symbol(ctx(), s); }
2886  std::string get_rational() const { Z3_string s = Z3_get_decl_rational_parameter(ctx(), m_decl, m_index); check_error(); return s; }
2887  double get_double() const { double d = Z3_get_decl_double_parameter(ctx(), m_decl, m_index); check_error(); return d; }
2888  int get_int() const { int i = Z3_get_decl_int_parameter(ctx(), m_decl, m_index); check_error(); return i; }
2889  };
2890 
2891 
2892  class solver : public object {
2893  Z3_solver m_solver;
2894  void init(Z3_solver s) {
2895  m_solver = s;
2896  if (s)
2897  Z3_solver_inc_ref(ctx(), s);
2898  }
2899  public:
2900  struct simple {};
2901  struct translate {};
2902  solver(context & c):object(c) { init(Z3_mk_solver(c)); check_error(); }
2904  solver(context & c, Z3_solver s):object(c) { init(s); }
2905  solver(context & c, char const * logic):object(c) { init(Z3_mk_solver_for_logic(c, c.str_symbol(logic))); check_error(); }
2906  solver(context & c, solver const& src, translate): object(c) { Z3_solver s = Z3_solver_translate(src.ctx(), src, c); check_error(); init(s); }
2907  solver(solver const & s):object(s) { init(s.m_solver); }
2908  solver(solver const& s, simplifier const& simp);
2909  ~solver() override { Z3_solver_dec_ref(ctx(), m_solver); }
2910  operator Z3_solver() const { return m_solver; }
2911  solver & operator=(solver const & s) {
2912  Z3_solver_inc_ref(s.ctx(), s.m_solver);
2913  Z3_solver_dec_ref(ctx(), m_solver);
2914  object::operator=(s);
2915  m_solver = s.m_solver;
2916  return *this;
2917  }
2918  void set(params const & p) { Z3_solver_set_params(ctx(), m_solver, p); check_error(); }
2919  void set(char const * k, bool v) { params p(ctx()); p.set(k, v); set(p); }
2920  void set(char const * k, unsigned v) { params p(ctx()); p.set(k, v); set(p); }
2921  void set(char const * k, double v) { params p(ctx()); p.set(k, v); set(p); }
2922  void set(char const * k, symbol const & v) { params p(ctx()); p.set(k, v); set(p); }
2923  void set(char const * k, char const* v) { params p(ctx()); p.set(k, v); set(p); }
2934  void push() { Z3_solver_push(ctx(), m_solver); check_error(); }
2935  void pop(unsigned n = 1) { Z3_solver_pop(ctx(), m_solver, n); check_error(); }
2936  void reset() { Z3_solver_reset(ctx(), m_solver); check_error(); }
2937  void add(expr const & e) { assert(e.is_bool()); Z3_solver_assert(ctx(), m_solver, e); check_error(); }
2938  void add(expr const & e, expr const & p) {
2939  assert(e.is_bool()); assert(p.is_bool()); assert(p.is_const());
2940  Z3_solver_assert_and_track(ctx(), m_solver, e, p);
2941  check_error();
2942  }
2943  void add(expr const & e, char const * p) {
2944  add(e, ctx().bool_const(p));
2945  }
2946  void add(expr_vector const& v) {
2947  check_context(*this, v);
2948  for (unsigned i = 0; i < v.size(); ++i)
2949  add(v[i]);
2950  }
2951  void from_file(char const* file) { Z3_solver_from_file(ctx(), m_solver, file); ctx().check_parser_error(); }
2952  void from_string(char const* s) { Z3_solver_from_string(ctx(), m_solver, s); ctx().check_parser_error(); }
2953 
2955  check_result check(unsigned n, expr * const assumptions) {
2956  array<Z3_ast> _assumptions(n);
2957  for (unsigned i = 0; i < n; ++i) {
2958  check_context(*this, assumptions[i]);
2959  _assumptions[i] = assumptions[i];
2960  }
2961  Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
2962  check_error();
2963  return to_check_result(r);
2964  }
2965  check_result check(expr_vector const& assumptions) {
2966  unsigned n = assumptions.size();
2967  array<Z3_ast> _assumptions(n);
2968  for (unsigned i = 0; i < n; ++i) {
2969  check_context(*this, assumptions[i]);
2970  _assumptions[i] = assumptions[i];
2971  }
2972  Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
2973  check_error();
2974  return to_check_result(r);
2975  }
2976  model get_model() const { Z3_model m = Z3_solver_get_model(ctx(), m_solver); check_error(); return model(ctx(), m); }
2977  check_result consequences(expr_vector& assumptions, expr_vector& vars, expr_vector& conseq) {
2978  Z3_lbool r = Z3_solver_get_consequences(ctx(), m_solver, assumptions, vars, conseq);
2979  check_error();
2980  return to_check_result(r);
2981  }
2982  std::string reason_unknown() const { Z3_string r = Z3_solver_get_reason_unknown(ctx(), m_solver); check_error(); return r; }
2983  stats statistics() const { Z3_stats r = Z3_solver_get_statistics(ctx(), m_solver); check_error(); return stats(ctx(), r); }
2984  expr_vector unsat_core() const { Z3_ast_vector r = Z3_solver_get_unsat_core(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2985  expr_vector assertions() const { Z3_ast_vector r = Z3_solver_get_assertions(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2986  expr_vector non_units() const { Z3_ast_vector r = Z3_solver_get_non_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2987  expr_vector units() const { Z3_ast_vector r = Z3_solver_get_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2988  expr_vector trail() const { Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2989  expr_vector trail(array<unsigned>& levels) const {
2990  Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver);
2991  check_error();
2992  expr_vector result(ctx(), r);
2993  unsigned sz = result.size();
2994  levels.resize(sz);
2995  Z3_solver_get_levels(ctx(), m_solver, r, sz, levels.ptr());
2996  check_error();
2997  return result;
2998  }
2999  expr congruence_root(expr const& t) const {
3000  check_context(*this, t);
3001  Z3_ast r = Z3_solver_congruence_root(ctx(), m_solver, t);
3002  check_error();
3003  return expr(ctx(), r);
3004  }
3005  expr congruence_next(expr const& t) const {
3006  check_context(*this, t);
3007  Z3_ast r = Z3_solver_congruence_next(ctx(), m_solver, t);
3008  check_error();
3009  return expr(ctx(), r);
3010  }
3011  expr congruence_explain(expr const& a, expr const& b) const {
3012  check_context(*this, a);
3013  check_context(*this, b);
3014  Z3_ast r = Z3_solver_congruence_explain(ctx(), m_solver, a, b);
3015  check_error();
3016  return expr(ctx(), r);
3017  }
3018  void set_initial_value(expr const& var, expr const& value) {
3019  Z3_solver_set_initial_value(ctx(), m_solver, var, value);
3020  check_error();
3021  }
3022  void set_initial_value(expr const& var, int i) {
3023  set_initial_value(var, ctx().num_val(i, var.get_sort()));
3024  }
3025  void set_initial_value(expr const& var, bool b) {
3026  set_initial_value(var, ctx().bool_val(b));
3027  }
3028 
3029  void solve_for(expr_vector const& vars, expr_vector& terms, expr_vector& guards) {
3030  // Create a copy of vars since the C API modifies the variables vector
3031  expr_vector variables(ctx());
3032  for (unsigned i = 0; i < vars.size(); ++i) {
3033  check_context(*this, vars[i]);
3034  variables.push_back(vars[i]);
3035  }
3036  // Clear output vectors before calling C API
3037  terms = expr_vector(ctx());
3038  guards = expr_vector(ctx());
3039  Z3_solver_solve_for(ctx(), m_solver, variables, terms, guards);
3040  check_error();
3041  }
3042 
3043  void import_model_converter(solver const& src) {
3044  check_context(*this, src);
3045  Z3_solver_import_model_converter(ctx(), src.m_solver, m_solver);
3046  check_error();
3047  }
3048 
3049  expr proof() const { Z3_ast r = Z3_solver_get_proof(ctx(), m_solver); check_error(); return expr(ctx(), r); }
3050  friend std::ostream & operator<<(std::ostream & out, solver const & s);
3051 
3052  std::string to_smt2(char const* status = "unknown") {
3053  array<Z3_ast> es(assertions());
3054  Z3_ast const* fmls = es.ptr();
3055  Z3_ast fml = 0;
3056  unsigned sz = es.size();
3057  if (sz > 0) {
3058  --sz;
3059  fml = fmls[sz];
3060  }
3061  else {
3062  fml = ctx().bool_val(true);
3063  }
3064  return std::string(Z3_benchmark_to_smtlib_string(
3065  ctx(),
3066  "", "", status, "",
3067  sz,
3068  fmls,
3069  fml));
3070  }
3071 
3072  std::string dimacs(bool include_names = true) const { return std::string(Z3_solver_to_dimacs_string(ctx(), m_solver, include_names)); }
3073 
3075 
3076 
3077  expr_vector cube(expr_vector& vars, unsigned cutoff) {
3078  Z3_ast_vector r = Z3_solver_cube(ctx(), m_solver, vars, cutoff);
3079  check_error();
3080  return expr_vector(ctx(), r);
3081  }
3082 
3084  solver& m_solver;
3085  unsigned& m_cutoff;
3086  expr_vector& m_vars;
3087  expr_vector m_cube;
3088  bool m_end;
3089  bool m_empty;
3090 
3091  void inc() {
3092  assert(!m_end && !m_empty);
3093  m_cube = m_solver.cube(m_vars, m_cutoff);
3094  m_cutoff = 0xFFFFFFFF;
3095  if (m_cube.size() == 1 && m_cube[0u].is_false()) {
3096  m_cube = z3::expr_vector(m_solver.ctx());
3097  m_end = true;
3098  }
3099  else if (m_cube.empty()) {
3100  m_empty = true;
3101  }
3102  }
3103  public:
3104  cube_iterator(solver& s, expr_vector& vars, unsigned& cutoff, bool end):
3105  m_solver(s),
3106  m_cutoff(cutoff),
3107  m_vars(vars),
3108  m_cube(s.ctx()),
3109  m_end(end),
3110  m_empty(false) {
3111  if (!m_end) {
3112  inc();
3113  }
3114  }
3115 
3117  assert(!m_end);
3118  if (m_empty) {
3119  m_end = true;
3120  }
3121  else {
3122  inc();
3123  }
3124  return *this;
3125  }
3126  cube_iterator operator++(int) { assert(false); return *this; }
3127  expr_vector const * operator->() const { return &(operator*()); }
3128  expr_vector const& operator*() const noexcept { return m_cube; }
3129 
3130  bool operator==(cube_iterator const& other) const noexcept {
3131  return other.m_end == m_end;
3132  };
3133  bool operator!=(cube_iterator const& other) const noexcept {
3134  return other.m_end != m_end;
3135  };
3136 
3137  };
3138 
3140  solver& m_solver;
3141  unsigned m_cutoff;
3142  expr_vector m_default_vars;
3143  expr_vector& m_vars;
3144  public:
3146  m_solver(s),
3147  m_cutoff(0xFFFFFFFF),
3148  m_default_vars(s.ctx()),
3149  m_vars(m_default_vars)
3150  {}
3151 
3152  cube_generator(solver& s, expr_vector& vars):
3153  m_solver(s),
3154  m_cutoff(0xFFFFFFFF),
3155  m_default_vars(s.ctx()),
3156  m_vars(vars)
3157  {}
3158 
3159  cube_iterator begin() { return cube_iterator(m_solver, m_vars, m_cutoff, false); }
3160  cube_iterator end() { return cube_iterator(m_solver, m_vars, m_cutoff, true); }
3161  void set_cutoff(unsigned c) noexcept { m_cutoff = c; }
3162  };
3163 
3164  cube_generator cubes() { return cube_generator(*this); }
3165  cube_generator cubes(expr_vector& vars) { return cube_generator(*this, vars); }
3166 
3167  };
3168  inline std::ostream & operator<<(std::ostream & out, solver const & s) { out << Z3_solver_to_string(s.ctx(), s); return out; }
3169 
3170  class goal : public object {
3171  Z3_goal m_goal;
3172  void init(Z3_goal s) {
3173  m_goal = s;
3174  Z3_goal_inc_ref(ctx(), s);
3175  }
3176  public:
3177  goal(context & c, bool models=true, bool unsat_cores=false, bool proofs=false):object(c) { init(Z3_mk_goal(c, models, unsat_cores, proofs)); }
3178  goal(context & c, Z3_goal s):object(c) { init(s); }
3179  goal(goal const & s):object(s) { init(s.m_goal); }
3180  ~goal() override { Z3_goal_dec_ref(ctx(), m_goal); }
3181  operator Z3_goal() const { return m_goal; }
3182  goal & operator=(goal const & s) {
3183  Z3_goal_inc_ref(s.ctx(), s.m_goal);
3184  Z3_goal_dec_ref(ctx(), m_goal);
3185  object::operator=(s);
3186  m_goal = s.m_goal;
3187  return *this;
3188  }
3189  void add(expr const & f) { check_context(*this, f); Z3_goal_assert(ctx(), m_goal, f); check_error(); }
3190  void add(expr_vector const& v) { check_context(*this, v); for (unsigned i = 0; i < v.size(); ++i) add(v[i]); }
3191  unsigned size() const { return Z3_goal_size(ctx(), m_goal); }
3192  expr operator[](int i) const { assert(0 <= i); Z3_ast r = Z3_goal_formula(ctx(), m_goal, i); check_error(); return expr(ctx(), r); }
3193  Z3_goal_prec precision() const { return Z3_goal_precision(ctx(), m_goal); }
3194  bool inconsistent() const { return Z3_goal_inconsistent(ctx(), m_goal); }
3195  unsigned depth() const { return Z3_goal_depth(ctx(), m_goal); }
3196  void reset() { Z3_goal_reset(ctx(), m_goal); }
3197  unsigned num_exprs() const { return Z3_goal_num_exprs(ctx(), m_goal); }
3198  bool is_decided_sat() const { return Z3_goal_is_decided_sat(ctx(), m_goal); }
3199  bool is_decided_unsat() const { return Z3_goal_is_decided_unsat(ctx(), m_goal); }
3200  model convert_model(model const & m) const {
3201  check_context(*this, m);
3202  Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, m);
3203  check_error();
3204  return model(ctx(), new_m);
3205  }
3206  model get_model() const {
3207  Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, 0);
3208  check_error();
3209  return model(ctx(), new_m);
3210  }
3211  expr as_expr() const {
3212  unsigned n = size();
3213  if (n == 0)
3214  return ctx().bool_val(true);
3215  else if (n == 1)
3216  return operator[](0u);
3217  else {
3218  array<Z3_ast> args(n);
3219  for (unsigned i = 0; i < n; ++i)
3220  args[i] = operator[](i);
3221  return expr(ctx(), Z3_mk_and(ctx(), n, args.ptr()));
3222  }
3223  }
3224  std::string dimacs(bool include_names = true) const { return std::string(Z3_goal_to_dimacs_string(ctx(), m_goal, include_names)); }
3225  friend std::ostream & operator<<(std::ostream & out, goal const & g);
3226  };
3227  inline std::ostream & operator<<(std::ostream & out, goal const & g) { out << Z3_goal_to_string(g.ctx(), g); return out; }
3228 
3229  class apply_result : public object {
3230  Z3_apply_result m_apply_result;
3231  void init(Z3_apply_result s) {
3232  m_apply_result = s;
3234  }
3235  public:
3236  apply_result(context & c, Z3_apply_result s):object(c) { init(s); }
3237  apply_result(apply_result const & s):object(s) { init(s.m_apply_result); }
3238  ~apply_result() override { Z3_apply_result_dec_ref(ctx(), m_apply_result); }
3239  operator Z3_apply_result() const { return m_apply_result; }
3241  Z3_apply_result_inc_ref(s.ctx(), s.m_apply_result);
3242  Z3_apply_result_dec_ref(ctx(), m_apply_result);
3243  object::operator=(s);
3244  m_apply_result = s.m_apply_result;
3245  return *this;
3246  }
3247  unsigned size() const { return Z3_apply_result_get_num_subgoals(ctx(), m_apply_result); }
3248  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); }
3249  friend std::ostream & operator<<(std::ostream & out, apply_result const & r);
3250  };
3251  inline std::ostream & operator<<(std::ostream & out, apply_result const & r) { out << Z3_apply_result_to_string(r.ctx(), r); return out; }
3252 
3253  class tactic : public object {
3254  Z3_tactic m_tactic;
3255  void init(Z3_tactic s) {
3256  m_tactic = s;
3257  Z3_tactic_inc_ref(ctx(), s);
3258  }
3259  public:
3260  tactic(context & c, char const * name):object(c) { Z3_tactic r = Z3_mk_tactic(c, name); check_error(); init(r); }
3261  tactic(context & c, Z3_tactic s):object(c) { init(s); }
3262  tactic(tactic const & s):object(s) { init(s.m_tactic); }
3263  ~tactic() override { Z3_tactic_dec_ref(ctx(), m_tactic); }
3264  operator Z3_tactic() const { return m_tactic; }
3265  tactic & operator=(tactic const & s) {
3266  Z3_tactic_inc_ref(s.ctx(), s.m_tactic);
3267  Z3_tactic_dec_ref(ctx(), m_tactic);
3268  object::operator=(s);
3269  m_tactic = s.m_tactic;
3270  return *this;
3271  }
3272  solver mk_solver() const { Z3_solver r = Z3_mk_solver_from_tactic(ctx(), m_tactic); check_error(); return solver(ctx(), r); }
3273  apply_result apply(goal const & g) const {
3274  check_context(*this, g);
3275  Z3_apply_result r = Z3_tactic_apply(ctx(), m_tactic, g);
3276  check_error();
3277  return apply_result(ctx(), r);
3278  }
3279  apply_result operator()(goal const & g) const {
3280  return apply(g);
3281  }
3282  std::string help() const { char const * r = Z3_tactic_get_help(ctx(), m_tactic); check_error(); return r; }
3283  friend tactic operator&(tactic const & t1, tactic const & t2);
3284  friend tactic operator|(tactic const & t1, tactic const & t2);
3285  friend tactic repeat(tactic const & t, unsigned max);
3286  friend tactic with(tactic const & t, params const & p);
3287  friend tactic try_for(tactic const & t, unsigned ms);
3288  friend tactic par_or(unsigned n, tactic const* tactics);
3289  friend tactic par_and_then(tactic const& t1, tactic const& t2);
3291  };
3292 
3293  inline tactic operator&(tactic const & t1, tactic const & t2) {
3294  check_context(t1, t2);
3295  Z3_tactic r = Z3_tactic_and_then(t1.ctx(), t1, t2);
3296  t1.check_error();
3297  return tactic(t1.ctx(), r);
3298  }
3299 
3300  inline tactic operator|(tactic const & t1, tactic const & t2) {
3301  check_context(t1, t2);
3302  Z3_tactic r = Z3_tactic_or_else(t1.ctx(), t1, t2);
3303  t1.check_error();
3304  return tactic(t1.ctx(), r);
3305  }
3306 
3307  inline tactic repeat(tactic const & t, unsigned max=UINT_MAX) {
3308  Z3_tactic r = Z3_tactic_repeat(t.ctx(), t, max);
3309  t.check_error();
3310  return tactic(t.ctx(), r);
3311  }
3312 
3313  inline tactic with(tactic const & t, params const & p) {
3314  Z3_tactic r = Z3_tactic_using_params(t.ctx(), t, p);
3315  t.check_error();
3316  return tactic(t.ctx(), r);
3317  }
3318  inline tactic try_for(tactic const & t, unsigned ms) {
3319  Z3_tactic r = Z3_tactic_try_for(t.ctx(), t, ms);
3320  t.check_error();
3321  return tactic(t.ctx(), r);
3322  }
3323  inline tactic par_or(unsigned n, tactic const* tactics) {
3324  if (n == 0) {
3325  Z3_THROW(exception("a non-zero number of tactics need to be passed to par_or"));
3326  }
3327  array<Z3_tactic> buffer(n);
3328  for (unsigned i = 0; i < n; ++i) buffer[i] = tactics[i];
3329  return tactic(tactics[0u].ctx(), Z3_tactic_par_or(tactics[0u].ctx(), n, buffer.ptr()));
3330  }
3331 
3332  inline tactic par_and_then(tactic const & t1, tactic const & t2) {
3333  check_context(t1, t2);
3334  Z3_tactic r = Z3_tactic_par_and_then(t1.ctx(), t1, t2);
3335  t1.check_error();
3336  return tactic(t1.ctx(), r);
3337  }
3338 
3339  class simplifier : public object {
3340  Z3_simplifier m_simplifier;
3341  void init(Z3_simplifier s) {
3342  m_simplifier = s;
3343  Z3_simplifier_inc_ref(ctx(), s);
3344  }
3345  public:
3346  simplifier(context & c, char const * name):object(c) { Z3_simplifier r = Z3_mk_simplifier(c, name); check_error(); init(r); }
3347  simplifier(context & c, Z3_simplifier s):object(c) { init(s); }
3348  simplifier(simplifier const & s):object(s) { init(s.m_simplifier); }
3349  ~simplifier() override { Z3_simplifier_dec_ref(ctx(), m_simplifier); }
3350  operator Z3_simplifier() const { return m_simplifier; }
3352  Z3_simplifier_inc_ref(s.ctx(), s.m_simplifier);
3353  Z3_simplifier_dec_ref(ctx(), m_simplifier);
3354  object::operator=(s);
3355  m_simplifier = s.m_simplifier;
3356  return *this;
3357  }
3358  std::string help() const { char const * r = Z3_simplifier_get_help(ctx(), m_simplifier); check_error(); return r; }
3359  friend simplifier operator&(simplifier const & t1, simplifier const & t2);
3360  friend simplifier with(simplifier const & t, params const & p);
3362  };
3363 
3364  inline solver::solver(solver const& s, simplifier const& simp):object(s) { init(Z3_solver_add_simplifier(s.ctx(), s, simp)); }
3365 
3366 
3367  inline simplifier operator&(simplifier const & t1, simplifier const & t2) {
3368  check_context(t1, t2);
3369  Z3_simplifier r = Z3_simplifier_and_then(t1.ctx(), t1, t2);
3370  t1.check_error();
3371  return simplifier(t1.ctx(), r);
3372  }
3373 
3374  inline simplifier with(simplifier const & t, params const & p) {
3375  Z3_simplifier r = Z3_simplifier_using_params(t.ctx(), t, p);
3376  t.check_error();
3377  return simplifier(t.ctx(), r);
3378  }
3379 
3380  class probe : public object {
3381  Z3_probe m_probe;
3382  void init(Z3_probe s) {
3383  m_probe = s;
3384  Z3_probe_inc_ref(ctx(), s);
3385  }
3386  public:
3387  probe(context & c, char const * name):object(c) { Z3_probe r = Z3_mk_probe(c, name); check_error(); init(r); }
3388  probe(context & c, double val):object(c) { Z3_probe r = Z3_probe_const(c, val); check_error(); init(r); }
3389  probe(context & c, Z3_probe s):object(c) { init(s); }
3390  probe(probe const & s):object(s) { init(s.m_probe); }
3391  ~probe() override { Z3_probe_dec_ref(ctx(), m_probe); }
3392  operator Z3_probe() const { return m_probe; }
3393  probe & operator=(probe const & s) {
3394  Z3_probe_inc_ref(s.ctx(), s.m_probe);
3395  Z3_probe_dec_ref(ctx(), m_probe);
3396  object::operator=(s);
3397  m_probe = s.m_probe;
3398  return *this;
3399  }
3400  double apply(goal const & g) const { double r = Z3_probe_apply(ctx(), m_probe, g); check_error(); return r; }
3401  double operator()(goal const & g) const { return apply(g); }
3402  friend probe operator<=(probe const & p1, probe const & p2);
3403  friend probe operator<=(probe const & p1, double p2);
3404  friend probe operator<=(double p1, probe const & p2);
3405  friend probe operator>=(probe const & p1, probe const & p2);
3406  friend probe operator>=(probe const & p1, double p2);
3407  friend probe operator>=(double p1, probe const & p2);
3408  friend probe operator<(probe const & p1, probe const & p2);
3409  friend probe operator<(probe const & p1, double p2);
3410  friend probe operator<(double p1, probe const & p2);
3411  friend probe operator>(probe const & p1, probe const & p2);
3412  friend probe operator>(probe const & p1, double p2);
3413  friend probe operator>(double p1, probe const & p2);
3414  friend probe operator==(probe const & p1, probe const & p2);
3415  friend probe operator==(probe const & p1, double p2);
3416  friend probe operator==(double p1, probe const & p2);
3417  friend probe operator&&(probe const & p1, probe const & p2);
3418  friend probe operator||(probe const & p1, probe const & p2);
3419  friend probe operator!(probe const & p);
3420  };
3421 
3422  inline probe operator<=(probe const & p1, probe const & p2) {
3423  check_context(p1, p2); Z3_probe r = Z3_probe_le(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3424  }
3425  inline probe operator<=(probe const & p1, double p2) { return p1 <= probe(p1.ctx(), p2); }
3426  inline probe operator<=(double p1, probe const & p2) { return probe(p2.ctx(), p1) <= p2; }
3427  inline probe operator>=(probe const & p1, probe const & p2) {
3428  check_context(p1, p2); Z3_probe r = Z3_probe_ge(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3429  }
3430  inline probe operator>=(probe const & p1, double p2) { return p1 >= probe(p1.ctx(), p2); }
3431  inline probe operator>=(double p1, probe const & p2) { return probe(p2.ctx(), p1) >= p2; }
3432  inline probe operator<(probe const & p1, probe const & p2) {
3433  check_context(p1, p2); Z3_probe r = Z3_probe_lt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3434  }
3435  inline probe operator<(probe const & p1, double p2) { return p1 < probe(p1.ctx(), p2); }
3436  inline probe operator<(double p1, probe const & p2) { return probe(p2.ctx(), p1) < p2; }
3437  inline probe operator>(probe const & p1, probe const & p2) {
3438  check_context(p1, p2); Z3_probe r = Z3_probe_gt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3439  }
3440  inline probe operator>(probe const & p1, double p2) { return p1 > probe(p1.ctx(), p2); }
3441  inline probe operator>(double p1, probe const & p2) { return probe(p2.ctx(), p1) > p2; }
3442  inline probe operator==(probe const & p1, probe const & p2) {
3443  check_context(p1, p2); Z3_probe r = Z3_probe_eq(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3444  }
3445  inline probe operator==(probe const & p1, double p2) { return p1 == probe(p1.ctx(), p2); }
3446  inline probe operator==(double p1, probe const & p2) { return probe(p2.ctx(), p1) == p2; }
3447  inline probe operator&&(probe const & p1, probe const & p2) {
3448  check_context(p1, p2); Z3_probe r = Z3_probe_and(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3449  }
3450  inline probe operator||(probe const & p1, probe const & p2) {
3451  check_context(p1, p2); Z3_probe r = Z3_probe_or(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3452  }
3453  inline probe operator!(probe const & p) {
3454  Z3_probe r = Z3_probe_not(p.ctx(), p); p.check_error(); return probe(p.ctx(), r);
3455  }
3456 
3457  class optimize : public object {
3458  Z3_optimize m_opt;
3459 
3460  public:
3461  struct translate {};
3462  class handle final {
3463  unsigned m_h;
3464  public:
3465  handle(unsigned h): m_h(h) {}
3466  unsigned h() const { return m_h; }
3467  };
3468  optimize(context& c):object(c) { m_opt = Z3_mk_optimize(c); Z3_optimize_inc_ref(c, m_opt); }
3469  optimize(context & c, optimize const& src, translate): object(c) {
3470  Z3_optimize o = Z3_optimize_translate(src.ctx(), src, c);
3471  check_error();
3472  m_opt = o;
3473  Z3_optimize_inc_ref(c, m_opt);
3474  }
3475  optimize(optimize const & o):object(o), m_opt(o.m_opt) {
3476  Z3_optimize_inc_ref(o.ctx(), o.m_opt);
3477  }
3479  m_opt = Z3_mk_optimize(c);
3480  Z3_optimize_inc_ref(c, m_opt);
3481  add(expr_vector(c, src.assertions()));
3482  expr_vector v(c, src.objectives());
3483  for (expr_vector::iterator it = v.begin(); it != v.end(); ++it) minimize(*it);
3484  }
3486  Z3_optimize_inc_ref(o.ctx(), o.m_opt);
3487  Z3_optimize_dec_ref(ctx(), m_opt);
3488  m_opt = o.m_opt;
3489  object::operator=(o);
3490  return *this;
3491  }
3492  ~optimize() override { Z3_optimize_dec_ref(ctx(), m_opt); }
3493  operator Z3_optimize() const { return m_opt; }
3494  void add(expr const& e) {
3495  assert(e.is_bool());
3496  Z3_optimize_assert(ctx(), m_opt, e);
3497  }
3498  void add(expr_vector const& es) {
3499  for (expr_vector::iterator it = es.begin(); it != es.end(); ++it) add(*it);
3500  }
3501  void add(expr const& e, expr const& t) {
3502  assert(e.is_bool());
3503  Z3_optimize_assert_and_track(ctx(), m_opt, e, t);
3504  }
3505  void add(expr const& e, char const* p) {
3506  assert(e.is_bool());
3507  add(e, ctx().bool_const(p));
3508  }
3509  handle add_soft(expr const& e, unsigned weight) {
3510  assert(e.is_bool());
3511  auto str = std::to_string(weight);
3512  return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, str.c_str(), 0));
3513  }
3514  handle add_soft(expr const& e, char const* weight) {
3515  assert(e.is_bool());
3516  return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, weight, 0));
3517  }
3518  handle add(expr const& e, unsigned weight) {
3519  return add_soft(e, weight);
3520  }
3521  void set_initial_value(expr const& var, expr const& value) {
3522  Z3_optimize_set_initial_value(ctx(), m_opt, var, value);
3523  check_error();
3524  }
3525  void set_initial_value(expr const& var, int i) {
3526  set_initial_value(var, ctx().num_val(i, var.get_sort()));
3527  }
3528  void set_initial_value(expr const& var, bool b) {
3529  set_initial_value(var, ctx().bool_val(b));
3530  }
3531 
3532  handle maximize(expr const& e) {
3533  return handle(Z3_optimize_maximize(ctx(), m_opt, e));
3534  }
3535  handle minimize(expr const& e) {
3536  return handle(Z3_optimize_minimize(ctx(), m_opt, e));
3537  }
3538  void push() {
3539  Z3_optimize_push(ctx(), m_opt);
3540  }
3541  void pop() {
3542  Z3_optimize_pop(ctx(), m_opt);
3543  }
3545  check_result check(expr_vector const& asms) {
3546  unsigned n = asms.size();
3547  array<Z3_ast> _asms(n);
3548  for (unsigned i = 0; i < n; ++i) {
3549  check_context(*this, asms[i]);
3550  _asms[i] = asms[i];
3551  }
3552  Z3_lbool r = Z3_optimize_check(ctx(), m_opt, n, _asms.ptr());
3553  check_error();
3554  return to_check_result(r);
3555  }
3556  model get_model() const { Z3_model m = Z3_optimize_get_model(ctx(), m_opt); check_error(); return model(ctx(), m); }
3557  expr_vector unsat_core() const { Z3_ast_vector r = Z3_optimize_get_unsat_core(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3558  void set(params const & p) { Z3_optimize_set_params(ctx(), m_opt, p); check_error(); }
3559  expr lower(handle const& h) {
3560  Z3_ast r = Z3_optimize_get_lower(ctx(), m_opt, h.h());
3561  check_error();
3562  return expr(ctx(), r);
3563  }
3564  expr upper(handle const& h) {
3565  Z3_ast r = Z3_optimize_get_upper(ctx(), m_opt, h.h());
3566  check_error();
3567  return expr(ctx(), r);
3568  }
3569  expr_vector assertions() const { Z3_ast_vector r = Z3_optimize_get_assertions(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3570  expr_vector objectives() const { Z3_ast_vector r = Z3_optimize_get_objectives(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3571  stats statistics() const { Z3_stats r = Z3_optimize_get_statistics(ctx(), m_opt); check_error(); return stats(ctx(), r); }
3572  friend std::ostream & operator<<(std::ostream & out, optimize const & s);
3573  void from_file(char const* filename) { Z3_optimize_from_file(ctx(), m_opt, filename); check_error(); }
3574  void from_string(char const* constraints) { Z3_optimize_from_string(ctx(), m_opt, constraints); check_error(); }
3575  std::string help() const { char const * r = Z3_optimize_get_help(ctx(), m_opt); check_error(); return r; }
3576  };
3577  inline std::ostream & operator<<(std::ostream & out, optimize const & s) { out << Z3_optimize_to_string(s.ctx(), s.m_opt); return out; }
3578 
3579  class fixedpoint : public object {
3580  Z3_fixedpoint m_fp;
3581  public:
3583  fixedpoint(fixedpoint const & o):object(o), m_fp(o.m_fp) { Z3_fixedpoint_inc_ref(ctx(), m_fp); }
3584  ~fixedpoint() override { Z3_fixedpoint_dec_ref(ctx(), m_fp); }
3586  Z3_fixedpoint_inc_ref(o.ctx(), o.m_fp);
3587  Z3_fixedpoint_dec_ref(ctx(), m_fp);
3588  m_fp = o.m_fp;
3589  object::operator=(o);
3590  return *this;
3591  }
3592  operator Z3_fixedpoint() const { return m_fp; }
3593  expr_vector from_string(char const* s) {
3594  Z3_ast_vector r = Z3_fixedpoint_from_string(ctx(), m_fp, s);
3595  check_error();
3596  return expr_vector(ctx(), r);
3597  }
3598  expr_vector from_file(char const* s) {
3599  Z3_ast_vector r = Z3_fixedpoint_from_file(ctx(), m_fp, s);
3600  check_error();
3601  return expr_vector(ctx(), r);
3602  }
3603  void add_rule(expr& rule, symbol const& name) { Z3_fixedpoint_add_rule(ctx(), m_fp, rule, name); check_error(); }
3604  void add_fact(func_decl& f, unsigned * args) { Z3_fixedpoint_add_fact(ctx(), m_fp, f, f.arity(), args); check_error(); }
3606  check_result query(func_decl_vector& relations) {
3607  array<Z3_func_decl> rs(relations);
3608  Z3_lbool r = Z3_fixedpoint_query_relations(ctx(), m_fp, rs.size(), rs.ptr());
3609  check_error();
3610  return to_check_result(r);
3611  }
3612  expr get_answer() { Z3_ast r = Z3_fixedpoint_get_answer(ctx(), m_fp); check_error(); return expr(ctx(), r); }
3613  std::string reason_unknown() { return Z3_fixedpoint_get_reason_unknown(ctx(), m_fp); }
3614  void update_rule(expr& rule, symbol const& name) { Z3_fixedpoint_update_rule(ctx(), m_fp, rule, name); check_error(); }
3615  unsigned get_num_levels(func_decl& p) { unsigned r = Z3_fixedpoint_get_num_levels(ctx(), m_fp, p); check_error(); return r; }
3616  expr get_cover_delta(int level, func_decl& p) {
3617  Z3_ast r = Z3_fixedpoint_get_cover_delta(ctx(), m_fp, level, p);
3618  check_error();
3619  return expr(ctx(), r);
3620  }
3621  void add_cover(int level, func_decl& p, expr& property) { Z3_fixedpoint_add_cover(ctx(), m_fp, level, p, property); check_error(); }
3622  stats statistics() const { Z3_stats r = Z3_fixedpoint_get_statistics(ctx(), m_fp); check_error(); return stats(ctx(), r); }
3624  expr_vector assertions() const { Z3_ast_vector r = Z3_fixedpoint_get_assertions(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
3625  expr_vector rules() const { Z3_ast_vector r = Z3_fixedpoint_get_rules(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
3626  void set(params const & p) { Z3_fixedpoint_set_params(ctx(), m_fp, p); check_error(); }
3627  std::string help() const { return Z3_fixedpoint_get_help(ctx(), m_fp); }
3629  std::string to_string() { return Z3_fixedpoint_to_string(ctx(), m_fp, 0, 0); }
3630  std::string to_string(expr_vector const& queries) {
3631  array<Z3_ast> qs(queries);
3632  return Z3_fixedpoint_to_string(ctx(), m_fp, qs.size(), qs.ptr());
3633  }
3634  };
3635  inline std::ostream & operator<<(std::ostream & out, fixedpoint const & f) { return out << Z3_fixedpoint_to_string(f.ctx(), f, 0, 0); }
3636 
3637  inline tactic fail_if(probe const & p) {
3638  Z3_tactic r = Z3_tactic_fail_if(p.ctx(), p);
3639  p.check_error();
3640  return tactic(p.ctx(), r);
3641  }
3642  inline tactic when(probe const & p, tactic const & t) {
3643  check_context(p, t);
3644  Z3_tactic r = Z3_tactic_when(t.ctx(), p, t);
3645  t.check_error();
3646  return tactic(t.ctx(), r);
3647  }
3648  inline tactic cond(probe const & p, tactic const & t1, tactic const & t2) {
3649  check_context(p, t1); check_context(p, t2);
3650  Z3_tactic r = Z3_tactic_cond(t1.ctx(), p, t1, t2);
3651  t1.check_error();
3652  return tactic(t1.ctx(), r);
3653  }
3654 
3655  inline symbol context::str_symbol(char const * s) { Z3_symbol r = Z3_mk_string_symbol(m_ctx, s); check_error(); return symbol(*this, r); }
3656  inline symbol context::int_symbol(int n) { Z3_symbol r = Z3_mk_int_symbol(m_ctx, n); check_error(); return symbol(*this, r); }
3657 
3658  inline sort context::bool_sort() { Z3_sort s = Z3_mk_bool_sort(m_ctx); check_error(); return sort(*this, s); }
3659  inline sort context::int_sort() { Z3_sort s = Z3_mk_int_sort(m_ctx); check_error(); return sort(*this, s); }
3660  inline sort context::real_sort() { Z3_sort s = Z3_mk_real_sort(m_ctx); check_error(); return sort(*this, s); }
3661  inline sort context::bv_sort(unsigned sz) { Z3_sort s = Z3_mk_bv_sort(m_ctx, sz); check_error(); return sort(*this, s); }
3662  inline sort context::string_sort() { Z3_sort s = Z3_mk_string_sort(m_ctx); check_error(); return sort(*this, s); }
3663  inline sort context::char_sort() { Z3_sort s = Z3_mk_char_sort(m_ctx); check_error(); return sort(*this, s); }
3664  inline sort context::seq_sort(sort& s) { Z3_sort r = Z3_mk_seq_sort(m_ctx, s); check_error(); return sort(*this, r); }
3665  inline sort context::re_sort(sort& s) { Z3_sort r = Z3_mk_re_sort(m_ctx, s); check_error(); return sort(*this, r); }
3666  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); }
3667 
3668  template<>
3669  inline sort context::fpa_sort<16>() { return fpa_sort(5, 11); }
3670 
3671  template<>
3672  inline sort context::fpa_sort<32>() { return fpa_sort(8, 24); }
3673 
3674  template<>
3675  inline sort context::fpa_sort<64>() { return fpa_sort(11, 53); }
3676 
3677  template<>
3678  inline sort context::fpa_sort<128>() { return fpa_sort(15, 113); }
3679 
3680  inline sort context::fpa_rounding_mode_sort() { Z3_sort r = Z3_mk_fpa_rounding_mode_sort(m_ctx); check_error(); return sort(*this, r); }
3681 
3682  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); }
3683  inline sort context::array_sort(sort_vector const& d, sort r) {
3684  array<Z3_sort> dom(d);
3685  Z3_sort s = Z3_mk_array_sort_n(m_ctx, dom.size(), dom.ptr(), r); check_error(); return sort(*this, s);
3686  }
3687  inline sort context::enumeration_sort(char const * name, unsigned n, char const * const * enum_names, func_decl_vector & cs, func_decl_vector & ts) {
3688  array<Z3_symbol> _enum_names(n);
3689  for (unsigned i = 0; i < n; ++i) { _enum_names[i] = Z3_mk_string_symbol(*this, enum_names[i]); }
3690  array<Z3_func_decl> _cs(n);
3691  array<Z3_func_decl> _ts(n);
3692  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3693  sort s = to_sort(*this, Z3_mk_enumeration_sort(*this, _name, n, _enum_names.ptr(), _cs.ptr(), _ts.ptr()));
3694  check_error();
3695  for (unsigned i = 0; i < n; ++i) { cs.push_back(func_decl(*this, _cs[i])); ts.push_back(func_decl(*this, _ts[i])); }
3696  return s;
3697  }
3698  inline func_decl context::tuple_sort(char const * name, unsigned n, char const * const * names, sort const* sorts, func_decl_vector & projs) {
3699  array<Z3_symbol> _names(n);
3700  array<Z3_sort> _sorts(n);
3701  for (unsigned i = 0; i < n; ++i) { _names[i] = Z3_mk_string_symbol(*this, names[i]); _sorts[i] = sorts[i]; }
3702  array<Z3_func_decl> _projs(n);
3703  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3704  Z3_func_decl tuple;
3705  sort _ignore_s = to_sort(*this, Z3_mk_tuple_sort(*this, _name, n, _names.ptr(), _sorts.ptr(), &tuple, _projs.ptr()));
3706  check_error();
3707  for (unsigned i = 0; i < n; ++i) { projs.push_back(func_decl(*this, _projs[i])); }
3708  return func_decl(*this, tuple);
3709  }
3710 
3712  context& ctx;
3713  Z3_constructor_list clist;
3714  public:
3715  constructor_list(constructors const& cs);
3717  operator Z3_constructor_list() const { return clist; }
3718  };
3719 
3721  friend class constructor_list;
3722  context& ctx;
3723  std::vector<Z3_constructor> cons;
3724  std::vector<unsigned> num_fields;
3725  public:
3726  constructors(context& ctx): ctx(ctx) {}
3727 
3729  for (auto con : cons)
3730  Z3_del_constructor(ctx, con);
3731  }
3732 
3733  void add(symbol const& name, symbol const& rec, unsigned n, symbol const* names, sort const* fields) {
3734  array<unsigned> sort_refs(n);
3735  array<Z3_sort> sorts(n);
3736  array<Z3_symbol> _names(n);
3737  for (unsigned i = 0; i < n; ++i) sorts[i] = fields[i], _names[i] = names[i];
3738  cons.push_back(Z3_mk_constructor(ctx, name, rec, n, _names.ptr(), sorts.ptr(), sort_refs.ptr()));
3739  num_fields.push_back(n);
3740  }
3741 
3742  Z3_constructor operator[](unsigned i) const { return cons[i]; }
3743 
3744  unsigned size() const { return (unsigned)cons.size(); }
3745 
3746  void query(unsigned i, func_decl& constructor, func_decl& test, func_decl_vector& accs) {
3747  Z3_func_decl _constructor;
3748  Z3_func_decl _test;
3749  array<Z3_func_decl> accessors(num_fields[i]);
3750  accs.resize(0);
3752  cons[i],
3753  num_fields[i],
3754  &_constructor,
3755  &_test,
3756  accessors.ptr());
3757  constructor = func_decl(ctx, _constructor);
3758 
3759  test = func_decl(ctx, _test);
3760  for (unsigned j = 0; j < num_fields[i]; ++j)
3761  accs.push_back(func_decl(ctx, accessors[j]));
3762  }
3763  };
3764 
3765  inline constructor_list::constructor_list(constructors const& cs): ctx(cs.ctx) {
3766  array<Z3_constructor> cons(cs.size());
3767  for (unsigned i = 0; i < cs.size(); ++i)
3768  cons[i] = cs[i];
3769  clist = Z3_mk_constructor_list(ctx, cs.size(), cons.ptr());
3770  }
3771 
3772  inline sort context::datatype(symbol const& name, constructors const& cs) {
3773  array<Z3_constructor> _cs(cs.size());
3774  for (unsigned i = 0; i < cs.size(); ++i) _cs[i] = cs[i];
3775  Z3_sort s = Z3_mk_datatype(*this, name, cs.size(), _cs.ptr());
3776  check_error();
3777  return sort(*this, s);
3778  }
3779 
3780  inline sort context::datatype(symbol const &name, sort_vector const& params, constructors const &cs) {
3781  array<Z3_sort> _params(params);
3782  array<Z3_constructor> _cs(cs.size());
3783  for (unsigned i = 0; i < cs.size(); ++i)
3784  _cs[i] = cs[i];
3785  Z3_sort s = Z3_mk_polymorphic_datatype(*this, name, _params.size(), _params.ptr(), cs.size(), _cs.ptr());
3786  check_error();
3787  return sort(*this, s);
3788  }
3789 
3790  inline sort_vector context::datatypes(
3791  unsigned n, symbol const* names,
3792  constructor_list *const* cons) {
3793  sort_vector result(*this);
3794  array<Z3_symbol> _names(n);
3795  array<Z3_sort> _sorts(n);
3796  array<Z3_constructor_list> _cons(n);
3797  for (unsigned i = 0; i < n; ++i)
3798  _names[i] = names[i], _cons[i] = *cons[i];
3799  Z3_mk_datatypes(*this, n, _names.ptr(), _sorts.ptr(), _cons.ptr());
3800  for (unsigned i = 0; i < n; ++i)
3801  result.push_back(sort(*this, _sorts[i]));
3802  return result;
3803  }
3804 
3805 
3806  inline sort context::datatype_sort(symbol const& name) {
3807  Z3_sort s = Z3_mk_datatype_sort(*this, name, 0, nullptr);
3808  check_error();
3809  return sort(*this, s);
3810  }
3811 
3812  inline sort context::datatype_sort(symbol const& name, sort_vector const& params) {
3813  array<Z3_sort> _params(params);
3814  Z3_sort s = Z3_mk_datatype_sort(*this, name, _params.size(), _params.ptr());
3815  check_error();
3816  return sort(*this, s);
3817  }
3818 
3819 
3820  inline sort context::uninterpreted_sort(char const* name) {
3821  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3822  return to_sort(*this, Z3_mk_uninterpreted_sort(*this, _name));
3823  }
3825  return to_sort(*this, Z3_mk_uninterpreted_sort(*this, name));
3826  }
3827 
3828  inline func_decl context::function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3829  array<Z3_sort> args(arity);
3830  for (unsigned i = 0; i < arity; ++i) {
3831  check_context(domain[i], range);
3832  args[i] = domain[i];
3833  }
3834  Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, arity, args.ptr(), range);
3835  check_error();
3836  return func_decl(*this, f);
3837  }
3838 
3839  inline func_decl context::function(char const * name, unsigned arity, sort const * domain, sort const & range) {
3840  return function(range.ctx().str_symbol(name), arity, domain, range);
3841  }
3842 
3843  inline func_decl context::function(symbol const& name, sort_vector const& domain, sort const& range) {
3844  array<Z3_sort> args(domain.size());
3845  for (unsigned i = 0; i < domain.size(); ++i) {
3846  check_context(domain[i], range);
3847  args[i] = domain[i];
3848  }
3849  Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, domain.size(), args.ptr(), range);
3850  check_error();
3851  return func_decl(*this, f);
3852  }
3853 
3854  inline func_decl context::function(char const * name, sort_vector const& domain, sort const& range) {
3855  return function(range.ctx().str_symbol(name), domain, range);
3856  }
3857 
3858 
3859  inline func_decl context::function(char const * name, sort const & domain, sort const & range) {
3860  check_context(domain, range);
3861  Z3_sort args[1] = { domain };
3862  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 1, args, range);
3863  check_error();
3864  return func_decl(*this, f);
3865  }
3866 
3867  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & range) {
3868  check_context(d1, range); check_context(d2, range);
3869  Z3_sort args[2] = { d1, d2 };
3870  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 2, args, range);
3871  check_error();
3872  return func_decl(*this, f);
3873  }
3874 
3875  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
3876  check_context(d1, range); check_context(d2, range); check_context(d3, range);
3877  Z3_sort args[3] = { d1, d2, d3 };
3878  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 3, args, range);
3879  check_error();
3880  return func_decl(*this, f);
3881  }
3882 
3883  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
3884  check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range);
3885  Z3_sort args[4] = { d1, d2, d3, d4 };
3886  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 4, args, range);
3887  check_error();
3888  return func_decl(*this, f);
3889  }
3890 
3891  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) {
3892  check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range); check_context(d5, range);
3893  Z3_sort args[5] = { d1, d2, d3, d4, d5 };
3894  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 5, args, range);
3895  check_error();
3896  return func_decl(*this, f);
3897  }
3898 
3899  inline func_decl context::recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3900  array<Z3_sort> args(arity);
3901  for (unsigned i = 0; i < arity; ++i) {
3902  check_context(domain[i], range);
3903  args[i] = domain[i];
3904  }
3905  Z3_func_decl f = Z3_mk_rec_func_decl(m_ctx, name, arity, args.ptr(), range);
3906  check_error();
3907  return func_decl(*this, f);
3908 
3909  }
3910 
3911  inline func_decl context::recfun(symbol const & name, sort_vector const& domain, sort const & range) {
3912  check_context(domain, range);
3913  array<Z3_sort> domain1(domain);
3914  Z3_func_decl f = Z3_mk_rec_func_decl(m_ctx, name, domain1.size(), domain1.ptr(), range);
3915  check_error();
3916  return func_decl(*this, f);
3917  }
3918 
3919  inline func_decl context::recfun(char const * name, sort_vector const& domain, sort const & range) {
3920  return recfun(str_symbol(name), domain, range);
3921 
3922  }
3923 
3924  inline func_decl context::recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
3925  return recfun(str_symbol(name), arity, domain, range);
3926  }
3927 
3928  inline func_decl context::recfun(char const * name, sort const& d1, sort const & range) {
3929  return recfun(str_symbol(name), 1, &d1, range);
3930  }
3931 
3932  inline func_decl context::recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
3933  sort dom[2] = { d1, d2 };
3934  return recfun(str_symbol(name), 2, dom, range);
3935  }
3936 
3937  inline void context::recdef(func_decl f, expr_vector const& args, expr const& body) {
3938  check_context(f, args); check_context(f, body);
3939  array<Z3_ast> vars(args);
3940  Z3_add_rec_def(f.ctx(), f, vars.size(), vars.ptr(), body);
3941  }
3942 
3943  inline func_decl context::user_propagate_function(symbol const& name, sort_vector const& domain, sort const& range) {
3944  check_context(domain, range);
3945  array<Z3_sort> domain1(domain);
3946  Z3_func_decl f = Z3_solver_propagate_declare(range.ctx(), name, domain1.size(), domain1.ptr(), range);
3947  check_error();
3948  return func_decl(*this, f);
3949  }
3950 
3951  inline expr context::constant(symbol const & name, sort const & s) {
3952  Z3_ast r = Z3_mk_const(m_ctx, name, s);
3953  check_error();
3954  return expr(*this, r);
3955  }
3956  inline expr context::constant(char const * name, sort const & s) { return constant(str_symbol(name), s); }
3957  inline expr context::variable(unsigned idx, sort const& s) {
3958  Z3_ast r = Z3_mk_bound(m_ctx, idx, s);
3959  check_error();
3960  return expr(*this, r);
3961  }
3962  inline expr context::bool_const(char const * name) { return constant(name, bool_sort()); }
3963  inline expr context::int_const(char const * name) { return constant(name, int_sort()); }
3964  inline expr context::real_const(char const * name) { return constant(name, real_sort()); }
3965  inline expr context::string_const(char const * name) { return constant(name, string_sort()); }
3966  inline expr context::bv_const(char const * name, unsigned sz) { return constant(name, bv_sort(sz)); }
3967  inline expr context::fpa_const(char const * name, unsigned ebits, unsigned sbits) { return constant(name, fpa_sort(ebits, sbits)); }
3968 
3969  template<size_t precision>
3970  inline expr context::fpa_const(char const * name) { return constant(name, fpa_sort<precision>()); }
3971 
3972  inline void context::set_rounding_mode(rounding_mode rm) { m_rounding_mode = rm; }
3973 
3975  switch (m_rounding_mode) {
3976  case RNA: return expr(*this, Z3_mk_fpa_rna(m_ctx));
3977  case RNE: return expr(*this, Z3_mk_fpa_rne(m_ctx));
3978  case RTP: return expr(*this, Z3_mk_fpa_rtp(m_ctx));
3979  case RTN: return expr(*this, Z3_mk_fpa_rtn(m_ctx));
3980  case RTZ: return expr(*this, Z3_mk_fpa_rtz(m_ctx));
3981  default: return expr(*this);
3982  }
3983  }
3984 
3985  inline expr context::bool_val(bool b) { return b ? expr(*this, Z3_mk_true(m_ctx)) : expr(*this, Z3_mk_false(m_ctx)); }
3986 
3987  inline expr context::int_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, int_sort()); check_error(); return expr(*this, r); }
3988  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); }
3989  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); }
3990  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); }
3991  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); }
3992 
3993  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); }
3994  inline expr context::real_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, real_sort()); check_error(); return expr(*this, r); }
3995  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); }
3996  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); }
3997  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); }
3998  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); }
3999 
4000  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); }
4001  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); }
4002  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); }
4003  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); }
4004  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); }
4005  inline expr context::bv_val(unsigned n, bool const* bits) {
4006  array<bool> _bits(n);
4007  for (unsigned i = 0; i < n; ++i) _bits[i] = bits[i] ? 1 : 0;
4008  Z3_ast r = Z3_mk_bv_numeral(m_ctx, n, _bits.ptr()); check_error(); return expr(*this, r);
4009  }
4010 
4011  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); }
4012  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); }
4013  inline expr context::fpa_nan(sort const & s) { Z3_ast r = Z3_mk_fpa_nan(m_ctx, s); check_error(); return expr(*this, r); }
4014  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); }
4015 
4016  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); }
4017  inline expr context::string_val(char const* s) { Z3_ast r = Z3_mk_string(m_ctx, s); check_error(); return expr(*this, r); }
4018  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); }
4019  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); }
4020 
4021  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); }
4022 
4023  inline expr func_decl::operator()(unsigned n, expr const * args) const {
4024  array<Z3_ast> _args(n);
4025  for (unsigned i = 0; i < n; ++i) {
4026  check_context(*this, args[i]);
4027  _args[i] = args[i];
4028  }
4029  Z3_ast r = Z3_mk_app(ctx(), *this, n, _args.ptr());
4030  check_error();
4031  return expr(ctx(), r);
4032 
4033  }
4034  inline expr func_decl::operator()(expr_vector const& args) const {
4035  array<Z3_ast> _args(args.size());
4036  for (unsigned i = 0; i < args.size(); ++i) {
4037  check_context(*this, args[i]);
4038  _args[i] = args[i];
4039  }
4040  Z3_ast r = Z3_mk_app(ctx(), *this, args.size(), _args.ptr());
4041  check_error();
4042  return expr(ctx(), r);
4043  }
4044  inline expr func_decl::operator()() const {
4045  Z3_ast r = Z3_mk_app(ctx(), *this, 0, 0);
4046  ctx().check_error();
4047  return expr(ctx(), r);
4048  }
4049  inline expr func_decl::operator()(expr const & a) const {
4050  check_context(*this, a);
4051  Z3_ast args[1] = { a };
4052  Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
4053  ctx().check_error();
4054  return expr(ctx(), r);
4055  }
4056  inline expr func_decl::operator()(int a) const {
4057  Z3_ast args[1] = { ctx().num_val(a, domain(0)) };
4058  Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
4059  ctx().check_error();
4060  return expr(ctx(), r);
4061  }
4062  inline expr func_decl::operator()(expr const & a1, expr const & a2) const {
4063  check_context(*this, a1); check_context(*this, a2);
4064  Z3_ast args[2] = { a1, a2 };
4065  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4066  ctx().check_error();
4067  return expr(ctx(), r);
4068  }
4069  inline expr func_decl::operator()(expr const & a1, int a2) const {
4070  check_context(*this, a1);
4071  Z3_ast args[2] = { a1, ctx().num_val(a2, domain(1)) };
4072  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4073  ctx().check_error();
4074  return expr(ctx(), r);
4075  }
4076  inline expr func_decl::operator()(int a1, expr const & a2) const {
4077  check_context(*this, a2);
4078  Z3_ast args[2] = { ctx().num_val(a1, domain(0)), a2 };
4079  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
4080  ctx().check_error();
4081  return expr(ctx(), r);
4082  }
4083  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3) const {
4084  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3);
4085  Z3_ast args[3] = { a1, a2, a3 };
4086  Z3_ast r = Z3_mk_app(ctx(), *this, 3, args);
4087  ctx().check_error();
4088  return expr(ctx(), r);
4089  }
4090  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const {
4091  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4);
4092  Z3_ast args[4] = { a1, a2, a3, a4 };
4093  Z3_ast r = Z3_mk_app(ctx(), *this, 4, args);
4094  ctx().check_error();
4095  return expr(ctx(), r);
4096  }
4097  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const {
4098  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4); check_context(*this, a5);
4099  Z3_ast args[5] = { a1, a2, a3, a4, a5 };
4100  Z3_ast r = Z3_mk_app(ctx(), *this, 5, args);
4101  ctx().check_error();
4102  return expr(ctx(), r);
4103  }
4104 
4105  inline expr to_real(expr const & a) { Z3_ast r = Z3_mk_int2real(a.ctx(), a); a.check_error(); return expr(a.ctx(), r); }
4106 
4107  inline func_decl function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
4108  return range.ctx().function(name, arity, domain, range);
4109  }
4110  inline func_decl function(char const * name, unsigned arity, sort const * domain, sort const & range) {
4111  return range.ctx().function(name, arity, domain, range);
4112  }
4113  inline func_decl function(char const * name, sort const & domain, sort const & range) {
4114  return range.ctx().function(name, domain, range);
4115  }
4116  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & range) {
4117  return range.ctx().function(name, d1, d2, range);
4118  }
4119  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
4120  return range.ctx().function(name, d1, d2, d3, range);
4121  }
4122  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
4123  return range.ctx().function(name, d1, d2, d3, d4, range);
4124  }
4125  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) {
4126  return range.ctx().function(name, d1, d2, d3, d4, d5, range);
4127  }
4128  inline func_decl function(char const* name, sort_vector const& domain, sort const& range) {
4129  return range.ctx().function(name, domain, range);
4130  }
4131  inline func_decl function(std::string const& name, sort_vector const& domain, sort const& range) {
4132  return range.ctx().function(name.c_str(), domain, range);
4133  }
4134 
4135  inline func_decl recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
4136  return range.ctx().recfun(name, arity, domain, range);
4137  }
4138  inline func_decl recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
4139  return range.ctx().recfun(name, arity, domain, range);
4140  }
4141  inline func_decl recfun(char const * name, sort const& d1, sort const & range) {
4142  return range.ctx().recfun(name, d1, range);
4143  }
4144  inline func_decl recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
4145  return range.ctx().recfun(name, d1, d2, range);
4146  }
4147 
4148  inline expr select(expr const & a, expr const & i) {
4149  check_context(a, i);
4150  Z3_ast r = Z3_mk_select(a.ctx(), a, i);
4151  a.check_error();
4152  return expr(a.ctx(), r);
4153  }
4154  inline expr select(expr const & a, int i) {
4155  return select(a, a.ctx().num_val(i, a.get_sort().array_domain()));
4156  }
4157  inline expr select(expr const & a, expr_vector const & i) {
4158  check_context(a, i);
4159  array<Z3_ast> idxs(i);
4160  Z3_ast r = Z3_mk_select_n(a.ctx(), a, idxs.size(), idxs.ptr());
4161  a.check_error();
4162  return expr(a.ctx(), r);
4163  }
4164 
4165  inline expr store(expr const & a, expr const & i, expr const & v) {
4166  check_context(a, i); check_context(a, v);
4167  Z3_ast r = Z3_mk_store(a.ctx(), a, i, v);
4168  a.check_error();
4169  return expr(a.ctx(), r);
4170  }
4171 
4172  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); }
4173  inline expr store(expr const & a, expr i, int v) { return store(a, i, a.ctx().num_val(v, a.get_sort().array_range())); }
4174  inline expr store(expr const & a, int i, int v) {
4175  return store(a, a.ctx().num_val(i, a.get_sort().array_domain()), a.ctx().num_val(v, a.get_sort().array_range()));
4176  }
4177  inline expr store(expr const & a, expr_vector const & i, expr const & v) {
4178  check_context(a, i); check_context(a, v);
4179  array<Z3_ast> idxs(i);
4180  Z3_ast r = Z3_mk_store_n(a.ctx(), a, idxs.size(), idxs.ptr(), v);
4181  a.check_error();
4182  return expr(a.ctx(), r);
4183  }
4184 
4185  inline expr as_array(func_decl & f) {
4186  Z3_ast r = Z3_mk_as_array(f.ctx(), f);
4187  f.check_error();
4188  return expr(f.ctx(), r);
4189  }
4190 
4191  inline expr array_default(expr const & a) {
4192  Z3_ast r = Z3_mk_array_default(a.ctx(), a);
4193  a.check_error();
4194  return expr(a.ctx(), r);
4195  }
4196 
4197  inline expr array_ext(expr const & a, expr const & b) {
4198  check_context(a, b);
4199  Z3_ast r = Z3_mk_array_ext(a.ctx(), a, b);
4200  a.check_error();
4201  return expr(a.ctx(), r);
4202  }
4203 
4204 #define MK_EXPR1(_fn, _arg) \
4205  Z3_ast r = _fn(_arg.ctx(), _arg); \
4206  _arg.check_error(); \
4207  return expr(_arg.ctx(), r);
4208 
4209 #define MK_EXPR2(_fn, _arg1, _arg2) \
4210  check_context(_arg1, _arg2); \
4211  Z3_ast r = _fn(_arg1.ctx(), _arg1, _arg2); \
4212  _arg1.check_error(); \
4213  return expr(_arg1.ctx(), r);
4214 
4215  inline expr const_array(sort const & d, expr const & v) {
4216  MK_EXPR2(Z3_mk_const_array, d, v);
4217  }
4218 
4219  inline expr empty_set(sort const& s) {
4221  }
4222 
4223  inline expr full_set(sort const& s) {
4225  }
4226 
4227  inline expr set_add(expr const& s, expr const& e) {
4228  MK_EXPR2(Z3_mk_set_add, s, e);
4229  }
4230 
4231  inline expr set_del(expr const& s, expr const& e) {
4232  MK_EXPR2(Z3_mk_set_del, s, e);
4233  }
4234 
4235  inline expr set_union(expr const& a, expr const& b) {
4236  check_context(a, b);
4237  Z3_ast es[2] = { a, b };
4238  Z3_ast r = Z3_mk_set_union(a.ctx(), 2, es);
4239  a.check_error();
4240  return expr(a.ctx(), r);
4241  }
4242 
4243  inline expr set_intersect(expr const& a, expr const& b) {
4244  check_context(a, b);
4245  Z3_ast es[2] = { a, b };
4246  Z3_ast r = Z3_mk_set_intersect(a.ctx(), 2, es);
4247  a.check_error();
4248  return expr(a.ctx(), r);
4249  }
4250 
4251  inline expr set_difference(expr const& a, expr const& b) {
4253  }
4254 
4255  inline expr set_complement(expr const& a) {
4257  }
4258 
4259  inline expr set_member(expr const& s, expr const& e) {
4260  MK_EXPR2(Z3_mk_set_member, s, e);
4261  }
4262 
4263  inline expr set_subset(expr const& a, expr const& b) {
4264  MK_EXPR2(Z3_mk_set_subset, a, b);
4265  }
4266 
4267  // sequence and regular expression operations.
4268  // union is +
4269  // concat is overloaded to handle sequences and regular expressions
4270 
4271  inline expr empty(sort const& s) {
4272  Z3_ast r = Z3_mk_seq_empty(s.ctx(), s);
4273  s.check_error();
4274  return expr(s.ctx(), r);
4275  }
4276  inline expr suffixof(expr const& a, expr const& b) {
4277  check_context(a, b);
4278  Z3_ast r = Z3_mk_seq_suffix(a.ctx(), a, b);
4279  a.check_error();
4280  return expr(a.ctx(), r);
4281  }
4282  inline expr prefixof(expr const& a, expr const& b) {
4283  check_context(a, b);
4284  Z3_ast r = Z3_mk_seq_prefix(a.ctx(), a, b);
4285  a.check_error();
4286  return expr(a.ctx(), r);
4287  }
4288  inline expr indexof(expr const& s, expr const& substr, expr const& offset) {
4289  check_context(s, substr); check_context(s, offset);
4290  Z3_ast r = Z3_mk_seq_index(s.ctx(), s, substr, offset);
4291  s.check_error();
4292  return expr(s.ctx(), r);
4293  }
4294  inline expr last_indexof(expr const& s, expr const& substr) {
4295  check_context(s, substr);
4296  Z3_ast r = Z3_mk_seq_last_index(s.ctx(), s, substr);
4297  s.check_error();
4298  return expr(s.ctx(), r);
4299  }
4300  inline expr to_re(expr const& s) {
4302  }
4303  inline expr in_re(expr const& s, expr const& re) {
4304  MK_EXPR2(Z3_mk_seq_in_re, s, re);
4305  }
4306  inline expr plus(expr const& re) {
4307  MK_EXPR1(Z3_mk_re_plus, re);
4308  }
4309  inline expr option(expr const& re) {
4311  }
4312  inline expr star(expr const& re) {
4313  MK_EXPR1(Z3_mk_re_star, re);
4314  }
4315  inline expr re_empty(sort const& s) {
4316  Z3_ast r = Z3_mk_re_empty(s.ctx(), s);
4317  s.check_error();
4318  return expr(s.ctx(), r);
4319  }
4320  inline expr re_full(sort const& s) {
4321  Z3_ast r = Z3_mk_re_full(s.ctx(), s);
4322  s.check_error();
4323  return expr(s.ctx(), r);
4324  }
4325  inline expr re_intersect(expr_vector const& args) {
4326  assert(args.size() > 0);
4327  context& ctx = args[0u].ctx();
4328  array<Z3_ast> _args(args);
4329  Z3_ast r = Z3_mk_re_intersect(ctx, _args.size(), _args.ptr());
4330  ctx.check_error();
4331  return expr(ctx, r);
4332  }
4333  inline expr re_diff(expr const& a, expr const& b) {
4334  check_context(a, b);
4335  context& ctx = a.ctx();
4336  Z3_ast r = Z3_mk_re_diff(ctx, a, b);
4337  ctx.check_error();
4338  return expr(ctx, r);
4339  }
4340  inline expr re_complement(expr const& a) {
4342  }
4343  inline expr range(expr const& lo, expr const& hi) {
4344  check_context(lo, hi);
4345  Z3_ast r = Z3_mk_re_range(lo.ctx(), lo, hi);
4346  lo.check_error();
4347  return expr(lo.ctx(), r);
4348  }
4349 
4350 
4351 
4352 
4353 
4354  inline expr_vector context::parse_string(char const* s) {
4355  Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, 0, 0, 0, 0, 0, 0);
4356  check_error();
4357  return expr_vector(*this, r);
4358 
4359  }
4360  inline expr_vector context::parse_file(char const* s) {
4361  Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, 0, 0, 0, 0, 0, 0);
4362  check_error();
4363  return expr_vector(*this, r);
4364  }
4365 
4366  inline expr_vector context::parse_string(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
4367  array<Z3_symbol> sort_names(sorts.size());
4368  array<Z3_symbol> decl_names(decls.size());
4369  array<Z3_sort> sorts1(sorts);
4370  array<Z3_func_decl> decls1(decls);
4371  for (unsigned i = 0; i < sorts.size(); ++i) {
4372  sort_names[i] = sorts[i].name();
4373  }
4374  for (unsigned i = 0; i < decls.size(); ++i) {
4375  decl_names[i] = decls[i].name();
4376  }
4377 
4378  Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
4379  check_error();
4380  return expr_vector(*this, r);
4381  }
4382 
4383  inline expr_vector context::parse_file(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
4384  array<Z3_symbol> sort_names(sorts.size());
4385  array<Z3_symbol> decl_names(decls.size());
4386  array<Z3_sort> sorts1(sorts);
4387  array<Z3_func_decl> decls1(decls);
4388  for (unsigned i = 0; i < sorts.size(); ++i) {
4389  sort_names[i] = sorts[i].name();
4390  }
4391  for (unsigned i = 0; i < decls.size(); ++i) {
4392  decl_names[i] = decls[i].name();
4393  }
4394  Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
4395  check_error();
4396  return expr_vector(*this, r);
4397  }
4398 
4399  inline func_decl_vector sort::constructors() {
4400  assert(is_datatype());
4401  func_decl_vector cs(ctx());
4402  unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), *this);
4403  for (unsigned i = 0; i < n; ++i)
4405  return cs;
4406  }
4407 
4408  inline func_decl_vector sort::recognizers() {
4409  assert(is_datatype());
4410  func_decl_vector rs(ctx());
4411  unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), *this);
4412  for (unsigned i = 0; i < n; ++i)
4414  return rs;
4415  }
4416 
4417  inline func_decl_vector func_decl::accessors() {
4418  sort s = range();
4419  assert(s.is_datatype());
4420  unsigned n = Z3_get_datatype_sort_num_constructors(ctx(), s);
4421  unsigned idx = 0;
4422  for (; idx < n; ++idx) {
4424  if (id() == f.id())
4425  break;
4426  }
4427  assert(idx < n);
4428  n = arity();
4429  func_decl_vector as(ctx());
4430  for (unsigned i = 0; i < n; ++i)
4432  return as;
4433  }
4434 
4435 
4436  inline expr expr::substitute(expr_vector const& src, expr_vector const& dst) {
4437  assert(src.size() == dst.size());
4438  array<Z3_ast> _src(src.size());
4439  array<Z3_ast> _dst(dst.size());
4440  for (unsigned i = 0; i < src.size(); ++i) {
4441  _src[i] = src[i];
4442  _dst[i] = dst[i];
4443  }
4444  Z3_ast r = Z3_substitute(ctx(), m_ast, src.size(), _src.ptr(), _dst.ptr());
4445  check_error();
4446  return expr(ctx(), r);
4447  }
4448 
4449  inline expr expr::substitute(expr_vector const& dst) {
4450  array<Z3_ast> _dst(dst.size());
4451  for (unsigned i = 0; i < dst.size(); ++i) {
4452  _dst[i] = dst[i];
4453  }
4454  Z3_ast r = Z3_substitute_vars(ctx(), m_ast, dst.size(), _dst.ptr());
4455  check_error();
4456  return expr(ctx(), r);
4457  }
4458 
4459  inline expr expr::substitute(func_decl_vector const& funs, expr_vector const& dst) {
4460  array<Z3_ast> _dst(dst.size());
4461  array<Z3_func_decl> _funs(funs.size());
4462  if (dst.size() != funs.size()) {
4463  Z3_THROW(exception("length of argument lists don't align"));
4464  return expr(ctx(), nullptr);
4465  }
4466  for (unsigned i = 0; i < dst.size(); ++i) {
4467  _dst[i] = dst[i];
4468  _funs[i] = funs[i];
4469  }
4470  Z3_ast r = Z3_substitute_funs(ctx(), m_ast, dst.size(), _funs.ptr(), _dst.ptr());
4471  check_error();
4472  return expr(ctx(), r);
4473  }
4474 
4475  inline expr expr::update(expr_vector const& args) const {
4476  array<Z3_ast> _args(args.size());
4477  for (unsigned i = 0; i < args.size(); ++i) {
4478  _args[i] = args[i];
4479  }
4480  Z3_ast r = Z3_update_term(ctx(), m_ast, args.size(), _args.ptr());
4481  check_error();
4482  return expr(ctx(), r);
4483  }
4484 
4485  inline expr expr::update_field(func_decl const& field_access, expr const& new_value) const {
4486  assert(is_datatype());
4487  Z3_ast r = Z3_datatype_update_field(ctx(), field_access, m_ast, new_value);
4488  check_error();
4489  return expr(ctx(), r);
4490  }
4491 
4492  typedef std::function<void(expr const& proof, std::vector<unsigned> const& deps, expr_vector const& clause)> on_clause_eh_t;
4493 
4494  class on_clause {
4495  context& c;
4496  on_clause_eh_t m_on_clause;
4497 
4498  static void _on_clause_eh(void* _ctx, Z3_ast _proof, unsigned n, unsigned const* dep, Z3_ast_vector _literals) {
4499  on_clause* ctx = static_cast<on_clause*>(_ctx);
4500  expr_vector lits(ctx->c, _literals);
4501  expr proof(ctx->c, _proof);
4502  std::vector<unsigned> deps;
4503  for (unsigned i = 0; i < n; ++i)
4504  deps.push_back(dep[i]);
4505  ctx->m_on_clause(proof, deps, lits);
4506  }
4507  public:
4509  m_on_clause = on_clause_eh;
4510  Z3_solver_register_on_clause(c, s, this, _on_clause_eh);
4511  c.check_error();
4512  }
4513  };
4514 
4516 
4517  typedef std::function<void(expr const&, expr const&)> fixed_eh_t;
4518  typedef std::function<void(void)> final_eh_t;
4519  typedef std::function<void(expr const&, expr const&)> eq_eh_t;
4520  typedef std::function<void(expr const&)> created_eh_t;
4521  typedef std::function<void(expr, unsigned, bool)> decide_eh_t;
4522  typedef std::function<bool(expr const&, expr const&)> on_binding_eh_t;
4523 
4524  final_eh_t m_final_eh;
4525  eq_eh_t m_eq_eh;
4526  fixed_eh_t m_fixed_eh;
4527  created_eh_t m_created_eh;
4528  decide_eh_t m_decide_eh;
4529  on_binding_eh_t m_on_binding_eh;
4530  solver* s;
4531  context* c;
4532  std::vector<z3::context*> subcontexts;
4533 
4534  unsigned m_callbackNesting = 0;
4535  Z3_solver_callback cb { nullptr };
4536 
4537  struct scoped_cb {
4539  scoped_cb(void* _p, Z3_solver_callback cb):p(*static_cast<user_propagator_base*>(_p)) {
4540  p.cb = cb;
4541  p.m_callbackNesting++;
4542  }
4543  ~scoped_cb() {
4544  if (--p.m_callbackNesting == 0)
4545  p.cb = nullptr;
4546  }
4547  };
4548 
4549  static void push_eh(void* _p, Z3_solver_callback cb) {
4550  user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4551  scoped_cb _cb(p, cb);
4552  static_cast<user_propagator_base*>(p)->push();
4553  }
4554 
4555  static void pop_eh(void* _p, Z3_solver_callback cb, unsigned num_scopes) {
4556  user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4557  scoped_cb _cb(p, cb);
4558  static_cast<user_propagator_base*>(_p)->pop(num_scopes);
4559  }
4560 
4561  static void* fresh_eh(void* _p, Z3_context ctx) {
4562  user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4563  context* c = new context(ctx);
4564  p->subcontexts.push_back(c);
4565  return p->fresh(*c);
4566  }
4567 
4568  static void fixed_eh(void* _p, Z3_solver_callback cb, Z3_ast _var, Z3_ast _value) {
4569  user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4570  scoped_cb _cb(p, cb);
4571  expr value(p->ctx(), _value);
4572  expr var(p->ctx(), _var);
4573  p->m_fixed_eh(var, value);
4574  }
4575 
4576  static void eq_eh(void* _p, Z3_solver_callback cb, Z3_ast _x, Z3_ast _y) {
4577  user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4578  scoped_cb _cb(p, cb);
4579  expr x(p->ctx(), _x), y(p->ctx(), _y);
4580  p->m_eq_eh(x, y);
4581  }
4582 
4583  static void final_eh(void* p, Z3_solver_callback cb) {
4584  scoped_cb _cb(p, cb);
4585  static_cast<user_propagator_base*>(p)->m_final_eh();
4586  }
4587 
4588  static void created_eh(void* _p, Z3_solver_callback cb, Z3_ast _e) {
4589  user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4590  scoped_cb _cb(p, cb);
4591  expr e(p->ctx(), _e);
4592  p->m_created_eh(e);
4593  }
4594 
4595  static void decide_eh(void* _p, Z3_solver_callback cb, Z3_ast _val, unsigned bit, bool is_pos) {
4596  user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4597  scoped_cb _cb(p, cb);
4598  expr val(p->ctx(), _val);
4599  p->m_decide_eh(val, bit, is_pos);
4600  }
4601 
4602  static bool on_binding_eh(void* _p, Z3_solver_callback cb, Z3_ast _q, Z3_ast _inst) {
4603  user_propagator_base* p = static_cast<user_propagator_base*>(_p);
4604  scoped_cb _cb(p, cb);
4605  expr q(p->ctx(), _q), inst(p->ctx(), _inst);
4606  return p->m_on_binding_eh(q, inst);
4607  }
4608 
4609  public:
4610  user_propagator_base(context& c) : s(nullptr), c(&c) {}
4611 
4612  user_propagator_base(solver* s): s(s), c(nullptr) {
4613  Z3_solver_propagate_init(ctx(), *s, this, push_eh, pop_eh, fresh_eh);
4614  }
4615 
4616  virtual void push() = 0;
4617  virtual void pop(unsigned num_scopes) = 0;
4618 
4620  for (auto& subcontext : subcontexts) {
4621  subcontext->detach(); // detach first; the subcontexts will be freed internally!
4622  delete subcontext;
4623  }
4624  }
4625 
4627  return c ? *c : s->ctx();
4628  }
4629 
4638  virtual user_propagator_base* fresh(context& ctx) = 0;
4639 
4646  void register_fixed(fixed_eh_t& f) {
4647  m_fixed_eh = f;
4648  if (s) {
4649  Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4650  }
4651  }
4652 
4654  m_fixed_eh = [this](expr const &id, expr const &e) {
4655  fixed(id, e);
4656  };
4657  if (s) {
4658  Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4659  }
4660  }
4661 
4662  void register_eq(eq_eh_t& f) {
4663  m_eq_eh = f;
4664  if (s) {
4665  Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4666  }
4667  }
4668 
4669  void register_eq() {
4670  m_eq_eh = [this](expr const& x, expr const& y) {
4671  eq(x, y);
4672  };
4673  if (s) {
4674  Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4675  }
4676  }
4677 
4686  void register_final(final_eh_t& f) {
4687  m_final_eh = f;
4688  if (s) {
4689  Z3_solver_propagate_final(ctx(), *s, final_eh);
4690  }
4691  }
4692 
4694  m_final_eh = [this]() {
4695  final();
4696  };
4697  if (s) {
4698  Z3_solver_propagate_final(ctx(), *s, final_eh);
4699  }
4700  }
4701 
4702  void register_created(created_eh_t& c) {
4703  m_created_eh = c;
4704  if (s) {
4705  Z3_solver_propagate_created(ctx(), *s, created_eh);
4706  }
4707  }
4708 
4710  m_created_eh = [this](expr const& e) {
4711  created(e);
4712  };
4713  if (s) {
4714  Z3_solver_propagate_created(ctx(), *s, created_eh);
4715  }
4716  }
4717 
4718  void register_decide(decide_eh_t& c) {
4719  m_decide_eh = c;
4720  if (s) {
4721  Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4722  }
4723  }
4724 
4726  m_decide_eh = [this](expr val, unsigned bit, bool is_pos) {
4727  decide(val, bit, is_pos);
4728  };
4729  if (s) {
4730  Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4731  }
4732  }
4733 
4735  m_on_binding_eh = [this](expr const& q, expr const& inst) {
4736  return on_binding(q, inst);
4737  };
4738  if (s)
4739  Z3_solver_propagate_on_binding(ctx(), *s, on_binding_eh);
4740  }
4741 
4742  virtual void fixed(expr const& /*id*/, expr const& /*e*/) { }
4743 
4744  virtual void eq(expr const& /*x*/, expr const& /*y*/) { }
4745 
4746  virtual void final() { }
4747 
4748  virtual void created(expr const& /*e*/) {}
4749 
4750  virtual void decide(expr const& /*val*/, unsigned /*bit*/, bool /*is_pos*/) {}
4751 
4752  virtual bool on_binding(expr const& /*q*/, expr const& /*inst*/) { return true; }
4753 
4754  bool next_split(expr const& e, unsigned idx, Z3_lbool phase) {
4755  assert(cb);
4756  return Z3_solver_next_split(ctx(), cb, e, idx, phase);
4757  }
4758 
4773  void add(expr const& e) {
4774  if (cb)
4776  else if (s)
4778  else
4779  assert(false);
4780  }
4781 
4782  void conflict(expr_vector const& fixed) {
4783  assert(cb);
4784  expr conseq = ctx().bool_val(false);
4785  array<Z3_ast> _fixed(fixed);
4786  Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
4787  }
4788 
4789  void conflict(expr_vector const& fixed, expr_vector const& lhs, expr_vector const& rhs) {
4790  assert(cb);
4791  assert(lhs.size() == rhs.size());
4792  expr conseq = ctx().bool_val(false);
4793  array<Z3_ast> _fixed(fixed);
4794  array<Z3_ast> _lhs(lhs);
4795  array<Z3_ast> _rhs(rhs);
4796  Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
4797  }
4798 
4799  bool propagate(expr_vector const& fixed, expr const& conseq) {
4800  assert(cb);
4801  assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
4802  array<Z3_ast> _fixed(fixed);
4803  return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
4804  }
4805 
4806  bool propagate(expr_vector const& fixed,
4807  expr_vector const& lhs, expr_vector const& rhs,
4808  expr const& conseq) {
4809  assert(cb);
4810  assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
4811  assert(lhs.size() == rhs.size());
4812  array<Z3_ast> _fixed(fixed);
4813  array<Z3_ast> _lhs(lhs);
4814  array<Z3_ast> _rhs(rhs);
4815 
4816  return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
4817  }
4818  };
4819 
4829  class rcf_num {
4830  Z3_context m_ctx;
4831  Z3_rcf_num m_num;
4832 
4833  void check_context(rcf_num const& other) const {
4834  if (m_ctx != other.m_ctx) {
4835  throw exception("rcf_num objects from different contexts");
4836  }
4837  }
4838 
4839  public:
4840  rcf_num(context& c, Z3_rcf_num n): m_ctx(c), m_num(n) {}
4841 
4842  rcf_num(context& c, int val): m_ctx(c) {
4843  m_num = Z3_rcf_mk_small_int(c, val);
4844  }
4845 
4846  rcf_num(context& c, char const* val): m_ctx(c) {
4847  m_num = Z3_rcf_mk_rational(c, val);
4848  }
4849 
4850  rcf_num(rcf_num const& other): m_ctx(other.m_ctx) {
4851  // Create a copy by converting to string and back
4852  std::string str = Z3_rcf_num_to_string(m_ctx, other.m_num, false, false);
4853  m_num = Z3_rcf_mk_rational(m_ctx, str.c_str());
4854  }
4855 
4856  rcf_num& operator=(rcf_num const& other) {
4857  if (this != &other) {
4858  Z3_rcf_del(m_ctx, m_num);
4859  m_ctx = other.m_ctx;
4860  std::string str = Z3_rcf_num_to_string(m_ctx, other.m_num, false, false);
4861  m_num = Z3_rcf_mk_rational(m_ctx, str.c_str());
4862  }
4863  return *this;
4864  }
4865 
4867  Z3_rcf_del(m_ctx, m_num);
4868  }
4869 
4870  operator Z3_rcf_num() const { return m_num; }
4871  Z3_context ctx() const { return m_ctx; }
4872 
4876  std::string to_string(bool compact = false) const {
4877  return std::string(Z3_rcf_num_to_string(m_ctx, m_num, compact, false));
4878  }
4879 
4883  std::string to_decimal(unsigned precision = 10) const {
4884  return std::string(Z3_rcf_num_to_decimal_string(m_ctx, m_num, precision));
4885  }
4886 
4887  // Arithmetic operations
4888  rcf_num operator+(rcf_num const& other) const {
4889  check_context(other);
4890  return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
4891  Z3_rcf_add(m_ctx, m_num, other.m_num));
4892  }
4893 
4894  rcf_num operator-(rcf_num const& other) const {
4895  check_context(other);
4896  return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
4897  Z3_rcf_sub(m_ctx, m_num, other.m_num));
4898  }
4899 
4900  rcf_num operator*(rcf_num const& other) const {
4901  check_context(other);
4902  return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
4903  Z3_rcf_mul(m_ctx, m_num, other.m_num));
4904  }
4905 
4906  rcf_num operator/(rcf_num const& other) const {
4907  check_context(other);
4908  return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
4909  Z3_rcf_div(m_ctx, m_num, other.m_num));
4910  }
4911 
4912  rcf_num operator-() const {
4913  return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
4914  Z3_rcf_neg(m_ctx, m_num));
4915  }
4916 
4920  rcf_num power(unsigned k) const {
4921  return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
4922  Z3_rcf_power(m_ctx, m_num, k));
4923  }
4924 
4928  rcf_num inv() const {
4929  return rcf_num(*const_cast<context*>(reinterpret_cast<context const*>(&m_ctx)),
4930  Z3_rcf_inv(m_ctx, m_num));
4931  }
4932 
4933  // Comparison operations
4934  bool operator<(rcf_num const& other) const {
4935  check_context(other);
4936  return Z3_rcf_lt(m_ctx, m_num, other.m_num);
4937  }
4938 
4939  bool operator>(rcf_num const& other) const {
4940  check_context(other);
4941  return Z3_rcf_gt(m_ctx, m_num, other.m_num);
4942  }
4943 
4944  bool operator<=(rcf_num const& other) const {
4945  check_context(other);
4946  return Z3_rcf_le(m_ctx, m_num, other.m_num);
4947  }
4948 
4949  bool operator>=(rcf_num const& other) const {
4950  check_context(other);
4951  return Z3_rcf_ge(m_ctx, m_num, other.m_num);
4952  }
4953 
4954  bool operator==(rcf_num const& other) const {
4955  check_context(other);
4956  return Z3_rcf_eq(m_ctx, m_num, other.m_num);
4957  }
4958 
4959  bool operator!=(rcf_num const& other) const {
4960  check_context(other);
4961  return Z3_rcf_neq(m_ctx, m_num, other.m_num);
4962  }
4963 
4964  // Type queries
4965  bool is_rational() const {
4966  return Z3_rcf_is_rational(m_ctx, m_num);
4967  }
4968 
4969  bool is_algebraic() const {
4970  return Z3_rcf_is_algebraic(m_ctx, m_num);
4971  }
4972 
4973  bool is_infinitesimal() const {
4974  return Z3_rcf_is_infinitesimal(m_ctx, m_num);
4975  }
4976 
4977  bool is_transcendental() const {
4978  return Z3_rcf_is_transcendental(m_ctx, m_num);
4979  }
4980 
4981  friend std::ostream& operator<<(std::ostream& out, rcf_num const& n) {
4982  return out << n.to_string();
4983  }
4984  };
4985 
4989  inline rcf_num rcf_pi(context& c) {
4990  return rcf_num(c, Z3_rcf_mk_pi(c));
4991  }
4992 
4996  inline rcf_num rcf_e(context& c) {
4997  return rcf_num(c, Z3_rcf_mk_e(c));
4998  }
4999 
5004  return rcf_num(c, Z3_rcf_mk_infinitesimal(c));
5005  }
5006 
5013  inline std::vector<rcf_num> rcf_roots(context& c, std::vector<rcf_num> const& coeffs) {
5014  if (coeffs.empty()) {
5015  throw exception("polynomial coefficients cannot be empty");
5016  }
5017 
5018  unsigned n = static_cast<unsigned>(coeffs.size());
5019  std::vector<Z3_rcf_num> a(n);
5020  std::vector<Z3_rcf_num> roots(n);
5021 
5022  for (unsigned i = 0; i < n; ++i) {
5023  a[i] = coeffs[i];
5024  }
5025 
5026  unsigned num_roots = Z3_rcf_mk_roots(c, n, a.data(), roots.data());
5027 
5028  std::vector<rcf_num> result;
5029  result.reserve(num_roots);
5030  for (unsigned i = 0; i < num_roots; ++i) {
5031  result.push_back(rcf_num(c, roots[i]));
5032  }
5033 
5034  return result;
5035  }
5036 
5037 }
5038 
5041 #undef Z3_THROW
5042 
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.
cube_generator cubes(expr_vector &vars)
Definition: z3++.h:3165
ast_vector_tpl(context &c)
Definition: z3++.h:657
void Z3_API Z3_solver_push(Z3_context c, Z3_solver s)
Create a backtracking point.
expr distinct(expr_vector const &args)
Definition: z3++.h:2555
expr mod(expr const &a, expr const &b)
Definition: z3++.h:1728
friend expr mk_or(expr_vector const &args)
Definition: z3++.h:2636
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_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...
expr bvadd_no_overflow(expr const &a, expr const &b, bool is_signed)
bit-vector overflow/underflow checks
Definition: z3++.h:2334
void Z3_API Z3_rcf_del(Z3_context c, Z3_rcf_num a)
Delete a RCF numeral created using the RCF API.
Z3_ast Z3_API Z3_mk_re_loop(Z3_context c, Z3_ast r, unsigned lo, unsigned hi)
Create a regular expression loop. The supplied regular expression r is repeated between lo and hi tim...
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...
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_fpa_fma(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2, Z3_ast t3)
Floating-point fused multiply-add.
void Z3_API Z3_stats_inc_ref(Z3_context c, Z3_stats s)
Increment the reference counter of the given statistics object.
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:2384
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_true(Z3_context c)
Create an AST node representing true.
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_fixedpoint Z3_API Z3_mk_fixedpoint(Z3_context c)
Create a new fixedpoint context.
user_propagator_base(solver *s)
Definition: z3++.h:4612
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...
Z3_sort_kind
The different kinds of Z3 types (See Z3_get_sort_kind).
Definition: z3_api.h:109
bool is_numeral_u(unsigned &i) const
Definition: z3++.h:951
Z3_sort Z3_API Z3_mk_bv_sort(Z3_context c, unsigned sz)
Create a bit-vector type of the given size.
friend expr operator|(expr const &a, expr const &b)
Definition: z3++.h:2031
Z3_ast Z3_API Z3_mk_bvnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nor.
void register_final(final_eh_t &f)
register a callback on final-check. During the final check stage, all propagations have been processe...
Definition: z3++.h:4686
void Z3_API Z3_global_param_set(Z3_string param_id, Z3_string param_value)
Set a global (or module) parameter. This setting is shared by all Z3 contexts.
std::string reason_unknown() const
Definition: z3++.h:2982
std::string help() const
Definition: z3++.h:3282
sort bool_sort()
Return the Boolean sort.
Definition: z3++.h:3658
void Z3_API Z3_solver_set_params(Z3_context c, Z3_solver s, Z3_params p)
Set the given solver using the given parameters.
friend expr atmost(expr_vector const &es, unsigned bound)
Definition: z3++.h:2530
void check_parser_error() const
Definition: z3++.h:248
handle add_soft(expr const &e, char const *weight)
Definition: z3++.h:3514
context(context &&other) noexcept
Definition: z3++.h:218
friend expr operator+(expr const &a, expr const &b)
Definition: z3++.h:1816
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.
expr variable(unsigned index, sort const &s)
create a de-Bruijn variable.
Definition: z3++.h:3957
void add_const_interp(func_decl &f, expr &value)
Definition: z3++.h:2783
expr mk_and(expr_vector const &args)
Definition: z3++.h:2642
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.
friend expr pw(expr const &a, expr const &b)
Definition: z3++.h:1724
double as_double() const
Definition: z3++.h:957
bool is_numeral_i64(int64_t &i) const
Definition: z3++.h:948
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: ...
void set_initial_value(expr const &var, expr const &value)
Definition: z3++.h:3521
unsigned Z3_API Z3_get_string_length(Z3_context c, Z3_ast s)
Retrieve the length of the unescaped string constant stored in s.
bool as_binary(std::string &s) const
Definition: z3++.h:955
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.
bool Z3_API Z3_get_numeral_uint(Z3_context c, Z3_ast v, unsigned *u)
Similar to Z3_get_numeral_string, but only succeeds if the value can fit in a machine unsigned int...
Z3_ast Z3_API Z3_mk_fpa_rtz(Z3_context c)
Create a numeral of RoundingMode sort which represents the TowardZero rounding mode.
void set(char const *k, bool v)
Definition: z3++.h:2919
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_rcf_num Z3_API Z3_rcf_add(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return the value a + b.
model(context &c)
Definition: z3++.h:2720
friend expr bv2int(expr const &a, bool is_signed)
bit-vector and integer conversions.
Definition: z3++.h:2328
bool is_int() const
Return true if this sort is the Integer sort.
Definition: z3++.h:750
Z3_ast Z3_API Z3_mk_false(Z3_context c)
Create an AST node representing false.
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_ast Z3_API Z3_mk_mod(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 mod arg2.
iterator & operator++()
Definition: z3++.h:1700
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...
tactic & operator=(tactic const &s)
Definition: z3++.h:3265
expr operator[](expr const &index) const
Definition: z3++.h:1651
sort re_sort(sort &seq_sort)
Return a regular expression sort over sequences seq_sort.
Definition: z3++.h:3665
void Z3_API Z3_del_constructor(Z3_context c, Z3_constructor constr)
Reclaim memory allocated to constructor.
expr sle(expr const &a, expr const &b)
signed less than or equal to operator for bitvectors.
Definition: z3++.h:2216
expr bvredand(expr const &a)
Definition: z3++.h:2076
void add_fact(func_decl &f, unsigned *args)
Definition: z3++.h:3604
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.
probe(context &c, Z3_probe s)
Definition: z3++.h:3389
void Z3_API Z3_solver_from_string(Z3_context c, Z3_solver s, Z3_string str)
load solver assertions from a string.
void Z3_API Z3_goal_reset(Z3_context c, Z3_goal g)
Erase all formulas from the given goal.
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.
expr pbeq(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2522
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.
friend expr xnor(expr const &a, expr const &b)
Definition: z3++.h:2037
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.
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.
probe & operator=(probe const &s)
Definition: z3++.h:3393
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...
func_decl get_const_decl(unsigned i) const
Definition: z3++.h:2746
Z3_ast Z3_API Z3_mk_bound(Z3_context c, unsigned index, Z3_sort ty)
Create a variable.
void register_fixed(fixed_eh_t &f)
register callbacks. Callbacks can only be registered with user_propagators that were created using a ...
Definition: z3++.h:4646
Z3_string Z3_API Z3_get_error_msg(Z3_context c, Z3_error_code err)
Return a string describing the given error code.
unsigned get_num_levels(func_decl &p)
Definition: z3++.h:3615
std::string documentation(symbol const &s)
Definition: z3++.h:585
~func_interp() override
Definition: z3++.h:2690
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_mul(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] * ... * args[num_args-1].
Z3_ast Z3_API Z3_mk_seq_concat(Z3_context c, unsigned n, Z3_ast const args[])
Concatenate sequences.
Z3_func_decl Z3_API Z3_mk_transitive_closure(Z3_context c, Z3_func_decl f)
create transitive closure of binary relation.
void Z3_API Z3_tactic_inc_ref(Z3_context c, Z3_tactic t)
Increment the reference counter of the given tactic.
virtual void eq(expr const &, expr const &)
Definition: z3++.h:4744
friend expr operator>=(expr const &a, expr const &b)
Definition: z3++.h:1870
#define Z3_THROW(x)
Definition: z3++.h:134
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...
iterator & operator++() noexcept
Definition: z3++.h:702
bool is_array() const
Return true if this is a Array expression.
Definition: z3++.h:910
unsigned id() const
retrieve unique identifier for expression.
Definition: z3++.h:1123
void Z3_API Z3_solver_pop(Z3_context c, Z3_solver s, unsigned n)
Backtrack n backtracking points.
Z3_symbol Z3_API Z3_get_decl_name(Z3_context c, Z3_func_decl d)
Return the constant declaration name as a symbol.
Z3_string Z3_API Z3_param_descrs_get_documentation(Z3_context c, Z3_param_descrs p, Z3_symbol s)
Retrieve documentation string corresponding to parameter name s.
Z3_sort Z3_API Z3_mk_fpa_sort(Z3_context c, unsigned ebits, unsigned sbits)
Create a FloatingPoint sort.
symbol str_symbol(char const *s)
Create a Z3 symbol based on the given string.
Definition: z3++.h:3655
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.
rcf_num operator/(rcf_num const &other) const
Definition: z3++.h:4906
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:2323
expr congruence_next(expr const &t) const
Definition: z3++.h:3005
void Z3_API Z3_disable_trace(Z3_string tag)
Disable tracing messages tagged as tag when Z3 is compiled in debug mode. It is a NOOP otherwise...
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_full_set(Z3_context c, Z3_sort domain)
Create the full set.
Z3_ast Z3_API Z3_mk_char_is_digit(Z3_context c, Z3_ast ch)
Create a check if the character is a digit.
Z3_rcf_num Z3_API Z3_rcf_sub(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return the value a - b.
void set(char const *k, symbol const &s)
Definition: z3++.h:608
Z3_ast Z3_API Z3_mk_seq_at(Z3_context c, Z3_ast s, Z3_ast index)
Retrieve from s the unit sequence positioned at position index. The sequence is empty if the index is...
friend std::ostream & operator<<(std::ostream &out, sort const &s)
Definition: z3++.h:815
Z3_params Z3_API Z3_mk_params(Z3_context c)
Create a Z3 (empty) parameter set. Starting at Z3 4.0, parameter sets are used to configure many comp...
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...
friend bool eq(ast const &a, ast const &b)
Return true if the ASTs are structurally identical.
Definition: z3++.h:650
Z3_symbol_kind Z3_API Z3_get_symbol_kind(Z3_context c, Z3_symbol s)
Return Z3_INT_SYMBOL if the symbol was constructed using Z3_mk_int_symbol, and Z3_STRING_SYMBOL if th...
func_decl piecewise_linear_order(sort const &a, unsigned index)
Definition: z3++.h:2371
void Z3_API Z3_ast_vector_inc_ref(Z3_context c, Z3_ast_vector v)
Increment the reference counter of the given AST vector.
void push()
Create a backtracking point.
Definition: z3++.h:2934
bool operator!=(rcf_num const &other) const
Definition: z3++.h:4959
friend expr bvmul_no_overflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:2352
expr length() const
Definition: z3++.h:1587
expr bvsub_no_underflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:2343
Z3_string Z3_API Z3_ast_to_string(Z3_context c, Z3_ast a)
Convert the given AST node into a string.
bool is_algebraic() const
Definition: z3++.h:4969
stats statistics() const
Definition: z3++.h:2983
Z3_symbol Z3_API Z3_mk_string_symbol(Z3_context c, Z3_string s)
Create a Z3 symbol using a C string.
tactic cond(probe const &p, tactic const &t1, tactic const &t2)
Definition: z3++.h:3648
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_unary_minus(Z3_context c, Z3_ast arg)
Create an AST node representing - arg.
void import_model_converter(solver const &src)
Definition: z3++.h:3043
friend expr bvadd_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:2337
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...
solver(context &c, simple)
Definition: z3++.h:2903
void Z3_API Z3_params_set_uint(Z3_context c, Z3_params p, Z3_symbol k, unsigned v)
Add a unsigned parameter k with value v to the parameter set p.
expr(context &c)
Definition: z3++.h:879
friend expr fp_eq(expr const &a, expr const &b)
Definition: z3++.h:2109
char const * msg() const
Definition: z3++.h:124
void Z3_API Z3_add_const_interp(Z3_context c, Z3_model m, Z3_func_decl f, Z3_ast a)
Add a constant interpretation.
expr range(expr const &lo, expr const &hi)
Definition: z3++.h:4343
expr bv_val(int n, unsigned sz)
Definition: z3++.h:4000
Z3_ast Z3_API Z3_mk_bvsgt(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed greater than.
expr operator!=(expr const &a, expr const &b)
Definition: z3++.h:1804
expr value() const
Definition: z3++.h:2676
Z3_ast Z3_API Z3_mk_bvlshr(Z3_context c, Z3_ast t1, Z3_ast t2)
Logical shift right.
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_fpa_is_zero(Z3_context c, Z3_ast t)
Predicate indicating whether t is a floating-point number with zero value, i.e., +zero or -zero...
Z3_sort Z3_API Z3_mk_int_sort(Z3_context c)
Create the integer type.
friend expr bvsub_no_underflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:2343
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, again represented as a floating-point number.
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...
bool is_real() const
Return true if this is a real expression.
Definition: z3++.h:898
Definition: z3_api.h:1348
func_interp & operator=(func_interp const &s)
Definition: z3++.h:2692
friend expr operator!=(expr const &a, expr const &b)
Definition: z3++.h:1804
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...
func_decl_vector recognizers()
Definition: z3++.h:4408
friend expr bvredor(expr const &a)
Definition: z3++.h:2070
expr fpa_rounding_mode()
Definition: z3++.h:3974
Z3_ast Z3_API Z3_mk_bvashr(Z3_context c, Z3_ast t1, Z3_ast t2)
Arithmetic shift right.
Z3_ast Z3_API Z3_mk_xor(Z3_context c, Z3_ast t1, Z3_ast t2)
Create an AST node representing t1 xor t2.
bool Z3_API Z3_rcf_eq(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a == b.
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...
probe(context &c, double val)
Definition: z3++.h:3388
bool Z3_API Z3_is_algebraic_number(Z3_context c, Z3_ast a)
Return true if the given AST is a real algebraic number.
uint64_t as_uint64() const
Definition: z3++.h:958
expr itos() const
Definition: z3++.h:1597
Definition: z3++.h:167
std::string help() const
Definition: z3++.h:3575
Z3_ast Z3_API Z3_mk_store(Z3_context c, Z3_ast a, Z3_ast i, Z3_ast v)
Array update.
func_entry & operator=(func_entry const &s)
Definition: z3++.h:2669
Z3_ast Z3_API Z3_mk_const(Z3_context c, Z3_symbol s, Z3_sort ty)
Declare and create a constant.
Z3_ast Z3_API Z3_ast_vector_get(Z3_context c, Z3_ast_vector v, unsigned i)
Return the AST at position i in the AST vector v.
void set(char const *param, char const *value)
Set global parameter param with string value.
Definition: z3++.h:152
expr_vector units() const
Definition: z3++.h:2987
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...
constructor_list(constructors const &cs)
Definition: z3++.h:3765
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...
void set(char const *k, char const *v)
Definition: z3++.h:2923
simplifier(simplifier const &s)
Definition: z3++.h:3348
expr is_digit() const
Definition: z3++.h:1627
Definition: z3++.h:174
expr fma(expr const &a, expr const &b, expr const &c, expr const &rm)
Definition: z3++.h:2118
tactic when(probe const &p, tactic const &t)
Definition: z3++.h:3642
Z3_probe Z3_API Z3_probe_const(Z3_context x, double val)
Return a probe that always evaluates to val.
void set_else(expr &value)
Definition: z3++.h:2706
friend expr round_fpa_to_closest_integer(expr const &t)
Round a floating-point term into its closest integer.
Definition: z3++.h:2169
config()
Definition: z3++.h:146
friend std::ostream & operator<<(std::ostream &out, params const &p)
Definition: z3++.h:613
void set(char const *k, double n)
Definition: z3++.h:607
void Z3_API Z3_stats_dec_ref(Z3_context c, Z3_stats s)
Decrement the reference counter of the given statistics object.
Z3_sort Z3_API Z3_get_array_sort_range(Z3_context c, Z3_sort t)
Return the range of the given array sort.
expr lower(handle const &h)
Definition: z3++.h:3559
cube_generator cubes()
Definition: z3++.h:3164
bool is_numeral_u64(uint64_t &i) const
Definition: z3++.h:949
friend expr operator/(expr const &a, expr const &b)
Definition: z3++.h:1890
rcf_num & operator=(rcf_num const &other)
Definition: z3++.h:4856
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 ...
std::string help() const
Definition: z3++.h:3358
Z3_ast Z3_API Z3_mk_concat(Z3_context c, Z3_ast t1, Z3_ast t2)
Concatenate the given bit-vectors.
friend std::ostream & operator<<(std::ostream &out, rcf_num const &n)
Definition: z3++.h:4981
void set(char const *param, char const *value)
Update global parameter param with string value.
Definition: z3++.h:266
array(unsigned sz)
Definition: z3++.h:523
handle add_soft(expr const &e, unsigned weight)
Definition: z3++.h:3509
expr mk_is_inf() const
Return Boolean expression to test for whether an FP expression is inf.
Definition: z3++.h:1005
std::ostream & operator<<(std::ostream &out, exception const &e)
Definition: z3++.h:128
void Z3_API Z3_get_string_contents(Z3_context c, Z3_ast s, unsigned length, unsigned contents[])
Retrieve the unescaped string constant stored in s.
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 ...
A Z3 sort (aka type). Every expression (i.e., formula or term) in Z3 has a sort.
Definition: z3++.h:723
bool is_transcendental() const
Definition: z3++.h:4977
optimize(context &c, optimize &src)
Definition: z3++.h:3478
Z3_rcf_num Z3_API Z3_rcf_mk_infinitesimal(Z3_context c)
Return a new infinitesimal that is smaller than all elements in the Z3 field.
Z3_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.
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. The result is the new AST. The arrays from and to must have size num_exprs. For every i smaller than num_exprs, we must have that sort of from[i] must be equal to sort of to[i].
expr simplify() const
Return a simplified version of this expression.
Definition: z3++.h:1666
unsigned bv_size() const
Return the size of this Bit-vector sort.
Definition: z3++.h:797
bool is_bv() const
Return true if this sort is a Bit-vector sort.
Definition: z3++.h:762
Z3_ast Z3_API Z3_mk_bvuge(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than or equal to.
Z3_ast Z3_API Z3_mk_bvugt(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than.
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_optimize Z3_API Z3_mk_optimize(Z3_context c)
Create a new optimize context.
void Z3_API Z3_optimize_assert(Z3_context c, Z3_optimize o, Z3_ast a)
Assert hard constraint to the optimization context.
func_decl(context &c)
Definition: z3++.h:828
int to_int() const
Definition: z3++.h:553
friend expr operator^(expr const &a, expr const &b)
Definition: z3++.h:2027
void pop_back()
Definition: z3++.h:669
expr full_set(sort const &s)
Definition: z3++.h:4223
def on_clause_eh(ctx, p, n, dep, clause)
Definition: z3py.py:11824
model(model &src, context &dst, translate)
Definition: z3++.h:2723
void Z3_API Z3_del_context(Z3_context c)
Delete the given logical context.
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_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. The datatype may be recursive. Return the datatype sort.
friend expr fpa_to_ubv(expr const &t, unsigned sz)
Conversion of a floating-point term into an unsigned bit-vector.
Definition: z3++.h:2141
Z3_ast Z3_API Z3_mk_str_to_int(Z3_context c, Z3_ast s)
Convert string to integer.
friend std::ostream & operator<<(std::ostream &out, ast const &n)
Definition: z3++.h:646
Z3_ast Z3_API Z3_mk_set_del(Z3_context c, Z3_ast set, Z3_ast elem)
Remove an element to a set.
bool is_true() const
Definition: z3++.h:1381
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_set_union(Z3_context c, unsigned num_args, Z3_ast const args[])
Take the union of a list of sets.
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.
sort bv_sort(unsigned sz)
Return the Bit-vector sort of size sz. That is, the sort for bit-vectors of size sz.
Definition: z3++.h:3661
void interrupt()
Interrupt the current procedure being executed by any object managed by this context. This is a soft interruption: there is no guarantee the object will actually stop.
Definition: z3++.h:283
bool is_double(unsigned i) const
Definition: z3++.h:2839
expr lshr(expr const &a, expr const &b)
logic shift right operator for bitvectors
Definition: z3++.h:2309
expr udiv(expr const &a, expr const &b)
unsigned division operator for bitvectors.
Definition: z3++.h:2274
void add(expr const &e)
tracks e by a unique identifier that is returned by the call.
Definition: z3++.h:4773
apply_result operator()(goal const &g) const
Definition: z3++.h:3279
Z3_ast Z3_API Z3_mk_le(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than or equal to.
bool empty() const
Definition: z3++.h:670
T back() const
Definition: z3++.h:668
solver mk_solver() const
Definition: z3++.h:3272
friend expr concat(expr const &a, expr const &b)
Definition: z3++.h:2564
friend expr mod(expr const &a, expr const &b)
Definition: z3++.h:1728
Z3_symbol Z3_API Z3_param_descrs_get_name(Z3_context c, Z3_param_descrs p, unsigned i)
Return the name of the parameter at given index i.
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...
expr upper(handle const &h)
Definition: z3++.h:3564
Z3_goal_prec
Z3 custom error handler (See Z3_set_error_handler).
Definition: z3_api.h:1387
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_error_code
Z3 error codes (See Z3_get_error_code).
Definition: z3_api.h:1346
goal(context &c, Z3_goal s)
Definition: z3++.h:3178
optimize(optimize const &o)
Definition: z3++.h:3475
optimize & operator=(optimize const &o)
Definition: z3++.h:3485
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].
std::string to_string() const
Definition: z3++.h:586
expr eval(expr const &n, bool model_completion=false) const
Definition: z3++.h:2734
model(context &c, Z3_model m)
Definition: z3++.h:2721
Z3_ast_kind kind() const
Definition: z3++.h:635
~params() override
Definition: z3++.h:596
sort array_sort(sort d, sort r)
Return an array sort for arrays from d to r.
Definition: z3++.h:3682
expr constant(symbol const &name, sort const &s)
create an uninterpreted constant.
Definition: z3++.h:3951
void pop()
Definition: z3++.h:3541
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.
friend simplifier operator&(simplifier const &t1, simplifier const &t2)
Definition: z3++.h:3367
unsigned Z3_API Z3_get_decl_num_parameters(Z3_context c, Z3_func_decl d)
Return the number of parameters associated with a declaration.
func_decl operator[](int i) const
Definition: z3++.h:2749
bool Z3_API Z3_is_eq_ast(Z3_context c, Z3_ast t1, Z3_ast t2)
Compare terms.
check_result query(expr &q)
Definition: z3++.h:3605
bool is_ite() const
Definition: z3++.h:1389
unsigned fpa_sbits() const
Definition: z3++.h:801
void set_initial_value(expr const &var, expr const &value)
Definition: z3++.h:3018
fixedpoint(context &c)
Definition: z3++.h:3582
Z3_ast Z3_API Z3_mk_bvule(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned less than or equal to.
sort char_sort()
Return the sort for Unicode characters.
Definition: z3++.h:3663
constructors(context &ctx)
Definition: z3++.h:3726
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_string Z3_API Z3_ast_vector_to_string(Z3_context c, Z3_ast_vector v)
Convert AST vector into a string.
tactic(tactic const &s)
Definition: z3++.h:3262
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.
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...
double get_double() const
Definition: z3++.h:2887
friend expr operator||(expr const &a, expr const &b)
Return an expression representing a or b.
Definition: z3++.h:1780
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...
void set_enable_exceptions(bool f)
The C++ API uses by defaults exceptions on errors. For applications that don't work well with excepti...
Definition: z3++.h:259
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...
~fixedpoint() override
Definition: z3++.h:3584
void disable_trace(char const *tag)
Disable tracing messages tagged as tag when Z3 is compiled in debug mode. It is a NOOP otherwise...
Definition: z3++.h:112
bool is_datatype() const
Return true if this is a Datatype expression.
Definition: z3++.h:914
void add(expr const &e, expr const &t)
Definition: z3++.h:3501
Z3_decl_kind Z3_API Z3_get_decl_kind(Z3_context c, Z3_func_decl d)
Return declaration kind corresponding to declaration.
rcf_num(context &c, Z3_rcf_num n)
Definition: z3++.h:4840
bool Z3_API Z3_is_quantifier_exists(Z3_context c, Z3_ast a)
Determine if ast is an existential quantifier.
sort operator()(context &c, Z3_ast a)
Definition: z3++.h:2409
check_result check()
Definition: z3++.h:3544
expr ubv_to_fpa(expr const &t, sort s)
Definition: z3++.h:2155
simplifier(context &c, Z3_simplifier s)
Definition: z3++.h:3347
Z3_ast Z3_API Z3_mk_re_intersect(Z3_context c, unsigned n, Z3_ast const args[])
Create the intersection of the regular languages.
expr rotate_left(unsigned i) const
Definition: z3++.h:1492
~simplifier() override
Definition: z3++.h:3349
friend probe operator||(probe const &p1, probe const &p2)
Definition: z3++.h:3450
expr is_int(expr const &e)
Definition: z3++.h:1764
void Z3_API Z3_optimize_inc_ref(Z3_context c, Z3_optimize d)
Increment the reference counter of the given optimize context.
expr fpa_to_fpa(expr const &t, sort s)
Definition: z3++.h:2162
expr contains(expr const &s) const
Definition: z3++.h:1569
friend expr bvadd_no_overflow(expr const &a, expr const &b, bool is_signed)
bit-vector overflow/underflow checks
Definition: z3++.h:2334
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.
iterator operator++(int) noexcept
Definition: z3++.h:709
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...
expr operator^(expr const &a, expr const &b)
Definition: z3++.h:2027
~param_descrs() override
Definition: z3++.h:578
unsigned Z3_API Z3_fpa_get_ebits(Z3_context c, Z3_sort s)
Retrieves the number of bits reserved for the exponent in a FloatingPoint sort.
friend std::ostream & operator<<(std::ostream &out, optimize const &s)
Definition: z3++.h:3577
Z3_ast Z3_API Z3_mk_const_array(Z3_context c, Z3_sort domain, Z3_ast v)
Create the constant array.
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].
void from_string(char const *constraints)
Definition: z3++.h:3574
void add(expr const &e, char const *p)
Definition: z3++.h:3505
unsigned lo() const
Definition: z3++.h:1506
Exception used to sign API usage errors.
Definition: z3++.h:119
expr operator*(expr const &a, expr const &b)
Definition: z3++.h:1846
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.
Z3_ast Z3_API Z3_simplify_ex(Z3_context c, Z3_ast a, Z3_params p)
Interface to simplifier.
unsigned uint_value(unsigned i) const
Definition: z3++.h:2840
unsigned Z3_API Z3_get_sort_id(Z3_context c, Z3_sort s)
Return a unique identifier for s.
Z3_context Z3_API Z3_mk_context_rc(Z3_config c)
Create a context using the given configuration. This function is similar to Z3_mk_context. However, in the context returned by this function, the user is responsible for managing Z3_ast reference counters. Managing reference counters is a burden and error-prone, but allows the user to use the memory more efficiently. The user must invoke Z3_inc_ref for any Z3_ast returned by Z3, and Z3_dec_ref whenever the Z3_ast is not needed anymore. This idiom is similar to the one used in BDD (binary decision diagrams) packages such as CUDD.
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.
Z3_apply_result Z3_API Z3_tactic_apply(Z3_context c, Z3_tactic t, Z3_goal g)
Apply tactic t to the goal g.
bool is_infinitesimal() const
Definition: z3++.h:4973
expr nth(expr const &index) const
Definition: z3++.h:1581
bool Z3_API Z3_get_numeral_uint64(Z3_context c, Z3_ast v, uint64_t *u)
Similar to Z3_get_numeral_string, but only succeeds if the value can fit in a machine uint64_t int...
ast_vector_tpl(context &c, Z3_ast_vector v)
Definition: z3++.h:658
A Z3 expression is used to represent formulas and terms. For Z3, a formula is any expression of sort ...
Definition: z3++.h:877
void reset_params()
Definition: z3++.h:84
void Z3_API Z3_update_param_value(Z3_context c, Z3_string param_id, Z3_string param_value)
Set a value of a context parameter.
Z3_string Z3_API Z3_sort_to_string(Z3_context c, Z3_sort s)
expr operator!(expr const &a)
Definition: z3++.h:1762
~ast_vector_tpl() override
Definition: z3++.h:662
ast_vector_tpl & set(unsigned idx, ast &a)
Definition: z3++.h:678
expr set_subset(expr const &a, expr const &b)
Definition: z3++.h:4263
Z3_ast Z3_API Z3_mk_empty_set(Z3_context c, Z3_sort domain)
Create the empty set.
void add(expr_vector const &es)
Definition: z3++.h:3498
unsigned Z3_API Z3_fpa_get_sbits(Z3_context c, Z3_sort s)
Retrieves the number of bits reserved for the significand in a FloatingPoint sort.
void Z3_API Z3_solver_reset(Z3_context c, Z3_solver s)
Remove all assertions from the solver.
unsigned num_exprs() const
Definition: z3++.h:3197
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_fpa_is_subnormal(Z3_context c, Z3_ast t)
Predicate indicating whether t is a subnormal floating-point number.
bool is_uint(unsigned i) const
Definition: z3++.h:2838
expr ule(expr const &a, expr const &b)
unsigned less than or equal to operator for bitvectors.
Definition: z3++.h:2242
expr in_re(expr const &s, expr const &re)
Definition: z3++.h:4303
symbol name(unsigned i)
Definition: z3++.h:583
expr re_diff(expr const &a, expr const &b)
Definition: z3++.h:4333
void Z3_API Z3_ast_vector_resize(Z3_context c, Z3_ast_vector v, unsigned n)
Resize the AST vector v.
expr_vector unsat_core() const
Definition: z3++.h:2984
bool is_lambda() const
Return true if this expression is a lambda expression.
Definition: z3++.h:986
iterator end() const
Definition: z3++.h:714
Z3_ast Z3_API Z3_mk_seq_length(Z3_context c, Z3_ast s)
Return the length of the sequence s.
~optimize() override
Definition: z3++.h:3492
bool is_fpa() const
Return true if this is a FloatingPoint expression. .
Definition: z3++.h:940
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.
sort datatype_sort(symbol const &name)
a reference to a recursively defined datatype. Expect that it gets defined as a datatype.
Definition: z3++.h:3806
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_error_code check_error() const
Definition: z3++.h:541
Z3_ast_vector Z3_API Z3_solver_get_units(Z3_context c, Z3_solver s)
Return the set of units modulo model conversion.
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.
void set(char const *param, int value)
Update global parameter param with Integer value.
Definition: z3++.h:274
static param_descrs simplify_param_descrs(context &c)
Definition: z3++.h:579
friend expr mk_and(expr_vector const &args)
Definition: z3++.h:2642
Z3_ast Z3_API Z3_get_app_arg(Z3_context c, Z3_app a, unsigned i)
Return the i-th argument of the given application.
unsigned num_entries() const
Definition: z3++.h:2700
Z3_ast Z3_API Z3_mk_fpa_rne(Z3_context c)
Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode...
cube_iterator begin()
Definition: z3++.h:3159
unsigned arity() const
Definition: z3++.h:837
iterator begin()
Definition: z3++.h:1704
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_re_complement(Z3_context c, Z3_ast re)
Create the complement of the regular language re.
sort_vector datatypes(unsigned n, symbol const *names, constructor_list *const *cons)
Create a set of mutually recursive datatypes. n - number of recursive datatypes names - array of name...
Definition: z3++.h:3790
void update_rule(expr &rule, symbol const &name)
Definition: z3++.h:3614
bool enable_exceptions() const
Definition: z3++.h:261
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.
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...
bool is_finite_domain() const
Return true if this sort is a Finite domain sort.
Definition: z3++.h:786
Z3_ast Z3_API Z3_mk_seq_nth(Z3_context c, Z3_ast s, Z3_ast index)
Retrieve from s the element positioned at position index. The function is under-specified if the inde...
void register_on_binding()
Definition: z3++.h:4734
func_decl operator()(context &c, Z3_ast a)
Definition: z3++.h:2417
std::string to_string(expr_vector const &queries)
Definition: z3++.h:3630
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.
ast_vector_tpl< func_decl > func_decl_vector
Definition: z3++.h:79
stats(context &c)
Definition: z3++.h:2824
expr algebraic_upper(unsigned precision) const
Definition: z3++.h:1093
Z3_stats Z3_API Z3_solver_get_statistics(Z3_context c, Z3_solver s)
Return statistics for the given solver.
void Z3_API Z3_ast_vector_dec_ref(Z3_context c, Z3_ast_vector v)
Decrement the reference counter of the given AST vector.
expr operator>=(expr const &a, expr const &b)
Definition: z3++.h:1870
std::string reason_unknown()
Definition: z3++.h:3613
#define MK_EXPR2(_fn, _arg1, _arg2)
Definition: z3++.h:4209
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...
expr replace(expr const &src, expr const &dst) const
Definition: z3++.h:1558
void add_entry(expr_vector const &args, expr &value)
Definition: z3++.h:2702
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.
sort get_sort(unsigned i) const
Return the uninterpreted sort at position i.
Definition: z3++.h:2798
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_array_default(Z3_context c, Z3_ast array)
Access the array default value. Produces the default range value, for arrays that can be represented ...
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_re_concat(Z3_context c, unsigned n, Z3_ast const args[])
Create the concatenation of the regular languages.
expr pw(expr const &a, expr const &b)
Definition: z3++.h:1724
Z3_func_decl Z3_API Z3_get_app_decl(Z3_context c, Z3_app a)
Return the declaration of a constant or function application.
friend std::ostream & operator<<(std::ostream &out, goal const &g)
Definition: z3++.h:3227
friend expr fpa_fp(expr const &sgn, expr const &exp, expr const &sig)
Create an expression of FloatingPoint sort from three bit-vector expressions.
Definition: z3++.h:2126
Z3_string Z3_API Z3_param_descrs_to_string(Z3_context c, Z3_param_descrs p)
Convert a parameter description set into a string. This function is mainly used for printing the cont...
friend probe operator>=(probe const &p1, probe const &p2)
Definition: z3++.h:3427
expr(context &c, Z3_ast n)
Definition: z3++.h:880
Wrapper for Z3 Real Closed Field (RCF) numerals.
Definition: z3++.h:4829
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...
expr set_difference(expr const &a, expr const &b)
Definition: z3++.h:4251
symbol name() const
Return name of sort.
Definition: z3++.h:742
T * operator->() const
Definition: z3++.h:710
unsigned Z3_API Z3_ast_vector_size(Z3_context c, Z3_ast_vector v)
Return the size of the given AST vector.
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.
bool is_and() const
Definition: z3++.h:1384
unsigned id() const
retrieve unique identifier for func_decl.
Definition: z3++.h:835
expr operator~(expr const &a)
Definition: z3++.h:2116
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.
expr operator[](int i) const
Definition: z3++.h:3192
expr array_default(expr const &a)
Definition: z3++.h:4191
bool propagate(expr_vector const &fixed, expr const &conseq)
Definition: z3++.h:4799
Z3_ast Z3_API Z3_mk_fpa_rtn(Z3_context c)
Create a numeral of RoundingMode sort which represents the TowardNegative rounding mode...
expr update_field(func_decl const &field_access, expr const &new_value) const
Update a datatype field. Return a new datatype expression with the specified field updated to the new...
Definition: z3++.h:4485
expr_vector assertions() const
Definition: z3++.h:3624
friend expr int2bv(unsigned n, expr const &a)
Definition: z3++.h:2329
expr_vector assertions() const
Definition: z3++.h:3569
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...
Z3_ast Z3_API Z3_mk_fpa_abs(Z3_context c, Z3_ast t)
Floating-point absolute value.
expr_vector unsat_core() const
Definition: z3++.h:3557
friend expr operator-(expr const &a)
Definition: z3++.h:1912
Z3_error_code Z3_API Z3_get_error_code(Z3_context c)
Return the error code for the last API call.
friend expr distinct(expr_vector const &args)
Definition: z3++.h:2555
check_result check(unsigned n, expr *const assumptions)
Definition: z3++.h:2955
Z3_ast Z3_API Z3_mk_bvnand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nand.
expr bvredor(expr const &a)
Definition: z3++.h:2070
expr rem(expr const &a, expr const &b)
Definition: z3++.h:1744
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.
friend expr operator*(expr const &a, expr const &b)
Definition: z3++.h:1846
probe(context &c, char const *name)
Definition: z3++.h:3387
friend std::ostream & operator<<(std::ostream &out, solver const &s)
Definition: z3++.h:3168
iterator operator++(int)
Definition: z3++.h:1701
Z3_ast Z3_API Z3_mk_bvslt(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed less than.
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.
#define MK_EXPR1(_fn, _arg)
Definition: z3++.h:4204
expr get_answer()
Definition: z3++.h:3612
Z3_sort Z3_API Z3_mk_string_sort(Z3_context c)
Create a sort for unicode strings.
bool is_forall() const
Return true if this expression is a universal quantifier.
Definition: z3++.h:978
~model() override
Definition: z3++.h:2724
friend expr min(expr const &a, expr const &b)
Definition: z3++.h:2038
sort seq_sort(sort &s)
Return a sequence sort over base sort s.
Definition: z3++.h:3664
void Z3_API Z3_optimize_set_params(Z3_context c, Z3_optimize o, Z3_params p)
Set parameters on optimization context.
friend expr bvmul_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:2355
bool next_split(expr const &e, unsigned idx, Z3_lbool phase)
Definition: z3++.h:4754
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_solver_assert(Z3_context c, Z3_solver s, Z3_ast a)
Assert a constraint into the solver.
friend expr operator<=(expr const &a, expr const &b)
Definition: z3++.h:1954
Z3_rcf_num Z3_API Z3_rcf_div(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return the value a / b.
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...
bool operator>(rcf_num const &other) const
Definition: z3++.h:4939
Z3_ast Z3_API Z3_mk_char_to_bv(Z3_context c, Z3_ast ch)
Create a bit-vector (code point) from character.
Z3_ast Z3_API Z3_mk_bit2bool(Z3_context c, unsigned i, Z3_ast t1)
Extracts the bit at position i of a bit-vector and yields a boolean.
expr bvmul_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:2355
friend expr bvredand(expr const &a)
Definition: z3++.h:2076
expr get_const_interp(func_decl c) const
Definition: z3++.h:2757
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.
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.
void Z3_API Z3_del_constructor_list(Z3_context c, Z3_constructor_list clist)
Reclaim memory allocated for constructor list.
A Context manages all other Z3 objects, global configuration options, etc.
Definition: z3++.h:191
Definition: z3++.h:617
Z3 C++ namespace.
Definition: z3++.h:50
Z3_ast Z3_API Z3_mk_set_difference(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Take the set difference between two sets.
Z3_ast_kind Z3_API Z3_get_ast_kind(Z3_context c, Z3_ast a)
Return the kind of the given AST.
expr set_add(expr const &s, expr const &e)
Definition: z3++.h:4227
expr ashr(expr const &a, expr const &b)
arithmetic shift right operator for bitvectors
Definition: z3++.h:2316
expr re_empty(sort const &s)
Definition: z3++.h:4315
void Z3_API Z3_set_ast_print_mode(Z3_context c, Z3_ast_print_mode mode)
Select mode for the format used for pretty-printing AST nodes.
void Z3_API Z3_solver_inc_ref(Z3_context c, Z3_solver s)
Increment the reference counter of the given solver.
Z3_ast Z3_API Z3_mk_bvsrem(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed remainder (sign follows dividend).
sort fpa_sort()
Return a FloatingPoint sort with given precision bitwidth (16, 32, 64 or 128).
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.
friend tactic operator|(tactic const &t1, tactic const &t2)
Definition: z3++.h:3300
Z3_ast Z3_API Z3_mk_bvsdiv(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed division.
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 ...
expr simplify(params const &p) const
Return a simplified version of this expression. The parameter p is a set of parameters for the Z3 sim...
Definition: z3++.h:1670
expr nor(expr const &a, expr const &b)
Definition: z3++.h:2036
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.
bool Z3_API Z3_rcf_neq(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a != b.
Z3_ast Z3_API Z3_mk_fpa_to_fp_bv(Z3_context c, Z3_ast bv, Z3_sort s)
Conversion of a single IEEE 754-2008 bit-vector into a floating-point number.
Z3_param_descrs Z3_API Z3_simplify_get_param_descrs(Z3_context c)
Return the parameter description set for the simplify procedure.
std::string get_rational() const
Definition: z3++.h:2886
fixedpoint(fixedpoint const &o)
Definition: z3++.h:3583
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...
unsigned size() const
Definition: z3++.h:3744
solver(context &c, Z3_solver s)
Definition: z3++.h:2904
func_decl_vector accessors()
Definition: z3++.h:4417
expr ubvtos() const
Definition: z3++.h:1602
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.
Z3 global configuration object.
Definition: z3++.h:141
context & operator=(context &&other) noexcept
Definition: z3++.h:225
~goal() override
Definition: z3++.h:3180
solver & operator=(solver const &s)
Definition: z3++.h:2911
Z3_ast Z3_API Z3_mk_char_from_bv(Z3_context c, Z3_ast bv)
Create a character from a bit-vector (code point).
Z3_ast Z3_API Z3_mk_fpa_rtp(Z3_context c)
Create a numeral of RoundingMode sort which represents the TowardPositive rounding mode...
void set(char const *param, int value)
Set global parameter param with integer value.
Definition: z3++.h:160
void add_cover(int level, func_decl &p, expr &property)
Definition: z3++.h:3621
expr substitute(expr_vector const &src, expr_vector const &dst)
Apply substitution. Replace src expressions by dst.
Definition: z3++.h:4436
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.
ast(context &c, Z3_ast n)
Definition: z3++.h:622
ast_vector_tpl & operator=(ast_vector_tpl const &s)
Definition: z3++.h:671
expr_vector cube(expr_vector &vars, unsigned cutoff)
Definition: z3++.h:3077
friend expr fpa_to_sbv(expr const &t, unsigned sz)
Conversion of a floating-point term into a signed bit-vector.
Definition: z3++.h:2134
expr operator<=(expr const &a, expr const &b)
Definition: z3++.h:1954
friend std::ostream & operator<<(std::ostream &out, apply_result const &r)
Definition: z3++.h:3251
bool is_finite_domain() const
Return true if this is a Finite-domain expression.
Definition: z3++.h:936
expr proof() const
Definition: z3++.h:3049
void set(char const *k, char const *s)
Definition: z3++.h:609
expr bv_const(char const *name, unsigned sz)
Definition: z3++.h:3966
sort fpa_sort()
Definition: z3++.h:3669
void Z3_API Z3_param_descrs_inc_ref(Z3_context c, Z3_param_descrs p)
Increment the reference counter of the given parameter description set.
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.
user_propagator_base(context &c)
Definition: z3++.h:4610
expr real_val(int n)
Definition: z3++.h:3994
expr string_val(char const *s)
Definition: z3++.h:4017
uint64_t get_numeral_uint64() const
Return uint64_t value of numeral, throw if result cannot fit in uint64_t.
Definition: z3++.h:1188
tactic(context &c, char const *name)
Definition: z3++.h:3260
Z3_ast Z3_API Z3_mk_div(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 div arg2.
void Z3_API Z3_fixedpoint_inc_ref(Z3_context c, Z3_fixedpoint d)
Increment the reference counter of the given fixedpoint context.
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_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...
sort string_sort()
Return the sort for Unicode strings.
Definition: z3++.h:3662
std::string str() const
Definition: z3++.h:552
void conflict(expr_vector const &fixed, expr_vector const &lhs, expr_vector const &rhs)
Definition: z3++.h:4789
tactic with(tactic const &t, params const &p)
Definition: z3++.h:3313
expr empty_set(sort const &s)
Definition: z3++.h:4219
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.
Z3_ast_vector Z3_API Z3_mk_ast_vector(Z3_context c)
Return an empty AST vector.
expr as_array(func_decl &f)
Definition: z3++.h:4185
expr plus(expr const &re)
Definition: z3++.h:4306
func_decl partial_order(sort const &a, unsigned index)
Definition: z3++.h:2368
expr xnor(expr const &a, expr const &b)
Definition: z3++.h:2037
expr char_to_bv() const
Definition: z3++.h:1617
void reset()
Definition: z3++.h:2936
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_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...
expr operator*() const
Definition: z3++.h:1699
Z3_ast Z3_API Z3_mk_int2real(Z3_context c, Z3_ast t1)
Coerce an integer to a real.
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_rcf_num Z3_API Z3_rcf_power(Z3_context c, Z3_rcf_num a, unsigned k)
Return the value a^k.
Z3_ast Z3_API Z3_mk_fpa_rem(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point remainder.
Z3_ast Z3_API Z3_mk_bvshl(Z3_context c, Z3_ast t1, Z3_ast t2)
Shift left.
std::string get_decimal_string(int precision) const
Return string representation of numeral or algebraic number This method assumes the expression is num...
Definition: z3++.h:1078
~config()
Definition: z3++.h:147
void from_string(char const *s)
Definition: z3++.h:2952
void Z3_API Z3_solver_solve_for(Z3_context c, Z3_solver s, Z3_ast_vector variables, Z3_ast_vector terms, Z3_ast_vector guards)
retrieve a 'solution' for variables as defined by equalities in maintained by solvers. At this point, only linear solution are supported. The solution to variables may be presented in triangular form, such that variables used in solutions themselves have solutions.
Z3_sort Z3_API Z3_mk_uninterpreted_sort(Z3_context c, Z3_symbol s)
Create a free (uninterpreted) type using the given name (symbol).
sort array_domain() const
Return the domain of this Array sort.
Definition: z3++.h:807
Z3_ast Z3_API Z3_mk_lt(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than.
Z3_ast Z3_API Z3_mk_seq_replace(Z3_context c, Z3_ast s, Z3_ast src, Z3_ast dst)
Replace the first occurrence of src with dst in s.
Z3_ast_kind
The different kinds of Z3 AST (abstract syntax trees). That is, terms, formulas and types...
Definition: z3_api.h:141
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...
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.
expr_vector args() const
Return a vector of all the arguments of this application. This method assumes the expression is an ap...
Definition: z3++.h:1281
friend expr atleast(expr_vector const &es, unsigned bound)
Definition: z3++.h:2538
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.
expr fpa_fp(expr const &sgn, expr const &exp, expr const &sig)
Definition: z3++.h:2126
void set_initial_value(expr const &var, bool b)
Definition: z3++.h:3025
void Z3_API Z3_dec_ref(Z3_context c, Z3_ast a)
Decrement the reference counter of the given AST. The context c should have been created using Z3_mk_...
bool operator==(rcf_num const &other) const
Definition: z3++.h:4954
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...
func_entry(context &c, Z3_func_entry e)
Definition: z3++.h:2665
void resize(unsigned sz)
Definition: z3++.h:667
void Z3_API Z3_del_config(Z3_config c)
Delete the given configuration object.
bool is_var() const
Return true if this expression is a variable.
Definition: z3++.h:991
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.
void solve_for(expr_vector const &vars, expr_vector &terms, expr_vector &guards)
Definition: z3++.h:3029
expr extract(unsigned hi, unsigned lo) const
Definition: z3++.h:1504
model get_model() const
Definition: z3++.h:3206
Z3_ast_vector Z3_API Z3_algebraic_get_poly(Z3_context c, Z3_ast a)
Return the coefficients of the defining polynomial.
expr operator[](expr_vector const &index) const
Definition: z3++.h:1659
void add(expr const &e, char const *p)
Definition: z3++.h:2943
func_decl to_func_decl(context &c, Z3_func_decl f)
Definition: z3++.h:2208
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.
friend simplifier with(simplifier const &t, params const &p)
Definition: z3++.h:3374
unsigned depth() const
Definition: z3++.h:3195
optimize(context &c)
Definition: z3++.h:3468
expr min(expr const &a, expr const &b)
Definition: z3++.h:2038
context & ctx() const
Definition: z3++.h:540
std::vector< rcf_num > rcf_roots(context &c, std::vector< rcf_num > const &coeffs)
Find roots of a polynomial with given coefficients.
Definition: z3++.h:5013
Z3_string Z3_API Z3_rcf_num_to_string(Z3_context c, Z3_rcf_num a, bool compact, bool html)
Convert the RCF numeral into a string.
sort array_range() const
Return the range of this Array sort.
Definition: z3++.h:813
cube_iterator(solver &s, expr_vector &vars, unsigned &cutoff, bool end)
Definition: z3++.h:3104
~ast() override
Definition: z3++.h:624
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...
param_descrs(param_descrs const &o)
Definition: z3++.h:570
void Z3_API Z3_optimize_push(Z3_context c, Z3_optimize d)
Create a backtracking point.
void set_cutoff(unsigned c) noexcept
Definition: z3++.h:3161
Z3_ast Z3_API Z3_mk_not(Z3_context c, Z3_ast a)
Create an AST node representing not(a).
Z3_ast Z3_API Z3_mk_re_option(Z3_context c, Z3_ast re)
Create the regular language [re].
friend expr fpa_to_fpa(expr const &t, sort s)
Conversion of a floating-point term into another floating-point.
Definition: z3++.h:2162
Z3_ast Z3_API Z3_mk_and(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] and ... and args[num_args-1].
Z3_ast Z3_API Z3_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_ge(Z3_context c, Z3_ast t1, Z3_ast t2)
Create greater than or equal to.
unsigned Z3_API Z3_get_bv_sort_size(Z3_context c, Z3_sort t)
Return the size of the given bit-vector sort.
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.
Definition: z3++.h:2658
virtual bool on_binding(expr const &, expr const &)
Definition: z3++.h:4752
bool is_const() const
Definition: z3++.h:849
Z3_sort Z3_API Z3_mk_array_sort(Z3_context c, Z3_sort domain, Z3_sort range)
Create an array type.
sort fpa_rounding_mode_sort()
Return a RoundingMode sort.
Definition: z3++.h:3680
bool is_string_value() const
Return true if this expression is a string literal. The string can be accessed using get_string() and...
Definition: z3++.h:1223
check_result check()
Definition: z3++.h:2954
unsigned size() const
Definition: z3++.h:3247
unsigned Z3_API Z3_stats_size(Z3_context c, Z3_stats s)
Return the number of statistical data in s.
Z3_ast Z3_API Z3_mk_set_subset(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Check for subsetness of sets.
std::string to_smt2(char const *status="unknown")
Definition: z3++.h:3052
unsigned get_numeral_uint() const
Return uint value of numeral, throw if result cannot fit in machine uint.
Definition: z3++.h:1154
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...
func_decl get_func_decl(unsigned i) const
Definition: z3++.h:2747
expr operator+(expr const &a, expr const &b)
Definition: z3++.h:1816
func_decl function(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:3828
expr operator()(context &c, Z3_ast a)
Definition: z3++.h:2398
Z3_ast Z3_API Z3_mk_bvsge(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed greater than or equal to.
Z3_ast Z3_API Z3_mk_set_add(Z3_context c, Z3_ast set, Z3_ast elem)
Add an element to a set.
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.
friend probe operator!(probe const &p)
Definition: z3++.h:3453
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.
expr as_expr() const
Definition: z3++.h:3211
bool is_numeral() const
Return true if this expression is a numeral. Specialized functions also return representations for th...
Definition: z3++.h:947
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:3899
expr bvadd_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:2337
Z3_ast Z3_API Z3_mk_set_complement(Z3_context c, Z3_ast arg)
Take the complement of a set.
expr int2bv(unsigned n, expr const &a)
Definition: z3++.h:2329
unsigned Z3_API Z3_get_ast_hash(Z3_context c, Z3_ast a)
Return a hash code for the given AST. The hash code is structural but two different AST objects can m...
expr bvneg_no_overflow(expr const &a)
Definition: z3++.h:2349
func_decl tree_order(sort const &a, unsigned index)
Definition: z3++.h:2374
Z3_string Z3_API Z3_params_to_string(Z3_context c, Z3_params p)
Convert a parameter set into a string. This function is mainly used for printing the contents of a pa...
expr re_complement(expr const &a)
Definition: z3++.h:4340
model convert_model(model const &m) const
Definition: z3++.h:3200
unsigned h() const
Definition: z3++.h:3466
expr srem(expr const &a, expr const &b)
signed remainder operator for bitvectors
Definition: z3++.h:2281
Z3_ast Z3_API Z3_mk_bvsle(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed less than or equal to.
Z3_string Z3_API Z3_optimize_to_string(Z3_context c, Z3_optimize o)
Print the current context as a string.
expr operator&(expr const &a, expr const &b)
Definition: z3++.h:2023
expr set_intersect(expr const &a, expr const &b)
Definition: z3++.h:4243
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.
exception(char const *msg)
Definition: z3++.h:123
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...
expr mapi(expr const &f, expr const &i, expr const &list)
Definition: z3++.h:2615
solver(solver const &s)
Definition: z3++.h:2907
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_lbool
Lifted Boolean type: false, undefined, true.
Definition: z3_api.h:57
Z3_string Z3_API Z3_get_full_version(void)
Return a string that fully describes the version of Z3 in use.
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_sort Z3_API Z3_mk_fpa_rounding_mode_sort(Z3_context c)
Create the RoundingMode sort.
unsigned Z3_API Z3_get_app_num_args(Z3_context c, Z3_app a)
Return the number of argument of an application. If t is an constant, then the number of arguments is...
friend expr max(expr const &a, expr const &b)
Definition: z3++.h:2054
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...
bool Z3_API Z3_rcf_ge(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a >= b.
expr fpa_const(char const *name, unsigned ebits, unsigned sbits)
Definition: z3++.h:3967
virtual void pop(unsigned num_scopes)=0
Z3_rcf_num Z3_API Z3_rcf_mk_small_int(Z3_context c, int val)
Return a RCF small integer.
void Z3_API Z3_goal_dec_ref(Z3_context c, Z3_goal g)
Decrement the reference counter of the given goal.
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. ...
expr select(expr const &a, expr const &i)
forward declarations
Definition: z3++.h:4148
expr re_intersect(expr_vector const &args)
Definition: z3++.h:4325
friend expr ubv_to_fpa(expr const &t, sort s)
Conversion of an unsigned bit-vector term into a floating-point.
Definition: z3++.h:2155
Z3_ast Z3_API Z3_mk_fpa_is_infinite(Z3_context c, Z3_ast t)
Predicate indicating whether t is a floating-point number representing +oo or -oo.
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...
~apply_result() override
Definition: z3++.h:3238
expr foldli(expr const &f, expr const &i, expr const &a, expr const &list)
Definition: z3++.h:2629
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...
ast_vector_tpl< sort > sort_vector
Definition: z3++.h:78
std::function< void(expr const &proof, std::vector< unsigned > const &deps, expr_vector const &clause)> on_clause_eh_t
Definition: z3++.h:4492
void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name)
load solver assertions from a file.
expr mk_xor(expr_vector const &args)
Definition: z3++.h:2648
expr foldl(expr const &f, expr const &a, expr const &list)
Definition: z3++.h:2622
void add(expr const &e)
Definition: z3++.h:3494
expr congruence_root(expr const &t) const
Definition: z3++.h:2999
Z3_ast Z3_API Z3_get_numerator(Z3_context c, Z3_ast a)
Return the numerator (as a numeral AST) of a numeral AST of sort Real.
expr prefixof(expr const &a, expr const &b)
Definition: z3++.h:4282
void Z3_API Z3_set_error_handler(Z3_context c, Z3_error_handler h)
Register a Z3 error handler.
expr sdiv(expr const &a, expr const &b)
signed division operator for bitvectors.
Definition: z3++.h:2267
void Z3_API Z3_enable_trace(Z3_string tag)
Enable tracing messages tagged as tag when Z3 is compiled in debug mode. It is a NOOP otherwise...
Z3_ast Z3_API Z3_mk_ubv_to_str(Z3_context c, Z3_ast s)
Unsigned bit-vector to string conversion.
Z3_parameter_kind kind() const
Definition: z3++.h:2881
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...
bool Z3_API Z3_rcf_is_algebraic(Z3_context c, Z3_rcf_num a)
Return true if a represents an algebraic number.
func_interp(func_interp const &s)
Definition: z3++.h:2689
Z3_decl_kind decl_kind() const
Definition: z3++.h:841
sort datatype(symbol const &name, constructors const &cs)
Create a recursive datatype over a single sort. name is the name of the recursive datatype n - the nu...
Definition: z3++.h:3772
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...
model & operator=(model const &s)
Definition: z3++.h:2726
rcf_num(context &c, int val)
Definition: z3++.h:4842
void Z3_API Z3_model_dec_ref(Z3_context c, Z3_model m)
Decrement the reference counter of the given model.
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...
expr operator%(expr const &a, expr const &b)
Definition: z3++.h:1739
expr_vector parse_file(char const *file)
Definition: z3++.h:4360
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.
bool operator>=(rcf_num const &other) const
Definition: z3++.h:4949
bool operator<=(rcf_num const &other) const
Definition: z3++.h:4944
Z3_string Z3_API Z3_get_string(Z3_context c, Z3_ast s)
Retrieve the string constant stored in s. Characters outside the basic printable ASCII range are esca...
~func_entry() override
Definition: z3++.h:2667
Z3_ast Z3_API Z3_mk_rotate_right(Z3_context c, unsigned i, Z3_ast t1)
Rotate bits of t1 to the right i times.
tactic par_and_then(tactic const &t1, tactic const &t2)
Definition: z3++.h:3332
unsigned Z3_API Z3_param_descrs_size(Z3_context c, Z3_param_descrs p)
Return the number of parameters in the given parameter description set.
friend expr operator==(expr const &a, expr const &b)
Definition: z3++.h:1793
void set(char const *param, bool value)
Set global parameter param with Boolean value.
Definition: z3++.h:156
unsigned Z3_API Z3_model_get_num_consts(Z3_context c, Z3_model m)
Return the number of constants assigned by the given model.
expr loop(unsigned lo)
create a looping regular expression.
Definition: z3++.h:1637
stats statistics() const
Definition: z3++.h:3571
func_entry entry(unsigned i) const
Definition: z3++.h:2701
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...
void add(expr const &e)
Definition: z3++.h:2937
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_mk_fpa_to_ieee_bv(Z3_context c, Z3_ast t)
Conversion of a floating-point term into a bit-vector term in IEEE 754-2008 format.
bool is_relation() const
Return true if this is a Relation expression.
Definition: z3++.h:918
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_mul(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point multiplication.
unsigned Z3_API Z3_goal_size(Z3_context c, Z3_goal g)
Return the number of formulas in the given goal.
bool is_bool() const
Return true if this sort is the Boolean sort.
Definition: z3++.h:746
void resize(unsigned sz)
Definition: z3++.h:526
expr ugt(expr const &a, expr const &b)
unsigned greater than operator for bitvectors.
Definition: z3++.h:2260
Z3_ast Z3_API Z3_mk_fpa_is_normal(Z3_context c, Z3_ast t)
Predicate indicating whether t is a normal floating-point number.
Z3_ast Z3_API Z3_mk_bvxnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise xnor.
goal & operator=(goal const &s)
Definition: z3++.h:3182
expr option(expr const &re)
Definition: z3++.h:4309
void enable_trace(char const *tag)
Enable tracing messages tagged as tag when Z3 is compiled in debug mode. It is a NOOP otherwise...
Definition: z3++.h:104
Z3_sort Z3_API Z3_get_array_sort_domain(Z3_context c, Z3_sort t)
Return the domain of the given array sort. In the case of a multi-dimensional array, this function returns the sort of the first dimension.
expr const_array(sort const &d, expr const &v)
Definition: z3++.h:4215
stats(stats const &s)
Definition: z3++.h:2826
T const * ptr() const
Definition: z3++.h:530
cube_iterator operator++(int)
Definition: z3++.h:3126
Z3_ast_vector Z3_API Z3_fixedpoint_get_rules(Z3_context c, Z3_fixedpoint f)
Retrieve set of rules from fixedpoint context.
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...
expr set_member(expr const &s, expr const &e)
Definition: z3++.h:4259
Z3_model Z3_API Z3_mk_model(Z3_context c)
Create a fresh model object. It has reference count 0.
unsigned id() const
retrieve unique identifier for func_decl.
Definition: z3++.h:733
bool is_distinct() const
Definition: z3++.h:1390
friend std::ostream & operator<<(std::ostream &out, model const &m)
Definition: z3++.h:2815
bool Z3_API Z3_rcf_lt(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a < b.
bool is_or() const
Definition: z3++.h:1385
void Z3_API Z3_solver_import_model_converter(Z3_context ctx, Z3_solver src, Z3_solver dst)
Ad-hoc method for importing model conversion from solver.
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.
Z3_rcf_num Z3_API Z3_rcf_inv(Z3_context c, Z3_rcf_num a)
Return the value 1/a.
int Z3_API Z3_get_symbol_int(Z3_context c, Z3_symbol s)
Return the symbol int value.
bool is_not() const
Definition: z3++.h:1383
void Z3_API Z3_params_dec_ref(Z3_context c, Z3_params p)
Decrement the reference counter of the given parameter set.
void Z3_API Z3_optimize_dec_ref(Z3_context c, Z3_optimize d)
Decrement the reference counter of the given optimize context.
sort uninterpreted_sort(char const *name)
create an uninterpreted sort with the name given by the string or symbol.
Definition: z3++.h:3820
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...
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...
goal operator[](int i) const
Definition: z3++.h:3248
check_result check(expr_vector const &assumptions)
Definition: z3++.h:2965
unsigned num_sorts() const
Definition: z3++.h:2788
unsigned fpa_ebits() const
Definition: z3++.h:799
expr_vector trail() const
Definition: z3++.h:2988
iterator end()
Definition: z3++.h:1705
void reset()
Definition: z3++.h:3196
Z3_ast Z3_API Z3_mk_bvsmod(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed remainder (sign follows divisor).
bool is_numeral(double &d) const
Definition: z3++.h:954
T * ptr()
Definition: z3++.h:531
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.
bool is_implies() const
Definition: z3++.h:1387
params(params const &s)
Definition: z3++.h:595
Z3_ast Z3_API Z3_func_entry_get_value(Z3_context c, Z3_func_entry e)
Return the value of this point.
expr_vector algebraic_poly() const
Return coefficients for p of an algebraic number (root-obj p i)
Definition: z3++.h:1103
std::string to_decimal(unsigned precision=10) const
Return decimal string representation with given precision.
Definition: z3++.h:4883
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 set_param(char const *param, char const *value)
Definition: z3++.h:81
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_bvult(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned less than.
expr bv2int(expr const &a, bool is_signed)
bit-vector and integer conversions.
Definition: z3++.h:2328
friend void check_context(object const &a, object const &b)
Definition: z3++.h:544
Z3_string Z3_API Z3_goal_to_string(Z3_context c, Z3_goal g)
Convert a goal into a string.
Z3_rcf_num Z3_API Z3_rcf_mk_pi(Z3_context c)
Return Pi.
parameter(expr const &e, unsigned idx)
Definition: z3++.h:2876
handle maximize(expr const &e)
Definition: z3++.h:3532
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 Z3_API Z3_mk_int2bv(Z3_context c, unsigned n, Z3_ast t1)
Create an n bit bit-vector from the integer argument t1.
func_decl decl() const
Return the declaration associated with this application. This method assumes the expression is an app...
Definition: z3++.h:1259
unsigned size() const
Definition: z3++.h:664
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.
bool is_seq() const
Return true if this is a sequence expression.
Definition: z3++.h:922
std::u32string get_u32string() const
for a string value expression return an unespaced string value.
Definition: z3++.h:1242
Z3_param_kind
The different kinds of parameters that can be associated with parameter sets. (see Z3_mk_params)...
Definition: z3_api.h:1305
friend expr bvsdiv_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:2346
bool Z3_API Z3_get_numeral_int(Z3_context c, Z3_ast v, int *i)
Similar to Z3_get_numeral_string, but only succeeds if the value can fit in a machine int...
friend probe operator<=(probe const &p1, probe const &p2)
Definition: z3++.h:3422
friend expr operator&&(expr const &a, expr const &b)
Return an expression representing a and b.
Definition: z3++.h:1768
expr get_cover_delta(int level, func_decl &p)
Definition: z3++.h:3616
Z3_string Z3_API Z3_get_numeral_string(Z3_context c, Z3_ast a)
Return numeral value, as a decimal string of a numeric constant term.
bool Z3_API Z3_is_string(Z3_context c, Z3_ast s)
Determine if s is a string constant.
expr int_const(char const *name)
Definition: z3++.h:3963
Z3_ast Z3_API Z3_mk_rem(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 rem arg2.
friend expr operator&(expr const &a, expr const &b)
Definition: z3++.h:2023
friend std::ostream & operator<<(std::ostream &out, exception const &e)
Definition: z3++.h:128
expr arg(unsigned i) const
Definition: z3++.h:2678
expr abs(expr const &a)
Definition: z3++.h:2082
bool operator==(iterator const &other) const noexcept
Definition: z3++.h:1693
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.
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.
bool Z3_API Z3_get_numeral_int64(Z3_context c, Z3_ast v, int64_t *i)
Similar to Z3_get_numeral_string, but only succeeds if the value can fit in a machine int64_t int...
expr sbvtos() const
Definition: z3++.h:1607
unsigned num_args() const
Return the number of arguments in this application. This method assumes the expression is an applicat...
Definition: z3++.h:1266
virtual void decide(expr const &, unsigned, bool)
Definition: z3++.h:4750
void register_decide(decide_eh_t &c)
Definition: z3++.h:4718
Z3_symbol_kind
The different kinds of symbol. In Z3, a symbol can be represented using integers and strings (See Z3_...
Definition: z3_api.h:71
expr sum(expr_vector const &args)
Definition: z3++.h:2546
Z3_string Z3_API Z3_get_numeral_binary_string(Z3_context c, Z3_ast a)
Return numeral value, as a binary string of a numeric constant term.
Z3_ast Z3_API Z3_mk_re_plus(Z3_context c, Z3_ast re)
Create the regular language re+.
Z3_ast Z3_API Z3_mk_fpa_eq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point equality.
Z3_ast Z3_API Z3_simplify(Z3_context c, Z3_ast a)
Interface to simplifier.
sort(context &c)
Definition: z3++.h:725
expr_vector from_string(char const *s)
Definition: z3++.h:3593
Z3_model Z3_API Z3_optimize_get_model(Z3_context c, Z3_optimize o)
Retrieve the model for the last Z3_optimize_check.
virtual void created(expr const &)
Definition: z3++.h:4748
rcf_num operator*(rcf_num const &other) const
Definition: z3++.h:4900
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_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.
goal(context &c, bool models=true, bool unsat_cores=false, bool proofs=false)
Definition: z3++.h:3177
expr array_ext(expr const &a, expr const &b)
Definition: z3++.h:4197
expr suffixof(expr const &a, expr const &b)
Definition: z3++.h:4276
void from_file(char const *filename)
Definition: z3++.h:3573
void Z3_API Z3_interrupt(Z3_context c)
Interrupt the execution of a Z3 procedure. This procedure can be used to interrupt: solvers...
expr_vector const * operator->() const
Definition: z3++.h:3127
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.
check_result consequences(expr_vector &assumptions, expr_vector &vars, expr_vector &conseq)
Definition: z3++.h:2977
unsigned algebraic_i() const
Return i of an algebraic number (root-obj p i)
Definition: z3++.h:1113
bool is_app() const
Return true if this expression is an application.
Definition: z3++.h:965
std::string to_string() const
Definition: z3++.h:2813
friend tactic operator&(tactic const &t1, tactic const &t2)
Definition: z3++.h:3293
expr operator<(expr const &a, expr const &b)
Definition: z3++.h:1979
object(context &c)
Definition: z3++.h:538
friend expr operator>(expr const &a, expr const &b)
Definition: z3++.h:2001
unsigned size() const
Definition: z3++.h:3191
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_rcf_num Z3_API Z3_rcf_mk_e(Z3_context c)
Return e (Euler's constant)
handle add(expr const &e, unsigned weight)
Definition: z3++.h:3518
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.
fixedpoint & operator=(fixedpoint const &o)
Definition: z3++.h:3585
ast(context &c)
Definition: z3++.h:621
rcf_num inv() const
Return the multiplicative inverse (1/this).
Definition: z3++.h:4928
Z3_symbol_kind kind() const
Definition: z3++.h:551
param_descrs get_param_descrs()
Definition: z3++.h:3361
friend expr nand(expr const &a, expr const &b)
Definition: z3++.h:2035
void set(params const &p)
Definition: z3++.h:3626
rcf_num rcf_e(context &c)
Create an RCF numeral representing e (Euler's constant).
Definition: z3++.h:4996
expr fp_eq(expr const &a, expr const &b)
Definition: z3++.h:2109
expr atleast(expr_vector const &es, unsigned bound)
Definition: z3++.h:2538
friend tactic with(tactic const &t, params const &p)
Definition: z3++.h:3313
Z3_ast Z3_API Z3_mk_fpa_is_nan(Z3_context c, Z3_ast t)
Predicate indicating whether t is a NaN.
Z3_ast Z3_API Z3_mk_bvor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise or.
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...
bool Z3_API Z3_rcf_gt(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a > b.
bool Z3_API Z3_is_seq_sort(Z3_context c, Z3_sort s)
Check if s is a sequence sort.
expr real_const(char const *name)
Definition: z3++.h:3964
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.
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.
~solver() override
Definition: z3++.h:2909
sort(context &c, Z3_ast a)
Definition: z3++.h:727
friend expr sbv_to_fpa(expr const &t, sort s)
Conversion of a signed bit-vector term into a floating-point.
Definition: z3++.h:2148
stats statistics() const
Definition: z3++.h:3622
model get_model() const
Definition: z3++.h:3556
context & ctx()
Definition: z3++.h:4626
func_interp get_func_interp(func_decl f) const
Definition: z3++.h:2763
friend probe operator==(probe const &p1, probe const &p2)
Definition: z3++.h:3442
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...
bool is_numeral(std::string &s, unsigned precision) const
Definition: z3++.h:953
Z3_ast Z3_API Z3_mk_repeat(Z3_context c, unsigned i, Z3_ast t1)
Repeat the given bit-vector up length i.
~rcf_num()
Definition: z3++.h:4866
void conflict(expr_vector const &fixed)
Definition: z3++.h:4782
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_get_decl_ast_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the expression value associated with an expression parameter.
bool operator!=(iterator const &other) const noexcept
Definition: z3++.h:699
expr algebraic_lower(unsigned precision) const
Definition: z3++.h:1086
bool is_eq() const
Definition: z3++.h:1388
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.
double Z3_API Z3_get_numeral_double(Z3_context c, Z3_ast a)
Return numeral as a double.
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_string Z3_API Z3_solver_to_string(Z3_context c, Z3_solver s)
Convert a solver into a string.
Z3_sort_kind sort_kind() const
Return the internal sort kind.
Definition: z3++.h:738
bool is_numeral(std::string &s) const
Definition: z3++.h:952
bool is_arith() const
Return true if this sort is the Integer or Real sort.
Definition: z3++.h:758
Z3_ast Z3_API Z3_mk_re_star(Z3_context c, Z3_ast re)
Create the regular language re*.
std::string dimacs(bool include_names=true) const
Definition: z3++.h:3072
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.
Definition: z3++.h:2363
friend expr fma(expr const &a, expr const &b, expr const &c, expr const &rm)
FloatingPoint fused multiply-add.
Definition: z3++.h:2118
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.
expr mk_is_zero() const
Return Boolean expression to test for whether an FP expression is a zero.
Definition: z3++.h:1045
Z3_ast_vector Z3_API Z3_ast_vector_translate(Z3_context s, Z3_ast_vector v, Z3_context t)
Translate the AST vector v from context s into an AST vector in context t.
Z3_model Z3_API Z3_model_translate(Z3_context c, Z3_model m, Z3_context dst)
translate model from context c to context dst.
void from_file(char const *file)
Definition: z3++.h:2951
Z3_sort Z3_API Z3_get_domain(Z3_context c, Z3_func_decl d, unsigned i)
Return the sort of the i-th parameter of the given function declaration.
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.
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...
Definition: z3++.h:171
void Z3_API Z3_optimize_pop(Z3_context c, Z3_optimize d)
Backtrack one level.
Z3_ast Z3_API Z3_mk_fpa_neg(Z3_context c, Z3_ast t)
Floating-point negation.
Z3_ast Z3_API Z3_mk_is_int(Z3_context c, Z3_ast t1)
Check if a real number is an integer.
Z3_sort Z3_API Z3_mk_real_sort(Z3_context c)
Create the real type.
friend expr pbeq(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2522
expr at(expr const &index) const
Definition: z3++.h:1575
unsigned Z3_API Z3_get_ast_id(Z3_context c, Z3_ast t)
Return a unique identifier for t. The identifier is unique up to structural equality. Thus, two ast nodes created by the same context and having the same children and same function symbols have the same identifiers. Ast nodes created in the same context, but having different children or different functions have different identifiers. Variables and quantifiers are also assigned different identifiers according to their structure.
bool operator==(iterator const &other) const noexcept
Definition: z3++.h:696
void add(expr_vector const &v)
Definition: z3++.h:3190
Z3_string Z3_API Z3_get_numeral_decimal_string(Z3_context c, Z3_ast a, unsigned precision)
Return numeral as a string in decimal notation. The result has at most precision decimal places...
Z3_ast Z3_API Z3_mk_set_member(Z3_context c, Z3_ast elem, Z3_ast set)
Check for set membership.
expr_vector trail(array< unsigned > &levels) const
Definition: z3++.h:2989
bool operator!=(cube_iterator const &other) const noexcept
Definition: z3++.h:3133
Z3_ast Z3_API Z3_mk_fpa_rna(Z3_context c)
Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode...
expr empty(sort const &s)
Definition: z3++.h:4271
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.
bool is_well_sorted() const
Return true if this expression is well sorted (aka type correct).
Definition: z3++.h:1000
Z3_ast Z3_API Z3_mk_seq_extract(Z3_context c, Z3_ast s, Z3_ast offset, Z3_ast length)
Extract subsequence starting at offset of length.
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_fpa_add(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point addition.
Z3_config Z3_API Z3_mk_config(void)
Create a configuration object for the Z3 context object.
Z3_ast Z3_API Z3_mk_char_to_int(Z3_context c, Z3_ast ch)
Create an integer (code point) from character.
cube_generator(solver &s, expr_vector &vars)
Definition: z3++.h:3152
friend tactic par_and_then(tactic const &t1, tactic const &t2)
Definition: z3++.h:3332
rcf_num operator+(rcf_num const &other) const
Definition: z3++.h:4888
char const * what() const
Definition: z3++.h:125
sort real_sort()
Return the Real sort.
Definition: z3++.h:3660
void set(char const *k, unsigned v)
Definition: z3++.h:2920
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.
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.
virtual ~user_propagator_base()
Definition: z3++.h:4619
friend std::ostream & operator<<(std::ostream &out, ast_vector_tpl const &v)
Definition: z3++.h:715
expr re_full(sort const &s)
Definition: z3++.h:4320
Z3_sort Z3_API Z3_get_range(Z3_context c, Z3_func_decl d)
Return the range of the given declaration.
bool inconsistent() const
Definition: z3++.h:3194
bool is_const() const
Return true if this expression is a constant (i.e., an application with 0 arguments).
Definition: z3++.h:969
expr arg(unsigned i) const
Return the i-th argument of this application. This method assumes the expression is an application...
Definition: z3++.h:1274
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 -...
ast_vector_tpl(ast_vector_tpl const &s)
Definition: z3++.h:659
rcf_num power(unsigned k) const
Return the power of this number raised to k.
Definition: z3++.h:4920
friend expr rem(expr const &a, expr const &b)
Definition: z3++.h:1744
expr num_val(int n, sort const &s)
Definition: z3++.h:4021
expr update(expr_vector const &args) const
Update the arguments of this application. Return a new expression with the same function declaration ...
Definition: z3++.h:4475
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. ...
bool eq(ast const &a, ast const &b)
Definition: z3++.h:650
Z3_string Z3_API Z3_stats_to_string(Z3_context c, Z3_stats s)
Convert a statistics into a string.
unsigned num_consts() const
Definition: z3++.h:2744
expr map(expr const &f, expr const &list)
Definition: z3++.h:2608
symbol int_symbol(int n)
Create a Z3 symbol based on the given integer.
Definition: z3++.h:3656
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...
expr loop(unsigned lo, unsigned hi)
Definition: z3++.h:1642
void add(expr_vector const &v)
Definition: z3++.h:2946
~stats() override
Definition: z3++.h:2827
expr fpa_val(double n)
Definition: z3++.h:4011
func_decl transitive_closure(func_decl const &)
Definition: z3++.h:845
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.
expr bvmul_no_overflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:2352
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_gt(Z3_context c, Z3_ast t1, Z3_ast t2)
Create greater than.
friend probe operator>(probe const &p1, probe const &p2)
Definition: z3++.h:3437
expr indexof(expr const &s, expr const &substr, expr const &offset)
Definition: z3++.h:4288
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...
expr set_complement(expr const &a)
Definition: z3++.h:4255
unsigned num_funcs() const
Definition: z3++.h:2745
bool is_algebraic() const
Return true if expression is an algebraic number.
Definition: z3++.h:995
expr operator()() const
Definition: z3++.h:4044
Z3_string Z3_API Z3_rcf_num_to_decimal_string(Z3_context c, Z3_rcf_num a, unsigned prec)
Convert the RCF numeral into a string in decimal notation.
Z3_constructor operator[](unsigned i) const
Definition: z3++.h:3742
expr_vector non_units() const
Definition: z3++.h:2986
Z3_parameter_kind
The different kinds of parameters that can be associated with function symbols.
Definition: z3_api.h:93
iterator(expr &e, unsigned i)
Definition: z3++.h:1692
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_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...
param_descrs & operator=(param_descrs const &o)
Definition: z3++.h:571
expr operator>(expr const &a, expr const &b)
Definition: z3++.h:2001
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].
check_result to_check_result(Z3_lbool l)
Definition: z3++.h:178
expr star(expr const &re)
Definition: z3++.h:4312
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.
friend expr operator~(expr const &a)
Definition: z3++.h:2116
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.
expr operator==(expr const &a, expr const &b)
Definition: z3++.h:1793
Z3_rcf_num Z3_API Z3_rcf_mul(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return the value a * b.
Z3_solver Z3_API Z3_mk_simple_solver(Z3_context c)
Create a new incremental solver.
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_implies(Z3_context c, Z3_ast t1, Z3_ast t2)
Create an AST node representing t1 implies t2.
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...
param_descrs(context &c, Z3_param_descrs d)
Definition: z3++.h:569
void Z3_API Z3_set_param_value(Z3_config c, Z3_string param_id, Z3_string param_value)
Set a configuration parameter.
friend tactic repeat(tactic const &t, unsigned max)
Definition: z3++.h:3307
expr operator|(expr const &a, expr const &b)
Definition: z3++.h:2031
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_bvnot(Z3_context c, Z3_ast t1)
Bitwise negation.
Z3_ast Z3_API Z3_mk_fpa_div(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point division.
friend tactic par_or(unsigned n, tactic const *tactics)
Definition: z3++.h:3323
expr pbge(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2514
Z3_ast Z3_API Z3_mk_re_empty(Z3_context c, Z3_sort re)
Create an empty regular expression of sort re.
friend expr abs(expr const &a)
Definition: z3++.h:2082
tactic(context &c, Z3_tactic s)
Definition: z3++.h:3261
void check_context(object const &a, object const &b)
Definition: z3++.h:544
expr char_to_int() const
Definition: z3++.h:1612
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.
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...
bool Z3_API Z3_rcf_is_infinitesimal(Z3_context c, Z3_rcf_num a)
Return true if a represents an infinitesimal.
Z3_ast Z3_API Z3_mk_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.
expr mk_from_ieee_bv(sort const &s) const
Convert this IEEE BV into a fpa.
Definition: z3++.h:1065
virtual user_propagator_base * fresh(context &ctx)=0
user_propagators created using fresh() are created during search and their lifetimes are restricted t...
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_string Z3_API Z3_fixedpoint_get_help(Z3_context c, Z3_fixedpoint f)
Return a string describing all fixedpoint available parameters.
expr bool_const(char const *name)
create uninterpreted constants of a given sort.
Definition: z3++.h:3962
expr urem(expr const &a, expr const &b)
unsigned reminder operator for bitvectors
Definition: z3++.h:2295
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_params_set_double(Z3_context c, Z3_params p, Z3_symbol k, double v)
Add a double parameter k with value v to the parameter set p.
expr sbv_to_fpa(expr const &t, sort s)
Definition: z3++.h:2148
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_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.
expr operator&&(expr const &a, expr const &b)
Definition: z3++.h:1768
double apply(goal const &g) const
Definition: z3++.h:3400
expr extract(expr const &offset, expr const &length) const
sequence and regular expression operations.
Definition: z3++.h:1554
optimize(context &c, optimize const &src, translate)
Definition: z3++.h:3469
rounding_mode
Definition: z3++.h:170
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_string Z3_API Z3_get_symbol_string(Z3_context c, Z3_symbol s)
Return the symbol name.
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_get_algebraic_number_upper(Z3_context c, Z3_ast a, unsigned precision)
Return a upper bound for the given real algebraic number. The interval isolating the number is smalle...
symbol get_symbol() const
Definition: z3++.h:2885
#define _Z3_MK_BIN_(a, b, binop)
Definition: z3++.h:1709
void set_rounding_mode(rounding_mode rm)
Sets RoundingMode of FloatingPoints.
Definition: z3++.h:3972
friend expr ite(expr const &c, expr const &t, expr const &e)
Create the if-then-else expression ite(c, t, e)
Definition: z3++.h:2181
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_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.
std::string dimacs(bool include_names=true) const
Definition: z3++.h:3224
expr_vector rules() const
Definition: z3++.h:3625
friend expr nor(expr const &a, expr const &b)
Definition: z3++.h:2036
params & operator=(params const &s)
Definition: z3++.h:598
friend std::ostream & operator<<(std::ostream &out, symbol const &s)
Definition: z3++.h:557
Z3_sort_kind Z3_API Z3_get_sort_kind(Z3_context c, Z3_sort t)
Return the sort kind (e.g., array, tuple, int, bool, etc).
model(model const &s)
Definition: z3++.h:2722
Z3_param_descrs Z3_API Z3_get_global_param_descrs(Z3_context c)
Retrieve description of global parameters.
unsigned hi() const
Definition: z3++.h:1507
check_result query(func_decl_vector &relations)
Definition: z3++.h:3606
Z3_lbool Z3_API Z3_get_bool_value(Z3_context c, Z3_ast a)
Return Z3_L_TRUE if a is true, Z3_L_FALSE if it is false, and Z3_L_UNDEF otherwise.
probe(probe const &s)
Definition: z3++.h:3390
Z3_param_kind Z3_API Z3_param_descrs_get_kind(Z3_context c, Z3_param_descrs p, Z3_symbol n)
Return the kind associated with the given parameter name n.
iterator(ast_vector_tpl const *v, unsigned i)
Definition: z3++.h:694
Definition: z3++.h:175
friend expr operator<(expr const &a, expr const &b)
Definition: z3++.h:1979
bool operator<(rcf_num const &other) const
Definition: z3++.h:4934
friend expr operator!(expr const &a)
Return an expression representing not(a).
Definition: z3++.h:1762
class for auxiliary parameters associated with func_decl The class is initialized with a func_decl or...
Definition: z3++.h:2864
Z3_ast Z3_API Z3_mk_bvredor(Z3_context c, Z3_ast t1)
Take disjunction of bits in vector, return vector of length 1.
virtual ~exception()=default
friend expr bvsub_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:2340
solver(context &c, solver const &src, translate)
Definition: z3++.h:2906
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_goal_prec precision() const
Definition: z3++.h:3193
solver(context &c)
Definition: z3++.h:2902
expr get_expr() const
Definition: z3++.h:2882
unsigned Z3_API Z3_get_func_decl_id(Z3_context c, Z3_func_decl f)
Return a unique identifier for f.
void Z3_API Z3_apply_result_dec_ref(Z3_context c, Z3_apply_result r)
Decrement the reference counter of the given Z3_apply_result object.
Z3_ast Z3_API Z3_mk_re_full(Z3_context c, Z3_sort re)
Create an universal regular expression of sort re.
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.
friend expr sum(expr_vector const &args)
Definition: z3++.h:2546
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...
expr lambda(expr const &x, expr const &b)
Definition: z3++.h:2481
parameter(func_decl const &d, unsigned idx)
Definition: z3++.h:2871
Z3_ast Z3_API Z3_mk_bvsub(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement subtraction.
bool Z3_API Z3_is_quantifier_forall(Z3_context c, Z3_ast a)
Determine if an ast is a universal quantifier.
func_decl get_decl() const
Definition: z3++.h:2884
func_decl(context &c, Z3_func_decl n)
Definition: z3++.h:829
Z3_ast Z3_API Z3_mk_bvand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise and.
Z3_ast_vector Z3_API Z3_fixedpoint_get_assertions(Z3_context c, Z3_fixedpoint f)
Retrieve set of background assertions from fixedpoint context.
ast_vector_tpl< ast > ast_vector
Definition: z3++.h:75
bool is_decided_unsat() const
Definition: z3++.h:3199
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.
handle minimize(expr const &e)
Definition: z3++.h:3535
expr mk_is_subnormal() const
Return Boolean expression to test for whether an FP expression is a subnormal.
Definition: z3++.h:1035
friend probe operator<(probe const &p1, probe const &p2)
Definition: z3++.h:3432
Z3_ast Z3_API Z3_mk_atleast(Z3_context c, unsigned num_args, Z3_ast const args[], unsigned k)
Pseudo-Boolean relations.
expr_vector assertions() const
Definition: z3++.h:2985
cube_iterator & operator++()
Definition: z3++.h:3116
void Z3_API Z3_goal_inc_ref(Z3_context c, Z3_goal g)
Increment the reference counter of the given goal.
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_seq_map(Z3_context c, Z3_ast f, Z3_ast s)
Create a map of the function f over the sequence s.
sort get_sort() const
Return the sort of this expression.
Definition: z3++.h:885
friend probe operator&&(probe const &p1, probe const &p2)
Definition: z3++.h:3447
void set(char const *k, double v)
Definition: z3++.h:2921
void add(expr const &e, expr const &p)
Definition: z3++.h:2938
Z3_ast Z3_API Z3_get_quantifier_body(Z3_context c, Z3_ast a)
Return body of quantifier.
expr store(expr const &a, expr const &i, expr const &v)
Definition: z3++.h:4165
rcf_num rcf_infinitesimal(context &c)
Create an RCF numeral representing an infinitesimal.
Definition: z3++.h:5003
Z3_ast Z3_API Z3_mk_fpa_geq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point greater than or equal.
virtual ~object()=default
expr congruence_explain(expr const &a, expr const &b) const
Definition: z3++.h:3011
bool is_exists() const
Return true if this expression is an existential quantifier.
Definition: z3++.h:982
void Z3_API Z3_get_version(unsigned *major, unsigned *minor, unsigned *build_number, unsigned *revision_number)
Return Z3 version number information.
Z3_lbool Z3_API Z3_fixedpoint_query(Z3_context c, Z3_fixedpoint d, Z3_ast query)
Pose a query against the asserted rules.
Z3_sort Z3_API Z3_mk_bool_sort(Z3_context c)
Create the Boolean type.
void set(char const *k, unsigned n)
Definition: z3++.h:606
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...
iterator begin() const noexcept
Definition: z3++.h:713
expr_vector const & operator*() const noexcept
Definition: z3++.h:3128
friend expr pble(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2506
Z3_ast Z3_API Z3_mk_fpa_sub(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point subtraction.
std::string key(unsigned i) const
Definition: z3++.h:2837
unsigned Z3_API Z3_rcf_mk_roots(Z3_context c, unsigned n, Z3_rcf_num const a[], Z3_rcf_num roots[])
Store in roots the roots of the polynomial a[n-1]*x^{n-1} + ... + a[0]. The output vector roots must ...
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.
bool is_relation() const
Return true if this sort is a Relation sort.
Definition: z3++.h:774
Z3_ast m_ast
Definition: z3++.h:619
Z3_ast Z3_API Z3_mk_bvudiv(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned division.
void set(char const *k, bool b)
Definition: z3++.h:605
rcf_num operator-(rcf_num const &other) const
Definition: z3++.h:4894
Z3_rcf_num Z3_API Z3_rcf_mk_rational(Z3_context c, Z3_string val)
Return a RCF rational using the given string.
tactic repeat(tactic const &t, unsigned max=UINT_MAX)
Definition: z3++.h:3307
expr bool_val(bool b)
Definition: z3++.h:3985
bool Z3_API Z3_rcf_is_rational(Z3_context c, Z3_rcf_num a)
Return true if a represents a rational number.
~context()
Definition: z3++.h:235
expr operator||(expr const &a, expr const &b)
Definition: z3++.h:1780
expr ult(expr const &a, expr const &b)
unsigned less than operator for bitvectors.
Definition: z3++.h:2248
bool Z3_API Z3_rcf_le(Z3_context c, Z3_rcf_num a, Z3_rcf_num b)
Return true if a <= b.
void Z3_API Z3_params_inc_ref(Z3_context c, Z3_params p)
Increment the reference counter of the given parameter set.
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...
unsigned num_parameters() const
Definition: z3++.h:842
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...
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_params_set_symbol(Z3_context c, Z3_params p, Z3_symbol k, Z3_symbol v)
Add a symbol parameter k with value v to the parameter set p.
bool is_int() const
Return true if this is an integer expression.
Definition: z3++.h:894
friend expr pbge(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2514
apply_result apply(goal const &g) const
Definition: z3++.h:3273
expr int_val(int n)
Definition: z3++.h:3987
bool is_arith() const
Return true if this is an integer or real expression.
Definition: z3++.h:902
void Z3_API Z3_global_param_reset_all(void)
Restore the value of all global (and module) parameters. This command will not affect already created...
Z3_context ctx() const
Definition: z3++.h:4871
void Z3_API Z3_model_inc_ref(Z3_context c, Z3_model m)
Increment the reference counter of the given model.
unsigned Z3_API Z3_optimize_minimize(Z3_context c, Z3_optimize o, Z3_ast t)
Add a minimization constraint.
model get_model() const
Definition: z3++.h:2976
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_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.
expr else_value() const
Definition: z3++.h:2699
expr mk_or(expr_vector const &args)
Definition: z3++.h:2636
tactic fail_if(probe const &p)
Definition: z3++.h:3637
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_param_kind kind(symbol const &s)
Definition: z3++.h:584
stats(context &c, Z3_stats e)
Definition: z3++.h:2825
bool is_rational() const
Definition: z3++.h:4965
expr exists(expr const &x, expr const &b)
Definition: z3++.h:2457
expr round_fpa_to_closest_integer(expr const &t)
Definition: z3++.h:2169
std::string to_string()
Definition: z3++.h:3629
expr sge(expr const &a, expr const &b)
signed greater than or equal to operator for bitvectors.
Definition: z3++.h:2228
ast operator()(context &c, Z3_ast a)
Definition: z3++.h:2393
Z3_ast Z3_API Z3_mk_atmost(Z3_context c, unsigned num_args, Z3_ast const args[], unsigned k)
Pseudo-Boolean relations.
Definition: z3++.h:173
expr rotate_right(unsigned i) const
Definition: z3++.h:1493
Z3_symbol Z3_API Z3_mk_int_symbol(Z3_context c, int i)
Create a Z3 symbol using an integer.
expr_vector parse_string(char const *s)
parsing
Definition: z3++.h:4354
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.
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.
Z3_ast Z3_API Z3_mk_bvmul(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement multiplication.
rcf_num operator-() const
Definition: z3++.h:4912
context(config &c)
Definition: z3++.h:216
func_decl user_propagate_function(symbol const &name, sort_vector const &domain, sort const &range)
Definition: z3++.h:3943
void recdef(func_decl decl, expr_vector const &args, expr const &body)
add function definition body to declaration decl. decl needs to be declared using context::recfun...
Definition: z3++.h:3937
expr unit() const
Definition: z3++.h:1564
bool is_array() const
Return true if this sort is a Array sort.
Definition: z3++.h:766
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.
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.
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...
expr_vector from_file(char const *s)
Definition: z3++.h:3598
void set(char const *k, symbol const &v)
Definition: z3++.h:2922
expr ite(expr const &c, expr const &t, expr const &e)
Create the if-then-else expression ite(c, t, e)
Definition: z3++.h:2181
T const & operator[](int i) const
Definition: z3++.h:529
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.
func_entry(func_entry const &s)
Definition: z3++.h:2666
Z3_ast Z3_API Z3_mk_extract(Z3_context c, unsigned high, unsigned low, Z3_ast t1)
Extract the bits high down to low from a bit-vector of size m to yield a new bit-vector of size n...
double double_value(unsigned i) const
Definition: z3++.h:2841
expr bit2bool(unsigned i) const
Definition: z3++.h:1505
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:4135
void register_eq(eq_eh_t &f)
Definition: z3++.h:4662
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_seq_empty(Z3_context c, Z3_sort seq)
Create an empty sequence of the sequence sort seq.
expr body() const
Return the 'body' of this quantifier.
Definition: z3++.h:1315
std::string get_string() const
for a string value expression return an escaped string value.
Definition: z3++.h:1230
expr char_from_bv() const
Definition: z3++.h:1622
friend expr bvneg_no_overflow(expr const &a)
Definition: z3++.h:2349
Z3_ast Z3_API Z3_mk_seq_to_re(Z3_context c, Z3_ast seq)
Create a regular expression that accepts the sequence seq.
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.
cube_generator(solver &s)
Definition: z3++.h:3145
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.
ast & operator=(ast const &s)
Definition: z3++.h:627
bool is_seq() const
Return true if this sort is a Sequence sort.
Definition: z3++.h:778
func_interp add_func_interp(func_decl &f, expr &else_val)
Definition: z3++.h:2777
expr repeat(unsigned i) const
Definition: z3++.h:1494
bool is_bv() const
Return true if this is a Bit-vector expression.
Definition: z3++.h:906
Z3_ast Z3_API Z3_mk_bvurem(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned remainder.
expr forall(expr const &x, expr const &b)
Definition: z3++.h:2433
void Z3_API Z3_params_set_bool(Z3_context c, Z3_params p, Z3_symbol k, bool v)
Add a Boolean parameter k with value v to the parameter set p.
sort domain(unsigned i) const
Definition: z3++.h:838
bool is_bool() const
Return true if this is a Boolean expression.
Definition: z3++.h:890
int64_t get_numeral_int64() const
Return int64_t value of numeral, throw if result cannot fit in int64_t.
Definition: z3++.h:1171
sort(context &c, Z3_sort s)
Definition: z3++.h:726
unsigned hash() const
Definition: z3++.h:636
double operator()(goal const &g) const
Definition: z3++.h:3401
Z3_error_code check_error() const
Auxiliary method used to check for API usage errors.
Definition: z3++.h:241
Z3_ast Z3_API Z3_mk_fpa_sqrt(Z3_context c, Z3_ast rm, Z3_ast t)
Floating-point square root.
Z3_ast Z3_API Z3_mk_bvxor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise exclusive-or.
std::string get_full_version()
Return a string that fully describes the version of Z3 in use.
Definition: z3++.h:96
bool operator==(cube_iterator const &other) const noexcept
Definition: z3++.h:3130
Z3_ast Z3_API Z3_get_algebraic_number_lower(Z3_context c, Z3_ast a, unsigned precision)
Return a lower bound for the given real algebraic number. The interval isolating the number is smalle...
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).
bool is_datatype() const
Return true if this sort is a Datatype sort.
Definition: z3++.h:770
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.
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...
std::string to_string() const
Definition: z3++.h:638
expr implies(expr const &a, expr const &b)
Definition: z3++.h:1716
sort get_sort() const
Definition: z3++.h:2883
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_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...
friend expr sqrt(expr const &a, expr const &rm)
Definition: z3++.h:2102
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.
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:2194
expr_vector sort_universe(sort const &s) const
Definition: z3++.h:2804
bool has_interp(func_decl f) const
Definition: z3++.h:2772
bool operator!=(iterator const &other) const noexcept
Definition: z3++.h:1696
Z3_sort Z3_API Z3_mk_char_sort(Z3_context c)
Create a sort for unicode characters.
expr mk_is_normal() const
Return Boolean expression to test for whether an FP expression is a normal.
Definition: z3++.h:1025
expr concat(expr const &a, expr const &b)
Definition: z3++.h:2564
symbol(context &c, Z3_symbol s)
Definition: z3++.h:549
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.
solver(context &c, char const *logic)
Definition: z3++.h:2905
bool is_false() const
Definition: z3++.h:1382
tactic try_for(tactic const &t, unsigned ms)
Definition: z3++.h:3318
func_interp(context &c, Z3_func_interp e)
Definition: z3++.h:2688
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 register_relation(func_decl &p)
Definition: z3++.h:3623
unsigned Z3_API Z3_get_arity(Z3_context c, Z3_func_decl d)
Alias for Z3_get_domain_size.
expr fpa_nan(sort const &s)
Definition: z3++.h:4013
Z3_sort Z3_API Z3_get_sort(Z3_context c, Z3_ast a)
Return the sort of an AST node.
void add_rule(expr &rule, symbol const &name)
Definition: z3++.h:3603
expr shl(expr const &a, expr const &b)
shift left operator for bitvectors
Definition: z3++.h:2302
expr bvsdiv_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:2346
params(context &c)
Definition: z3++.h:594
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_rotate_left(Z3_context c, unsigned i, Z3_ast t1)
Rotate bits of t1 to the left i times.
Z3_ast Z3_API Z3_mk_re_diff(Z3_context c, Z3_ast re1, Z3_ast re2)
Create the difference of regular expressions.
friend tactic try_for(tactic const &t, unsigned ms)
Definition: z3++.h:3318
void push_back(T const &e)
Definition: z3++.h:666
expr pble(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2506
expr max(expr const &a, expr const &b)
Definition: z3++.h:2054
sort range() const
Definition: z3++.h:839
expr sqrt(expr const &a, expr const &rm)
Definition: z3++.h:2102
expr mk_to_ieee_bv() const
Convert this fpa into an IEEE BV.
Definition: z3++.h:1055
void set_initial_value(expr const &var, bool b)
Definition: z3++.h:3528
ast_vector_tpl< expr > expr_vector
Definition: z3++.h:77
bool is_re() const
Return true if this is a regular expression.
Definition: z3++.h:926
Z3_ast Z3_API Z3_mk_re_union(Z3_context c, unsigned n, Z3_ast const args[])
Create the union of the regular languages.
void Z3_API Z3_probe_dec_ref(Z3_context c, Z3_probe p)
Decrement the reference counter of the given probe.
int get_int() const
Definition: z3++.h:2888
expr mk_is_nan() const
Return Boolean expression to test for whether an FP expression is a NaN.
Definition: z3++.h:1015
expr uge(expr const &a, expr const &b)
unsigned greater than or equal to operator for bitvectors.
Definition: z3++.h:2254
void push()
Definition: z3++.h:3538
expr last_indexof(expr const &s, expr const &substr)
Definition: z3++.h:4294
expr slt(expr const &a, expr const &b)
signed less than operator for bitvectors.
Definition: z3++.h:2222
void set(char const *param, bool value)
Update global parameter param with Boolean value.
Definition: z3++.h:270
Z3_constructor_list Z3_API Z3_mk_constructor_list(Z3_context c, unsigned num_constructors, Z3_constructor const constructors[])
Create list of constructors.
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. Add the parsed constraints and objectives to the optimization context.
void set(params const &p)
Definition: z3++.h:2918
bool is_re() const
Return true if this sort is a regular expression sort.
Definition: z3++.h:782
func_decl_vector constructors()
Definition: z3++.h:4399
Z3_ast Z3_API Z3_goal_formula(Z3_context c, Z3_goal g, unsigned idx)
Return a formula from the given goal.
Z3_symbol Z3_API Z3_get_sort_name(Z3_context c, Z3_sort d)
Return the sort name as a symbol.
bool is_quantifier() const
Return true if this expression is a quantifier.
Definition: z3++.h:973
func_decl tuple_sort(char const *name, unsigned n, char const *const *names, sort const *sorts, func_decl_vector &projs)
Return a tuple constructor. name is the name of the returned constructor, n are the number of argumen...
Definition: z3++.h:3698
context * m_ctx
Definition: z3++.h:536
bool propagate(expr_vector const &fixed, expr_vector const &lhs, expr_vector const &rhs, expr const &conseq)
Definition: z3++.h:4806
unsigned size()
Definition: z3++.h:582
unsigned size() const
Definition: z3++.h:527
void Z3_API Z3_fixedpoint_set_params(Z3_context c, Z3_fixedpoint f, Z3_params p)
Set parameters on fixedpoint context.
Z3_ast Z3_API Z3_mk_fpa_nan(Z3_context c, Z3_sort s)
Create a floating-point NaN of sort s.
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.
expr fpa_inf(sort const &s, bool sgn)
Definition: z3++.h:4014
symbol name() const
Definition: z3++.h:840
std::string help() const
Definition: z3++.h:3627
bool Z3_API Z3_is_re_sort(Z3_context c, Z3_sort s)
Check if s is a regular expression sort.
expr operator-(expr const &a)
Definition: z3++.h:1912
void pop(unsigned n=1)
Definition: z3++.h:2935
friend std::ostream & operator<<(std::ostream &out, stats const &s)
Definition: z3++.h:2844
expr smod(expr const &a, expr const &b)
signed modulus operator for bitvectors
Definition: z3++.h:2288
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 propa...
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.
expr to_real(expr const &a)
Definition: z3++.h:4105
cube_iterator end()
Definition: z3++.h:3160
handle(unsigned h)
Definition: z3++.h:3465
unsigned size() const
Definition: z3++.h:2836
void register_created(created_eh_t &c)
Definition: z3++.h:4702
Z3_ast Z3_API Z3_mk_bvadd(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement addition.
friend expr implies(expr const &a, expr const &b)
Definition: z3++.h:1716
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...
virtual void push()=0
param_descrs get_param_descrs()
Definition: z3++.h:3074
rcf_num(rcf_num const &other)
Definition: z3++.h:4850
Definition: z3++.h:172
rcf_num rcf_pi(context &c)
Create an RCF numeral representing pi.
Definition: z3++.h:4989
void add(symbol const &name, symbol const &rec, unsigned n, symbol const *names, sort const *fields)
Definition: z3++.h:3733
Z3_ast Z3_API Z3_mk_seq_unit(Z3_context c, Z3_ast a)
Create a unit sequence of a.
void Z3_API Z3_solver_dec_ref(Z3_context c, Z3_solver s)
Decrement the reference counter of the given solver.
void Z3_API Z3_inc_ref(Z3_context c, Z3_ast a)
Increment the reference counter of the given AST. The context c should have been created using Z3_mk_...
Z3_rcf_num Z3_API Z3_rcf_neg(Z3_context c, Z3_rcf_num a)
Return the value -a.
std::string to_string(bool compact=false) const
Return string representation of the RCF numeral.
Definition: z3++.h:4876
Z3_ast Z3_API Z3_datatype_update_field(Z3_context c, Z3_func_decl field_access, Z3_ast t, Z3_ast value)
Update record field with a value.
ast(ast const &s)
Definition: z3++.h:623
sort enumeration_sort(char const *name, unsigned n, char const *const *enum_names, func_decl_vector &cs, func_decl_vector &ts)
Return an enumeration sort: enum_names[0], ..., enum_names[n-1]. cs and ts are output parameters...
Definition: z3++.h:3687
Z3_ast Z3_API Z3_mk_numeral(Z3_context c, Z3_string numeral, Z3_sort ty)
Create a numeral of a given sort.
Z3_ast Z3_API Z3_mk_fpa_min(Z3_context c, Z3_ast t1, Z3_ast t2)
Minimum of floating-point numbers.
tactic par_or(unsigned n, tactic const *tactics)
Definition: z3++.h:3323
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.
void get_version(unsigned &major, unsigned &minor, unsigned &build_number, unsigned &revision_number)
Return Z3 version number information.
Definition: z3++.h:89
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 ...
~tactic() override
Definition: z3++.h:3263
rcf_num(context &c, char const *val)
Definition: z3++.h:4846
Z3_decl_kind
The different kinds of interpreted function kinds.
Definition: z3_api.h:962
T operator[](unsigned i) const
Definition: z3++.h:665
unsigned Z3_API Z3_optimize_maximize(Z3_context c, Z3_optimize o, Z3_ast t)
Add a maximization constraint.
expr sgt(expr const &a, expr const &b)
signed greater than operator for bitvectors.
Definition: z3++.h:2234
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_fpa_leq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point less than or equal.
apply_result(context &c, Z3_apply_result s)
Definition: z3++.h:3236
~probe() override
Definition: z3++.h:3391
expr nand(expr const &a, expr const &b)
Definition: z3++.h:2035
def tactics
Definition: z3py.py:8852
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_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_fixedpoint_get_answer(Z3_context c, Z3_fixedpoint d)
Retrieve a formula that encodes satisfying answers to the query.
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.
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.
void Z3_API Z3_ast_vector_set(Z3_context c, Z3_ast_vector v, unsigned i, Z3_ast a)
Update position i of the AST vector v with the AST a.
expr fpa_to_ubv(expr const &t, unsigned sz)
Definition: z3++.h:2141
expr stoi() const
Definition: z3++.h:1592
static param_descrs global_param_descrs(context &c)
Definition: z3++.h:580
expr operator/(expr const &a, expr const &b)
Definition: z3++.h:1890
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_ast Z3_API Z3_mk_fpa_lt(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point less than.
void query(unsigned i, func_decl &constructor, func_decl &test, func_decl_vector &accs)
Definition: z3++.h:3746
Function declaration (aka function definition). It is the signature of interpreted and uninterpreted ...
Definition: z3++.h:826
expr set_union(expr const &a, expr const &b)
Definition: z3++.h:4235
Z3_ast Z3_API Z3_get_denominator(Z3_context c, Z3_ast a)
Return the denominator (as a numeral AST) of a numeral AST of sort Real.
T & operator[](int i)
Definition: z3++.h:528
expr_vector objectives() const
Definition: z3++.h:3570
bool Z3_API Z3_is_well_sorted(Z3_context c, Z3_ast t)
Return true if the given expression t is well sorted.
int get_numeral_int() const
Return int value of numeral, throw if result cannot fit in machine int.
Definition: z3++.h:1135
param_descrs get_param_descrs()
Definition: z3++.h:3290
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...
bool is_xor() const
Definition: z3++.h:1386
virtual void fixed(expr const &, expr const &)
Definition: z3++.h:4742
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.
goal(goal const &s)
Definition: z3++.h:3179
sort int_sort()
Return the integer sort.
Definition: z3++.h:3659
bool Z3_API Z3_rcf_is_transcendental(Z3_context c, Z3_rcf_num a)
Return true if a represents a transcendental number.
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_func_decl Z3_API Z3_get_datatype_sort_constructor(Z3_context c, Z3_sort t, unsigned idx)
Return idx'th constructor.
ast_vector_tpl(context &c, ast_vector_tpl const &src)
Definition: z3++.h:660
expr set_del(expr const &s, expr const &e)
Definition: z3++.h:4231
void set(params const &p)
Definition: z3++.h:3558
check_result check(expr_vector const &asms)
Definition: z3++.h:3545
void set_initial_value(expr const &var, int i)
Definition: z3++.h:3525
#define _Z3_MK_UN_(a, mkun)
Definition: z3++.h:1756
void Z3_API Z3_tactic_dec_ref(Z3_context c, Z3_tactic g)
Decrement the reference counter of the given tactic.
simplifier & operator=(simplifier const &s)
Definition: z3++.h:3351
int64_t as_int64() const
Definition: z3++.h:959
stats & operator=(stats const &s)
Definition: z3++.h:2829
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.
simplifier(context &c, char const *name)
Definition: z3++.h:3346
unsigned num_args() const
Definition: z3++.h:2677
expr bvsub_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:2340
Z3_ast Z3_API Z3_mk_sbv_to_str(Z3_context c, Z3_ast s)
Signed bit-vector to string conversion.
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_lbool bool_value() const
Definition: z3++.h:1199
expr fpa_to_sbv(expr const &t, unsigned sz)
Definition: z3++.h:2134
bool Z3_API Z3_solver_next_split(Z3_context c, Z3_solver_callback cb, Z3_ast t, unsigned idx, Z3_lbool phase)
void set_initial_value(expr const &var, int i)
Definition: z3++.h:3022
apply_result & operator=(apply_result const &s)
Definition: z3++.h:3240
Z3_ast Z3_API Z3_mk_int_to_str(Z3_context c, Z3_ast s)
Integer to string conversion.
Z3_func_decl Z3_API Z3_solver_propagate_declare(Z3_context c, Z3_symbol name, unsigned n, Z3_sort *domain, Z3_sort range)
expr atmost(expr_vector const &es, unsigned bound)
Definition: z3++.h:2530
void Z3_API Z3_ast_vector_push(Z3_context c, Z3_ast_vector v, Z3_ast a)
Add the AST a in the end of the AST vector v. The size of v is increased by one.
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.
bool is_real() const
Return true if this sort is the Real sort.
Definition: z3++.h:754
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.
bool Z3_API Z3_is_lambda(Z3_context c, Z3_ast a)
Determine if ast is a lambda expression.
Z3_ast Z3_API Z3_solver_congruence_explain(Z3_context c, Z3_solver s, Z3_ast a, Z3_ast b)
retrieve explanation for congruence.
sort to_sort(context &c, Z3_sort s)
Definition: z3++.h:2203
expr string_const(char const *name)
Definition: z3++.h:3965
context()
Definition: z3++.h:215
void Z3_API Z3_param_descrs_dec_ref(Z3_context c, Z3_param_descrs p)
Decrement the reference counter of the given parameter description set.
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 ...
expr numerator() const
Definition: z3++.h:1203
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.
void Z3_API Z3_solver_propagate_eq(Z3_context c, Z3_solver s, Z3_eq_eh eq_eh)
register a callback on expression equalities.
bool is_decided_sat() const
Definition: z3++.h:3198
on_clause(solver &s, on_clause_eh_t &on_clause_eh)
Definition: z3++.h:4508
void add(expr const &f)
Definition: z3++.h:3189
friend expr mk_xor(expr_vector const &args)
Definition: z3++.h:2648
Z3_ast Z3_API Z3_mk_fpa_gt(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point greater than.
friend expr range(expr const &lo, expr const &hi)
Definition: z3++.h:4343
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...
expr to_re(expr const &s)
Definition: z3++.h:4300
func_decl linear_order(sort const &a, unsigned index)
Definition: z3++.h:2365
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. Add the parsed constraints and objectives to the optimization context.
Z3_ast Z3_API Z3_mk_seq_contains(Z3_context c, Z3_ast container, Z3_ast containee)
Check if container contains containee.
check_result
Definition: z3++.h:166
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...
Z3_string Z3_API Z3_model_to_string(Z3_context c, Z3_model m)
Convert the given model into a string.
expr denominator() const
Definition: z3++.h:1211
std::string to_string() const
Definition: z3++.h:716
bool is_numeral_i(int &i) const
Definition: z3++.h:950
param_descrs get_param_descrs()
Definition: z3++.h:3628
unsigned size() const
Definition: z3++.h:2748
const char * Z3_string
Z3 string type. It is just an alias for const char *.
Definition: z3_api.h:50
unsigned Z3_API Z3_algebraic_get_i(Z3_context c, Z3_ast a)
Return which root of the polynomial the algebraic number represents.
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...
apply_result(apply_result const &s)
Definition: z3++.h:3237
bool is_fpa() const
Return true if this sort is a Floating point sort.
Definition: z3++.h:790