Z3
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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 signining 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 #ifndef Z3PP_H_
22 #define Z3PP_H_
23 
24 #include<cassert>
25 #include<iostream>
26 #include<string>
27 #include<sstream>
28 #include<z3.h>
29 #include<limits.h>
30 
31 #undef min
32 #undef max
33 
39 
44 
48 namespace z3 {
49 
50  class exception;
51  class config;
52  class context;
53  class symbol;
54  class params;
55  class param_descrs;
56  class ast;
57  class sort;
58  class func_decl;
59  class expr;
60  class solver;
61  class goal;
62  class tactic;
63  class probe;
64  class model;
65  class func_interp;
66  class func_entry;
67  class statistics;
68  class apply_result;
69  template<typename T> class ast_vector_tpl;
74 
75  inline void set_param(char const * param, char const * value) { Z3_global_param_set(param, value); }
76  inline void set_param(char const * param, bool value) { Z3_global_param_set(param, value ? "true" : "false"); }
77  inline void set_param(char const * param, int value) { std::ostringstream oss; oss << value; Z3_global_param_set(param, oss.str().c_str()); }
79 
83  class exception {
84  std::string m_msg;
85  public:
86  exception(char const * msg):m_msg(msg) {}
87  char const * msg() const { return m_msg.c_str(); }
88  friend std::ostream & operator<<(std::ostream & out, exception const & e);
89  };
90  inline std::ostream & operator<<(std::ostream & out, exception const & e) { out << e.msg(); return out; }
91 
92 #if !defined(Z3_THROW)
93 #if __cpp_exceptions || _CPPUNWIND || __EXCEPTIONS
94 #define Z3_THROW(x) throw x
95 #else
96 #define Z3_THROW(x) {}
97 #endif
98 #endif // !defined(Z3_THROW)
99 
103  class config {
104  Z3_config m_cfg;
105  config(config const & s);
106  config & operator=(config const & s);
107  public:
108  config() { m_cfg = Z3_mk_config(); }
109  ~config() { Z3_del_config(m_cfg); }
110  operator Z3_config() const { return m_cfg; }
114  void set(char const * param, char const * value) { Z3_set_param_value(m_cfg, param, value); }
118  void set(char const * param, bool value) { Z3_set_param_value(m_cfg, param, value ? "true" : "false"); }
122  void set(char const * param, int value) {
123  std::ostringstream oss;
124  oss << value;
125  Z3_set_param_value(m_cfg, param, oss.str().c_str());
126  }
127  };
128 
131  };
132 
139  };
140 
142  if (l == Z3_L_TRUE) return sat;
143  else if (l == Z3_L_FALSE) return unsat;
144  return unknown;
145  }
146 
147 
153  class context {
154  private:
155  bool m_enable_exceptions;
156  rounding_mode m_rounding_mode;
157  Z3_context m_ctx;
158  void init(config & c) {
159  m_ctx = Z3_mk_context_rc(c);
160  m_enable_exceptions = true;
161  m_rounding_mode = RNA;
162  Z3_set_error_handler(m_ctx, 0);
164  }
165 
166 
167  context(context const & s);
168  context & operator=(context const & s);
169  public:
170  context() { config c; init(c); }
171  context(config & c) { init(c); }
172  ~context() { Z3_del_context(m_ctx); }
173  operator Z3_context() const { return m_ctx; }
174 
179  Z3_error_code e = Z3_get_error_code(m_ctx);
180  if (e != Z3_OK && enable_exceptions())
181  Z3_THROW(exception(Z3_get_error_msg(m_ctx, e)));
182  return e;
183  }
184 
185  void check_parser_error() const {
186  check_error();
187  }
188 
196  void set_enable_exceptions(bool f) { m_enable_exceptions = f; }
197 
198  bool enable_exceptions() const { return m_enable_exceptions; }
199 
203  void set(char const * param, char const * value) { Z3_update_param_value(m_ctx, param, value); }
207  void set(char const * param, bool value) { Z3_update_param_value(m_ctx, param, value ? "true" : "false"); }
211  void set(char const * param, int value) {
212  std::ostringstream oss;
213  oss << value;
214  Z3_update_param_value(m_ctx, param, oss.str().c_str());
215  }
216 
221  void interrupt() { Z3_interrupt(m_ctx); }
222 
226  symbol str_symbol(char const * s);
230  symbol int_symbol(int n);
234  sort bool_sort();
238  sort int_sort();
242  sort real_sort();
246  sort bv_sort(unsigned sz);
250  sort string_sort();
254  sort seq_sort(sort& s);
264  sort array_sort(sort d, sort r);
265  sort array_sort(sort_vector const& d, sort r);
272  sort fpa_sort(unsigned ebits, unsigned sbits);
276  template<size_t precision>
277  sort fpa_sort();
291  sort enumeration_sort(char const * name, unsigned n, char const * const * enum_names, func_decl_vector & cs, func_decl_vector & ts);
292 
299  func_decl tuple_sort(char const * name, unsigned n, char const * const * names, sort const* sorts, func_decl_vector & projs);
300 
304  sort uninterpreted_sort(char const* name);
305  sort uninterpreted_sort(symbol const& name);
306 
307  func_decl function(symbol const & name, unsigned arity, sort const * domain, sort const & range);
308  func_decl function(char const * name, unsigned arity, sort const * domain, sort const & range);
309  func_decl function(symbol const& name, sort_vector const& domain, sort const& range);
310  func_decl function(char const * name, sort_vector const& domain, sort const& range);
311  func_decl function(char const * name, sort const & domain, sort const & range);
312  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & range);
313  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range);
314  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range);
315  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & d5, sort const & range);
316 
317  func_decl recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range);
318  func_decl recfun(char const * name, unsigned arity, sort const * domain, sort const & range);
319  func_decl recfun(char const * name, sort const & domain, sort const & range);
320  func_decl recfun(char const * name, sort const & d1, sort const & d2, sort const & range);
321 
322  void recdef(func_decl, expr_vector const& args, expr const& body);
323 
324  expr constant(symbol const & name, sort const & s);
325  expr constant(char const * name, sort const & s);
326  expr bool_const(char const * name);
327  expr int_const(char const * name);
328  expr real_const(char const * name);
329  expr bv_const(char const * name, unsigned sz);
330  expr fpa_const(char const * name, unsigned ebits, unsigned sbits);
331 
332  template<size_t precision>
333  expr fpa_const(char const * name);
334 
335  expr bool_val(bool b);
336 
337  expr int_val(int n);
338  expr int_val(unsigned n);
339  expr int_val(int64_t n);
340  expr int_val(uint64_t n);
341  expr int_val(char const * n);
342 
343  expr real_val(int n, int d);
344  expr real_val(int n);
345  expr real_val(unsigned n);
346  expr real_val(int64_t n);
347  expr real_val(uint64_t n);
348  expr real_val(char const * n);
349 
350  expr bv_val(int n, unsigned sz);
351  expr bv_val(unsigned n, unsigned sz);
352  expr bv_val(int64_t n, unsigned sz);
353  expr bv_val(uint64_t n, unsigned sz);
354  expr bv_val(char const * n, unsigned sz);
355  expr bv_val(unsigned n, bool const* bits);
356 
357  expr fpa_val(double n);
358  expr fpa_val(float n);
359 
360  expr string_val(char const* s);
361  expr string_val(char const* s, unsigned n);
362  expr string_val(std::string const& s);
363 
364  expr num_val(int n, sort const & s);
365 
369  expr_vector parse_string(char const* s);
370  expr_vector parse_file(char const* file);
371 
372  expr_vector parse_string(char const* s, sort_vector const& sorts, func_decl_vector const& decls);
373  expr_vector parse_file(char const* s, sort_vector const& sorts, func_decl_vector const& decls);
374 
375 
376  };
377 
378 
379 
380 
381  template<typename T>
382  class array {
383  T * m_array;
384  unsigned m_size;
385  array(array const & s);
386  array & operator=(array const & s);
387  public:
388  array(unsigned sz):m_size(sz) { m_array = new T[sz]; }
389  template<typename T2>
390  array(ast_vector_tpl<T2> const & v);
391  ~array() { delete[] m_array; }
392  void resize(unsigned sz) { delete[] m_array; m_size = sz; m_array = new T[sz]; }
393  unsigned size() const { return m_size; }
394  T & operator[](int i) { assert(0 <= i); assert(static_cast<unsigned>(i) < m_size); return m_array[i]; }
395  T const & operator[](int i) const { assert(0 <= i); assert(static_cast<unsigned>(i) < m_size); return m_array[i]; }
396  T const * ptr() const { return m_array; }
397  T * ptr() { return m_array; }
398  };
399 
400  class object {
401  protected:
403  public:
404  object(context & c):m_ctx(&c) {}
405  object(object const & s):m_ctx(s.m_ctx) {}
406  context & ctx() const { return *m_ctx; }
407  Z3_error_code check_error() const { return m_ctx->check_error(); }
408  friend void check_context(object const & a, object const & b);
409  };
410  inline void check_context(object const & a, object const & b) { (void)a; (void)b; assert(a.m_ctx == b.m_ctx); }
411 
412  class symbol : public object {
413  Z3_symbol m_sym;
414  public:
415  symbol(context & c, Z3_symbol s):object(c), m_sym(s) {}
416  symbol(symbol const & s):object(s), m_sym(s.m_sym) {}
417  symbol & operator=(symbol const & s) { m_ctx = s.m_ctx; m_sym = s.m_sym; return *this; }
418  operator Z3_symbol() const { return m_sym; }
419  Z3_symbol_kind kind() const { return Z3_get_symbol_kind(ctx(), m_sym); }
420  std::string str() const { assert(kind() == Z3_STRING_SYMBOL); return Z3_get_symbol_string(ctx(), m_sym); }
421  int to_int() const { assert(kind() == Z3_INT_SYMBOL); return Z3_get_symbol_int(ctx(), m_sym); }
422  friend std::ostream & operator<<(std::ostream & out, symbol const & s);
423  };
424 
425  inline std::ostream & operator<<(std::ostream & out, symbol const & s) {
426  if (s.kind() == Z3_INT_SYMBOL)
427  out << "k!" << s.to_int();
428  else
429  out << s.str().c_str();
430  return out;
431  }
432 
433 
434  class param_descrs : public object {
435  Z3_param_descrs m_descrs;
436  public:
437  param_descrs(context& c, Z3_param_descrs d): object(c), m_descrs(d) { Z3_param_descrs_inc_ref(c, d); }
438  param_descrs(param_descrs const& o): object(o.ctx()), m_descrs(o.m_descrs) { Z3_param_descrs_inc_ref(ctx(), m_descrs); }
440  Z3_param_descrs_inc_ref(o.ctx(), o.m_descrs);
441  Z3_param_descrs_dec_ref(ctx(), m_descrs);
442  m_descrs = o.m_descrs;
443  m_ctx = o.m_ctx;
444  return *this;
445  }
448 
449  unsigned size() { return Z3_param_descrs_size(ctx(), m_descrs); }
450  symbol name(unsigned i) { return symbol(ctx(), Z3_param_descrs_get_name(ctx(), m_descrs, i)); }
451  Z3_param_kind kind(symbol const& s) { return Z3_param_descrs_get_kind(ctx(), m_descrs, s); }
452  std::string documentation(symbol const& s) { char const* r = Z3_param_descrs_get_documentation(ctx(), m_descrs, s); check_error(); return r; }
453  std::string to_string() const { return Z3_param_descrs_to_string(ctx(), m_descrs); }
454  };
455 
456  inline std::ostream& operator<<(std::ostream & out, param_descrs const & d) { return out << d.to_string(); }
457 
458  class params : public object {
459  Z3_params m_params;
460  public:
461  params(context & c):object(c) { m_params = Z3_mk_params(c); Z3_params_inc_ref(ctx(), m_params); }
462  params(params const & s):object(s), m_params(s.m_params) { Z3_params_inc_ref(ctx(), m_params); }
463  ~params() { Z3_params_dec_ref(ctx(), m_params); }
464  operator Z3_params() const { return m_params; }
465  params & operator=(params const & s) {
466  Z3_params_inc_ref(s.ctx(), s.m_params);
467  Z3_params_dec_ref(ctx(), m_params);
468  m_ctx = s.m_ctx;
469  m_params = s.m_params;
470  return *this;
471  }
472  void set(char const * k, bool b) { Z3_params_set_bool(ctx(), m_params, ctx().str_symbol(k), b); }
473  void set(char const * k, unsigned n) { Z3_params_set_uint(ctx(), m_params, ctx().str_symbol(k), n); }
474  void set(char const * k, double n) { Z3_params_set_double(ctx(), m_params, ctx().str_symbol(k), n); }
475  void set(char const * k, symbol const & s) { Z3_params_set_symbol(ctx(), m_params, ctx().str_symbol(k), s); }
476  void set(char const * k, char const* s) { Z3_params_set_symbol(ctx(), m_params, ctx().str_symbol(k), ctx().str_symbol(s)); }
477  friend std::ostream & operator<<(std::ostream & out, params const & p);
478  };
479 
480  inline std::ostream & operator<<(std::ostream & out, params const & p) {
481  out << Z3_params_to_string(p.ctx(), p); return out;
482  }
483 
484  class ast : public object {
485  protected:
486  Z3_ast m_ast;
487  public:
488  ast(context & c):object(c), m_ast(0) {}
489  ast(context & c, Z3_ast n):object(c), m_ast(n) { Z3_inc_ref(ctx(), m_ast); }
490  ast(ast const & s):object(s), m_ast(s.m_ast) { Z3_inc_ref(ctx(), m_ast); }
491  ~ast() { if (m_ast) Z3_dec_ref(*m_ctx, m_ast); }
492  operator Z3_ast() const { return m_ast; }
493  operator bool() const { return m_ast != 0; }
494  ast & operator=(ast const & s) { Z3_inc_ref(s.ctx(), s.m_ast); if (m_ast) Z3_dec_ref(ctx(), m_ast); m_ctx = s.m_ctx; m_ast = s.m_ast; return *this; }
495  Z3_ast_kind kind() const { Z3_ast_kind r = Z3_get_ast_kind(ctx(), m_ast); check_error(); return r; }
496  unsigned hash() const { unsigned r = Z3_get_ast_hash(ctx(), m_ast); check_error(); return r; }
497  friend std::ostream & operator<<(std::ostream & out, ast const & n);
498  std::string to_string() const { return std::string(Z3_ast_to_string(ctx(), m_ast)); }
499 
500 
504  friend bool eq(ast const & a, ast const & b);
505  };
506  inline std::ostream & operator<<(std::ostream & out, ast const & n) {
507  out << Z3_ast_to_string(n.ctx(), n.m_ast); return out;
508  }
509 
510  inline bool eq(ast const & a, ast const & b) { return Z3_is_eq_ast(a.ctx(), a, b); }
511 
512 
516  class sort : public ast {
517  public:
518  sort(context & c):ast(c) {}
519  sort(context & c, Z3_sort s):ast(c, reinterpret_cast<Z3_ast>(s)) {}
520  sort(context & c, Z3_ast a):ast(c, a) {}
521  sort(sort const & s):ast(s) {}
522  operator Z3_sort() const { return reinterpret_cast<Z3_sort>(m_ast); }
523 
527  unsigned id() const { unsigned r = Z3_get_sort_id(ctx(), *this); check_error(); return r; }
528 
532  sort & operator=(sort const & s) { return static_cast<sort&>(ast::operator=(s)); }
536  Z3_sort_kind sort_kind() const { return Z3_get_sort_kind(*m_ctx, *this); }
540  symbol name() const { Z3_symbol s = Z3_get_sort_name(ctx(), *this); check_error(); return symbol(ctx(), s); }
544  bool is_bool() const { return sort_kind() == Z3_BOOL_SORT; }
548  bool is_int() const { return sort_kind() == Z3_INT_SORT; }
552  bool is_real() const { return sort_kind() == Z3_REAL_SORT; }
556  bool is_arith() const { return is_int() || is_real(); }
560  bool is_bv() const { return sort_kind() == Z3_BV_SORT; }
564  bool is_array() const { return sort_kind() == Z3_ARRAY_SORT; }
568  bool is_datatype() const { return sort_kind() == Z3_DATATYPE_SORT; }
572  bool is_relation() const { return sort_kind() == Z3_RELATION_SORT; }
576  bool is_seq() const { return sort_kind() == Z3_SEQ_SORT; }
580  bool is_re() const { return sort_kind() == Z3_RE_SORT; }
584  bool is_finite_domain() const { return sort_kind() == Z3_FINITE_DOMAIN_SORT; }
588  bool is_fpa() const { return sort_kind() == Z3_FLOATING_POINT_SORT; }
589 
595  unsigned bv_size() const { assert(is_bv()); unsigned r = Z3_get_bv_sort_size(ctx(), *this); check_error(); return r; }
596 
597  unsigned fpa_ebits() const { assert(is_fpa()); unsigned r = Z3_fpa_get_ebits(ctx(), *this); check_error(); return r; }
598 
599  unsigned fpa_sbits() const { assert(is_fpa()); unsigned r = Z3_fpa_get_sbits(ctx(), *this); check_error(); return r; }
605  sort array_domain() const { assert(is_array()); Z3_sort s = Z3_get_array_sort_domain(ctx(), *this); check_error(); return sort(ctx(), s); }
611  sort array_range() const { assert(is_array()); Z3_sort s = Z3_get_array_sort_range(ctx(), *this); check_error(); return sort(ctx(), s); }
612  };
613 
618  class func_decl : public ast {
619  public:
620  func_decl(context & c):ast(c) {}
621  func_decl(context & c, Z3_func_decl n):ast(c, reinterpret_cast<Z3_ast>(n)) {}
622  func_decl(func_decl const & s):ast(s) {}
623  operator Z3_func_decl() const { return reinterpret_cast<Z3_func_decl>(m_ast); }
624  func_decl & operator=(func_decl const & s) { return static_cast<func_decl&>(ast::operator=(s)); }
625 
629  unsigned id() const { unsigned r = Z3_get_func_decl_id(ctx(), *this); check_error(); return r; }
630 
631  unsigned arity() const { return Z3_get_arity(ctx(), *this); }
632  sort domain(unsigned i) const { assert(i < arity()); Z3_sort r = Z3_get_domain(ctx(), *this, i); check_error(); return sort(ctx(), r); }
633  sort range() const { Z3_sort r = Z3_get_range(ctx(), *this); check_error(); return sort(ctx(), r); }
634  symbol name() const { Z3_symbol s = Z3_get_decl_name(ctx(), *this); check_error(); return symbol(ctx(), s); }
635  Z3_decl_kind decl_kind() const { return Z3_get_decl_kind(ctx(), *this); }
636 
638  Z3_func_decl tc = Z3_mk_transitive_closure(ctx(), *this); check_error(); return func_decl(ctx(), tc);
639  }
640 
641  bool is_const() const { return arity() == 0; }
642 
643  expr operator()() const;
644  expr operator()(unsigned n, expr const * args) const;
645  expr operator()(expr_vector const& v) const;
646  expr operator()(expr const & a) const;
647  expr operator()(int a) const;
648  expr operator()(expr const & a1, expr const & a2) const;
649  expr operator()(expr const & a1, int a2) const;
650  expr operator()(int a1, expr const & a2) const;
651  expr operator()(expr const & a1, expr const & a2, expr const & a3) const;
652  expr operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const;
653  expr operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const;
654  };
655 
659  expr select(expr const & a, expr const& i);
660  expr select(expr const & a, expr_vector const & i);
661 
667  class expr : public ast {
668  public:
669  expr(context & c):ast(c) {}
670  expr(context & c, Z3_ast n):ast(c, reinterpret_cast<Z3_ast>(n)) {}
671  expr(expr const & n):ast(n) {}
672  expr & operator=(expr const & n) { return static_cast<expr&>(ast::operator=(n)); }
673 
677  sort get_sort() const { Z3_sort s = Z3_get_sort(*m_ctx, m_ast); check_error(); return sort(*m_ctx, s); }
678 
682  bool is_bool() const { return get_sort().is_bool(); }
686  bool is_int() const { return get_sort().is_int(); }
690  bool is_real() const { return get_sort().is_real(); }
694  bool is_arith() const { return get_sort().is_arith(); }
698  bool is_bv() const { return get_sort().is_bv(); }
702  bool is_array() const { return get_sort().is_array(); }
706  bool is_datatype() const { return get_sort().is_datatype(); }
710  bool is_relation() const { return get_sort().is_relation(); }
714  bool is_seq() const { return get_sort().is_seq(); }
718  bool is_re() const { return get_sort().is_re(); }
719 
728  bool is_finite_domain() const { return get_sort().is_finite_domain(); }
732  bool is_fpa() const { return get_sort().is_fpa(); }
733 
739  bool is_numeral() const { return kind() == Z3_NUMERAL_AST; }
740  bool is_numeral_i64(int64_t& i) const { bool r = Z3_get_numeral_int64(ctx(), m_ast, &i); check_error(); return r;}
741  bool is_numeral_u64(uint64_t& i) const { bool r = Z3_get_numeral_uint64(ctx(), m_ast, &i); check_error(); return r;}
742  bool is_numeral_i(int& i) const { bool r = Z3_get_numeral_int(ctx(), m_ast, &i); check_error(); return r;}
743  bool is_numeral_u(unsigned& i) const { bool r = Z3_get_numeral_uint(ctx(), m_ast, &i); check_error(); return r;}
744  bool is_numeral(std::string& s) const { if (!is_numeral()) return false; s = Z3_get_numeral_string(ctx(), m_ast); check_error(); return true; }
745  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; }
746  bool is_numeral(double& d) const { if (!is_numeral()) return false; d = Z3_get_numeral_double(ctx(), m_ast); check_error(); return true; }
750  bool is_app() const { return kind() == Z3_APP_AST || kind() == Z3_NUMERAL_AST; }
754  bool is_const() const { return is_app() && num_args() == 0; }
758  bool is_quantifier() const { return kind() == Z3_QUANTIFIER_AST; }
759 
763  bool is_forall() const { return Z3_is_quantifier_forall(ctx(), m_ast); }
767  bool is_exists() const { return Z3_is_quantifier_exists(ctx(), m_ast); }
771  bool is_lambda() const { return Z3_is_lambda(ctx(), m_ast); }
776  bool is_var() const { return kind() == Z3_VAR_AST; }
780  bool is_algebraic() const { return Z3_is_algebraic_number(ctx(), m_ast); }
781 
785  bool is_well_sorted() const { bool r = Z3_is_well_sorted(ctx(), m_ast); check_error(); return r; }
786 
793  std::string get_decimal_string(int precision) const {
794  assert(is_numeral() || is_algebraic());
795  return std::string(Z3_get_numeral_decimal_string(ctx(), m_ast, precision));
796  }
797 
798 
802  unsigned id() const { unsigned r = Z3_get_ast_id(ctx(), m_ast); check_error(); return r; }
803 
814  int get_numeral_int() const {
815  int result = 0;
816  if (!is_numeral_i(result)) {
817  assert(ctx().enable_exceptions());
818  if (!ctx().enable_exceptions()) return 0;
819  Z3_THROW(exception("numeral does not fit in machine int"));
820  }
821  return result;
822  }
823 
833  unsigned get_numeral_uint() const {
834  assert(is_numeral());
835  unsigned result = 0;
836  if (!is_numeral_u(result)) {
837  assert(ctx().enable_exceptions());
838  if (!ctx().enable_exceptions()) return 0;
839  Z3_THROW(exception("numeral does not fit in machine uint"));
840  }
841  return result;
842  }
843 
850  int64_t get_numeral_int64() const {
851  assert(is_numeral());
852  int64_t result = 0;
853  if (!is_numeral_i64(result)) {
854  assert(ctx().enable_exceptions());
855  if (!ctx().enable_exceptions()) return 0;
856  Z3_THROW(exception("numeral does not fit in machine int64_t"));
857  }
858  return result;
859  }
860 
867  uint64_t get_numeral_uint64() const {
868  assert(is_numeral());
869  uint64_t result = 0;
870  if (!is_numeral_u64(result)) {
871  assert(ctx().enable_exceptions());
872  if (!ctx().enable_exceptions()) return 0;
873  Z3_THROW(exception("numeral does not fit in machine uint64_t"));
874  }
875  return result;
876  }
877 
879  return Z3_get_bool_value(ctx(), m_ast);
880  }
881 
882  expr numerator() const {
883  assert(is_numeral());
884  Z3_ast r = Z3_get_numerator(ctx(), m_ast);
885  check_error();
886  return expr(ctx(),r);
887  }
888 
889 
890  expr denominator() const {
891  assert(is_numeral());
892  Z3_ast r = Z3_get_denominator(ctx(), m_ast);
893  check_error();
894  return expr(ctx(),r);
895  }
896 
902  std::string get_escaped_string() const {
903  char const* s = Z3_get_string(ctx(), m_ast);
904  check_error();
905  return std::string(s);
906  }
907 
908  std::string get_string() const {
909  unsigned n;
910  char const* s = Z3_get_lstring(ctx(), m_ast, &n);
911  check_error();
912  return std::string(s, n);
913  }
914 
915  operator Z3_app() const { assert(is_app()); return reinterpret_cast<Z3_app>(m_ast); }
916 
921  assert(is_fpa());
922  Z3_sort s = ctx().fpa_rounding_mode();
923  check_error();
924  return sort(ctx(), s);
925  }
926 
927 
934  func_decl decl() const { Z3_func_decl f = Z3_get_app_decl(ctx(), *this); check_error(); return func_decl(ctx(), f); }
941  unsigned num_args() const { unsigned r = Z3_get_app_num_args(ctx(), *this); check_error(); return r; }
949  expr arg(unsigned i) const { Z3_ast r = Z3_get_app_arg(ctx(), *this, i); check_error(); return expr(ctx(), r); }
950 
956  expr body() const { assert(is_quantifier()); Z3_ast r = Z3_get_quantifier_body(ctx(), *this); check_error(); return expr(ctx(), r); }
957 
963  friend expr operator!(expr const & a);
964 
971  friend expr operator&&(expr const & a, expr const & b);
972 
973 
980  friend expr operator&&(expr const & a, bool b);
987  friend expr operator&&(bool a, expr const & b);
988 
995  friend expr operator||(expr const & a, expr const & b);
1002  friend expr operator||(expr const & a, bool b);
1003 
1010  friend expr operator||(bool a, expr const & b);
1011 
1012  friend expr implies(expr const & a, expr const & b);
1013  friend expr implies(expr const & a, bool b);
1014  friend expr implies(bool a, expr const & b);
1015 
1016  friend expr mk_or(expr_vector const& args);
1017  friend expr mk_and(expr_vector const& args);
1018 
1019  friend expr ite(expr const & c, expr const & t, expr const & e);
1020 
1021  bool is_true() const { return is_app() && Z3_OP_TRUE == decl().decl_kind(); }
1022  bool is_false() const { return is_app() && Z3_OP_FALSE == decl().decl_kind(); }
1023  bool is_not() const { return is_app() && Z3_OP_NOT == decl().decl_kind(); }
1024  bool is_and() const { return is_app() && Z3_OP_AND == decl().decl_kind(); }
1025  bool is_or() const { return is_app() && Z3_OP_OR == decl().decl_kind(); }
1026  bool is_xor() const { return is_app() && Z3_OP_XOR == decl().decl_kind(); }
1027  bool is_implies() const { return is_app() && Z3_OP_IMPLIES == decl().decl_kind(); }
1028  bool is_eq() const { return is_app() && Z3_OP_EQ == decl().decl_kind(); }
1029  bool is_ite() const { return is_app() && Z3_OP_ITE == decl().decl_kind(); }
1030  bool is_distinct() const { return is_app() && Z3_OP_DISTINCT == decl().decl_kind(); }
1031 
1032  friend expr distinct(expr_vector const& args);
1033  friend expr concat(expr const& a, expr const& b);
1034  friend expr concat(expr_vector const& args);
1035 
1036  friend expr operator==(expr const & a, expr const & b);
1037  friend expr operator==(expr const & a, int b);
1038  friend expr operator==(int a, expr const & b);
1039 
1040  friend expr operator!=(expr const & a, expr const & b);
1041  friend expr operator!=(expr const & a, int b);
1042  friend expr operator!=(int a, expr const & b);
1043 
1044  friend expr operator+(expr const & a, expr const & b);
1045  friend expr operator+(expr const & a, int b);
1046  friend expr operator+(int a, expr const & b);
1047  friend expr sum(expr_vector const& args);
1048 
1049  friend expr operator*(expr const & a, expr const & b);
1050  friend expr operator*(expr const & a, int b);
1051  friend expr operator*(int a, expr const & b);
1052 
1053  /* \brief Power operator */
1054  friend expr pw(expr const & a, expr const & b);
1055  friend expr pw(expr const & a, int b);
1056  friend expr pw(int a, expr const & b);
1057 
1058  /* \brief mod operator */
1059  friend expr mod(expr const& a, expr const& b);
1060  friend expr mod(expr const& a, int b);
1061  friend expr mod(int a, expr const& b);
1062 
1063  /* \brief rem operator */
1064  friend expr rem(expr const& a, expr const& b);
1065  friend expr rem(expr const& a, int b);
1066  friend expr rem(int a, expr const& b);
1067 
1068  friend expr is_int(expr const& e);
1069 
1070  friend expr operator/(expr const & a, expr const & b);
1071  friend expr operator/(expr const & a, int b);
1072  friend expr operator/(int a, expr const & b);
1073 
1074  friend expr operator-(expr const & a);
1075 
1076  friend expr operator-(expr const & a, expr const & b);
1077  friend expr operator-(expr const & a, int b);
1078  friend expr operator-(int a, expr const & b);
1079 
1080  friend expr operator<=(expr const & a, expr const & b);
1081  friend expr operator<=(expr const & a, int b);
1082  friend expr operator<=(int a, expr const & b);
1083 
1084 
1085  friend expr operator>=(expr const & a, expr const & b);
1086  friend expr operator>=(expr const & a, int b);
1087  friend expr operator>=(int a, expr const & b);
1088 
1089  friend expr operator<(expr const & a, expr const & b);
1090  friend expr operator<(expr const & a, int b);
1091  friend expr operator<(int a, expr const & b);
1092 
1093  friend expr operator>(expr const & a, expr const & b);
1094  friend expr operator>(expr const & a, int b);
1095  friend expr operator>(int a, expr const & b);
1096 
1097  friend expr pble(expr_vector const& es, int const * coeffs, int bound);
1098  friend expr pbge(expr_vector const& es, int const * coeffs, int bound);
1099  friend expr pbeq(expr_vector const& es, int const * coeffs, int bound);
1100  friend expr atmost(expr_vector const& es, unsigned bound);
1101  friend expr atleast(expr_vector const& es, unsigned bound);
1102 
1103  friend expr operator&(expr const & a, expr const & b);
1104  friend expr operator&(expr const & a, int b);
1105  friend expr operator&(int a, expr const & b);
1106 
1107  friend expr operator^(expr const & a, expr const & b);
1108  friend expr operator^(expr const & a, int b);
1109  friend expr operator^(int a, expr const & b);
1110 
1111  friend expr operator|(expr const & a, expr const & b);
1112  friend expr operator|(expr const & a, int b);
1113  friend expr operator|(int a, expr const & b);
1114  friend expr nand(expr const& a, expr const& b);
1115  friend expr nor(expr const& a, expr const& b);
1116  friend expr xnor(expr const& a, expr const& b);
1117 
1118  friend expr min(expr const& a, expr const& b);
1119  friend expr max(expr const& a, expr const& b);
1120 
1121  expr rotate_left(unsigned i) { Z3_ast r = Z3_mk_rotate_left(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1122  expr rotate_right(unsigned i) { Z3_ast r = Z3_mk_rotate_right(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1123  expr repeat(unsigned i) { Z3_ast r = Z3_mk_repeat(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1124 
1125  friend expr abs(expr const & a);
1126  friend expr sqrt(expr const & a, expr const & rm);
1127 
1128  friend expr operator~(expr const & a);
1129  expr extract(unsigned hi, unsigned lo) const { Z3_ast r = Z3_mk_extract(ctx(), hi, lo, *this); ctx().check_error(); return expr(ctx(), r); }
1130  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)); }
1131  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)); }
1132 
1136  friend expr fma(expr const& a, expr const& b, expr const& c);
1137 
1143  expr extract(expr const& offset, expr const& length) const {
1144  check_context(*this, offset); check_context(offset, length);
1145  Z3_ast r = Z3_mk_seq_extract(ctx(), *this, offset, length); check_error(); return expr(ctx(), r);
1146  }
1147  expr replace(expr const& src, expr const& dst) const {
1148  check_context(*this, src); check_context(src, dst);
1149  Z3_ast r = Z3_mk_seq_replace(ctx(), *this, src, dst);
1150  check_error();
1151  return expr(ctx(), r);
1152  }
1153  expr unit() const {
1154  Z3_ast r = Z3_mk_seq_unit(ctx(), *this);
1155  check_error();
1156  return expr(ctx(), r);
1157  }
1158  expr contains(expr const& s) {
1159  check_context(*this, s);
1160  Z3_ast r = Z3_mk_seq_contains(ctx(), *this, s);
1161  check_error();
1162  return expr(ctx(), r);
1163  }
1164  expr at(expr const& index) const {
1165  check_context(*this, index);
1166  Z3_ast r = Z3_mk_seq_at(ctx(), *this, index);
1167  check_error();
1168  return expr(ctx(), r);
1169  }
1170  expr nth(expr const& index) const {
1171  check_context(*this, index);
1172  Z3_ast r = Z3_mk_seq_nth(ctx(), *this, index);
1173  check_error();
1174  return expr(ctx(), r);
1175  }
1176  expr length() const {
1177  Z3_ast r = Z3_mk_seq_length(ctx(), *this);
1178  check_error();
1179  return expr(ctx(), r);
1180  }
1181  expr stoi() const {
1182  Z3_ast r = Z3_mk_str_to_int(ctx(), *this);
1183  check_error();
1184  return expr(ctx(), r);
1185  }
1186  expr itos() const {
1187  Z3_ast r = Z3_mk_int_to_str(ctx(), *this);
1188  check_error();
1189  return expr(ctx(), r);
1190  }
1191 
1192  friend expr range(expr const& lo, expr const& hi);
1196  expr loop(unsigned lo) {
1197  Z3_ast r = Z3_mk_re_loop(ctx(), m_ast, lo, 0);
1198  check_error();
1199  return expr(ctx(), r);
1200  }
1201  expr loop(unsigned lo, unsigned hi) {
1202  Z3_ast r = Z3_mk_re_loop(ctx(), m_ast, lo, hi);
1203  check_error();
1204  return expr(ctx(), r);
1205  }
1206 
1210  expr operator[](expr const& index) const {
1211  assert(is_array() || is_seq());
1212  if (is_array()) {
1213  return select(*this, index);
1214  }
1215  return nth(index);
1216  }
1217 
1218  expr operator[](expr_vector const& index) const {
1219  return select(*this, index);
1220  }
1221 
1225  expr simplify() const { Z3_ast r = Z3_simplify(ctx(), m_ast); check_error(); return expr(ctx(), r); }
1229  expr simplify(params const & p) const { Z3_ast r = Z3_simplify_ex(ctx(), m_ast, p); check_error(); return expr(ctx(), r); }
1230 
1234  expr substitute(expr_vector const& src, expr_vector const& dst);
1235 
1239  expr substitute(expr_vector const& dst);
1240 
1241  };
1242 
1243 #define _Z3_MK_BIN_(a, b, binop) \
1244  check_context(a, b); \
1245  Z3_ast r = binop(a.ctx(), a, b); \
1246  a.check_error(); \
1247  return expr(a.ctx(), r); \
1248 
1249 
1250  inline expr implies(expr const & a, expr const & b) {
1251  assert(a.is_bool() && b.is_bool());
1252  _Z3_MK_BIN_(a, b, Z3_mk_implies);
1253  }
1254  inline expr implies(expr const & a, bool b) { return implies(a, a.ctx().bool_val(b)); }
1255  inline expr implies(bool a, expr const & b) { return implies(b.ctx().bool_val(a), b); }
1256 
1257 
1258  inline expr pw(expr const & a, expr const & b) { _Z3_MK_BIN_(a, b, Z3_mk_power); }
1259  inline expr pw(expr const & a, int b) { return pw(a, a.ctx().num_val(b, a.get_sort())); }
1260  inline expr pw(int a, expr const & b) { return pw(b.ctx().num_val(a, b.get_sort()), b); }
1261 
1262  inline expr mod(expr const& a, expr const& b) { _Z3_MK_BIN_(a, b, Z3_mk_mod); }
1263  inline expr mod(expr const & a, int b) { return mod(a, a.ctx().num_val(b, a.get_sort())); }
1264  inline expr mod(int a, expr const & b) { return mod(b.ctx().num_val(a, b.get_sort()), b); }
1265 
1266  inline expr rem(expr const& a, expr const& b) {
1267  if (a.is_fpa() && b.is_fpa()) {
1268  _Z3_MK_BIN_(a, b, Z3_mk_fpa_rem);
1269  } else {
1270  _Z3_MK_BIN_(a, b, Z3_mk_rem);
1271  }
1272  }
1273  inline expr rem(expr const & a, int b) { return rem(a, a.ctx().num_val(b, a.get_sort())); }
1274  inline expr rem(int a, expr const & b) { return rem(b.ctx().num_val(a, b.get_sort()), b); }
1275 
1276 #undef _Z3_MK_BIN_
1277 
1278 #define _Z3_MK_UN_(a, mkun) \
1279  Z3_ast r = mkun(a.ctx(), a); \
1280  a.check_error(); \
1281  return expr(a.ctx(), r); \
1282 
1283 
1284  inline expr operator!(expr const & a) { assert(a.is_bool()); _Z3_MK_UN_(a, Z3_mk_not); }
1285 
1286  inline expr is_int(expr const& e) { _Z3_MK_UN_(e, Z3_mk_is_int); }
1287 
1288 #undef _Z3_MK_UN_
1289 
1290  inline expr operator&&(expr const & a, expr const & b) {
1291  check_context(a, b);
1292  assert(a.is_bool() && b.is_bool());
1293  Z3_ast args[2] = { a, b };
1294  Z3_ast r = Z3_mk_and(a.ctx(), 2, args);
1295  a.check_error();
1296  return expr(a.ctx(), r);
1297  }
1298 
1299  inline expr operator&&(expr const & a, bool b) { return a && a.ctx().bool_val(b); }
1300  inline expr operator&&(bool a, expr const & b) { return b.ctx().bool_val(a) && b; }
1301 
1302  inline expr operator||(expr const & a, expr const & b) {
1303  check_context(a, b);
1304  assert(a.is_bool() && b.is_bool());
1305  Z3_ast args[2] = { a, b };
1306  Z3_ast r = Z3_mk_or(a.ctx(), 2, args);
1307  a.check_error();
1308  return expr(a.ctx(), r);
1309  }
1310 
1311  inline expr operator||(expr const & a, bool b) { return a || a.ctx().bool_val(b); }
1312 
1313  inline expr operator||(bool a, expr const & b) { return b.ctx().bool_val(a) || b; }
1314 
1315  inline expr operator==(expr const & a, expr const & b) {
1316  check_context(a, b);
1317  Z3_ast r = Z3_mk_eq(a.ctx(), a, b);
1318  a.check_error();
1319  return expr(a.ctx(), r);
1320  }
1321  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()); }
1322  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; }
1323 
1324  inline expr operator!=(expr const & a, expr const & b) {
1325  check_context(a, b);
1326  Z3_ast args[2] = { a, b };
1327  Z3_ast r = Z3_mk_distinct(a.ctx(), 2, args);
1328  a.check_error();
1329  return expr(a.ctx(), r);
1330  }
1331  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()); }
1332  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; }
1333 
1334  inline expr operator+(expr const & a, expr const & b) {
1335  check_context(a, b);
1336  Z3_ast r = 0;
1337  if (a.is_arith() && b.is_arith()) {
1338  Z3_ast args[2] = { a, b };
1339  r = Z3_mk_add(a.ctx(), 2, args);
1340  }
1341  else if (a.is_bv() && b.is_bv()) {
1342  r = Z3_mk_bvadd(a.ctx(), a, b);
1343  }
1344  else if (a.is_seq() && b.is_seq()) {
1345  return concat(a, b);
1346  }
1347  else if (a.is_re() && b.is_re()) {
1348  Z3_ast _args[2] = { a, b };
1349  r = Z3_mk_re_union(a.ctx(), 2, _args);
1350  }
1351  else if (a.is_fpa() && b.is_fpa()) {
1352  r = Z3_mk_fpa_add(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1353  }
1354  else {
1355  // operator is not supported by given arguments.
1356  assert(false);
1357  }
1358  a.check_error();
1359  return expr(a.ctx(), r);
1360  }
1361  inline expr operator+(expr const & a, int b) { return a + a.ctx().num_val(b, a.get_sort()); }
1362  inline expr operator+(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) + b; }
1363 
1364  inline expr operator*(expr const & a, expr const & b) {
1365  check_context(a, b);
1366  Z3_ast r = 0;
1367  if (a.is_arith() && b.is_arith()) {
1368  Z3_ast args[2] = { a, b };
1369  r = Z3_mk_mul(a.ctx(), 2, args);
1370  }
1371  else if (a.is_bv() && b.is_bv()) {
1372  r = Z3_mk_bvmul(a.ctx(), a, b);
1373  }
1374  else if (a.is_fpa() && b.is_fpa()) {
1375  r = Z3_mk_fpa_mul(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1376  }
1377  else {
1378  // operator is not supported by given arguments.
1379  assert(false);
1380  }
1381  a.check_error();
1382  return expr(a.ctx(), r);
1383  }
1384  inline expr operator*(expr const & a, int b) { return a * a.ctx().num_val(b, a.get_sort()); }
1385  inline expr operator*(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) * b; }
1386 
1387 
1388  inline expr operator>=(expr const & a, expr const & b) {
1389  check_context(a, b);
1390  Z3_ast r = 0;
1391  if (a.is_arith() && b.is_arith()) {
1392  r = Z3_mk_ge(a.ctx(), a, b);
1393  }
1394  else if (a.is_bv() && b.is_bv()) {
1395  r = Z3_mk_bvsge(a.ctx(), a, b);
1396  }
1397  else {
1398  // operator is not supported by given arguments.
1399  assert(false);
1400  }
1401  a.check_error();
1402  return expr(a.ctx(), r);
1403  }
1404 
1405  inline expr operator/(expr const & a, expr const & b) {
1406  check_context(a, b);
1407  Z3_ast r = 0;
1408  if (a.is_arith() && b.is_arith()) {
1409  r = Z3_mk_div(a.ctx(), a, b);
1410  }
1411  else if (a.is_bv() && b.is_bv()) {
1412  r = Z3_mk_bvsdiv(a.ctx(), a, b);
1413  }
1414  else if (a.is_fpa() && b.is_fpa()) {
1415  r = Z3_mk_fpa_div(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1416  }
1417  else {
1418  // operator is not supported by given arguments.
1419  assert(false);
1420  }
1421  a.check_error();
1422  return expr(a.ctx(), r);
1423  }
1424  inline expr operator/(expr const & a, int b) { return a / a.ctx().num_val(b, a.get_sort()); }
1425  inline expr operator/(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) / b; }
1426 
1427  inline expr operator-(expr const & a) {
1428  Z3_ast r = 0;
1429  if (a.is_arith()) {
1430  r = Z3_mk_unary_minus(a.ctx(), a);
1431  }
1432  else if (a.is_bv()) {
1433  r = Z3_mk_bvneg(a.ctx(), a);
1434  }
1435  else if (a.is_fpa()) {
1436  r = Z3_mk_fpa_neg(a.ctx(), a);
1437  }
1438  else {
1439  // operator is not supported by given arguments.
1440  assert(false);
1441  }
1442  a.check_error();
1443  return expr(a.ctx(), r);
1444  }
1445 
1446  inline expr operator-(expr const & a, expr const & b) {
1447  check_context(a, b);
1448  Z3_ast r = 0;
1449  if (a.is_arith() && b.is_arith()) {
1450  Z3_ast args[2] = { a, b };
1451  r = Z3_mk_sub(a.ctx(), 2, args);
1452  }
1453  else if (a.is_bv() && b.is_bv()) {
1454  r = Z3_mk_bvsub(a.ctx(), a, b);
1455  }
1456  else if (a.is_fpa() && b.is_fpa()) {
1457  r = Z3_mk_fpa_sub(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1458  }
1459  else {
1460  // operator is not supported by given arguments.
1461  assert(false);
1462  }
1463  a.check_error();
1464  return expr(a.ctx(), r);
1465  }
1466  inline expr operator-(expr const & a, int b) { return a - a.ctx().num_val(b, a.get_sort()); }
1467  inline expr operator-(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) - b; }
1468 
1469  inline expr operator<=(expr const & a, expr const & b) {
1470  check_context(a, b);
1471  Z3_ast r = 0;
1472  if (a.is_arith() && b.is_arith()) {
1473  r = Z3_mk_le(a.ctx(), a, b);
1474  }
1475  else if (a.is_bv() && b.is_bv()) {
1476  r = Z3_mk_bvsle(a.ctx(), a, b);
1477  }
1478  else if (a.is_fpa() && b.is_fpa()) {
1479  r = Z3_mk_fpa_leq(a.ctx(), a, b);
1480  }
1481  else {
1482  // operator is not supported by given arguments.
1483  assert(false);
1484  }
1485  a.check_error();
1486  return expr(a.ctx(), r);
1487  }
1488  inline expr operator<=(expr const & a, int b) { return a <= a.ctx().num_val(b, a.get_sort()); }
1489  inline expr operator<=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) <= b; }
1490 
1491  inline expr operator>=(expr const & a, int b) { return a >= a.ctx().num_val(b, a.get_sort()); }
1492  inline expr operator>=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) >= b; }
1493 
1494  inline expr operator<(expr const & a, expr const & b) {
1495  check_context(a, b);
1496  Z3_ast r = 0;
1497  if (a.is_arith() && b.is_arith()) {
1498  r = Z3_mk_lt(a.ctx(), a, b);
1499  }
1500  else if (a.is_bv() && b.is_bv()) {
1501  r = Z3_mk_bvslt(a.ctx(), a, b);
1502  }
1503  else if (a.is_fpa() && b.is_fpa()) {
1504  r = Z3_mk_fpa_lt(a.ctx(), a, b);
1505  }
1506  else {
1507  // operator is not supported by given arguments.
1508  assert(false);
1509  }
1510  a.check_error();
1511  return expr(a.ctx(), r);
1512  }
1513  inline expr operator<(expr const & a, int b) { return a < a.ctx().num_val(b, a.get_sort()); }
1514  inline expr operator<(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) < b; }
1515 
1516  inline expr operator>(expr const & a, expr const & b) {
1517  check_context(a, b);
1518  Z3_ast r = 0;
1519  if (a.is_arith() && b.is_arith()) {
1520  r = Z3_mk_gt(a.ctx(), a, b);
1521  }
1522  else if (a.is_bv() && b.is_bv()) {
1523  r = Z3_mk_bvsgt(a.ctx(), a, b);
1524  }
1525  else if (a.is_fpa() && b.is_fpa()) {
1526  r = Z3_mk_fpa_gt(a.ctx(), a, b);
1527  }
1528  else {
1529  // operator is not supported by given arguments.
1530  assert(false);
1531  }
1532  a.check_error();
1533  return expr(a.ctx(), r);
1534  }
1535  inline expr operator>(expr const & a, int b) { return a > a.ctx().num_val(b, a.get_sort()); }
1536  inline expr operator>(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) > b; }
1537 
1538  inline expr operator&(expr const & a, expr const & b) { check_context(a, b); Z3_ast r = Z3_mk_bvand(a.ctx(), a, b); return expr(a.ctx(), r); }
1539  inline expr operator&(expr const & a, int b) { return a & a.ctx().num_val(b, a.get_sort()); }
1540  inline expr operator&(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) & b; }
1541 
1542  inline expr operator^(expr const & a, expr const & b) { check_context(a, b); Z3_ast r = Z3_mk_bvxor(a.ctx(), a, b); return expr(a.ctx(), r); }
1543  inline expr operator^(expr const & a, int b) { return a ^ a.ctx().num_val(b, a.get_sort()); }
1544  inline expr operator^(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) ^ b; }
1545 
1546  inline expr operator|(expr const & a, expr const & b) { check_context(a, b); Z3_ast r = Z3_mk_bvor(a.ctx(), a, b); return expr(a.ctx(), r); }
1547  inline expr operator|(expr const & a, int b) { return a | a.ctx().num_val(b, a.get_sort()); }
1548  inline expr operator|(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) | b; }
1549 
1550  inline expr nand(expr const& a, expr const& b) { check_context(a, b); Z3_ast r = Z3_mk_bvnand(a.ctx(), a, b); return expr(a.ctx(), r); }
1551  inline expr nor(expr const& a, expr const& b) { check_context(a, b); Z3_ast r = Z3_mk_bvnor(a.ctx(), a, b); return expr(a.ctx(), r); }
1552  inline expr xnor(expr const& a, expr const& b) { check_context(a, b); Z3_ast r = Z3_mk_bvxnor(a.ctx(), a, b); return expr(a.ctx(), r); }
1553  inline expr min(expr const& a, expr const& b) {
1554  check_context(a, b);
1555  Z3_ast r;
1556  if (a.is_arith()) {
1557  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), b, a);
1558  }
1559  else if (a.is_bv()) {
1560  r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), b, a);
1561  }
1562  else {
1563  assert(a.is_fpa());
1564  r = Z3_mk_fpa_min(a.ctx(), a, b);
1565  }
1566  return expr(a.ctx(), r);
1567  }
1568  inline expr max(expr const& a, expr const& b) {
1569  check_context(a, b);
1570  Z3_ast r;
1571  if (a.is_arith()) {
1572  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), a, b);
1573  }
1574  else if (a.is_bv()) {
1575  r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), a, b);
1576  }
1577  else {
1578  assert(a.is_fpa());
1579  r = Z3_mk_fpa_max(a.ctx(), a, b);
1580  }
1581  return expr(a.ctx(), r);
1582  }
1583  inline expr abs(expr const & a) {
1584  Z3_ast r;
1585  if (a.is_int()) {
1586  expr zero = a.ctx().int_val(0);
1587  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, zero), a, -a);
1588  }
1589  else if (a.is_real()) {
1590  expr zero = a.ctx().real_val(0);
1591  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, zero), a, -a);
1592  }
1593  else {
1594  r = Z3_mk_fpa_abs(a.ctx(), a);
1595  }
1596  a.check_error();
1597  return expr(a.ctx(), r);
1598  }
1599  inline expr sqrt(expr const & a, expr const& rm) {
1600  check_context(a, rm);
1601  assert(a.is_fpa());
1602  Z3_ast r = Z3_mk_fpa_sqrt(a.ctx(), rm, a);
1603  a.check_error();
1604  return expr(a.ctx(), r);
1605  }
1606  inline expr operator~(expr const & a) { Z3_ast r = Z3_mk_bvnot(a.ctx(), a); return expr(a.ctx(), r); }
1607 
1608  inline expr fma(expr const& a, expr const& b, expr const& c, expr const& rm) {
1609  check_context(a, b); check_context(a, c); check_context(a, rm);
1610  assert(a.is_fpa() && b.is_fpa() && c.is_fpa());
1611  Z3_ast r = Z3_mk_fpa_fma(a.ctx(), rm, a, b, c);
1612  a.check_error();
1613  return expr(a.ctx(), r);
1614  }
1615 
1621  inline expr ite(expr const & c, expr const & t, expr const & e) {
1622  check_context(c, t); check_context(c, e);
1623  assert(c.is_bool());
1624  Z3_ast r = Z3_mk_ite(c.ctx(), c, t, e);
1625  c.check_error();
1626  return expr(c.ctx(), r);
1627  }
1628 
1629 
1634  inline expr to_expr(context & c, Z3_ast a) {
1635  c.check_error();
1636  assert(Z3_get_ast_kind(c, a) == Z3_APP_AST ||
1637  Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST ||
1638  Z3_get_ast_kind(c, a) == Z3_VAR_AST ||
1640  return expr(c, a);
1641  }
1642 
1643  inline sort to_sort(context & c, Z3_sort s) {
1644  c.check_error();
1645  return sort(c, s);
1646  }
1647 
1648  inline func_decl to_func_decl(context & c, Z3_func_decl f) {
1649  c.check_error();
1650  return func_decl(c, f);
1651  }
1652 
1656  inline expr ule(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvule(a.ctx(), a, b)); }
1657  inline expr ule(expr const & a, int b) { return ule(a, a.ctx().num_val(b, a.get_sort())); }
1658  inline expr ule(int a, expr const & b) { return ule(b.ctx().num_val(a, b.get_sort()), b); }
1662  inline expr ult(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvult(a.ctx(), a, b)); }
1663  inline expr ult(expr const & a, int b) { return ult(a, a.ctx().num_val(b, a.get_sort())); }
1664  inline expr ult(int a, expr const & b) { return ult(b.ctx().num_val(a, b.get_sort()), b); }
1668  inline expr uge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b)); }
1669  inline expr uge(expr const & a, int b) { return uge(a, a.ctx().num_val(b, a.get_sort())); }
1670  inline expr uge(int a, expr const & b) { return uge(b.ctx().num_val(a, b.get_sort()), b); }
1674  inline expr ugt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvugt(a.ctx(), a, b)); }
1675  inline expr ugt(expr const & a, int b) { return ugt(a, a.ctx().num_val(b, a.get_sort())); }
1676  inline expr ugt(int a, expr const & b) { return ugt(b.ctx().num_val(a, b.get_sort()), b); }
1680  inline expr udiv(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvudiv(a.ctx(), a, b)); }
1681  inline expr udiv(expr const & a, int b) { return udiv(a, a.ctx().num_val(b, a.get_sort())); }
1682  inline expr udiv(int a, expr const & b) { return udiv(b.ctx().num_val(a, b.get_sort()), b); }
1683 
1687  inline expr srem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsrem(a.ctx(), a, b)); }
1688  inline expr srem(expr const & a, int b) { return srem(a, a.ctx().num_val(b, a.get_sort())); }
1689  inline expr srem(int a, expr const & b) { return srem(b.ctx().num_val(a, b.get_sort()), b); }
1690 
1694  inline expr smod(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsmod(a.ctx(), a, b)); }
1695  inline expr smod(expr const & a, int b) { return smod(a, a.ctx().num_val(b, a.get_sort())); }
1696  inline expr smod(int a, expr const & b) { return smod(b.ctx().num_val(a, b.get_sort()), b); }
1697 
1701  inline expr urem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvurem(a.ctx(), a, b)); }
1702  inline expr urem(expr const & a, int b) { return urem(a, a.ctx().num_val(b, a.get_sort())); }
1703  inline expr urem(int a, expr const & b) { return urem(b.ctx().num_val(a, b.get_sort()), b); }
1704 
1708  inline expr shl(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvshl(a.ctx(), a, b)); }
1709  inline expr shl(expr const & a, int b) { return shl(a, a.ctx().num_val(b, a.get_sort())); }
1710  inline expr shl(int a, expr const & b) { return shl(b.ctx().num_val(a, b.get_sort()), b); }
1711 
1715  inline expr lshr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvlshr(a.ctx(), a, b)); }
1716  inline expr lshr(expr const & a, int b) { return lshr(a, a.ctx().num_val(b, a.get_sort())); }
1717  inline expr lshr(int a, expr const & b) { return lshr(b.ctx().num_val(a, b.get_sort()), b); }
1718 
1722  inline expr ashr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvashr(a.ctx(), a, b)); }
1723  inline expr ashr(expr const & a, int b) { return ashr(a, a.ctx().num_val(b, a.get_sort())); }
1724  inline expr ashr(int a, expr const & b) { return ashr(b.ctx().num_val(a, b.get_sort()), b); }
1725 
1729  inline expr zext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_zero_ext(a.ctx(), i, a)); }
1730 
1734  inline expr sext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_sign_ext(a.ctx(), i, a)); }
1735 
1736  inline func_decl linear_order(sort const& a, unsigned index) {
1737  return to_func_decl(a.ctx(), Z3_mk_linear_order(a.ctx(), a, index));
1738  }
1739  inline func_decl partial_order(sort const& a, unsigned index) {
1740  return to_func_decl(a.ctx(), Z3_mk_partial_order(a.ctx(), a, index));
1741  }
1742  inline func_decl piecewise_linear_order(sort const& a, unsigned index) {
1743  return to_func_decl(a.ctx(), Z3_mk_piecewise_linear_order(a.ctx(), a, index));
1744  }
1745  inline func_decl tree_order(sort const& a, unsigned index) {
1746  return to_func_decl(a.ctx(), Z3_mk_tree_order(a.ctx(), a, index));
1747  }
1748 
1749  template<typename T> class cast_ast;
1750 
1751  template<> class cast_ast<ast> {
1752  public:
1753  ast operator()(context & c, Z3_ast a) { return ast(c, a); }
1754  };
1755 
1756  template<> class cast_ast<expr> {
1757  public:
1758  expr operator()(context & c, Z3_ast a) {
1759  assert(Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST ||
1760  Z3_get_ast_kind(c, a) == Z3_APP_AST ||
1762  Z3_get_ast_kind(c, a) == Z3_VAR_AST);
1763  return expr(c, a);
1764  }
1765  };
1766 
1767  template<> class cast_ast<sort> {
1768  public:
1769  sort operator()(context & c, Z3_ast a) {
1770  assert(Z3_get_ast_kind(c, a) == Z3_SORT_AST);
1771  return sort(c, reinterpret_cast<Z3_sort>(a));
1772  }
1773  };
1774 
1775  template<> class cast_ast<func_decl> {
1776  public:
1777  func_decl operator()(context & c, Z3_ast a) {
1778  assert(Z3_get_ast_kind(c, a) == Z3_FUNC_DECL_AST);
1779  return func_decl(c, reinterpret_cast<Z3_func_decl>(a));
1780  }
1781  };
1782 
1783  template<typename T>
1784  class ast_vector_tpl : public object {
1785  Z3_ast_vector m_vector;
1786  void init(Z3_ast_vector v) { Z3_ast_vector_inc_ref(ctx(), v); m_vector = v; }
1787  public:
1789  ast_vector_tpl(context & c, Z3_ast_vector v):object(c) { init(v); }
1790  ast_vector_tpl(ast_vector_tpl const & s):object(s), m_vector(s.m_vector) { Z3_ast_vector_inc_ref(ctx(), m_vector); }
1792  operator Z3_ast_vector() const { return m_vector; }
1793  unsigned size() const { return Z3_ast_vector_size(ctx(), m_vector); }
1794  T operator[](int i) const { assert(0 <= i); Z3_ast r = Z3_ast_vector_get(ctx(), m_vector, i); check_error(); return cast_ast<T>()(ctx(), r); }
1795  void push_back(T const & e) { Z3_ast_vector_push(ctx(), m_vector, e); check_error(); }
1796  void resize(unsigned sz) { Z3_ast_vector_resize(ctx(), m_vector, sz); check_error(); }
1797  T back() const { return operator[](size() - 1); }
1798  void pop_back() { assert(size() > 0); resize(size() - 1); }
1799  bool empty() const { return size() == 0; }
1801  Z3_ast_vector_inc_ref(s.ctx(), s.m_vector);
1802  Z3_ast_vector_dec_ref(ctx(), m_vector);
1803  m_ctx = s.m_ctx;
1804  m_vector = s.m_vector;
1805  return *this;
1806  }
1807  ast_vector_tpl& set(unsigned idx, ast& a) {
1808  Z3_ast_vector_set(ctx(), m_vector, idx, a);
1809  return *this;
1810  }
1811  /*
1812  Disabled pending C++98 build upgrade
1813  bool contains(T const& x) const {
1814  for (T y : *this) if (eq(x, y)) return true;
1815  return false;
1816  }
1817  */
1818 
1819  class iterator {
1820  ast_vector_tpl const* m_vector;
1821  unsigned m_index;
1822  public:
1823  iterator(ast_vector_tpl const* v, unsigned i): m_vector(v), m_index(i) {}
1824  iterator(iterator const& other): m_vector(other.m_vector), m_index(other.m_index) {}
1825  iterator operator=(iterator const& other) { m_vector = other.m_vector; m_index = other.m_index; return *this; }
1826 
1827  bool operator==(iterator const& other) const {
1828  return other.m_index == m_index;
1829  };
1830  bool operator!=(iterator const& other) const {
1831  return other.m_index != m_index;
1832  };
1834  ++m_index;
1835  return *this;
1836  }
1837  void set(T& arg) {
1838  Z3_ast_vector_set(m_vector->ctx(), *m_vector, m_index, arg);
1839  }
1840  iterator operator++(int) { iterator tmp = *this; ++m_index; return tmp; }
1841  T * operator->() const { return &(operator*()); }
1842  T operator*() const { return (*m_vector)[m_index]; }
1843  };
1844  iterator begin() const { return iterator(this, 0); }
1845  iterator end() const { return iterator(this, size()); }
1846  friend std::ostream & operator<<(std::ostream & out, ast_vector_tpl const & v) { out << Z3_ast_vector_to_string(v.ctx(), v); return out; }
1847  };
1848 
1849 
1850  template<typename T>
1851  template<typename T2>
1853  m_array = new T[v.size()];
1854  m_size = v.size();
1855  for (unsigned i = 0; i < m_size; i++) {
1856  m_array[i] = v[i];
1857  }
1858  }
1859 
1860  // Basic functions for creating quantified formulas.
1861  // The C API should be used for creating quantifiers with patterns, weights, many variables, etc.
1862  inline expr forall(expr const & x, expr const & b) {
1863  check_context(x, b);
1864  Z3_app vars[] = {(Z3_app) x};
1865  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
1866  }
1867  inline expr forall(expr const & x1, expr const & x2, expr const & b) {
1868  check_context(x1, b); check_context(x2, b);
1869  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
1870  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
1871  }
1872  inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
1873  check_context(x1, b); check_context(x2, b); check_context(x3, b);
1874  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
1875  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
1876  }
1877  inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
1878  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
1879  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
1880  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
1881  }
1882  inline expr forall(expr_vector const & xs, expr const & b) {
1883  array<Z3_app> vars(xs);
1884  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);
1885  }
1886  inline expr exists(expr const & x, expr const & b) {
1887  check_context(x, b);
1888  Z3_app vars[] = {(Z3_app) x};
1889  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
1890  }
1891  inline expr exists(expr const & x1, expr const & x2, expr const & b) {
1892  check_context(x1, b); check_context(x2, b);
1893  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
1894  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
1895  }
1896  inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
1897  check_context(x1, b); check_context(x2, b); check_context(x3, b);
1898  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
1899  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
1900  }
1901  inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
1902  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
1903  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
1904  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
1905  }
1906  inline expr exists(expr_vector const & xs, expr const & b) {
1907  array<Z3_app> vars(xs);
1908  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);
1909  }
1910  inline expr lambda(expr const & x, expr const & b) {
1911  check_context(x, b);
1912  Z3_app vars[] = {(Z3_app) x};
1913  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 1, vars, b); b.check_error(); return expr(b.ctx(), r);
1914  }
1915  inline expr lambda(expr const & x1, expr const & x2, expr const & b) {
1916  check_context(x1, b); check_context(x2, b);
1917  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
1918  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 2, vars, b); b.check_error(); return expr(b.ctx(), r);
1919  }
1920  inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
1921  check_context(x1, b); check_context(x2, b); check_context(x3, b);
1922  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
1923  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 3, vars, b); b.check_error(); return expr(b.ctx(), r);
1924  }
1925  inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
1926  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
1927  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
1928  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 4, vars, b); b.check_error(); return expr(b.ctx(), r);
1929  }
1930  inline expr lambda(expr_vector const & xs, expr const & b) {
1931  array<Z3_app> vars(xs);
1932  Z3_ast r = Z3_mk_lambda_const(b.ctx(), vars.size(), vars.ptr(), b); b.check_error(); return expr(b.ctx(), r);
1933  }
1934 
1935  inline expr pble(expr_vector const& es, int const* coeffs, int bound) {
1936  assert(es.size() > 0);
1937  context& ctx = es[0].ctx();
1938  array<Z3_ast> _es(es);
1939  Z3_ast r = Z3_mk_pble(ctx, _es.size(), _es.ptr(), coeffs, bound);
1940  ctx.check_error();
1941  return expr(ctx, r);
1942  }
1943  inline expr pbge(expr_vector const& es, int const* coeffs, int bound) {
1944  assert(es.size() > 0);
1945  context& ctx = es[0].ctx();
1946  array<Z3_ast> _es(es);
1947  Z3_ast r = Z3_mk_pbge(ctx, _es.size(), _es.ptr(), coeffs, bound);
1948  ctx.check_error();
1949  return expr(ctx, r);
1950  }
1951  inline expr pbeq(expr_vector const& es, int const* coeffs, int bound) {
1952  assert(es.size() > 0);
1953  context& ctx = es[0].ctx();
1954  array<Z3_ast> _es(es);
1955  Z3_ast r = Z3_mk_pbeq(ctx, _es.size(), _es.ptr(), coeffs, bound);
1956  ctx.check_error();
1957  return expr(ctx, r);
1958  }
1959  inline expr atmost(expr_vector const& es, unsigned bound) {
1960  assert(es.size() > 0);
1961  context& ctx = es[0].ctx();
1962  array<Z3_ast> _es(es);
1963  Z3_ast r = Z3_mk_atmost(ctx, _es.size(), _es.ptr(), bound);
1964  ctx.check_error();
1965  return expr(ctx, r);
1966  }
1967  inline expr atleast(expr_vector const& es, unsigned bound) {
1968  assert(es.size() > 0);
1969  context& ctx = es[0].ctx();
1970  array<Z3_ast> _es(es);
1971  Z3_ast r = Z3_mk_atleast(ctx, _es.size(), _es.ptr(), bound);
1972  ctx.check_error();
1973  return expr(ctx, r);
1974  }
1975  inline expr sum(expr_vector const& args) {
1976  assert(args.size() > 0);
1977  context& ctx = args[0].ctx();
1978  array<Z3_ast> _args(args);
1979  Z3_ast r = Z3_mk_add(ctx, _args.size(), _args.ptr());
1980  ctx.check_error();
1981  return expr(ctx, r);
1982  }
1983 
1984  inline expr distinct(expr_vector const& args) {
1985  assert(args.size() > 0);
1986  context& ctx = args[0].ctx();
1987  array<Z3_ast> _args(args);
1988  Z3_ast r = Z3_mk_distinct(ctx, _args.size(), _args.ptr());
1989  ctx.check_error();
1990  return expr(ctx, r);
1991  }
1992 
1993  inline expr concat(expr const& a, expr const& b) {
1994  check_context(a, b);
1995  Z3_ast r;
1996  if (Z3_is_seq_sort(a.ctx(), a.get_sort())) {
1997  Z3_ast _args[2] = { a, b };
1998  r = Z3_mk_seq_concat(a.ctx(), 2, _args);
1999  }
2000  else if (Z3_is_re_sort(a.ctx(), a.get_sort())) {
2001  Z3_ast _args[2] = { a, b };
2002  r = Z3_mk_re_concat(a.ctx(), 2, _args);
2003  }
2004  else {
2005  r = Z3_mk_concat(a.ctx(), a, b);
2006  }
2007  a.ctx().check_error();
2008  return expr(a.ctx(), r);
2009  }
2010 
2011  inline expr concat(expr_vector const& args) {
2012  Z3_ast r;
2013  assert(args.size() > 0);
2014  if (args.size() == 1) {
2015  return args[0];
2016  }
2017  context& ctx = args[0].ctx();
2018  array<Z3_ast> _args(args);
2019  if (Z3_is_seq_sort(ctx, args[0].get_sort())) {
2020  r = Z3_mk_seq_concat(ctx, _args.size(), _args.ptr());
2021  }
2022  else if (Z3_is_re_sort(ctx, args[0].get_sort())) {
2023  r = Z3_mk_re_concat(ctx, _args.size(), _args.ptr());
2024  }
2025  else {
2026  r = _args[args.size()-1];
2027  for (unsigned i = args.size()-1; i > 0; ) {
2028  --i;
2029  r = Z3_mk_concat(ctx, _args[i], r);
2030  ctx.check_error();
2031  }
2032  }
2033  ctx.check_error();
2034  return expr(ctx, r);
2035  }
2036 
2037  inline expr mk_or(expr_vector const& args) {
2038  array<Z3_ast> _args(args);
2039  Z3_ast r = Z3_mk_or(args.ctx(), _args.size(), _args.ptr());
2040  args.check_error();
2041  return expr(args.ctx(), r);
2042  }
2043  inline expr mk_and(expr_vector const& args) {
2044  array<Z3_ast> _args(args);
2045  Z3_ast r = Z3_mk_and(args.ctx(), _args.size(), _args.ptr());
2046  args.check_error();
2047  return expr(args.ctx(), r);
2048  }
2049 
2050 
2051  class func_entry : public object {
2052  Z3_func_entry m_entry;
2053  void init(Z3_func_entry e) {
2054  m_entry = e;
2055  Z3_func_entry_inc_ref(ctx(), m_entry);
2056  }
2057  public:
2058  func_entry(context & c, Z3_func_entry e):object(c) { init(e); }
2059  func_entry(func_entry const & s):object(s) { init(s.m_entry); }
2061  operator Z3_func_entry() const { return m_entry; }
2063  Z3_func_entry_inc_ref(s.ctx(), s.m_entry);
2064  Z3_func_entry_dec_ref(ctx(), m_entry);
2065  m_ctx = s.m_ctx;
2066  m_entry = s.m_entry;
2067  return *this;
2068  }
2069  expr value() const { Z3_ast r = Z3_func_entry_get_value(ctx(), m_entry); check_error(); return expr(ctx(), r); }
2070  unsigned num_args() const { unsigned r = Z3_func_entry_get_num_args(ctx(), m_entry); check_error(); return r; }
2071  expr arg(unsigned i) const { Z3_ast r = Z3_func_entry_get_arg(ctx(), m_entry, i); check_error(); return expr(ctx(), r); }
2072  };
2073 
2074  class func_interp : public object {
2075  Z3_func_interp m_interp;
2076  void init(Z3_func_interp e) {
2077  m_interp = e;
2078  Z3_func_interp_inc_ref(ctx(), m_interp);
2079  }
2080  public:
2081  func_interp(context & c, Z3_func_interp e):object(c) { init(e); }
2082  func_interp(func_interp const & s):object(s) { init(s.m_interp); }
2084  operator Z3_func_interp() const { return m_interp; }
2086  Z3_func_interp_inc_ref(s.ctx(), s.m_interp);
2087  Z3_func_interp_dec_ref(ctx(), m_interp);
2088  m_ctx = s.m_ctx;
2089  m_interp = s.m_interp;
2090  return *this;
2091  }
2092  expr else_value() const { Z3_ast r = Z3_func_interp_get_else(ctx(), m_interp); check_error(); return expr(ctx(), r); }
2093  unsigned num_entries() const { unsigned r = Z3_func_interp_get_num_entries(ctx(), m_interp); check_error(); return r; }
2094  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); }
2095  void add_entry(expr_vector const& args, expr& value) {
2096  Z3_func_interp_add_entry(ctx(), m_interp, args, value);
2097  check_error();
2098  }
2099  void set_else(expr& value) {
2100  Z3_func_interp_set_else(ctx(), m_interp, value);
2101  check_error();
2102  }
2103  };
2104 
2105  class model : public object {
2106  Z3_model m_model;
2107  void init(Z3_model m) {
2108  m_model = m;
2109  Z3_model_inc_ref(ctx(), m);
2110  }
2111  public:
2112  struct translate {};
2113  model(context & c):object(c) { init(Z3_mk_model(c)); }
2114  model(context & c, Z3_model m):object(c) { init(m); }
2115  model(model const & s):object(s) { init(s.m_model); }
2116  model(model& src, context& dst, translate) : object(dst) { init(Z3_model_translate(src.ctx(), src, dst)); }
2117  ~model() { Z3_model_dec_ref(ctx(), m_model); }
2118  operator Z3_model() const { return m_model; }
2119  model & operator=(model const & s) {
2120  Z3_model_inc_ref(s.ctx(), s.m_model);
2121  Z3_model_dec_ref(ctx(), m_model);
2122  m_ctx = s.m_ctx;
2123  m_model = s.m_model;
2124  return *this;
2125  }
2126 
2127  expr eval(expr const & n, bool model_completion=false) const {
2128  check_context(*this, n);
2129  Z3_ast r = 0;
2130  bool status = Z3_model_eval(ctx(), m_model, n, model_completion, &r);
2131  check_error();
2132  if (status == false && ctx().enable_exceptions())
2133  Z3_THROW(exception("failed to evaluate expression"));
2134  return expr(ctx(), r);
2135  }
2136 
2137  unsigned num_consts() const { return Z3_model_get_num_consts(ctx(), m_model); }
2138  unsigned num_funcs() const { return Z3_model_get_num_funcs(ctx(), m_model); }
2139  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); }
2140  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); }
2141  unsigned size() const { return num_consts() + num_funcs(); }
2142  func_decl operator[](int i) const {
2143  assert(0 <= i);
2144  return static_cast<unsigned>(i) < num_consts() ? get_const_decl(i) : get_func_decl(i - num_consts());
2145  }
2146 
2147  // returns interpretation of constant declaration c.
2148  // If c is not assigned any value in the model it returns
2149  // an expression with a null ast reference.
2151  check_context(*this, c);
2152  Z3_ast r = Z3_model_get_const_interp(ctx(), m_model, c);
2153  check_error();
2154  return expr(ctx(), r);
2155  }
2157  check_context(*this, f);
2158  Z3_func_interp r = Z3_model_get_func_interp(ctx(), m_model, f);
2159  check_error();
2160  return func_interp(ctx(), r);
2161  }
2162 
2163  // returns true iff the model contains an interpretation
2164  // for function f.
2165  bool has_interp(func_decl f) const {
2166  check_context(*this, f);
2167  return Z3_model_has_interp(ctx(), m_model, f);
2168  }
2169 
2171  Z3_func_interp r = Z3_add_func_interp(ctx(), m_model, f, else_val);
2172  check_error();
2173  return func_interp(ctx(), r);
2174  }
2175 
2176  void add_const_interp(func_decl& f, expr& value) {
2177  Z3_add_const_interp(ctx(), m_model, f, value);
2178  check_error();
2179  }
2180 
2181  friend std::ostream & operator<<(std::ostream & out, model const & m);
2182  };
2183  inline std::ostream & operator<<(std::ostream & out, model const & m) { out << Z3_model_to_string(m.ctx(), m); return out; }
2184 
2185  class stats : public object {
2186  Z3_stats m_stats;
2187  void init(Z3_stats e) {
2188  m_stats = e;
2189  Z3_stats_inc_ref(ctx(), m_stats);
2190  }
2191  public:
2192  stats(context & c):object(c), m_stats(0) {}
2193  stats(context & c, Z3_stats e):object(c) { init(e); }
2194  stats(stats const & s):object(s) { init(s.m_stats); }
2195  ~stats() { if (m_stats) Z3_stats_dec_ref(ctx(), m_stats); }
2196  operator Z3_stats() const { return m_stats; }
2197  stats & operator=(stats const & s) {
2198  Z3_stats_inc_ref(s.ctx(), s.m_stats);
2199  if (m_stats) Z3_stats_dec_ref(ctx(), m_stats);
2200  m_ctx = s.m_ctx;
2201  m_stats = s.m_stats;
2202  return *this;
2203  }
2204  unsigned size() const { return Z3_stats_size(ctx(), m_stats); }
2205  std::string key(unsigned i) const { Z3_string s = Z3_stats_get_key(ctx(), m_stats, i); check_error(); return s; }
2206  bool is_uint(unsigned i) const { bool r = Z3_stats_is_uint(ctx(), m_stats, i); check_error(); return r; }
2207  bool is_double(unsigned i) const { bool r = Z3_stats_is_double(ctx(), m_stats, i); check_error(); return r; }
2208  unsigned uint_value(unsigned i) const { unsigned r = Z3_stats_get_uint_value(ctx(), m_stats, i); check_error(); return r; }
2209  double double_value(unsigned i) const { double r = Z3_stats_get_double_value(ctx(), m_stats, i); check_error(); return r; }
2210  friend std::ostream & operator<<(std::ostream & out, stats const & s);
2211  };
2212  inline std::ostream & operator<<(std::ostream & out, stats const & s) { out << Z3_stats_to_string(s.ctx(), s); return out; }
2213 
2214 
2215  inline std::ostream & operator<<(std::ostream & out, check_result r) {
2216  if (r == unsat) out << "unsat";
2217  else if (r == sat) out << "sat";
2218  else out << "unknown";
2219  return out;
2220  }
2221 
2222 
2223  class solver : public object {
2224  Z3_solver m_solver;
2225  void init(Z3_solver s) {
2226  m_solver = s;
2227  Z3_solver_inc_ref(ctx(), s);
2228  }
2229  public:
2230  struct simple {};
2231  struct translate {};
2232  solver(context & c):object(c) { init(Z3_mk_solver(c)); }
2234  solver(context & c, Z3_solver s):object(c) { init(s); }
2235  solver(context & c, char const * logic):object(c) { init(Z3_mk_solver_for_logic(c, c.str_symbol(logic))); }
2236  solver(context & c, solver const& src, translate): object(c) { init(Z3_solver_translate(src.ctx(), src, c)); }
2237  solver(solver const & s):object(s) { init(s.m_solver); }
2238  ~solver() { Z3_solver_dec_ref(ctx(), m_solver); }
2239  operator Z3_solver() const { return m_solver; }
2240  solver & operator=(solver const & s) {
2241  Z3_solver_inc_ref(s.ctx(), s.m_solver);
2242  Z3_solver_dec_ref(ctx(), m_solver);
2243  m_ctx = s.m_ctx;
2244  m_solver = s.m_solver;
2245  return *this;
2246  }
2247  void set(params const & p) { Z3_solver_set_params(ctx(), m_solver, p); check_error(); }
2248  void set(char const * k, bool v) { params p(ctx()); p.set(k, v); set(p); }
2249  void set(char const * k, unsigned v) { params p(ctx()); p.set(k, v); set(p); }
2250  void set(char const * k, double v) { params p(ctx()); p.set(k, v); set(p); }
2251  void set(char const * k, symbol const & v) { params p(ctx()); p.set(k, v); set(p); }
2252  void set(char const * k, char const* v) { params p(ctx()); p.set(k, v); set(p); }
2253  void push() { Z3_solver_push(ctx(), m_solver); check_error(); }
2254  void pop(unsigned n = 1) { Z3_solver_pop(ctx(), m_solver, n); check_error(); }
2255  void reset() { Z3_solver_reset(ctx(), m_solver); check_error(); }
2256  void add(expr const & e) { assert(e.is_bool()); Z3_solver_assert(ctx(), m_solver, e); check_error(); }
2257  void add(expr const & e, expr const & p) {
2258  assert(e.is_bool()); assert(p.is_bool()); assert(p.is_const());
2259  Z3_solver_assert_and_track(ctx(), m_solver, e, p);
2260  check_error();
2261  }
2262  void add(expr const & e, char const * p) {
2263  add(e, ctx().bool_const(p));
2264  }
2265  // fails for some compilers:
2266  // void add(expr_vector const& v) { check_context(*this, v); for (expr e : v) add(e); }
2267  void from_file(char const* file) { Z3_solver_from_file(ctx(), m_solver, file); ctx().check_parser_error(); }
2268  void from_string(char const* s) { Z3_solver_from_string(ctx(), m_solver, s); ctx().check_parser_error(); }
2269 
2271  check_result check(unsigned n, expr * const assumptions) {
2272  array<Z3_ast> _assumptions(n);
2273  for (unsigned i = 0; i < n; i++) {
2274  check_context(*this, assumptions[i]);
2275  _assumptions[i] = assumptions[i];
2276  }
2277  Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
2278  check_error();
2279  return to_check_result(r);
2280  }
2281  check_result check(expr_vector assumptions) {
2282  unsigned n = assumptions.size();
2283  array<Z3_ast> _assumptions(n);
2284  for (unsigned i = 0; i < n; i++) {
2285  check_context(*this, assumptions[i]);
2286  _assumptions[i] = assumptions[i];
2287  }
2288  Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
2289  check_error();
2290  return to_check_result(r);
2291  }
2292  model get_model() const { Z3_model m = Z3_solver_get_model(ctx(), m_solver); check_error(); return model(ctx(), m); }
2293  check_result consequences(expr_vector& assumptions, expr_vector& vars, expr_vector& conseq) {
2294  Z3_lbool r = Z3_solver_get_consequences(ctx(), m_solver, assumptions, vars, conseq);
2295  check_error();
2296  return to_check_result(r);
2297  }
2298  std::string reason_unknown() const { Z3_string r = Z3_solver_get_reason_unknown(ctx(), m_solver); check_error(); return r; }
2299  stats statistics() const { Z3_stats r = Z3_solver_get_statistics(ctx(), m_solver); check_error(); return stats(ctx(), r); }
2300  expr_vector unsat_core() const { Z3_ast_vector r = Z3_solver_get_unsat_core(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2301  expr_vector assertions() const { Z3_ast_vector r = Z3_solver_get_assertions(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2302  expr_vector non_units() const { Z3_ast_vector r = Z3_solver_get_non_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2303  expr_vector units() const { Z3_ast_vector r = Z3_solver_get_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2304  expr_vector trail() const { Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2305  expr_vector trail(array<unsigned>& levels) const {
2306  Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver);
2307  check_error();
2308  expr_vector result(ctx(), r);
2309  unsigned sz = result.size();
2310  levels.resize(sz);
2311  Z3_solver_get_levels(ctx(), m_solver, r, sz, levels.ptr());
2312  check_error();
2313  return result;
2314  }
2315  expr proof() const { Z3_ast r = Z3_solver_get_proof(ctx(), m_solver); check_error(); return expr(ctx(), r); }
2316  friend std::ostream & operator<<(std::ostream & out, solver const & s);
2317 
2318  std::string to_smt2(char const* status = "unknown") {
2319  array<Z3_ast> es(assertions());
2320  Z3_ast const* fmls = es.ptr();
2321  Z3_ast fml = 0;
2322  unsigned sz = es.size();
2323  if (sz > 0) {
2324  --sz;
2325  fml = fmls[sz];
2326  }
2327  else {
2328  fml = ctx().bool_val(true);
2329  }
2330  return std::string(Z3_benchmark_to_smtlib_string(
2331  ctx(),
2332  "", "", status, "",
2333  sz,
2334  fmls,
2335  fml));
2336  }
2337 
2338  std::string dimacs() const { return std::string(Z3_solver_to_dimacs_string(ctx(), m_solver)); }
2339 
2341 
2342 
2343  expr_vector cube(expr_vector& vars, unsigned cutoff) {
2344  Z3_ast_vector r = Z3_solver_cube(ctx(), m_solver, vars, cutoff);
2345  check_error();
2346  return expr_vector(ctx(), r);
2347  }
2348 
2350  solver& m_solver;
2351  unsigned& m_cutoff;
2352  expr_vector& m_vars;
2353  expr_vector m_cube;
2354  bool m_end;
2355  bool m_empty;
2356 
2357  void inc() {
2358  assert(!m_end && !m_empty);
2359  m_cube = m_solver.cube(m_vars, m_cutoff);
2360  m_cutoff = 0xFFFFFFFF;
2361  if (m_cube.size() == 1 && m_cube[0].is_false()) {
2362  m_cube = z3::expr_vector(m_solver.ctx());
2363  m_end = true;
2364  }
2365  else if (m_cube.empty()) {
2366  m_empty = true;
2367  }
2368  }
2369  public:
2370  cube_iterator(solver& s, expr_vector& vars, unsigned& cutoff, bool end):
2371  m_solver(s),
2372  m_cutoff(cutoff),
2373  m_vars(vars),
2374  m_cube(s.ctx()),
2375  m_end(end),
2376  m_empty(false) {
2377  if (!m_end) {
2378  inc();
2379  }
2380  }
2381 
2383  assert(!m_end);
2384  if (m_empty) {
2385  m_end = true;
2386  }
2387  else {
2388  inc();
2389  }
2390  return *this;
2391  }
2392  cube_iterator operator++(int) { assert(false); return *this; }
2393  expr_vector const * operator->() const { return &(operator*()); }
2394  expr_vector const& operator*() const { return m_cube; }
2395 
2396  bool operator==(cube_iterator const& other) {
2397  return other.m_end == m_end;
2398  };
2399  bool operator!=(cube_iterator const& other) {
2400  return other.m_end != m_end;
2401  };
2402 
2403  };
2404 
2406  solver& m_solver;
2407  unsigned m_cutoff;
2408  expr_vector m_default_vars;
2409  expr_vector& m_vars;
2410  public:
2412  m_solver(s),
2413  m_cutoff(0xFFFFFFFF),
2414  m_default_vars(s.ctx()),
2415  m_vars(m_default_vars)
2416  {}
2417 
2418  cube_generator(solver& s, expr_vector& vars):
2419  m_solver(s),
2420  m_cutoff(0xFFFFFFFF),
2421  m_default_vars(s.ctx()),
2422  m_vars(vars)
2423  {}
2424 
2425  cube_iterator begin() { return cube_iterator(m_solver, m_vars, m_cutoff, false); }
2426  cube_iterator end() { return cube_iterator(m_solver, m_vars, m_cutoff, true); }
2427  void set_cutoff(unsigned c) { m_cutoff = c; }
2428  };
2429 
2430  cube_generator cubes() { return cube_generator(*this); }
2431  cube_generator cubes(expr_vector& vars) { return cube_generator(*this, vars); }
2432 
2433  };
2434  inline std::ostream & operator<<(std::ostream & out, solver const & s) { out << Z3_solver_to_string(s.ctx(), s); return out; }
2435 
2436  class goal : public object {
2437  Z3_goal m_goal;
2438  void init(Z3_goal s) {
2439  m_goal = s;
2440  Z3_goal_inc_ref(ctx(), s);
2441  }
2442  public:
2443  goal(context & c, bool models=true, bool unsat_cores=false, bool proofs=false):object(c) { init(Z3_mk_goal(c, models, unsat_cores, proofs)); }
2444  goal(context & c, Z3_goal s):object(c) { init(s); }
2445  goal(goal const & s):object(s) { init(s.m_goal); }
2446  ~goal() { Z3_goal_dec_ref(ctx(), m_goal); }
2447  operator Z3_goal() const { return m_goal; }
2448  goal & operator=(goal const & s) {
2449  Z3_goal_inc_ref(s.ctx(), s.m_goal);
2450  Z3_goal_dec_ref(ctx(), m_goal);
2451  m_ctx = s.m_ctx;
2452  m_goal = s.m_goal;
2453  return *this;
2454  }
2455  void add(expr const & f) { check_context(*this, f); Z3_goal_assert(ctx(), m_goal, f); check_error(); }
2456  void add(expr_vector const& v) { check_context(*this, v); for (unsigned i = 0; i < v.size(); ++i) add(v[i]); }
2457  unsigned size() const { return Z3_goal_size(ctx(), m_goal); }
2458  expr operator[](int i) const { assert(0 <= i); Z3_ast r = Z3_goal_formula(ctx(), m_goal, i); check_error(); return expr(ctx(), r); }
2459  Z3_goal_prec precision() const { return Z3_goal_precision(ctx(), m_goal); }
2460  bool inconsistent() const { return Z3_goal_inconsistent(ctx(), m_goal); }
2461  unsigned depth() const { return Z3_goal_depth(ctx(), m_goal); }
2462  void reset() { Z3_goal_reset(ctx(), m_goal); }
2463  unsigned num_exprs() const { return Z3_goal_num_exprs(ctx(), m_goal); }
2464  bool is_decided_sat() const { return Z3_goal_is_decided_sat(ctx(), m_goal); }
2465  bool is_decided_unsat() const { return Z3_goal_is_decided_unsat(ctx(), m_goal); }
2466  model convert_model(model const & m) const {
2467  check_context(*this, m);
2468  Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, m);
2469  check_error();
2470  return model(ctx(), new_m);
2471  }
2472  model get_model() const {
2473  Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, 0);
2474  check_error();
2475  return model(ctx(), new_m);
2476  }
2477  expr as_expr() const {
2478  unsigned n = size();
2479  if (n == 0)
2480  return ctx().bool_val(true);
2481  else if (n == 1)
2482  return operator[](0);
2483  else {
2484  array<Z3_ast> args(n);
2485  for (unsigned i = 0; i < n; i++)
2486  args[i] = operator[](i);
2487  return expr(ctx(), Z3_mk_and(ctx(), n, args.ptr()));
2488  }
2489  }
2490  std::string dimacs() const { return std::string(Z3_goal_to_dimacs_string(ctx(), m_goal)); }
2491  friend std::ostream & operator<<(std::ostream & out, goal const & g);
2492  };
2493  inline std::ostream & operator<<(std::ostream & out, goal const & g) { out << Z3_goal_to_string(g.ctx(), g); return out; }
2494 
2495  class apply_result : public object {
2496  Z3_apply_result m_apply_result;
2497  void init(Z3_apply_result s) {
2498  m_apply_result = s;
2500  }
2501  public:
2502  apply_result(context & c, Z3_apply_result s):object(c) { init(s); }
2503  apply_result(apply_result const & s):object(s) { init(s.m_apply_result); }
2504  ~apply_result() { Z3_apply_result_dec_ref(ctx(), m_apply_result); }
2505  operator Z3_apply_result() const { return m_apply_result; }
2507  Z3_apply_result_inc_ref(s.ctx(), s.m_apply_result);
2508  Z3_apply_result_dec_ref(ctx(), m_apply_result);
2509  m_ctx = s.m_ctx;
2510  m_apply_result = s.m_apply_result;
2511  return *this;
2512  }
2513  unsigned size() const { return Z3_apply_result_get_num_subgoals(ctx(), m_apply_result); }
2514  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); }
2515  friend std::ostream & operator<<(std::ostream & out, apply_result const & r);
2516  };
2517  inline std::ostream & operator<<(std::ostream & out, apply_result const & r) { out << Z3_apply_result_to_string(r.ctx(), r); return out; }
2518 
2519  class tactic : public object {
2520  Z3_tactic m_tactic;
2521  void init(Z3_tactic s) {
2522  m_tactic = s;
2523  Z3_tactic_inc_ref(ctx(), s);
2524  }
2525  public:
2526  tactic(context & c, char const * name):object(c) { Z3_tactic r = Z3_mk_tactic(c, name); check_error(); init(r); }
2527  tactic(context & c, Z3_tactic s):object(c) { init(s); }
2528  tactic(tactic const & s):object(s) { init(s.m_tactic); }
2529  ~tactic() { Z3_tactic_dec_ref(ctx(), m_tactic); }
2530  operator Z3_tactic() const { return m_tactic; }
2531  tactic & operator=(tactic const & s) {
2532  Z3_tactic_inc_ref(s.ctx(), s.m_tactic);
2533  Z3_tactic_dec_ref(ctx(), m_tactic);
2534  m_ctx = s.m_ctx;
2535  m_tactic = s.m_tactic;
2536  return *this;
2537  }
2538  solver mk_solver() const { Z3_solver r = Z3_mk_solver_from_tactic(ctx(), m_tactic); check_error(); return solver(ctx(), r); }
2539  apply_result apply(goal const & g) const {
2540  check_context(*this, g);
2541  Z3_apply_result r = Z3_tactic_apply(ctx(), m_tactic, g);
2542  check_error();
2543  return apply_result(ctx(), r);
2544  }
2545  apply_result operator()(goal const & g) const {
2546  return apply(g);
2547  }
2548  std::string help() const { char const * r = Z3_tactic_get_help(ctx(), m_tactic); check_error(); return r; }
2549  friend tactic operator&(tactic const & t1, tactic const & t2);
2550  friend tactic operator|(tactic const & t1, tactic const & t2);
2551  friend tactic repeat(tactic const & t, unsigned max);
2552  friend tactic with(tactic const & t, params const & p);
2553  friend tactic try_for(tactic const & t, unsigned ms);
2554  friend tactic par_or(unsigned n, tactic const* tactics);
2555  friend tactic par_and_then(tactic const& t1, tactic const& t2);
2557  };
2558 
2559  inline tactic operator&(tactic const & t1, tactic const & t2) {
2560  check_context(t1, t2);
2561  Z3_tactic r = Z3_tactic_and_then(t1.ctx(), t1, t2);
2562  t1.check_error();
2563  return tactic(t1.ctx(), r);
2564  }
2565 
2566  inline tactic operator|(tactic const & t1, tactic const & t2) {
2567  check_context(t1, t2);
2568  Z3_tactic r = Z3_tactic_or_else(t1.ctx(), t1, t2);
2569  t1.check_error();
2570  return tactic(t1.ctx(), r);
2571  }
2572 
2573  inline tactic repeat(tactic const & t, unsigned max=UINT_MAX) {
2574  Z3_tactic r = Z3_tactic_repeat(t.ctx(), t, max);
2575  t.check_error();
2576  return tactic(t.ctx(), r);
2577  }
2578 
2579  inline tactic with(tactic const & t, params const & p) {
2580  Z3_tactic r = Z3_tactic_using_params(t.ctx(), t, p);
2581  t.check_error();
2582  return tactic(t.ctx(), r);
2583  }
2584  inline tactic try_for(tactic const & t, unsigned ms) {
2585  Z3_tactic r = Z3_tactic_try_for(t.ctx(), t, ms);
2586  t.check_error();
2587  return tactic(t.ctx(), r);
2588  }
2589  inline tactic par_or(unsigned n, tactic const* tactics) {
2590  if (n == 0) {
2591  Z3_THROW(exception("a non-zero number of tactics need to be passed to par_or"));
2592  }
2593  array<Z3_tactic> buffer(n);
2594  for (unsigned i = 0; i < n; ++i) buffer[i] = tactics[i];
2595  return tactic(tactics[0].ctx(), Z3_tactic_par_or(tactics[0].ctx(), n, buffer.ptr()));
2596  }
2597 
2598  inline tactic par_and_then(tactic const & t1, tactic const & t2) {
2599  check_context(t1, t2);
2600  Z3_tactic r = Z3_tactic_par_and_then(t1.ctx(), t1, t2);
2601  t1.check_error();
2602  return tactic(t1.ctx(), r);
2603  }
2604 
2605  class probe : public object {
2606  Z3_probe m_probe;
2607  void init(Z3_probe s) {
2608  m_probe = s;
2609  Z3_probe_inc_ref(ctx(), s);
2610  }
2611  public:
2612  probe(context & c, char const * name):object(c) { Z3_probe r = Z3_mk_probe(c, name); check_error(); init(r); }
2613  probe(context & c, double val):object(c) { Z3_probe r = Z3_probe_const(c, val); check_error(); init(r); }
2614  probe(context & c, Z3_probe s):object(c) { init(s); }
2615  probe(probe const & s):object(s) { init(s.m_probe); }
2616  ~probe() { Z3_probe_dec_ref(ctx(), m_probe); }
2617  operator Z3_probe() const { return m_probe; }
2618  probe & operator=(probe const & s) {
2619  Z3_probe_inc_ref(s.ctx(), s.m_probe);
2620  Z3_probe_dec_ref(ctx(), m_probe);
2621  m_ctx = s.m_ctx;
2622  m_probe = s.m_probe;
2623  return *this;
2624  }
2625  double apply(goal const & g) const { double r = Z3_probe_apply(ctx(), m_probe, g); check_error(); return r; }
2626  double operator()(goal const & g) const { return apply(g); }
2627  friend probe operator<=(probe const & p1, probe const & p2);
2628  friend probe operator<=(probe const & p1, double p2);
2629  friend probe operator<=(double p1, probe const & p2);
2630  friend probe operator>=(probe const & p1, probe const & p2);
2631  friend probe operator>=(probe const & p1, double p2);
2632  friend probe operator>=(double p1, probe const & p2);
2633  friend probe operator<(probe const & p1, probe const & p2);
2634  friend probe operator<(probe const & p1, double p2);
2635  friend probe operator<(double p1, probe const & p2);
2636  friend probe operator>(probe const & p1, probe const & p2);
2637  friend probe operator>(probe const & p1, double p2);
2638  friend probe operator>(double p1, probe const & p2);
2639  friend probe operator==(probe const & p1, probe const & p2);
2640  friend probe operator==(probe const & p1, double p2);
2641  friend probe operator==(double p1, probe const & p2);
2642  friend probe operator&&(probe const & p1, probe const & p2);
2643  friend probe operator||(probe const & p1, probe const & p2);
2644  friend probe operator!(probe const & p);
2645  };
2646 
2647  inline probe operator<=(probe const & p1, probe const & p2) {
2648  check_context(p1, p2); Z3_probe r = Z3_probe_le(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2649  }
2650  inline probe operator<=(probe const & p1, double p2) { return p1 <= probe(p1.ctx(), p2); }
2651  inline probe operator<=(double p1, probe const & p2) { return probe(p2.ctx(), p1) <= p2; }
2652  inline probe operator>=(probe const & p1, probe const & p2) {
2653  check_context(p1, p2); Z3_probe r = Z3_probe_ge(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2654  }
2655  inline probe operator>=(probe const & p1, double p2) { return p1 >= probe(p1.ctx(), p2); }
2656  inline probe operator>=(double p1, probe const & p2) { return probe(p2.ctx(), p1) >= p2; }
2657  inline probe operator<(probe const & p1, probe const & p2) {
2658  check_context(p1, p2); Z3_probe r = Z3_probe_lt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2659  }
2660  inline probe operator<(probe const & p1, double p2) { return p1 < probe(p1.ctx(), p2); }
2661  inline probe operator<(double p1, probe const & p2) { return probe(p2.ctx(), p1) < p2; }
2662  inline probe operator>(probe const & p1, probe const & p2) {
2663  check_context(p1, p2); Z3_probe r = Z3_probe_gt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2664  }
2665  inline probe operator>(probe const & p1, double p2) { return p1 > probe(p1.ctx(), p2); }
2666  inline probe operator>(double p1, probe const & p2) { return probe(p2.ctx(), p1) > p2; }
2667  inline probe operator==(probe const & p1, probe const & p2) {
2668  check_context(p1, p2); Z3_probe r = Z3_probe_eq(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2669  }
2670  inline probe operator==(probe const & p1, double p2) { return p1 == probe(p1.ctx(), p2); }
2671  inline probe operator==(double p1, probe const & p2) { return probe(p2.ctx(), p1) == p2; }
2672  inline probe operator&&(probe const & p1, probe const & p2) {
2673  check_context(p1, p2); Z3_probe r = Z3_probe_and(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2674  }
2675  inline probe operator||(probe const & p1, probe const & p2) {
2676  check_context(p1, p2); Z3_probe r = Z3_probe_or(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2677  }
2678  inline probe operator!(probe const & p) {
2679  Z3_probe r = Z3_probe_not(p.ctx(), p); p.check_error(); return probe(p.ctx(), r);
2680  }
2681 
2682  class optimize : public object {
2683  Z3_optimize m_opt;
2684 
2685  public:
2686  class handle {
2687  unsigned m_h;
2688  public:
2689  handle(unsigned h): m_h(h) {}
2690  unsigned h() const { return m_h; }
2691  };
2692  optimize(context& c):object(c) { m_opt = Z3_mk_optimize(c); Z3_optimize_inc_ref(c, m_opt); }
2694  Z3_optimize_inc_ref(o.ctx(), o.m_opt);
2695  m_opt = o.m_opt;
2696  }
2698  Z3_optimize_inc_ref(o.ctx(), o.m_opt);
2699  Z3_optimize_dec_ref(ctx(), m_opt);
2700  m_opt = o.m_opt;
2701  m_ctx = o.m_ctx;
2702  return *this;
2703  }
2705  operator Z3_optimize() const { return m_opt; }
2706  void add(expr const& e) {
2707  assert(e.is_bool());
2708  Z3_optimize_assert(ctx(), m_opt, e);
2709  }
2710  handle add(expr const& e, unsigned weight) {
2711  assert(e.is_bool());
2712  std::stringstream strm;
2713  strm << weight;
2714  return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, strm.str().c_str(), 0));
2715  }
2716  void add(expr const& e, expr const& t) {
2717  assert(e.is_bool());
2718  Z3_optimize_assert_and_track(ctx(), m_opt, e, t);
2719  }
2720 
2721  handle add(expr const& e, char const* weight) {
2722  assert(e.is_bool());
2723  return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, weight, 0));
2724  }
2725  handle maximize(expr const& e) {
2726  return handle(Z3_optimize_maximize(ctx(), m_opt, e));
2727  }
2728  handle minimize(expr const& e) {
2729  return handle(Z3_optimize_minimize(ctx(), m_opt, e));
2730  }
2731  void push() {
2732  Z3_optimize_push(ctx(), m_opt);
2733  }
2734  void pop() {
2735  Z3_optimize_pop(ctx(), m_opt);
2736  }
2738  check_result check(expr_vector const& asms) {
2739  unsigned n = asms.size();
2740  array<Z3_ast> _asms(n);
2741  for (unsigned i = 0; i < n; i++) {
2742  check_context(*this, asms[i]);
2743  _asms[i] = asms[i];
2744  }
2745  Z3_lbool r = Z3_optimize_check(ctx(), m_opt, n, _asms.ptr());
2746  check_error();
2747  return to_check_result(r);
2748  }
2749  model get_model() const { Z3_model m = Z3_optimize_get_model(ctx(), m_opt); check_error(); return model(ctx(), m); }
2750  expr_vector unsat_core() const { Z3_ast_vector r = Z3_optimize_get_unsat_core(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
2751  void set(params const & p) { Z3_optimize_set_params(ctx(), m_opt, p); check_error(); }
2752  expr lower(handle const& h) {
2753  Z3_ast r = Z3_optimize_get_lower(ctx(), m_opt, h.h());
2754  check_error();
2755  return expr(ctx(), r);
2756  }
2757  expr upper(handle const& h) {
2758  Z3_ast r = Z3_optimize_get_upper(ctx(), m_opt, h.h());
2759  check_error();
2760  return expr(ctx(), r);
2761  }
2762  expr_vector assertions() const { Z3_ast_vector r = Z3_optimize_get_assertions(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
2763  expr_vector objectives() const { Z3_ast_vector r = Z3_optimize_get_objectives(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
2764  stats statistics() const { Z3_stats r = Z3_optimize_get_statistics(ctx(), m_opt); check_error(); return stats(ctx(), r); }
2765  friend std::ostream & operator<<(std::ostream & out, optimize const & s);
2766  void from_file(char const* filename) { Z3_optimize_from_file(ctx(), m_opt, filename); check_error(); }
2767  void from_string(char const* constraints) { Z3_optimize_from_string(ctx(), m_opt, constraints); check_error(); }
2768  std::string help() const { char const * r = Z3_optimize_get_help(ctx(), m_opt); check_error(); return r; }
2769  };
2770  inline std::ostream & operator<<(std::ostream & out, optimize const & s) { out << Z3_optimize_to_string(s.ctx(), s.m_opt); return out; }
2771 
2772  class fixedpoint : public object {
2773  Z3_fixedpoint m_fp;
2774  public:
2777  operator Z3_fixedpoint() const { return m_fp; }
2778  void from_string(char const* s) { Z3_fixedpoint_from_string(ctx(), m_fp, s); check_error(); }
2779  void from_file(char const* s) { Z3_fixedpoint_from_file(ctx(), m_fp, s); check_error(); }
2780  void add_rule(expr& rule, symbol const& name) { Z3_fixedpoint_add_rule(ctx(), m_fp, rule, name); check_error(); }
2781  void add_fact(func_decl& f, unsigned * args) { Z3_fixedpoint_add_fact(ctx(), m_fp, f, f.arity(), args); check_error(); }
2783  check_result query(func_decl_vector& relations) {
2784  array<Z3_func_decl> rs(relations);
2785  Z3_lbool r = Z3_fixedpoint_query_relations(ctx(), m_fp, rs.size(), rs.ptr());
2786  check_error();
2787  return to_check_result(r);
2788  }
2789  expr get_answer() { Z3_ast r = Z3_fixedpoint_get_answer(ctx(), m_fp); check_error(); return expr(ctx(), r); }
2790  std::string reason_unknown() { return Z3_fixedpoint_get_reason_unknown(ctx(), m_fp); }
2791  void update_rule(expr& rule, symbol const& name) { Z3_fixedpoint_update_rule(ctx(), m_fp, rule, name); check_error(); }
2792  unsigned get_num_levels(func_decl& p) { unsigned r = Z3_fixedpoint_get_num_levels(ctx(), m_fp, p); check_error(); return r; }
2793  expr get_cover_delta(int level, func_decl& p) {
2794  Z3_ast r = Z3_fixedpoint_get_cover_delta(ctx(), m_fp, level, p);
2795  check_error();
2796  return expr(ctx(), r);
2797  }
2798  void add_cover(int level, func_decl& p, expr& property) { Z3_fixedpoint_add_cover(ctx(), m_fp, level, p, property); check_error(); }
2799  stats statistics() const { Z3_stats r = Z3_fixedpoint_get_statistics(ctx(), m_fp); check_error(); return stats(ctx(), r); }
2801  expr_vector assertions() const { Z3_ast_vector r = Z3_fixedpoint_get_assertions(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
2802  expr_vector rules() const { Z3_ast_vector r = Z3_fixedpoint_get_rules(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
2803  void set(params const & p) { Z3_fixedpoint_set_params(ctx(), m_fp, p); check_error(); }
2804  std::string help() const { return Z3_fixedpoint_get_help(ctx(), m_fp); }
2806  std::string to_string() { return Z3_fixedpoint_to_string(ctx(), m_fp, 0, 0); }
2807  std::string to_string(expr_vector const& queries) {
2808  array<Z3_ast> qs(queries);
2809  return Z3_fixedpoint_to_string(ctx(), m_fp, qs.size(), qs.ptr());
2810  }
2811  };
2812  inline std::ostream & operator<<(std::ostream & out, fixedpoint const & f) { return out << Z3_fixedpoint_to_string(f.ctx(), f, 0, 0); }
2813 
2814  inline tactic fail_if(probe const & p) {
2815  Z3_tactic r = Z3_tactic_fail_if(p.ctx(), p);
2816  p.check_error();
2817  return tactic(p.ctx(), r);
2818  }
2819  inline tactic when(probe const & p, tactic const & t) {
2820  check_context(p, t);
2821  Z3_tactic r = Z3_tactic_when(t.ctx(), p, t);
2822  t.check_error();
2823  return tactic(t.ctx(), r);
2824  }
2825  inline tactic cond(probe const & p, tactic const & t1, tactic const & t2) {
2826  check_context(p, t1); check_context(p, t2);
2827  Z3_tactic r = Z3_tactic_cond(t1.ctx(), p, t1, t2);
2828  t1.check_error();
2829  return tactic(t1.ctx(), r);
2830  }
2831 
2832  inline symbol context::str_symbol(char const * s) { Z3_symbol r = Z3_mk_string_symbol(m_ctx, s); check_error(); return symbol(*this, r); }
2833  inline symbol context::int_symbol(int n) { Z3_symbol r = Z3_mk_int_symbol(m_ctx, n); check_error(); return symbol(*this, r); }
2834 
2835  inline sort context::bool_sort() { Z3_sort s = Z3_mk_bool_sort(m_ctx); check_error(); return sort(*this, s); }
2836  inline sort context::int_sort() { Z3_sort s = Z3_mk_int_sort(m_ctx); check_error(); return sort(*this, s); }
2837  inline sort context::real_sort() { Z3_sort s = Z3_mk_real_sort(m_ctx); check_error(); return sort(*this, s); }
2838  inline sort context::bv_sort(unsigned sz) { Z3_sort s = Z3_mk_bv_sort(m_ctx, sz); check_error(); return sort(*this, s); }
2839  inline sort context::string_sort() { Z3_sort s = Z3_mk_string_sort(m_ctx); check_error(); return sort(*this, s); }
2840  inline sort context::seq_sort(sort& s) { Z3_sort r = Z3_mk_seq_sort(m_ctx, s); check_error(); return sort(*this, r); }
2841  inline sort context::re_sort(sort& s) { Z3_sort r = Z3_mk_re_sort(m_ctx, s); check_error(); return sort(*this, r); }
2842  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); }
2843 
2844  template<>
2845  inline sort context::fpa_sort<16>() { return fpa_sort(5, 11); }
2846 
2847  template<>
2848  inline sort context::fpa_sort<32>() { return fpa_sort(8, 24); }
2849 
2850  template<>
2851  inline sort context::fpa_sort<64>() { return fpa_sort(11, 53); }
2852 
2853  template<>
2854  inline sort context::fpa_sort<128>() { return fpa_sort(15, 113); }
2855 
2857  switch (m_rounding_mode) {
2858  case RNA: return sort(*this, Z3_mk_fpa_rna(m_ctx));
2859  case RNE: return sort(*this, Z3_mk_fpa_rne(m_ctx));
2860  case RTP: return sort(*this, Z3_mk_fpa_rtp(m_ctx));
2861  case RTN: return sort(*this, Z3_mk_fpa_rtn(m_ctx));
2862  case RTZ: return sort(*this, Z3_mk_fpa_rtz(m_ctx));
2863  default: return sort(*this);
2864  }
2865  }
2866 
2867  inline void context::set_rounding_mode(rounding_mode rm) { m_rounding_mode = rm; }
2868 
2869  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); }
2870  inline sort context::array_sort(sort_vector const& d, sort r) {
2871  array<Z3_sort> dom(d);
2872  Z3_sort s = Z3_mk_array_sort_n(m_ctx, dom.size(), dom.ptr(), r); check_error(); return sort(*this, s);
2873  }
2874  inline sort context::enumeration_sort(char const * name, unsigned n, char const * const * enum_names, func_decl_vector & cs, func_decl_vector & ts) {
2875  array<Z3_symbol> _enum_names(n);
2876  for (unsigned i = 0; i < n; i++) { _enum_names[i] = Z3_mk_string_symbol(*this, enum_names[i]); }
2877  array<Z3_func_decl> _cs(n);
2878  array<Z3_func_decl> _ts(n);
2879  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
2880  sort s = to_sort(*this, Z3_mk_enumeration_sort(*this, _name, n, _enum_names.ptr(), _cs.ptr(), _ts.ptr()));
2881  check_error();
2882  for (unsigned i = 0; i < n; i++) { cs.push_back(func_decl(*this, _cs[i])); ts.push_back(func_decl(*this, _ts[i])); }
2883  return s;
2884  }
2885  inline func_decl context::tuple_sort(char const * name, unsigned n, char const * const * names, sort const* sorts, func_decl_vector & projs) {
2886  array<Z3_symbol> _names(n);
2887  array<Z3_sort> _sorts(n);
2888  for (unsigned i = 0; i < n; i++) { _names[i] = Z3_mk_string_symbol(*this, names[i]); _sorts[i] = sorts[i]; }
2889  array<Z3_func_decl> _projs(n);
2890  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
2891  Z3_func_decl tuple;
2892  sort _ignore_s = to_sort(*this, Z3_mk_tuple_sort(*this, _name, n, _names.ptr(), _sorts.ptr(), &tuple, _projs.ptr()));
2893  check_error();
2894  for (unsigned i = 0; i < n; i++) { projs.push_back(func_decl(*this, _projs[i])); }
2895  return func_decl(*this, tuple);
2896  }
2897 
2898  inline sort context::uninterpreted_sort(char const* name) {
2899  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
2900  return to_sort(*this, Z3_mk_uninterpreted_sort(*this, _name));
2901  }
2903  return to_sort(*this, Z3_mk_uninterpreted_sort(*this, name));
2904  }
2905 
2906  inline func_decl context::function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
2907  array<Z3_sort> args(arity);
2908  for (unsigned i = 0; i < arity; i++) {
2909  check_context(domain[i], range);
2910  args[i] = domain[i];
2911  }
2912  Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, arity, args.ptr(), range);
2913  check_error();
2914  return func_decl(*this, f);
2915  }
2916 
2917  inline func_decl context::function(char const * name, unsigned arity, sort const * domain, sort const & range) {
2918  return function(range.ctx().str_symbol(name), arity, domain, range);
2919  }
2920 
2921  inline func_decl context::function(symbol const& name, sort_vector const& domain, sort const& range) {
2922  array<Z3_sort> args(domain.size());
2923  for (unsigned i = 0; i < domain.size(); i++) {
2924  check_context(domain[i], range);
2925  args[i] = domain[i];
2926  }
2927  Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, domain.size(), args.ptr(), range);
2928  check_error();
2929  return func_decl(*this, f);
2930  }
2931 
2932  inline func_decl context::function(char const * name, sort_vector const& domain, sort const& range) {
2933  return function(range.ctx().str_symbol(name), domain, range);
2934  }
2935 
2936 
2937  inline func_decl context::function(char const * name, sort const & domain, sort const & range) {
2938  check_context(domain, range);
2939  Z3_sort args[1] = { domain };
2940  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 1, args, range);
2941  check_error();
2942  return func_decl(*this, f);
2943  }
2944 
2945  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & range) {
2946  check_context(d1, range); check_context(d2, range);
2947  Z3_sort args[2] = { d1, d2 };
2948  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 2, args, range);
2949  check_error();
2950  return func_decl(*this, f);
2951  }
2952 
2953  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
2954  check_context(d1, range); check_context(d2, range); check_context(d3, range);
2955  Z3_sort args[3] = { d1, d2, d3 };
2956  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 3, args, range);
2957  check_error();
2958  return func_decl(*this, f);
2959  }
2960 
2961  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
2962  check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range);
2963  Z3_sort args[4] = { d1, d2, d3, d4 };
2964  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 4, args, range);
2965  check_error();
2966  return func_decl(*this, f);
2967  }
2968 
2969  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) {
2970  check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range); check_context(d5, range);
2971  Z3_sort args[5] = { d1, d2, d3, d4, d5 };
2972  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 5, args, range);
2973  check_error();
2974  return func_decl(*this, f);
2975  }
2976 
2977  inline func_decl context::recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
2978  array<Z3_sort> args(arity);
2979  for (unsigned i = 0; i < arity; i++) {
2980  check_context(domain[i], range);
2981  args[i] = domain[i];
2982  }
2983  Z3_func_decl f = Z3_mk_rec_func_decl(m_ctx, name, arity, args.ptr(), range);
2984  check_error();
2985  return func_decl(*this, f);
2986 
2987  }
2988 
2989  inline func_decl context::recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
2990  return recfun(str_symbol(name), arity, domain, range);
2991  }
2992 
2993  inline func_decl context::recfun(char const * name, sort const& d1, sort const & range) {
2994  return recfun(str_symbol(name), 1, &d1, range);
2995  }
2996 
2997  inline func_decl context::recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
2998  sort dom[2] = { d1, d2 };
2999  return recfun(str_symbol(name), 2, dom, range);
3000  }
3001 
3002  inline void context::recdef(func_decl f, expr_vector const& args, expr const& body) {
3003  check_context(f, args); check_context(f, body);
3004  array<Z3_ast> vars(args);
3005  Z3_add_rec_def(f.ctx(), f, vars.size(), vars.ptr(), body);
3006  }
3007 
3008  inline expr context::constant(symbol const & name, sort const & s) {
3009  Z3_ast r = Z3_mk_const(m_ctx, name, s);
3010  check_error();
3011  return expr(*this, r);
3012  }
3013  inline expr context::constant(char const * name, sort const & s) { return constant(str_symbol(name), s); }
3014  inline expr context::bool_const(char const * name) { return constant(name, bool_sort()); }
3015  inline expr context::int_const(char const * name) { return constant(name, int_sort()); }
3016  inline expr context::real_const(char const * name) { return constant(name, real_sort()); }
3017  inline expr context::bv_const(char const * name, unsigned sz) { return constant(name, bv_sort(sz)); }
3018  inline expr context::fpa_const(char const * name, unsigned ebits, unsigned sbits) { return constant(name, fpa_sort(ebits, sbits)); }
3019 
3020  template<size_t precision>
3021  inline expr context::fpa_const(char const * name) { return constant(name, fpa_sort<precision>()); }
3022 
3023  inline expr context::bool_val(bool b) { return b ? expr(*this, Z3_mk_true(m_ctx)) : expr(*this, Z3_mk_false(m_ctx)); }
3024 
3025  inline expr context::int_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, int_sort()); check_error(); return expr(*this, r); }
3026  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); }
3027  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); }
3028  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); }
3029  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); }
3030 
3031  inline expr context::real_val(int n, int d) { Z3_ast r = Z3_mk_real(m_ctx, n, d); check_error(); return expr(*this, r); }
3032  inline expr context::real_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, real_sort()); check_error(); return expr(*this, r); }
3033  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); }
3034  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); }
3035  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); }
3036  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); }
3037 
3038  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); }
3039  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); }
3040  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); }
3041  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); }
3042  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); }
3043  inline expr context::bv_val(unsigned n, bool const* bits) {
3044  array<bool> _bits(n);
3045  for (unsigned i = 0; i < n; ++i) _bits[i] = bits[i] ? 1 : 0;
3046  Z3_ast r = Z3_mk_bv_numeral(m_ctx, n, _bits.ptr()); check_error(); return expr(*this, r);
3047  }
3048 
3049  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); }
3050  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); }
3051 
3052  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); }
3053  inline expr context::string_val(char const* s) { Z3_ast r = Z3_mk_string(m_ctx, s); check_error(); return expr(*this, r); }
3054  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); }
3055 
3056  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); }
3057 
3058  inline expr func_decl::operator()(unsigned n, expr const * args) const {
3059  array<Z3_ast> _args(n);
3060  for (unsigned i = 0; i < n; i++) {
3061  check_context(*this, args[i]);
3062  _args[i] = args[i];
3063  }
3064  Z3_ast r = Z3_mk_app(ctx(), *this, n, _args.ptr());
3065  check_error();
3066  return expr(ctx(), r);
3067 
3068  }
3069  inline expr func_decl::operator()(expr_vector const& args) const {
3070  array<Z3_ast> _args(args.size());
3071  for (unsigned i = 0; i < args.size(); i++) {
3072  check_context(*this, args[i]);
3073  _args[i] = args[i];
3074  }
3075  Z3_ast r = Z3_mk_app(ctx(), *this, args.size(), _args.ptr());
3076  check_error();
3077  return expr(ctx(), r);
3078  }
3079  inline expr func_decl::operator()() const {
3080  Z3_ast r = Z3_mk_app(ctx(), *this, 0, 0);
3081  ctx().check_error();
3082  return expr(ctx(), r);
3083  }
3084  inline expr func_decl::operator()(expr const & a) const {
3085  check_context(*this, a);
3086  Z3_ast args[1] = { a };
3087  Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
3088  ctx().check_error();
3089  return expr(ctx(), r);
3090  }
3091  inline expr func_decl::operator()(int a) const {
3092  Z3_ast args[1] = { ctx().num_val(a, domain(0)) };
3093  Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
3094  ctx().check_error();
3095  return expr(ctx(), r);
3096  }
3097  inline expr func_decl::operator()(expr const & a1, expr const & a2) const {
3098  check_context(*this, a1); check_context(*this, a2);
3099  Z3_ast args[2] = { a1, a2 };
3100  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
3101  ctx().check_error();
3102  return expr(ctx(), r);
3103  }
3104  inline expr func_decl::operator()(expr const & a1, int a2) const {
3105  check_context(*this, a1);
3106  Z3_ast args[2] = { a1, ctx().num_val(a2, domain(1)) };
3107  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
3108  ctx().check_error();
3109  return expr(ctx(), r);
3110  }
3111  inline expr func_decl::operator()(int a1, expr const & a2) const {
3112  check_context(*this, a2);
3113  Z3_ast args[2] = { ctx().num_val(a1, domain(0)), a2 };
3114  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
3115  ctx().check_error();
3116  return expr(ctx(), r);
3117  }
3118  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3) const {
3119  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3);
3120  Z3_ast args[3] = { a1, a2, a3 };
3121  Z3_ast r = Z3_mk_app(ctx(), *this, 3, args);
3122  ctx().check_error();
3123  return expr(ctx(), r);
3124  }
3125  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const {
3126  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4);
3127  Z3_ast args[4] = { a1, a2, a3, a4 };
3128  Z3_ast r = Z3_mk_app(ctx(), *this, 4, args);
3129  ctx().check_error();
3130  return expr(ctx(), r);
3131  }
3132  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const {
3133  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4); check_context(*this, a5);
3134  Z3_ast args[5] = { a1, a2, a3, a4, a5 };
3135  Z3_ast r = Z3_mk_app(ctx(), *this, 5, args);
3136  ctx().check_error();
3137  return expr(ctx(), r);
3138  }
3139 
3140  inline expr to_real(expr const & a) { Z3_ast r = Z3_mk_int2real(a.ctx(), a); a.check_error(); return expr(a.ctx(), r); }
3141 
3142  inline func_decl function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3143  return range.ctx().function(name, arity, domain, range);
3144  }
3145  inline func_decl function(char const * name, unsigned arity, sort const * domain, sort const & range) {
3146  return range.ctx().function(name, arity, domain, range);
3147  }
3148  inline func_decl function(char const * name, sort const & domain, sort const & range) {
3149  return range.ctx().function(name, domain, range);
3150  }
3151  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & range) {
3152  return range.ctx().function(name, d1, d2, range);
3153  }
3154  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
3155  return range.ctx().function(name, d1, d2, d3, range);
3156  }
3157  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
3158  return range.ctx().function(name, d1, d2, d3, d4, range);
3159  }
3160  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) {
3161  return range.ctx().function(name, d1, d2, d3, d4, d5, range);
3162  }
3163  inline func_decl function(char const* name, sort_vector const& domain, sort const& range) {
3164  return range.ctx().function(name, domain, range);
3165  }
3166  inline func_decl function(std::string const& name, sort_vector const& domain, sort const& range) {
3167  return range.ctx().function(name.c_str(), domain, range);
3168  }
3169 
3170  inline func_decl recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3171  return range.ctx().recfun(name, arity, domain, range);
3172  }
3173  inline func_decl recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
3174  return range.ctx().recfun(name, arity, domain, range);
3175  }
3176  inline func_decl recfun(char const * name, sort const& d1, sort const & range) {
3177  return range.ctx().recfun(name, d1, range);
3178  }
3179  inline func_decl recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
3180  return range.ctx().recfun(name, d1, d2, range);
3181  }
3182 
3183  inline expr select(expr const & a, expr const & i) {
3184  check_context(a, i);
3185  Z3_ast r = Z3_mk_select(a.ctx(), a, i);
3186  a.check_error();
3187  return expr(a.ctx(), r);
3188  }
3189  inline expr select(expr const & a, int i) {
3190  return select(a, a.ctx().num_val(i, a.get_sort().array_domain()));
3191  }
3192  inline expr select(expr const & a, expr_vector const & i) {
3193  check_context(a, i);
3194  array<Z3_ast> idxs(i);
3195  Z3_ast r = Z3_mk_select_n(a.ctx(), a, idxs.size(), idxs.ptr());
3196  a.check_error();
3197  return expr(a.ctx(), r);
3198  }
3199 
3200  inline expr store(expr const & a, expr const & i, expr const & v) {
3201  check_context(a, i); check_context(a, v);
3202  Z3_ast r = Z3_mk_store(a.ctx(), a, i, v);
3203  a.check_error();
3204  return expr(a.ctx(), r);
3205  }
3206 
3207  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); }
3208  inline expr store(expr const & a, expr i, int v) { return store(a, i, a.ctx().num_val(v, a.get_sort().array_range())); }
3209  inline expr store(expr const & a, int i, int v) {
3210  return store(a, a.ctx().num_val(i, a.get_sort().array_domain()), a.ctx().num_val(v, a.get_sort().array_range()));
3211  }
3212  inline expr store(expr const & a, expr_vector const & i, expr const & v) {
3213  check_context(a, i); check_context(a, v);
3214  array<Z3_ast> idxs(i);
3215  Z3_ast r = Z3_mk_store_n(a.ctx(), a, idxs.size(), idxs.ptr(), v);
3216  a.check_error();
3217  return expr(a.ctx(), r);
3218  }
3219 
3220  inline expr as_array(func_decl & f) {
3221  Z3_ast r = Z3_mk_as_array(f.ctx(), f);
3222  f.check_error();
3223  return expr(f.ctx(), r);
3224  }
3225 
3226 #define MK_EXPR1(_fn, _arg) \
3227  Z3_ast r = _fn(_arg.ctx(), _arg); \
3228  _arg.check_error(); \
3229  return expr(_arg.ctx(), r);
3230 
3231 #define MK_EXPR2(_fn, _arg1, _arg2) \
3232  check_context(_arg1, _arg2); \
3233  Z3_ast r = _fn(_arg1.ctx(), _arg1, _arg2); \
3234  _arg1.check_error(); \
3235  return expr(_arg1.ctx(), r);
3236 
3237  inline expr const_array(sort const & d, expr const & v) {
3238  MK_EXPR2(Z3_mk_const_array, d, v);
3239  }
3240 
3241  inline expr empty_set(sort const& s) {
3243  }
3244 
3245  inline expr full_set(sort const& s) {
3247  }
3248 
3249  inline expr set_add(expr const& s, expr const& e) {
3250  MK_EXPR2(Z3_mk_set_add, s, e);
3251  }
3252 
3253  inline expr set_del(expr const& s, expr const& e) {
3254  MK_EXPR2(Z3_mk_set_del, s, e);
3255  }
3256 
3257  inline expr set_union(expr const& a, expr const& b) {
3258  check_context(a, b);
3259  Z3_ast es[2] = { a, b };
3260  Z3_ast r = Z3_mk_set_union(a.ctx(), 2, es);
3261  a.check_error();
3262  return expr(a.ctx(), r);
3263  }
3264 
3265  inline expr set_intersect(expr const& a, expr const& b) {
3266  check_context(a, b);
3267  Z3_ast es[2] = { a, b };
3268  Z3_ast r = Z3_mk_set_intersect(a.ctx(), 2, es);
3269  a.check_error();
3270  return expr(a.ctx(), r);
3271  }
3272 
3273  inline expr set_difference(expr const& a, expr const& b) {
3275  }
3276 
3277  inline expr set_complement(expr const& a) {
3279  }
3280 
3281  inline expr set_member(expr const& s, expr const& e) {
3282  MK_EXPR2(Z3_mk_set_member, s, e);
3283  }
3284 
3285  inline expr set_subset(expr const& a, expr const& b) {
3286  MK_EXPR2(Z3_mk_set_subset, a, b);
3287  }
3288 
3289  // sequence and regular expression operations.
3290  // union is +
3291  // concat is overloaded to handle sequences and regular expressions
3292 
3293  inline expr empty(sort const& s) {
3294  Z3_ast r = Z3_mk_seq_empty(s.ctx(), s);
3295  s.check_error();
3296  return expr(s.ctx(), r);
3297  }
3298  inline expr suffixof(expr const& a, expr const& b) {
3299  check_context(a, b);
3300  Z3_ast r = Z3_mk_seq_suffix(a.ctx(), a, b);
3301  a.check_error();
3302  return expr(a.ctx(), r);
3303  }
3304  inline expr prefixof(expr const& a, expr const& b) {
3305  check_context(a, b);
3306  Z3_ast r = Z3_mk_seq_prefix(a.ctx(), a, b);
3307  a.check_error();
3308  return expr(a.ctx(), r);
3309  }
3310  inline expr indexof(expr const& s, expr const& substr, expr const& offset) {
3311  check_context(s, substr); check_context(s, offset);
3312  Z3_ast r = Z3_mk_seq_index(s.ctx(), s, substr, offset);
3313  s.check_error();
3314  return expr(s.ctx(), r);
3315  }
3316  inline expr last_indexof(expr const& s, expr const& substr) {
3317  check_context(s, substr);
3318  Z3_ast r = Z3_mk_seq_last_index(s.ctx(), s, substr);
3319  s.check_error();
3320  return expr(s.ctx(), r);
3321  }
3322  inline expr to_re(expr const& s) {
3324  }
3325  inline expr in_re(expr const& s, expr const& re) {
3326  MK_EXPR2(Z3_mk_seq_in_re, s, re);
3327  }
3328  inline expr plus(expr const& re) {
3329  MK_EXPR1(Z3_mk_re_plus, re);
3330  }
3331  inline expr option(expr const& re) {
3333  }
3334  inline expr star(expr const& re) {
3335  MK_EXPR1(Z3_mk_re_star, re);
3336  }
3337  inline expr re_empty(sort const& s) {
3338  Z3_ast r = Z3_mk_re_empty(s.ctx(), s);
3339  s.check_error();
3340  return expr(s.ctx(), r);
3341  }
3342  inline expr re_full(sort const& s) {
3343  Z3_ast r = Z3_mk_re_full(s.ctx(), s);
3344  s.check_error();
3345  return expr(s.ctx(), r);
3346  }
3347  inline expr re_intersect(expr_vector const& args) {
3348  assert(args.size() > 0);
3349  context& ctx = args[0].ctx();
3350  array<Z3_ast> _args(args);
3351  Z3_ast r = Z3_mk_re_intersect(ctx, _args.size(), _args.ptr());
3352  ctx.check_error();
3353  return expr(ctx, r);
3354  }
3355  inline expr re_complement(expr const& a) {
3357  }
3358  inline expr range(expr const& lo, expr const& hi) {
3359  check_context(lo, hi);
3360  Z3_ast r = Z3_mk_re_range(lo.ctx(), lo, hi);
3361  lo.check_error();
3362  return expr(lo.ctx(), r);
3363  }
3364 
3365 
3366 
3367 
3368 
3369  inline expr_vector context::parse_string(char const* s) {
3370  Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, 0, 0, 0, 0, 0, 0);
3371  check_error();
3372  return expr_vector(*this, r);
3373 
3374  }
3375  inline expr_vector context::parse_file(char const* s) {
3376  Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, 0, 0, 0, 0, 0, 0);
3377  check_error();
3378  return expr_vector(*this, r);
3379  }
3380 
3381  inline expr_vector context::parse_string(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
3382  array<Z3_symbol> sort_names(sorts.size());
3383  array<Z3_symbol> decl_names(decls.size());
3384  array<Z3_sort> sorts1(sorts);
3385  array<Z3_func_decl> decls1(decls);
3386  for (unsigned i = 0; i < sorts.size(); ++i) {
3387  sort_names[i] = sorts[i].name();
3388  }
3389  for (unsigned i = 0; i < decls.size(); ++i) {
3390  decl_names[i] = decls[i].name();
3391  }
3392 
3393  Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
3394  check_error();
3395  return expr_vector(*this, r);
3396  }
3397 
3398  inline expr_vector context::parse_file(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
3399  array<Z3_symbol> sort_names(sorts.size());
3400  array<Z3_symbol> decl_names(decls.size());
3401  array<Z3_sort> sorts1(sorts);
3402  array<Z3_func_decl> decls1(decls);
3403  for (unsigned i = 0; i < sorts.size(); ++i) {
3404  sort_names[i] = sorts[i].name();
3405  }
3406  for (unsigned i = 0; i < decls.size(); ++i) {
3407  decl_names[i] = decls[i].name();
3408  }
3409  Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
3410  check_error();
3411  return expr_vector(*this, r);
3412  }
3413 
3414 
3415  inline expr expr::substitute(expr_vector const& src, expr_vector const& dst) {
3416  assert(src.size() == dst.size());
3417  array<Z3_ast> _src(src.size());
3418  array<Z3_ast> _dst(dst.size());
3419  for (unsigned i = 0; i < src.size(); ++i) {
3420  _src[i] = src[i];
3421  _dst[i] = dst[i];
3422  }
3423  Z3_ast r = Z3_substitute(ctx(), m_ast, src.size(), _src.ptr(), _dst.ptr());
3424  check_error();
3425  return expr(ctx(), r);
3426  }
3427 
3428  inline expr expr::substitute(expr_vector const& dst) {
3429  array<Z3_ast> _dst(dst.size());
3430  for (unsigned i = 0; i < dst.size(); ++i) {
3431  _dst[i] = dst[i];
3432  }
3433  Z3_ast r = Z3_substitute_vars(ctx(), m_ast, dst.size(), _dst.ptr());
3434  check_error();
3435  return expr(ctx(), r);
3436  }
3437 
3438 
3439 
3440 }
3441 
3444 #undef Z3_THROW
3445 #endif
3446 
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:2431
Definition: z3++.h:134
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:1984
expr mod(expr const &a, expr const &b)
Definition: z3++.h:1262
friend expr mk_or(expr_vector const &args)
Definition: z3++.h:2037
Z3_ast Z3_API Z3_mk_unsigned_int(Z3_context c, unsigned v, Z3_sort ty)
Create a numeral of a int, bit-vector, or finite-domain sort.
Z3_ast Z3_API Z3_mk_re_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.
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.
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:146
bool is_numeral_u(unsigned &i) const
Definition: z3++.h:743
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:1546
Z3_ast Z3_API Z3_mk_bvnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nor.
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:2298
std::string help() const
Definition: z3++.h:2548
sort bool_sort()
Return the Boolean sort.
Definition: z3++.h:2835
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:1959
void check_parser_error() const
Definition: z3++.h:185
friend expr operator+(expr const &a, expr const &b)
Definition: z3++.h:1334
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.
void add_const_interp(func_decl &f, expr &value)
Definition: z3++.h:2176
expr mk_and(expr_vector const &args)
Definition: z3++.h:2043
friend expr pw(expr const &a, expr const &b)
Definition: z3++.h:1258
bool operator!=(cube_iterator const &other)
Definition: z3++.h:2399
bool is_numeral_i64(int64_t &i) const
Definition: z3++.h:740
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: ...
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:2248
iterator(iterator const &other)
Definition: z3++.h:1824
model(context &c)
Definition: z3++.h:2113
bool is_int() const
Return true if this sort is the Integer sort.
Definition: z3++.h:548
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.
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...
iterator operator++(int)
Definition: z3++.h:1840
tactic & operator=(tactic const &s)
Definition: z3++.h:2531
expr operator[](expr const &index) const
Definition: z3++.h:1210
sort re_sort(sort &seq_sort)
Return a regular expression sort over sequences seq_sort.
Definition: z3++.h:2841
void add_fact(func_decl &f, unsigned *args)
Definition: z3++.h:2781
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:2614
void Z3_API Z3_goal_reset(Z3_context c, Z3_goal g)
Erase all formulas from the given goal.
expr pbeq(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:1951
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:1552
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.
probe & operator=(probe const &s)
Definition: z3++.h:2618
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:2139
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:2792
std::string documentation(symbol const &s)
Definition: z3++.h:452
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.
sort fpa_rounding_mode()
Return a RoundingMode sort.
Definition: z3++.h:2856
friend expr operator>=(expr const &a, expr const &b)
Definition: z3++.h:1388
#define Z3_THROW(x)
Definition: z3++.h:96
bool is_array() const
Return true if this is a Array expression.
Definition: z3++.h:702
unsigned id() const
retrieve unique identifier for expression.
Definition: z3++.h:802
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.
Z3_string Z3_API Z3_goal_to_dimacs_string(Z3_context c, Z3_goal g)
Convert a goal into a DIMACS formatted string. The goal must be in CNF. You can convert a goal to CNF...
symbol str_symbol(char const *s)
Create a Z3 symbol based on the given string.
Definition: z3++.h:2832
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.
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:1729
bool operator==(cube_iterator const &other)
Definition: z3++.h:2396
Z3_ast Z3_API Z3_mk_full_set(Z3_context c, Z3_sort domain)
Create the full set.
void set(char const *k, symbol const &s)
Definition: z3++.h:475
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...
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:510
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:1742
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()
Definition: z3++.h:2253
expr contains(expr const &s)
Definition: z3++.h:1158
expr length() const
Definition: z3++.h:1176
Z3_string Z3_API Z3_ast_to_string(Z3_context c, Z3_ast a)
Convert the given AST node into a string.
stats statistics() const
Definition: z3++.h:2299
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:2825
Z3_ast Z3_API Z3_mk_unary_minus(Z3_context c, Z3_ast arg)
Create an AST node representing - arg.
solver(context &c, simple)
Definition: z3++.h:2233
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:669
char const * msg() const
Definition: z3++.h:87
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:3358
expr bv_val(int n, unsigned sz)
Definition: z3++.h:3038
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:1324
expr value() const
Definition: z3++.h:2069
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_sort Z3_API Z3_mk_int_sort(Z3_context c)
Create the integer type.
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:690
Definition: z3_api.h:1362
func_interp & operator=(func_interp const &s)
Definition: z3++.h:2085
friend expr operator!=(expr const &a, expr const &b)
Definition: z3++.h:1324
iterator & operator++()
Definition: z3++.h:1833
Z3_ast Z3_API Z3_mk_bvashr(Z3_context c, Z3_ast t1, Z3_ast t2)
Arithmetic shift right.
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:2613
bool Z3_API Z3_is_algebraic_number(Z3_context c, Z3_ast a)
Return true if the given AST is a real algebraic number.
expr itos() const
Definition: z3++.h:1186
std::string help() const
Definition: z3++.h:2768
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:2062
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:114
expr_vector units() const
Definition: z3++.h:2303
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:2252
expr fma(expr const &a, expr const &b, expr const &c, expr const &rm)
Definition: z3++.h:1608
tactic when(probe const &p, tactic const &t)
Definition: z3++.h:2819
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:2099
config()
Definition: z3++.h:108
friend std::ostream & operator<<(std::ostream &out, params const &p)
Definition: z3++.h:480
void set(char const *k, double n)
Definition: z3++.h:474
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:2752
cube_generator cubes()
Definition: z3++.h:2430
bool is_numeral_u64(uint64_t &i) const
Definition: z3++.h:741
friend expr operator/(expr const &a, expr const &b)
Definition: z3++.h:1405
Z3_probe Z3_API Z3_probe_eq(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when the value returned by p1 is equal to the value returned ...
Z3_ast Z3_API Z3_mk_concat(Z3_context c, Z3_ast t1, Z3_ast t2)
Concatenate the given bit-vectors.
void set(char const *param, char const *value)
Update global parameter param with string value.
Definition: z3++.h:203
array(unsigned sz)
Definition: z3++.h:388
std::ostream & operator<<(std::ostream &out, exception const &e)
Definition: z3++.h:90
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:516
~solver()
Definition: z3++.h:2238
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:1225
unsigned bv_size() const
Return the size of this Bit-vector sort.
Definition: z3++.h:595
bool is_bv() const
Return true if this sort is a Bit-vector sort.
Definition: z3++.h:560
Z3_ast Z3_API Z3_mk_bvuge(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than or equal to.
optimize(optimize &o)
Definition: z3++.h:2693
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:620
int to_int() const
Definition: z3++.h:421
friend expr operator^(expr const &a, expr const &b)
Definition: z3++.h:1542
~array()
Definition: z3++.h:391
expr full_set(sort const &s)
Definition: z3++.h:3245
model(model &src, context &dst, translate)
Definition: z3++.h:2116
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_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:506
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:1021
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:2838
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:221
bool is_double(unsigned i) const
Definition: z3++.h:2207
expr lshr(expr const &a, expr const &b)
logic shift right operator for bitvectors
Definition: z3++.h:1715
expr udiv(expr const &a, expr const &b)
unsigned division operator for bitvectors.
Definition: z3++.h:1680
apply_result operator()(goal const &g) const
Definition: z3++.h:2545
Z3_ast Z3_API Z3_mk_le(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than or equal to.
solver mk_solver() const
Definition: z3++.h:2538
friend expr concat(expr const &a, expr const &b)
Definition: z3++.h:1993
friend expr mod(expr const &a, expr const &b)
Definition: z3++.h:1262
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.
expr upper(handle const &h)
Definition: z3++.h:2757
Z3_goal_prec
A Goal is essentially a set of formulas. Z3 provide APIs for building strategies/tactics for solving ...
Definition: z3_api.h:1397
Z3_string Z3_API Z3_solver_to_dimacs_string(Z3_context c, Z3_solver s)
Convert a solver into a DIMACS formatted string.
Z3_error_code
Z3 error codes (See Z3_get_error_code).
Definition: z3_api.h:1360
goal(context &c, Z3_goal s)
Definition: z3++.h:2444
void push_back(T const &e)
Definition: z3++.h:1795
optimize & operator=(optimize const &o)
Definition: z3++.h:2697
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:453
expr eval(expr const &n, bool model_completion=false) const
Definition: z3++.h:2127
model(context &c, Z3_model m)
Definition: z3++.h:2114
Z3_ast_kind kind() const
Definition: z3++.h:495
sort array_sort(sort d, sort r)
Return an array sort for arrays from d to r.
Definition: z3++.h:2869
expr constant(symbol const &name, sort const &s)
Definition: z3++.h:3008
void pop()
Definition: z3++.h:2734
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.
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:2142
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:2782
bool is_ite() const
Definition: z3++.h:1029
unsigned fpa_sbits() const
Definition: z3++.h:599
#define _Z3_MK_UN_(a, mkun)
Definition: z3++.h:1278
fixedpoint(context &c)
Definition: z3++.h:2775
Z3_ast Z3_API Z3_mk_bvule(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned less than or equal to.
expr_vector const & operator*() const
Definition: z3++.h:2394
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:2528
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...
friend expr operator||(expr const &a, expr const &b)
Return an expression representing a or b.
Definition: z3++.h:1302
sort fpa_rounding_mode()
Return a RoundingMode sort.
Definition: z3++.h:920
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:196
~probe()
Definition: z3++.h:2616
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...
bool is_datatype() const
Return true if this is a Datatype expression.
Definition: z3++.h:706
void add(expr const &e, expr const &t)
Definition: z3++.h:2716
Z3_decl_kind Z3_API Z3_get_decl_kind(Z3_context c, Z3_func_decl d)
Return declaration kind corresponding to declaration.
expr rotate_right(unsigned i)
Definition: z3++.h:1122
~tactic()
Definition: z3++.h:2529
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:1769
check_result check()
Definition: z3++.h:2737
Z3_ast Z3_API Z3_mk_re_intersect(Z3_context c, unsigned n, Z3_ast const args[])
Create the intersection of the regular languages.
friend probe operator||(probe const &p1, probe const &p2)
Definition: z3++.h:2675
expr is_int(expr const &e)
Definition: z3++.h:1286
void Z3_API Z3_optimize_inc_ref(Z3_context c, Z3_optimize d)
Increment the reference counter of the given optimize context.
Z3_ast Z3_API Z3_solver_get_proof(Z3_context c, Z3_solver s)
Retrieve the proof for the last Z3_solver_check or Z3_solver_check_assumptions.
Z3_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:1542
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:2770
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:2767
unsigned lo() const
Definition: z3++.h:1130
Exception used to sign API usage errors.
Definition: z3++.h:83
expr operator*(expr const &a, expr const &b)
Definition: z3++.h:1364
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:2208
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.
Definition: z3++.h:136
Z3_apply_result Z3_API Z3_tactic_apply(Z3_context c, Z3_tactic t, Z3_goal g)
Apply tactic t to the goal g.
expr nth(expr const &index) const
Definition: z3++.h:1170
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...
A Z3 expression is used to represent formulas and terms. For Z3, a formula is any expression of sort ...
Definition: z3++.h:667
void reset_params()
Definition: z3++.h:78
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.
expr operator!(expr const &a)
Definition: z3++.h:1284
expr set_subset(expr const &a, expr const &b)
Definition: z3++.h:3285
Z3_ast Z3_API Z3_mk_empty_set(Z3_context c, Z3_sort domain)
Create the empty set.
#define MK_EXPR2(_fn, _arg1, _arg2)
Definition: z3++.h:3231
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.
expr & operator=(expr const &n)
Definition: z3++.h:672
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:2463
bool Z3_API Z3_goal_inconsistent(Z3_context c, Z3_goal g)
Return true if the given goal contains the formula false.
bool is_uint(unsigned i) const
Definition: z3++.h:2206
expr ule(expr const &a, expr const &b)
unsigned less than or equal to operator for bitvectors.
Definition: z3++.h:1656
expr in_re(expr const &s, expr const &re)
Definition: z3++.h:3325
symbol name(unsigned i)
Definition: z3++.h:450
void recdef(func_decl, expr_vector const &args, expr const &body)
Definition: z3++.h:3002
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:2300
iterator begin() const
Definition: z3++.h:1844
bool is_lambda() const
Return true if this expression is a lambda expression.
Definition: z3++.h:771
Z3_ast Z3_API Z3_mk_seq_length(Z3_context c, Z3_ast s)
Return the length of the sequence s.
bool is_fpa() const
Return true if this is a FloatingPoint expression. .
Definition: z3++.h:732
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.
Definition: z3++.h:130
Z3_error_code check_error() const
Definition: z3++.h:407
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:211
static param_descrs simplify_param_descrs(context &c)
Definition: z3++.h:447
friend expr mk_and(expr_vector const &args)
Definition: z3++.h:2043
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:2093
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:2425
unsigned arity() const
Definition: z3++.h:631
Z3_ast Z3_API Z3_mk_re_complement(Z3_context c, Z3_ast re)
Create the complement of the regular language re.
void update_rule(expr &rule, symbol const &name)
Definition: z3++.h:2791
bool enable_exceptions() const
Definition: z3++.h:198
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:584
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...
func_decl operator()(context &c, Z3_ast a)
Definition: z3++.h:1777
ast_vector_tpl(ast_vector_tpl const &s)
Definition: z3++.h:1790
friend expr fma(expr const &a, expr const &b, expr const &c)
FloatingPoint fused multiply-add.
std::string to_string(expr_vector const &queries)
Definition: z3++.h:2807
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:73
stats(context &c)
Definition: z3++.h:2192
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:1388
std::string reason_unknown()
Definition: z3++.h:2790
expr replace(expr const &src, expr const &dst) const
Definition: z3++.h:1147
void add_entry(expr_vector const &args, expr &value)
Definition: z3++.h:2095
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_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:1258
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:2493
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:2652
expr(context &c, Z3_ast n)
Definition: z3++.h:670
~goal()
Definition: z3++.h:2446
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:3273
symbol name() const
Return name of sort.
Definition: z3++.h:540
T * operator->() const
Definition: z3++.h:1841
unsigned Z3_API Z3_ast_vector_size(Z3_context c, Z3_ast_vector v)
Return the size of the given AST vector.
bool is_and() const
Definition: z3++.h:1024
unsigned id() const
retrieve unique identifier for func_decl.
Definition: z3++.h:629
expr operator~(expr const &a)
Definition: z3++.h:1606
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:2458
bool empty() const
Definition: z3++.h:1799
Z3_ast Z3_API Z3_mk_fpa_rtn(Z3_context c)
Create a numeral of RoundingMode sort which represents the TowardNegative rounding mode...
expr_vector assertions() const
Definition: z3++.h:2801
expr_vector assertions() const
Definition: z3++.h:2762
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:2750
friend expr operator-(expr const &a)
Definition: z3++.h:1427
void Z3_API Z3_solver_from_string(Z3_context c, Z3_solver s, Z3_string file_name)
load solver assertions from a string.
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:1984
check_result check(unsigned n, expr *const assumptions)
Definition: z3++.h:2271
Z3_ast Z3_API Z3_mk_bvnand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nand.
check_result check(expr_vector assumptions)
Definition: z3++.h:2281
expr rem(expr const &a, expr const &b)
Definition: z3++.h:1266
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:1364
probe(context &c, char const *name)
Definition: z3++.h:2612
friend std::ostream & operator<<(std::ostream &out, solver const &s)
Definition: z3++.h:2434
Z3_ast Z3_API Z3_mk_bvslt(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed less than.
expr get_answer()
Definition: z3++.h:2789
Z3_sort Z3_API Z3_mk_string_sort(Z3_context c)
Create a sort for 8 bit strings.
~stats()
Definition: z3++.h:2195
bool is_forall() const
Return true if this expression is a universal quantifier.
Definition: z3++.h:763
friend expr min(expr const &a, expr const &b)
Definition: z3++.h:1553
sort seq_sort(sort &s)
Return a sequence sort over base sort s.
Definition: z3++.h:2840
void Z3_API Z3_optimize_set_params(Z3_context c, Z3_optimize o, Z3_params p)
Set parameters on optimization context.
Z3_ast Z3_API Z3_mk_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:1469
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...
expr get_const_interp(func_decl c) const
Definition: z3++.h:2150
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.
A Context manages all other Z3 objects, global configuration options, etc.
Definition: z3++.h:153
Definition: z3++.h:484
Z3 C++ namespace.
Definition: z3++.h:48
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:3249
expr ashr(expr const &a, expr const &b)
arithmetic shift right operator for bitvectors
Definition: z3++.h:1722
expr re_empty(sort const &s)
Definition: z3++.h:3337
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:2566
Z3_ast Z3_API Z3_mk_bvsdiv(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed division.
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:1229
expr nor(expr const &a, expr const &b)
Definition: z3++.h:1551
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.
unsigned size() const
Definition: z3++.h:1793
Z3_param_descrs Z3_API Z3_simplify_get_param_descrs(Z3_context c)
Return the parameter description set for the simplify procedure.
solver(context &c, Z3_solver s)
Definition: z3++.h:2234
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:103
solver & operator=(solver const &s)
Definition: z3++.h:2240
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:122
void add_cover(int level, func_decl &p, expr &property)
Definition: z3++.h:2798
expr substitute(expr_vector const &src, expr_vector const &dst)
Apply substitution. Replace src expressions by dst.
Definition: z3++.h:3415
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:489
expr_vector cube(expr_vector &vars, unsigned cutoff)
Definition: z3++.h:2343
expr operator<=(expr const &a, expr const &b)
Definition: z3++.h:1469
handle add(expr const &e, char const *weight)
Definition: z3++.h:2721
friend std::ostream & operator<<(std::ostream &out, apply_result const &r)
Definition: z3++.h:2517
bool is_finite_domain() const
Return true if this is a Finite-domain expression.
Definition: z3++.h:728
expr proof() const
Definition: z3++.h:2315
void set(char const *k, char const *s)
Definition: z3++.h:476
expr bv_const(char const *name, unsigned sz)
Definition: z3++.h:3017
sort fpa_sort()
Definition: z3++.h:2845
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.
T back() const
Definition: z3++.h:1797
expr string_val(char const *s)
Definition: z3++.h:3053
uint64_t get_numeral_uint64() const
Return uint64_t value of numeral, throw if result cannot fit in uint64_t.
Definition: z3++.h:867
tactic(context &c, char const *name)
Definition: z3++.h:2526
ast_vector_tpl & set(unsigned idx, ast &a)
Definition: z3++.h:1807
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.
sort string_sort()
Return the sort for ASCII strings.
Definition: z3++.h:2839
std::string str() const
Definition: z3++.h:420
tactic with(tactic const &t, params const &p)
Definition: z3++.h:2579
expr empty_set(sort const &s)
Definition: z3++.h:3241
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.
Z3_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...
expr as_array(func_decl &f)
Definition: z3++.h:3220
expr plus(expr const &re)
Definition: z3++.h:3328
func_decl partial_order(sort const &a, unsigned index)
Definition: z3++.h:1739
expr xnor(expr const &a, expr const &b)
Definition: z3++.h:1552
void reset()
Definition: z3++.h:2255
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_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.
void resize(unsigned sz)
Definition: z3++.h:1796
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:793
~config()
Definition: z3++.h:109
void from_string(char const *s)
Definition: z3++.h:2268
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:605
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:176
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.
friend expr atleast(expr_vector const &es, unsigned bound)
Definition: z3++.h:1967
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.
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_...
func_entry(context &c, Z3_func_entry e)
Definition: z3++.h:2058
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:776
ast_vector_tpl(context &c)
Definition: z3++.h:1788
expr extract(unsigned hi, unsigned lo) const
Definition: z3++.h:1129
model get_model() const
Definition: z3++.h:2472
expr operator[](expr_vector const &index) const
Definition: z3++.h:1218
void add(expr const &e, char const *p)
Definition: z3++.h:2262
func_decl to_func_decl(context &c, Z3_func_decl f)
Definition: z3++.h:1648
unsigned depth() const
Definition: z3++.h:2461
ast_vector_tpl(context &c, Z3_ast_vector v)
Definition: z3++.h:1789
optimize(context &c)
Definition: z3++.h:2692
expr min(expr const &a, expr const &b)
Definition: z3++.h:1553
context & ctx() const
Definition: z3++.h:406
sort array_range() const
Return the range of this Array sort.
Definition: z3++.h:611
cube_iterator(solver &s, expr_vector &vars, unsigned &cutoff, bool end)
Definition: z3++.h:2370
param_descrs(param_descrs const &o)
Definition: z3++.h:438
void Z3_API Z3_optimize_push(Z3_context c, Z3_optimize d)
Create a backtracking point.
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].
expr(expr const &n)
Definition: z3++.h:671
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 free 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:2051
bool is_const() const
Definition: z3++.h:641
Z3_sort Z3_API Z3_mk_array_sort(Z3_context c, Z3_sort domain, Z3_sort range)
Create an array type.
check_result check()
Definition: z3++.h:2270
unsigned size() const
Definition: z3++.h:2513
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:2318
iterator end() const
Definition: z3++.h:1845
unsigned get_numeral_uint() const
Return uint value of numeral, throw if result cannot fit in machine uint.
Definition: z3++.h:833
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:2140
expr operator+(expr const &a, expr const &b)
Definition: z3++.h:1334
func_decl function(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:2906
expr operator()(context &c, Z3_ast a)
Definition: z3++.h:1758
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.
friend probe operator!(probe const &p)
Definition: z3++.h:2678
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:2477
bool is_numeral() const
Return true if this expression is a numeral. Specialized functions also return representations for th...
Definition: z3++.h:739
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:2977
Z3_ast Z3_API Z3_mk_real(Z3_context c, int num, int den)
Create a real from a fraction.
Z3_ast Z3_API Z3_mk_set_complement(Z3_context c, Z3_ast arg)
Take the complement of a set.
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. You can use Z3_get_ast_id intercha...
func_decl tree_order(sort const &a, unsigned index)
Definition: z3++.h:1745
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:3355
model convert_model(model const &m) const
Definition: z3++.h:2466
unsigned h() const
Definition: z3++.h:2690
expr srem(expr const &a, expr const &b)
signed remainder operator for bitvectors
Definition: z3++.h:1687
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:1538
expr set_intersect(expr const &a, expr const &b)
Definition: z3++.h:3265
void from_string(char const *s)
Definition: z3++.h:2778
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:86
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...
solver(solver const &s)
Definition: z3++.h:2237
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:98
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...
~optimize()
Definition: z3++.h:2704
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:1568
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...
expr fpa_const(char const *name, unsigned ebits, unsigned sbits)
Definition: z3++.h:3018
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:3183
expr re_intersect(expr_vector const &args)
Definition: z3++.h:3347
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.
expr real_val(int n, int d)
Definition: z3++.h:3031
ast_vector_tpl< sort > sort_vector
Definition: z3++.h:72
void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name)
load solver assertions from a file.
void add(expr const &e)
Definition: z3++.h:2706
bool operator==(iterator const &other) const
Definition: z3++.h:1827
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:3304
void Z3_API Z3_set_error_handler(Z3_context c, Z3_error_handler h)
Register a Z3 error handler.
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...
func_interp(func_interp const &s)
Definition: z3++.h:2082
Z3_decl_kind decl_kind() const
Definition: z3++.h:635
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:2119
void Z3_API Z3_model_dec_ref(Z3_context c, Z3_model m)
Decrement the reference counter of the given model.
expr_vector parse_file(char const *file)
Definition: z3++.h:3375
Z3_func_decl Z3_API Z3_mk_piecewise_linear_order(Z3_context c, Z3_sort a, unsigned id)
create a piecewise linear ordering relation over signature a and index id.
Z3_string Z3_API Z3_get_string(Z3_context c, Z3_ast s)
Retrieve the string constant stored in s.
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:2598
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:1315
void set(char const *param, bool value)
Set global parameter param with Boolean value.
Definition: z3++.h:118
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:1196
stats statistics() const
Definition: z3++.h:2764
func_entry entry(unsigned i) const
Definition: z3++.h:2094
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:2256
void Z3_API Z3_fixedpoint_dec_ref(Z3_context c, Z3_fixedpoint d)
Decrement the reference counter of the given fixedpoint context.
bool is_relation() const
Return true if this is a Relation expression.
Definition: z3++.h:710
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.
expr repeat(unsigned i)
Definition: z3++.h:1123
bool is_bool() const
Return true if this sort is the Boolean sort.
Definition: z3++.h:544
void resize(unsigned sz)
Definition: z3++.h:392
expr ugt(expr const &a, expr const &b)
unsigned greater than operator for bitvectors.
Definition: z3++.h:1674
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:2448
expr option(expr const &re)
Definition: z3++.h:3331
~params()
Definition: z3++.h:463
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:3237
stats(stats const &s)
Definition: z3++.h:2194
T const * ptr() const
Definition: z3++.h:396
cube_iterator operator++(int)
Definition: z3++.h:2392
Z3_ast_vector Z3_API Z3_fixedpoint_get_rules(Z3_context c, Z3_fixedpoint f)
Retrieve set of rules from fixedpoint context.
expr set_member(expr const &s, expr const &e)
Definition: z3++.h:3281
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:527
bool is_distinct() const
Definition: z3++.h:1030
friend std::ostream & operator<<(std::ostream &out, model const &m)
Definition: z3++.h:2183
bool is_or() const
Definition: z3++.h:1025
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.
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:1023
void Z3_API Z3_params_dec_ref(Z3_context c, Z3_params p)
Decrement the reference counter of the given parameter set.
~func_entry()
Definition: z3++.h:2060
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:2898
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:2514
unsigned fpa_ebits() const
Definition: z3++.h:597
expr_vector trail() const
Definition: z3++.h:2304
void reset()
Definition: z3++.h:2462
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:746
T * ptr()
Definition: z3++.h:397
bool is_implies() const
Definition: z3++.h:1027
params(params const &s)
Definition: z3++.h:462
Z3_ast Z3_API Z3_func_entry_get_value(Z3_context c, Z3_func_entry e)
Return the value of this point.
unsigned Z3_API Z3_stats_get_uint_value(Z3_context c, Z3_stats s, unsigned idx)
Return the unsigned value of the given statistical data.
void set_param(char const *param, char const *value)
Definition: z3++.h:75
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.
friend void check_context(object const &a, object const &b)
Definition: z3++.h:410
Z3_string Z3_API Z3_goal_to_string(Z3_context c, Z3_goal g)
Convert a goal into a string.
handle maximize(expr const &e)
Definition: z3++.h:2725
unsigned Z3_API Z3_model_get_num_funcs(Z3_context c, Z3_model m)
Return the number of function interpretations in the given model.
func_decl decl() const
Return the declaration associated with this application. This method assumes the expression is an app...
Definition: z3++.h:934
bool is_seq() const
Return true if this is a sequence expression.
Definition: z3++.h:714
std::string dimacs() const
Definition: z3++.h:2338
Z3_param_kind
The different kinds of parameters that can be associated with parameter sets. (see Z3_mk_params)...
Definition: z3_api.h:1319
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:2647
friend expr operator&&(expr const &a, expr const &b)
Return an expression representing a and b.
Definition: z3++.h:1290
expr get_cover_delta(int level, func_decl &p)
Definition: z3++.h:2793
Z3_string Z3_API Z3_get_numeral_string(Z3_context c, Z3_ast a)
Return numeral value, as a string of a numeric constant term.
expr int_const(char const *name)
Definition: z3++.h:3015
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:1538
friend std::ostream & operator<<(std::ostream &out, exception const &e)
Definition: z3++.h:90
expr arg(unsigned i) const
Definition: z3++.h:2071
expr abs(expr const &a)
Definition: z3++.h:1583
symbol(symbol const &s)
Definition: z3++.h:416
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...
unsigned num_args() const
Return the number of arguments in this application. This method assumes the expression is an applicat...
Definition: z3++.h:941
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:112
expr sum(expr_vector const &args)
Definition: z3++.h:1975
Z3_ast Z3_API Z3_mk_re_plus(Z3_context c, Z3_ast re)
Create the regular language re+.
Z3_ast Z3_API Z3_simplify(Z3_context c, Z3_ast a)
Interface to simplifier.
sort(context &c)
Definition: z3++.h:518
Z3_string Z3_API Z3_get_lstring(Z3_context c, Z3_ast s, unsigned *length)
Retrieve the unescaped string constant stored in s.
Z3_model Z3_API Z3_optimize_get_model(Z3_context c, Z3_optimize o)
Retrieve the model for the last Z3_optimize_check.
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.
goal(context &c, bool models=true, bool unsat_cores=false, bool proofs=false)
Definition: z3++.h:2443
expr suffixof(expr const &a, expr const &b)
Definition: z3++.h:3298
void from_file(char const *filename)
Definition: z3++.h:2766
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:2393
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:2293
bool is_app() const
Return true if this expression is an application.
Definition: z3++.h:750
friend tactic operator&(tactic const &t1, tactic const &t2)
Definition: z3++.h:2559
expr operator<(expr const &a, expr const &b)
Definition: z3++.h:1494
object(context &c)
Definition: z3++.h:404
friend expr operator>(expr const &a, expr const &b)
Definition: z3++.h:1516
unsigned size() const
Definition: z3++.h:2457
Z3_func_decl Z3_API Z3_mk_tree_order(Z3_context c, Z3_sort a, unsigned id)
create a tree ordering lreation over signature a identified using index id.
handle add(expr const &e, unsigned weight)
Definition: z3++.h:2710
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.
ast(context &c)
Definition: z3++.h:488
Z3_symbol_kind kind() const
Definition: z3++.h:419
object(object const &s)
Definition: z3++.h:405
friend expr nand(expr const &a, expr const &b)
Definition: z3++.h:1550
void set(params const &p)
Definition: z3++.h:2803
expr atleast(expr_vector const &es, unsigned bound)
Definition: z3++.h:1967
friend tactic with(tactic const &t, params const &p)
Definition: z3++.h:2579
Z3_ast Z3_API Z3_mk_bvor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise or.
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:3016
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.
sort(context &c, Z3_ast a)
Definition: z3++.h:520
stats statistics() const
Definition: z3++.h:2799
model get_model() const
Definition: z3++.h:2749
func_interp get_func_interp(func_decl f) const
Definition: z3++.h:2156
friend probe operator==(probe const &p1, probe const &p2)
Definition: z3++.h:2667
bool is_numeral(std::string &s, unsigned precision) const
Definition: z3++.h:745
Z3_ast Z3_API Z3_mk_repeat(Z3_context c, unsigned i, Z3_ast t1)
Repeat the given bit-vector up length i.
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. ...
bool is_eq() const
Definition: z3++.h:1028
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_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:536
bool is_numeral(std::string &s) const
Definition: z3++.h:744
bool is_arith() const
Return true if this sort is the Integer or Real sort.
Definition: z3++.h:556
Z3_ast Z3_API Z3_mk_re_star(Z3_context c, Z3_ast re)
Create the regular language re*.
Definition: z3++.h:135
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:1734
Z3_lbool Z3_API Z3_solver_check(Z3_context c, Z3_solver s)
Check whether the assertions in a given solver are consistent or not.
Z3_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:2267
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.
void Z3_API Z3_fixedpoint_add_cover(Z3_context c, Z3_fixedpoint d, int level, Z3_func_decl pred, Z3_ast property)
Add property about the predicate pred. Add a property of predicate pred at level. It gets pushed forw...
void Z3_API Z3_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:1951
expr at(expr const &index) const
Definition: z3++.h:1164
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.
void add(expr_vector const &v)
Definition: z3++.h:2456
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:2305
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:3293
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:785
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 first occurrence of substr in s starting from offset offset. If s does not contain su...
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.
symbol & operator=(symbol const &s)
Definition: z3++.h:417
~model()
Definition: z3++.h:2117
cube_generator(solver &s, expr_vector &vars)
Definition: z3++.h:2418
friend tactic par_and_then(tactic const &t1, tactic const &t2)
Definition: z3++.h:2598
sort real_sort()
Return the Real sort.
Definition: z3++.h:2837
void set(char const *k, unsigned v)
Definition: z3++.h:2249
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.
expr re_full(sort const &s)
Definition: z3++.h:3342
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:2460
bool is_const() const
Return true if this expression is a constant (i.e., an application with 0 arguments).
Definition: z3++.h:754
expr arg(unsigned i) const
Return the i-th argument of this application. This method assumes the expression is an application...
Definition: z3++.h:949
friend expr rem(expr const &a, expr const &b)
Definition: z3++.h:1266
expr num_val(int n, sort const &s)
Definition: z3++.h:3056
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:510
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:2137
symbol int_symbol(int n)
Create a Z3 symbol based on the given integer.
Definition: z3++.h:2833
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:1201
expr fpa_val(double n)
Definition: z3++.h:3049
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:2662
expr indexof(expr const &s, expr const &substr, expr const &offset)
Definition: z3++.h:3310
void from_file(char const *s)
Definition: z3++.h:2779
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:3277
unsigned num_funcs() const
Definition: z3++.h:2138
bool is_algebraic() const
Return true if expression is an algebraic number.
Definition: z3++.h:780
expr operator()() const
Definition: z3++.h:3079
expr_vector non_units() const
Definition: z3++.h:2302
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:439
expr operator>(expr const &a, expr const &b)
Definition: z3++.h:1516
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:141
expr star(expr const &re)
Definition: z3++.h:3334
std::string get_escaped_string() const
for a string value expression return an escaped or unescaped string value.
Definition: z3++.h:902
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:1606
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:1315
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...
#define MK_EXPR1(_fn, _arg)
Definition: z3++.h:3226
param_descrs(context &c, Z3_param_descrs d)
Definition: z3++.h:437
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:2573
expr operator|(expr const &a, expr const &b)
Definition: z3++.h:1546
friend std::ostream & operator<<(std::ostream &out, ast_vector_tpl const &v)
Definition: z3++.h:1846
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:2589
expr pbge(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:1943
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:1583
tactic(context &c, Z3_tactic s)
Definition: z3++.h:2527
void check_context(object const &a, object const &b)
Definition: z3++.h:410
Z3_ast_vector Z3_API Z3_optimize_get_assertions(Z3_context c, Z3_optimize o)
Return the set of asserted formulas on the optimization context.
Z3_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)
Definition: z3++.h:3014
expr urem(expr const &a, expr const &b)
unsigned reminder operator for bitvectors
Definition: z3++.h:1701
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.
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:1290
double apply(goal const &g) const
Definition: z3++.h:2625
expr extract(expr const &offset, expr const &length) const
sequence and regular expression operations.
Definition: z3++.h:1143
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.
void set_rounding_mode(rounding_mode rm)
Sets RoundingMode of FloatingPoints.
Definition: z3++.h:2867
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:1621
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.
expr_vector rules() const
Definition: z3++.h:2802
friend expr nor(expr const &a, expr const &b)
Definition: z3++.h:1551
params & operator=(params const &s)
Definition: z3++.h:465
friend std::ostream & operator<<(std::ostream &out, symbol const &s)
Definition: z3++.h:425
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:2115
unsigned hi() const
Definition: z3++.h:1131
check_result query(func_decl_vector &relations)
Definition: z3++.h:2783
check_result
Definition: z3++.h:129
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:2615
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:1823
friend expr operator<(expr const &a, expr const &b)
Definition: z3++.h:1494
friend expr operator!(expr const &a)
Return an expression representing not(a).
Definition: z3++.h:1284
solver(context &c, solver const &src, translate)
Definition: z3++.h:2236
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:2459
solver(context &c)
Definition: z3++.h:2232
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:1975
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:1910
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(context &c, Z3_func_decl n)
Definition: z3++.h:621
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:69
bool is_decided_unsat() const
Definition: z3++.h:2465
Definition: z3++.h:137
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:2728
friend probe operator<(probe const &p1, probe const &p2)
Definition: z3++.h:2657
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:2301
cube_iterator & operator++()
Definition: z3++.h:2382
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)
sort get_sort() const
Return the sort of this expression.
Definition: z3++.h:677
friend probe operator&&(probe const &p1, probe const &p2)
Definition: z3++.h:2672
void set(char const *k, double v)
Definition: z3++.h:2250
void add(expr const &e, expr const &p)
Definition: z3++.h:2257
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:3200
bool is_exists() const
Return true if this expression is an existential quantifier.
Definition: z3++.h:767
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:473
friend expr pble(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:1935
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:2205
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:572
Z3_ast m_ast
Definition: z3++.h:486
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:472
tactic repeat(tactic const &t, unsigned max=UINT_MAX)
Definition: z3++.h:2573
expr bool_val(bool b)
Definition: z3++.h:3023
~context()
Definition: z3++.h:172
expr operator||(expr const &a, expr const &b)
Definition: z3++.h:1302
expr ult(expr const &a, expr const &b)
unsigned less than operator for bitvectors.
Definition: z3++.h:1662
void Z3_API Z3_params_inc_ref(Z3_context c, Z3_params p)
Increment the reference counter of the given parameter set.
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:686
ast_vector_tpl & operator=(ast_vector_tpl const &s)
Definition: z3++.h:1800
friend expr pbge(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:1943
apply_result apply(goal const &g) const
Definition: z3++.h:2539
expr int_val(int n)
Definition: z3++.h:3025
bool is_arith() const
Return true if this is an integer or real expression.
Definition: z3++.h:694
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...
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:2292
func_decl(func_decl const &s)
Definition: z3++.h:622
Z3_ast Z3_API Z3_mk_eq(Z3_context c, Z3_ast l, Z3_ast r)
Create an AST node representing l = r.
iterator operator=(iterator const &other)
Definition: z3++.h:1825
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:2092
expr mk_or(expr_vector const &args)
Definition: z3++.h:2037
tactic fail_if(probe const &p)
Definition: z3++.h:2814
Z3_func_decl Z3_API Z3_mk_linear_order(Z3_context c, Z3_sort a, unsigned id)
declare a and b are in linear order over a relation indexed by id.
Z3_param_kind kind(symbol const &s)
Definition: z3++.h:451
stats(context &c, Z3_stats e)
Definition: z3++.h:2193
expr exists(expr const &x, expr const &b)
Definition: z3++.h:1886
std::string to_string()
Definition: z3++.h:2806
ast operator()(context &c, Z3_ast a)
Definition: z3++.h:1753
Z3_ast Z3_API Z3_mk_atmost(Z3_context c, unsigned num_args, Z3_ast const args[], unsigned k)
Pseudo-Boolean relations.
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:3369
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.
context(config &c)
Definition: z3++.h:171
expr unit() const
Definition: z3++.h:1153
bool is_array() const
Return true if this sort is a Array sort.
Definition: z3++.h:564
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.
std::string dimacs() const
Definition: z3++.h:2490
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...
void set(char const *k, symbol const &v)
Definition: z3++.h:2251
expr ite(expr const &c, expr const &t, expr const &e)
Create the if-then-else expression ite(c, t, e)
Definition: z3++.h:1621
T const & operator[](int i) const
Definition: z3++.h:395
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:2059
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:2209
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:3170
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:956
std::string get_string() const
Definition: z3++.h:908
~ast()
Definition: z3++.h:491
void pop_back()
Definition: z3++.h:1798
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:2411
T operator[](int i) const
Definition: z3++.h:1794
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:494
bool is_seq() const
Return true if this sort is a Sequence sort.
Definition: z3++.h:576
func_interp add_func_interp(func_decl &f, expr &else_val)
Definition: z3++.h:2170
bool is_bv() const
Return true if this is a Bit-vector expression.
Definition: z3++.h:698
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:1862
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:632
bool is_bool() const
Return true if this is a Boolean expression.
Definition: z3++.h:682
int64_t get_numeral_int64() const
Return int64_t value of numeral, throw if result cannot fit in int64_t.
Definition: z3++.h:850
sort(context &c, Z3_sort s)
Definition: z3++.h:519
unsigned hash() const
Definition: z3++.h:496
double operator()(goal const &g) const
Definition: z3++.h:2626
Z3_error_code check_error() const
Auxiliary method used to check for API usage errors.
Definition: z3++.h:178
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.
void set_cutoff(unsigned c)
Definition: z3++.h:2427
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:568
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:498
expr implies(expr const &a, expr const &b)
Definition: z3++.h:1250
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:1599
#define _Z3_MK_BIN_(a, b, binop)
Definition: z3++.h:1243
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:1634
expr rotate_left(unsigned i)
Definition: z3++.h:1121
bool has_interp(func_decl f) const
Definition: z3++.h:2165
expr concat(expr const &a, expr const &b)
Definition: z3++.h:1993
symbol(context &c, Z3_symbol s)
Definition: z3++.h:415
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:2235
bool is_false() const
Definition: z3++.h:1022
tactic try_for(tactic const &t, unsigned ms)
Definition: z3++.h:2584
func_interp(context &c, Z3_func_interp e)
Definition: z3++.h:2081
void register_relation(func_decl &p)
Definition: z3++.h:2800
unsigned Z3_API Z3_get_arity(Z3_context c, Z3_func_decl d)
Alias for Z3_get_domain_size.
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:2780
expr shl(expr const &a, expr const &b)
shift left operator for bitvectors
Definition: z3++.h:1708
params(context &c)
Definition: z3++.h:461
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.
friend tactic try_for(tactic const &t, unsigned ms)
Definition: z3++.h:2584
expr pble(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:1935
expr max(expr const &a, expr const &b)
Definition: z3++.h:1568
sort range() const
Definition: z3++.h:633
expr sqrt(expr const &a, expr const &rm)
Definition: z3++.h:1599
ast_vector_tpl< expr > expr_vector
Definition: z3++.h:71
bool is_re() const
Return true if this is a regular expression.
Definition: z3++.h:718
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.
expr uge(expr const &a, expr const &b)
unsigned greater than or equal to operator for bitvectors.
Definition: z3++.h:1668
void push()
Definition: z3++.h:2731
expr last_indexof(expr const &s, expr const &substr)
Definition: z3++.h:3316
void set(char const *param, bool value)
Update global parameter param with Boolean value.
Definition: z3++.h:207
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:2247
bool is_re() const
Return true if this sort is a regular expression sort.
Definition: z3++.h:580
Z3_ast Z3_API Z3_goal_formula(Z3_context c, Z3_goal g, unsigned idx)
Return a formula from the given goal.
sort & operator=(sort const &s)
Return true if this sort and s are equal.
Definition: z3++.h:532
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:758
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:2885
context * m_ctx
Definition: z3++.h:402
unsigned size()
Definition: z3++.h:449
unsigned size() const
Definition: z3++.h:393
void Z3_API Z3_fixedpoint_set_params(Z3_context c, Z3_fixedpoint f, Z3_params p)
Set parameters on fixedpoint context.
bool operator!=(iterator const &other) const
Definition: z3++.h:1830
symbol name() const
Definition: z3++.h:634
std::string help() const
Definition: z3++.h:2804
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:1427
void pop(unsigned n=1)
Definition: z3++.h:2254
friend std::ostream & operator<<(std::ostream &out, stats const &s)
Definition: z3++.h:2212
expr smod(expr const &a, expr const &b)
signed modulus operator for bitvectors
Definition: z3++.h:1694
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:3140
cube_iterator end()
Definition: z3++.h:2426
handle(unsigned h)
Definition: z3++.h:2689
unsigned size() const
Definition: z3++.h:2204
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:1250
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...
param_descrs get_param_descrs()
Definition: z3++.h:2340
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_...
ast(ast const &s)
Definition: z3++.h:490
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:2874
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:2589
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.
func_decl transitive_closure(func_decl const &f)
Definition: z3++.h:637
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 ...
sort(sort const &s)
Definition: z3++.h:521
Z3_decl_kind
The different kinds of interpreted function kinds.
Definition: z3_api.h:1006
unsigned Z3_API Z3_optimize_maximize(Z3_context c, Z3_optimize o, Z3_ast t)
Add a maximization constraint.
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:2502
expr nand(expr const &a, expr const &b)
Definition: z3++.h:1550
def tactics
Definition: z3py.py:7854
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 stoi() const
Definition: z3++.h:1181
expr operator/(expr const &a, expr const &b)
Definition: z3++.h:1405
Z3_ast Z3_API Z3_mk_fpa_lt(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point less than.
Function declaration (aka function definition). It is the signature of interpreted and uninterpreted ...
Definition: z3++.h:618
expr set_union(expr const &a, expr const &b)
Definition: z3++.h:3257
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:394
expr_vector objectives() const
Definition: z3++.h:2763
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:814
param_descrs get_param_descrs()
Definition: z3++.h:2556
bool is_xor() const
Definition: z3++.h:1026
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.
rounding_mode
Definition: z3++.h:133
goal(goal const &s)
Definition: z3++.h:2445
sort int_sort()
Return the integer sort.
Definition: z3++.h:2836
expr set_del(expr const &s, expr const &e)
Definition: z3++.h:3253
void set(params const &p)
Definition: z3++.h:2751
check_result check(expr_vector const &asms)
Definition: z3++.h:2738
void Z3_API Z3_tactic_dec_ref(Z3_context c, Z3_tactic g)
Decrement the reference counter of the given tactic.
stats & operator=(stats const &s)
Definition: z3++.h:2197
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.
Definition: z3++.h:138
unsigned num_args() const
Definition: z3++.h:2070
func_decl & operator=(func_decl const &s)
Definition: z3++.h:624
Z3_lbool bool_value() const
Definition: z3++.h:878
apply_result & operator=(apply_result const &s)
Definition: z3++.h:2506
Z3_ast Z3_API Z3_mk_int_to_str(Z3_context c, Z3_ast s)
Integer to string conversion.
expr atmost(expr_vector const &es, unsigned bound)
Definition: z3++.h:1959
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:552
bool Z3_API Z3_is_lambda(Z3_context c, Z3_ast a)
Determine if ast is a lambda expression.
sort to_sort(context &c, Z3_sort s)
Definition: z3++.h:1643
context()
Definition: z3++.h:170
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.
expr numerator() const
Definition: z3++.h:882
bool is_decided_sat() const
Definition: z3++.h:2464
void add(expr const &f)
Definition: z3++.h:2455
Z3_ast Z3_API Z3_mk_seq_last_index(Z3_context c, Z3_ast, Z3_ast substr)
Return the last occurrence of substr in s. If s does not contain substr, then the value is -1...
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:3358
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:3322
func_decl linear_order(sort const &a, unsigned index)
Definition: z3++.h:1736
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.
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:890
bool is_numeral_i(int &i) const
Definition: z3++.h:742
param_descrs get_param_descrs()
Definition: z3++.h:2805
unsigned size() const
Definition: z3++.h:2141
const char * Z3_string
Z3 string type. It is just an alias for const char *.
Definition: z3_api.h:82
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:2503
bool is_fpa() const
Return true if this sort is a Floating point sort.
Definition: z3++.h:588