Z3
z3++.h
Go to the documentation of this file.
1 /*++
2 Copyright (c) 2012 Microsoft Corporation
3 
4  Thin C++ layer on top of the Z3 C API.
5  Main features:
6  - Smart pointers for all Z3 objects.
7  - Object-Oriented interface.
8  - Operator overloading.
9  - Exceptions for signaling Z3 errors
10 
11  The C API can be used simultaneously with the C++ layer.
12  However, if you use the C API directly, you will have to check the error conditions manually.
13  Of course, you can invoke the method check_error() of the context object.
14 Author:
15 
16  Leonardo (leonardo) 2012-03-28
17 
18 Notes:
19 
20 --*/
21 #pragma once
22 
23 #include<cassert>
24 #include<iostream>
25 #include<string>
26 #include<sstream>
27 #include<memory>
28 #include<z3.h>
29 #include<limits.h>
30 #include<functional>
31 
32 #undef min
33 #undef max
34 
49 namespace z3 {
50 
51  class exception;
52  class config;
53  class context;
54  class symbol;
55  class params;
56  class param_descrs;
57  class ast;
58  class sort;
59  class func_decl;
60  class expr;
61  class solver;
62  class goal;
63  class tactic;
64  class probe;
65  class model;
66  class func_interp;
67  class func_entry;
68  class statistics;
69  class apply_result;
70  template<typename T> class cast_ast;
71  template<typename T> class ast_vector_tpl;
76 
77  inline void set_param(char const * param, char const * value) { Z3_global_param_set(param, value); }
78  inline void set_param(char const * param, bool value) { Z3_global_param_set(param, value ? "true" : "false"); }
79  inline void set_param(char const * param, int value) { auto str = std::to_string(value); Z3_global_param_set(param, str.c_str()); }
81 
85  class exception : public std::exception {
86  std::string m_msg;
87  public:
88  virtual ~exception() throw() {}
89  exception(char const * msg):m_msg(msg) {}
90  char const * msg() const { return m_msg.c_str(); }
91  char const * what() const throw() { return m_msg.c_str(); }
92  friend std::ostream & operator<<(std::ostream & out, exception const & e);
93  };
94  inline std::ostream & operator<<(std::ostream & out, exception const & e) { out << e.msg(); return out; }
95 
96 #if !defined(Z3_THROW)
97 #if __cpp_exceptions || _CPPUNWIND || __EXCEPTIONS
98 #define Z3_THROW(x) throw x
99 #else
100 #define Z3_THROW(x) {}
101 #endif
102 #endif // !defined(Z3_THROW)
103 
107  class config {
108  Z3_config m_cfg;
109  config(config const &) = delete;
110  config & operator=(config const &) = delete;
111  public:
112  config() { m_cfg = Z3_mk_config(); }
113  ~config() { Z3_del_config(m_cfg); }
114  operator Z3_config() const { return m_cfg; }
118  void set(char const * param, char const * value) { Z3_set_param_value(m_cfg, param, value); }
122  void set(char const * param, bool value) { Z3_set_param_value(m_cfg, param, value ? "true" : "false"); }
126  void set(char const * param, int value) {
127  auto str = std::to_string(value);
128  Z3_set_param_value(m_cfg, param, str.c_str());
129  }
130  };
131 
134  };
135 
142  };
143 
145  if (l == Z3_L_TRUE) return sat;
146  else if (l == Z3_L_FALSE) return unsat;
147  return unknown;
148  }
149 
150 
156  class context {
157  private:
158  bool m_enable_exceptions;
159  rounding_mode m_rounding_mode;
160  Z3_context m_ctx;
161  void init(config & c) {
162  set_context(Z3_mk_context_rc(c));
163  }
164  void set_context(Z3_context ctx) {
165  m_ctx = ctx;
166  m_enable_exceptions = true;
167  m_rounding_mode = RNE;
168  Z3_set_error_handler(m_ctx, 0);
170  }
171 
172 
173  context(context const &) = delete;
174  context & operator=(context const &) = delete;
175 
176  friend class scoped_context;
177  context(Z3_context c) { set_context(c); }
178  void detach() { m_ctx = nullptr; }
179  public:
180  context() { config c; init(c); }
181  context(config & c) { init(c); }
182  ~context() { if (m_ctx) Z3_del_context(m_ctx); }
183  operator Z3_context() const { return m_ctx; }
184 
189  Z3_error_code e = Z3_get_error_code(m_ctx);
190  if (e != Z3_OK && enable_exceptions())
191  Z3_THROW(exception(Z3_get_error_msg(m_ctx, e)));
192  return e;
193  }
194 
195  void check_parser_error() const {
196  check_error();
197  }
198 
206  void set_enable_exceptions(bool f) { m_enable_exceptions = f; }
207 
208  bool enable_exceptions() const { return m_enable_exceptions; }
209 
213  void set(char const * param, char const * value) { Z3_update_param_value(m_ctx, param, value); }
217  void set(char const * param, bool value) { Z3_update_param_value(m_ctx, param, value ? "true" : "false"); }
221  void set(char const * param, int value) {
222  auto str = std::to_string(value);
223  Z3_update_param_value(m_ctx, param, str.c_str());
224  }
225 
230  void interrupt() { Z3_interrupt(m_ctx); }
231 
235  symbol str_symbol(char const * s);
239  symbol int_symbol(int n);
243  sort bool_sort();
247  sort int_sort();
251  sort real_sort();
255  sort bv_sort(unsigned sz);
256 
260  sort char_sort();
264  sort string_sort();
268  sort seq_sort(sort& s);
278  sort array_sort(sort d, sort r);
279  sort array_sort(sort_vector const& d, sort r);
286  sort fpa_sort(unsigned ebits, unsigned sbits);
290  template<size_t precision>
291  sort fpa_sort();
305  sort enumeration_sort(char const * name, unsigned n, char const * const * enum_names, func_decl_vector & cs, func_decl_vector & ts);
306 
313  func_decl tuple_sort(char const * name, unsigned n, char const * const * names, sort const* sorts, func_decl_vector & projs);
314 
318  sort uninterpreted_sort(char const* name);
319  sort uninterpreted_sort(symbol const& name);
320 
321  func_decl function(symbol const & name, unsigned arity, sort const * domain, sort const & range);
322  func_decl function(char const * name, unsigned arity, sort const * domain, sort const & range);
323  func_decl function(symbol const& name, sort_vector const& domain, sort const& range);
324  func_decl function(char const * name, sort_vector const& domain, sort const& range);
325  func_decl function(char const * name, sort const & domain, sort const & range);
326  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & range);
327  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range);
328  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range);
329  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & d5, sort const & range);
330 
331  func_decl recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range);
332  func_decl recfun(char const * name, unsigned arity, sort const * domain, sort const & range);
333  func_decl recfun(char const * name, sort const & domain, sort const & range);
334  func_decl recfun(char const * name, sort const & d1, sort const & d2, sort const & range);
335 
336  void recdef(func_decl, expr_vector const& args, expr const& body);
337 
338  expr constant(symbol const & name, sort const & s);
339  expr constant(char const * name, sort const & s);
340  expr bool_const(char const * name);
341  expr int_const(char const * name);
342  expr real_const(char const * name);
343  expr string_const(char const * name);
344  expr bv_const(char const * name, unsigned sz);
345  expr fpa_const(char const * name, unsigned ebits, unsigned sbits);
346 
347  template<size_t precision>
348  expr fpa_const(char const * name);
349 
351 
352  expr bool_val(bool b);
353 
354  expr int_val(int n);
355  expr int_val(unsigned n);
356  expr int_val(int64_t n);
357  expr int_val(uint64_t n);
358  expr int_val(char const * n);
359 
360  expr real_val(int n, int d);
361  expr real_val(int n);
362  expr real_val(unsigned n);
363  expr real_val(int64_t n);
364  expr real_val(uint64_t n);
365  expr real_val(char const * n);
366 
367  expr bv_val(int n, unsigned sz);
368  expr bv_val(unsigned n, unsigned sz);
369  expr bv_val(int64_t n, unsigned sz);
370  expr bv_val(uint64_t n, unsigned sz);
371  expr bv_val(char const * n, unsigned sz);
372  expr bv_val(unsigned n, bool const* bits);
373 
374  expr fpa_val(double n);
375  expr fpa_val(float n);
376  expr fpa_nan(sort const & s);
377  expr fpa_inf(sort const & s, bool sgn);
378 
379  expr string_val(char const* s);
380  expr string_val(char const* s, unsigned n);
381  expr string_val(std::string const& s);
382  expr string_val(std::u32string const& s);
383 
384  expr num_val(int n, sort const & s);
385 
389  expr_vector parse_string(char const* s);
390  expr_vector parse_file(char const* file);
391 
392  expr_vector parse_string(char const* s, sort_vector const& sorts, func_decl_vector const& decls);
393  expr_vector parse_file(char const* s, sort_vector const& sorts, func_decl_vector const& decls);
394  };
395 
396  class scoped_context final {
397  context m_ctx;
398  public:
399  scoped_context(Z3_context c): m_ctx(c) {}
400  ~scoped_context() { m_ctx.detach(); }
401  context& operator()() { return m_ctx; }
402  };
403 
404 
405  template<typename T>
406  class array {
407  std::unique_ptr<T[]> m_array;
408  unsigned m_size;
409  array(array const &) = delete;
410  array & operator=(array const &) = delete;
411  public:
412  array(unsigned sz):m_array(new T[sz]),m_size(sz) {}
413  template<typename T2>
414  array(ast_vector_tpl<T2> const & v);
415  void resize(unsigned sz) { m_array.reset(new T[sz]); m_size = sz; }
416  unsigned size() const { return m_size; }
417  T & operator[](int i) { assert(0 <= i); assert(static_cast<unsigned>(i) < m_size); return m_array[i]; }
418  T const & operator[](int i) const { assert(0 <= i); assert(static_cast<unsigned>(i) < m_size); return m_array[i]; }
419  T const * ptr() const { return m_array.get(); }
420  T * ptr() { return m_array.get(); }
421  };
422 
423  class object {
424  protected:
426  public:
427  object(context & c):m_ctx(&c) {}
428  context & ctx() const { return *m_ctx; }
429  Z3_error_code check_error() const { return m_ctx->check_error(); }
430  friend void check_context(object const & a, object const & b);
431  };
432  inline void check_context(object const & a, object const & b) { (void)a; (void)b; assert(a.m_ctx == b.m_ctx); }
433 
434  class symbol : public object {
435  Z3_symbol m_sym;
436  public:
437  symbol(context & c, Z3_symbol s):object(c), m_sym(s) {}
438  operator Z3_symbol() const { return m_sym; }
439  Z3_symbol_kind kind() const { return Z3_get_symbol_kind(ctx(), m_sym); }
440  std::string str() const { assert(kind() == Z3_STRING_SYMBOL); return Z3_get_symbol_string(ctx(), m_sym); }
441  int to_int() const { assert(kind() == Z3_INT_SYMBOL); return Z3_get_symbol_int(ctx(), m_sym); }
442  friend std::ostream & operator<<(std::ostream & out, symbol const & s);
443  };
444 
445  inline std::ostream & operator<<(std::ostream & out, symbol const & s) {
446  if (s.kind() == Z3_INT_SYMBOL)
447  out << "k!" << s.to_int();
448  else
449  out << s.str();
450  return out;
451  }
452 
453 
454  class param_descrs : public object {
455  Z3_param_descrs m_descrs;
456  public:
457  param_descrs(context& c, Z3_param_descrs d): object(c), m_descrs(d) { Z3_param_descrs_inc_ref(c, d); }
458  param_descrs(param_descrs const& o): object(o.ctx()), m_descrs(o.m_descrs) { Z3_param_descrs_inc_ref(ctx(), m_descrs); }
460  Z3_param_descrs_inc_ref(o.ctx(), o.m_descrs);
461  Z3_param_descrs_dec_ref(ctx(), m_descrs);
462  m_descrs = o.m_descrs;
463  object::operator=(o);
464  return *this;
465  }
468 
469  unsigned size() { return Z3_param_descrs_size(ctx(), m_descrs); }
470  symbol name(unsigned i) { return symbol(ctx(), Z3_param_descrs_get_name(ctx(), m_descrs, i)); }
471  Z3_param_kind kind(symbol const& s) { return Z3_param_descrs_get_kind(ctx(), m_descrs, s); }
472  std::string documentation(symbol const& s) { char const* r = Z3_param_descrs_get_documentation(ctx(), m_descrs, s); check_error(); return r; }
473  std::string to_string() const { return Z3_param_descrs_to_string(ctx(), m_descrs); }
474  };
475 
476  inline std::ostream& operator<<(std::ostream & out, param_descrs const & d) { return out << d.to_string(); }
477 
478  class params : public object {
479  Z3_params m_params;
480  public:
481  params(context & c):object(c) { m_params = Z3_mk_params(c); Z3_params_inc_ref(ctx(), m_params); }
482  params(params const & s):object(s), m_params(s.m_params) { Z3_params_inc_ref(ctx(), m_params); }
483  ~params() { Z3_params_dec_ref(ctx(), m_params); }
484  operator Z3_params() const { return m_params; }
485  params & operator=(params const & s) {
486  Z3_params_inc_ref(s.ctx(), s.m_params);
487  Z3_params_dec_ref(ctx(), m_params);
488  object::operator=(s);
489  m_params = s.m_params;
490  return *this;
491  }
492  void set(char const * k, bool b) { Z3_params_set_bool(ctx(), m_params, ctx().str_symbol(k), b); }
493  void set(char const * k, unsigned n) { Z3_params_set_uint(ctx(), m_params, ctx().str_symbol(k), n); }
494  void set(char const * k, double n) { Z3_params_set_double(ctx(), m_params, ctx().str_symbol(k), n); }
495  void set(char const * k, symbol const & s) { Z3_params_set_symbol(ctx(), m_params, ctx().str_symbol(k), s); }
496  void set(char const * k, char const* s) { Z3_params_set_symbol(ctx(), m_params, ctx().str_symbol(k), ctx().str_symbol(s)); }
497  friend std::ostream & operator<<(std::ostream & out, params const & p);
498  };
499 
500  inline std::ostream & operator<<(std::ostream & out, params const & p) {
501  out << Z3_params_to_string(p.ctx(), p); return out;
502  }
503 
504  class ast : public object {
505  protected:
506  Z3_ast m_ast;
507  public:
508  ast(context & c):object(c), m_ast(0) {}
509  ast(context & c, Z3_ast n):object(c), m_ast(n) { Z3_inc_ref(ctx(), m_ast); }
510  ast(ast const & s) :object(s), m_ast(s.m_ast) { Z3_inc_ref(ctx(), m_ast); }
511  ~ast() { if (m_ast) Z3_dec_ref(*m_ctx, m_ast); }
512  operator Z3_ast() const { return m_ast; }
513  operator bool() const { return m_ast != 0; }
514  ast & operator=(ast const & s) {
515  Z3_inc_ref(s.ctx(), s.m_ast);
516  if (m_ast)
517  Z3_dec_ref(ctx(), m_ast);
518  object::operator=(s);
519  m_ast = s.m_ast;
520  return *this;
521  }
522  Z3_ast_kind kind() const { Z3_ast_kind r = Z3_get_ast_kind(ctx(), m_ast); check_error(); return r; }
523  unsigned hash() const { unsigned r = Z3_get_ast_hash(ctx(), m_ast); check_error(); return r; }
524  friend std::ostream & operator<<(std::ostream & out, ast const & n);
525  std::string to_string() const { return std::string(Z3_ast_to_string(ctx(), m_ast)); }
526 
527 
531  friend bool eq(ast const & a, ast const & b);
532  };
533  inline std::ostream & operator<<(std::ostream & out, ast const & n) {
534  out << Z3_ast_to_string(n.ctx(), n.m_ast); return out;
535  }
536 
537  inline bool eq(ast const & a, ast const & b) { return Z3_is_eq_ast(a.ctx(), a, b); }
538 
539  template<typename T>
540  class ast_vector_tpl : public object {
541  Z3_ast_vector m_vector;
542  void init(Z3_ast_vector v) { Z3_ast_vector_inc_ref(ctx(), v); m_vector = v; }
543  public:
545  ast_vector_tpl(context & c, Z3_ast_vector v):object(c) { init(v); }
546  ast_vector_tpl(ast_vector_tpl const & s):object(s), m_vector(s.m_vector) { Z3_ast_vector_inc_ref(ctx(), m_vector); }
547  ast_vector_tpl(context& c, ast_vector_tpl const& src): object(c) { init(Z3_ast_vector_translate(src.ctx(), src, c)); }
548 
550  operator Z3_ast_vector() const { return m_vector; }
551  unsigned size() const { return Z3_ast_vector_size(ctx(), m_vector); }
552  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); }
553  void push_back(T const & e) { Z3_ast_vector_push(ctx(), m_vector, e); check_error(); }
554  void resize(unsigned sz) { Z3_ast_vector_resize(ctx(), m_vector, sz); check_error(); }
555  T back() const { return operator[](size() - 1); }
556  void pop_back() { assert(size() > 0); resize(size() - 1); }
557  bool empty() const { return size() == 0; }
559  Z3_ast_vector_inc_ref(s.ctx(), s.m_vector);
560  Z3_ast_vector_dec_ref(ctx(), m_vector);
561  object::operator=(s);
562  m_vector = s.m_vector;
563  return *this;
564  }
565  ast_vector_tpl& set(unsigned idx, ast& a) {
566  Z3_ast_vector_set(ctx(), m_vector, idx, a);
567  return *this;
568  }
569  /*
570  Disabled pending C++98 build upgrade
571  bool contains(T const& x) const {
572  for (T y : *this) if (eq(x, y)) return true;
573  return false;
574  }
575  */
576 
577  class iterator final {
578  ast_vector_tpl const* m_vector;
579  unsigned m_index;
580  public:
581  iterator(ast_vector_tpl const* v, unsigned i): m_vector(v), m_index(i) {}
582 
583  bool operator==(iterator const& other) const noexcept {
584  return other.m_index == m_index;
585  };
586  bool operator!=(iterator const& other) const noexcept {
587  return other.m_index != m_index;
588  };
589  iterator& operator++() noexcept {
590  ++m_index;
591  return *this;
592  }
593  void set(T& arg) {
594  Z3_ast_vector_set(m_vector->ctx(), *m_vector, m_index, arg);
595  }
596  iterator operator++(int) noexcept { iterator tmp = *this; ++m_index; return tmp; }
597  T * operator->() const { return &(operator*()); }
598  T operator*() const { return (*m_vector)[m_index]; }
599  };
600  iterator begin() const noexcept { return iterator(this, 0); }
601  iterator end() const { return iterator(this, size()); }
602  friend std::ostream & operator<<(std::ostream & out, ast_vector_tpl const & v) { out << Z3_ast_vector_to_string(v.ctx(), v); return out; }
603  std::string to_string() const { return std::string(Z3_ast_vector_to_string(ctx(), m_vector)); }
604  };
605 
606 
610  class sort : public ast {
611  public:
612  sort(context & c):ast(c) {}
613  sort(context & c, Z3_sort s):ast(c, reinterpret_cast<Z3_ast>(s)) {}
614  sort(context & c, Z3_ast a):ast(c, a) {}
615  operator Z3_sort() const { return reinterpret_cast<Z3_sort>(m_ast); }
616 
620  unsigned id() const { unsigned r = Z3_get_sort_id(ctx(), *this); check_error(); return r; }
621 
625  Z3_sort_kind sort_kind() const { return Z3_get_sort_kind(*m_ctx, *this); }
629  symbol name() const { Z3_symbol s = Z3_get_sort_name(ctx(), *this); check_error(); return symbol(ctx(), s); }
633  bool is_bool() const { return sort_kind() == Z3_BOOL_SORT; }
637  bool is_int() const { return sort_kind() == Z3_INT_SORT; }
641  bool is_real() const { return sort_kind() == Z3_REAL_SORT; }
645  bool is_arith() const { return is_int() || is_real(); }
649  bool is_bv() const { return sort_kind() == Z3_BV_SORT; }
653  bool is_array() const { return sort_kind() == Z3_ARRAY_SORT; }
657  bool is_datatype() const { return sort_kind() == Z3_DATATYPE_SORT; }
661  bool is_relation() const { return sort_kind() == Z3_RELATION_SORT; }
665  bool is_seq() const { return sort_kind() == Z3_SEQ_SORT; }
669  bool is_re() const { return sort_kind() == Z3_RE_SORT; }
673  bool is_finite_domain() const { return sort_kind() == Z3_FINITE_DOMAIN_SORT; }
677  bool is_fpa() const { return sort_kind() == Z3_FLOATING_POINT_SORT; }
678 
684  unsigned bv_size() const { assert(is_bv()); unsigned r = Z3_get_bv_sort_size(ctx(), *this); check_error(); return r; }
685 
686  unsigned fpa_ebits() const { assert(is_fpa()); unsigned r = Z3_fpa_get_ebits(ctx(), *this); check_error(); return r; }
687 
688  unsigned fpa_sbits() const { assert(is_fpa()); unsigned r = Z3_fpa_get_sbits(ctx(), *this); check_error(); return r; }
694  sort array_domain() const { assert(is_array()); Z3_sort s = Z3_get_array_sort_domain(ctx(), *this); check_error(); return sort(ctx(), s); }
700  sort array_range() const { assert(is_array()); Z3_sort s = Z3_get_array_sort_range(ctx(), *this); check_error(); return sort(ctx(), s); }
701 
702  friend std::ostream & operator<<(std::ostream & out, sort const & s) { return out << Z3_sort_to_string(s.ctx(), Z3_sort(s.m_ast)); }
703  };
704 
709  class func_decl : public ast {
710  public:
711  func_decl(context & c):ast(c) {}
712  func_decl(context & c, Z3_func_decl n):ast(c, reinterpret_cast<Z3_ast>(n)) {}
713  operator Z3_func_decl() const { return reinterpret_cast<Z3_func_decl>(m_ast); }
714 
718  unsigned id() const { unsigned r = Z3_get_func_decl_id(ctx(), *this); check_error(); return r; }
719 
720  unsigned arity() const { return Z3_get_arity(ctx(), *this); }
721  sort domain(unsigned i) const { assert(i < arity()); Z3_sort r = Z3_get_domain(ctx(), *this, i); check_error(); return sort(ctx(), r); }
722  sort range() const { Z3_sort r = Z3_get_range(ctx(), *this); check_error(); return sort(ctx(), r); }
723  symbol name() const { Z3_symbol s = Z3_get_decl_name(ctx(), *this); check_error(); return symbol(ctx(), s); }
724  Z3_decl_kind decl_kind() const { return Z3_get_decl_kind(ctx(), *this); }
725 
727  Z3_func_decl tc = Z3_mk_transitive_closure(ctx(), *this); check_error(); return func_decl(ctx(), tc);
728  }
729 
730  bool is_const() const { return arity() == 0; }
731 
732  expr operator()() const;
733  expr operator()(unsigned n, expr const * args) const;
734  expr operator()(expr_vector const& v) const;
735  expr operator()(expr const & a) const;
736  expr operator()(int a) const;
737  expr operator()(expr const & a1, expr const & a2) const;
738  expr operator()(expr const & a1, int a2) const;
739  expr operator()(int a1, expr const & a2) const;
740  expr operator()(expr const & a1, expr const & a2, expr const & a3) const;
741  expr operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const;
742  expr operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const;
743  };
744 
748  expr select(expr const & a, expr const& i);
749  expr select(expr const & a, expr_vector const & i);
750 
755  class expr : public ast {
756  public:
757  expr(context & c):ast(c) {}
758  expr(context & c, Z3_ast n):ast(c, reinterpret_cast<Z3_ast>(n)) {}
759 
763  sort get_sort() const { Z3_sort s = Z3_get_sort(*m_ctx, m_ast); check_error(); return sort(*m_ctx, s); }
764 
768  bool is_bool() const { return get_sort().is_bool(); }
772  bool is_int() const { return get_sort().is_int(); }
776  bool is_real() const { return get_sort().is_real(); }
780  bool is_arith() const { return get_sort().is_arith(); }
784  bool is_bv() const { return get_sort().is_bv(); }
788  bool is_array() const { return get_sort().is_array(); }
792  bool is_datatype() const { return get_sort().is_datatype(); }
796  bool is_relation() const { return get_sort().is_relation(); }
800  bool is_seq() const { return get_sort().is_seq(); }
804  bool is_re() const { return get_sort().is_re(); }
805 
814  bool is_finite_domain() const { return get_sort().is_finite_domain(); }
818  bool is_fpa() const { return get_sort().is_fpa(); }
819 
825  bool is_numeral() const { return kind() == Z3_NUMERAL_AST; }
826  bool is_numeral_i64(int64_t& i) const { bool r = Z3_get_numeral_int64(ctx(), m_ast, &i); check_error(); return r;}
827  bool is_numeral_u64(uint64_t& i) const { bool r = Z3_get_numeral_uint64(ctx(), m_ast, &i); check_error(); return r;}
828  bool is_numeral_i(int& i) const { bool r = Z3_get_numeral_int(ctx(), m_ast, &i); check_error(); return r;}
829  bool is_numeral_u(unsigned& i) const { bool r = Z3_get_numeral_uint(ctx(), m_ast, &i); check_error(); return r;}
830  bool is_numeral(std::string& s) const { if (!is_numeral()) return false; s = Z3_get_numeral_string(ctx(), m_ast); check_error(); return true; }
831  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; }
832  bool is_numeral(double& d) const { if (!is_numeral()) return false; d = Z3_get_numeral_double(ctx(), m_ast); check_error(); return true; }
833  bool as_binary(std::string& s) const { if (!is_numeral()) return false; s = Z3_get_numeral_binary_string(ctx(), m_ast); check_error(); return true; }
834 
835  double as_double() const { double d = 0; is_numeral(d); return d; }
836  uint64_t as_uint64() const { uint64_t r = 0; is_numeral_u64(r); return r; }
837  uint64_t as_int64() const { int64_t r = 0; is_numeral_i64(r); return r; }
838 
839 
843  bool is_app() const { return kind() == Z3_APP_AST || kind() == Z3_NUMERAL_AST; }
847  bool is_const() const { return is_app() && num_args() == 0; }
851  bool is_quantifier() const { return kind() == Z3_QUANTIFIER_AST; }
852 
856  bool is_forall() const { return Z3_is_quantifier_forall(ctx(), m_ast); }
860  bool is_exists() const { return Z3_is_quantifier_exists(ctx(), m_ast); }
864  bool is_lambda() const { return Z3_is_lambda(ctx(), m_ast); }
869  bool is_var() const { return kind() == Z3_VAR_AST; }
873  bool is_algebraic() const { return Z3_is_algebraic_number(ctx(), m_ast); }
874 
878  bool is_well_sorted() const { bool r = Z3_is_well_sorted(ctx(), m_ast); check_error(); return r; }
879 
883  expr mk_is_inf() const {
884  assert(is_fpa());
885  Z3_ast r = Z3_mk_fpa_is_infinite(ctx(), m_ast);
886  check_error();
887  return expr(ctx(), r);
888  }
889 
893  expr mk_is_nan() const {
894  assert(is_fpa());
895  Z3_ast r = Z3_mk_fpa_is_nan(ctx(), m_ast);
896  check_error();
897  return expr(ctx(), r);
898  }
899 
903  expr mk_is_normal() const {
904  assert(is_fpa());
905  Z3_ast r = Z3_mk_fpa_is_normal(ctx(), m_ast);
906  check_error();
907  return expr(ctx(), r);
908  }
909 
914  assert(is_fpa());
915  Z3_ast r = Z3_mk_fpa_is_subnormal(ctx(), m_ast);
916  check_error();
917  return expr(ctx(), r);
918  }
919 
923  expr mk_is_zero() const {
924  assert(is_fpa());
925  Z3_ast r = Z3_mk_fpa_is_zero(ctx(), m_ast);
926  check_error();
927  return expr(ctx(), r);
928  }
929 
933  expr mk_to_ieee_bv() const {
934  assert(is_fpa());
935  Z3_ast r = Z3_mk_fpa_to_ieee_bv(ctx(), m_ast);
936  check_error();
937  return expr(ctx(), r);
938  }
939 
943  expr mk_from_ieee_bv(sort const &s) const {
944  assert(is_bv());
945  Z3_ast r = Z3_mk_fpa_to_fp_bv(ctx(), m_ast, s);
946  check_error();
947  return expr(ctx(), r);
948  }
949 
956  std::string get_decimal_string(int precision) const {
957  assert(is_numeral() || is_algebraic());
958  return std::string(Z3_get_numeral_decimal_string(ctx(), m_ast, precision));
959  }
960 
964  expr algebraic_lower(unsigned precision) const {
965  assert(is_algebraic());
966  Z3_ast r = Z3_get_algebraic_number_lower(ctx(), m_ast, precision);
967  check_error();
968  return expr(ctx(), r);
969  }
970 
971  expr algebraic_upper(unsigned precision) const {
972  assert(is_algebraic());
973  Z3_ast r = Z3_get_algebraic_number_upper(ctx(), m_ast, precision);
974  check_error();
975  return expr(ctx(), r);
976  }
977 
981  expr_vector algebraic_poly() const {
982  assert(is_algebraic());
983  Z3_ast_vector r = Z3_algebraic_get_poly(ctx(), m_ast);
984  check_error();
985  return expr_vector(ctx(), r);
986  }
987 
991  unsigned algebraic_i() const {
992  assert(is_algebraic());
993  unsigned i = Z3_algebraic_get_i(ctx(), m_ast);
994  check_error();
995  return i;
996  }
997 
1001  unsigned id() const { unsigned r = Z3_get_ast_id(ctx(), m_ast); check_error(); return r; }
1002 
1013  int get_numeral_int() const {
1014  int result = 0;
1015  if (!is_numeral_i(result)) {
1016  assert(ctx().enable_exceptions());
1017  if (!ctx().enable_exceptions()) return 0;
1018  Z3_THROW(exception("numeral does not fit in machine int"));
1019  }
1020  return result;
1021  }
1022 
1032  unsigned get_numeral_uint() const {
1033  assert(is_numeral());
1034  unsigned result = 0;
1035  if (!is_numeral_u(result)) {
1036  assert(ctx().enable_exceptions());
1037  if (!ctx().enable_exceptions()) return 0;
1038  Z3_THROW(exception("numeral does not fit in machine uint"));
1039  }
1040  return result;
1041  }
1042 
1049  int64_t get_numeral_int64() const {
1050  assert(is_numeral());
1051  int64_t result = 0;
1052  if (!is_numeral_i64(result)) {
1053  assert(ctx().enable_exceptions());
1054  if (!ctx().enable_exceptions()) return 0;
1055  Z3_THROW(exception("numeral does not fit in machine int64_t"));
1056  }
1057  return result;
1058  }
1059 
1066  uint64_t get_numeral_uint64() const {
1067  assert(is_numeral());
1068  uint64_t result = 0;
1069  if (!is_numeral_u64(result)) {
1070  assert(ctx().enable_exceptions());
1071  if (!ctx().enable_exceptions()) return 0;
1072  Z3_THROW(exception("numeral does not fit in machine uint64_t"));
1073  }
1074  return result;
1075  }
1076 
1078  return Z3_get_bool_value(ctx(), m_ast);
1079  }
1080 
1081  expr numerator() const {
1082  assert(is_numeral());
1083  Z3_ast r = Z3_get_numerator(ctx(), m_ast);
1084  check_error();
1085  return expr(ctx(),r);
1086  }
1087 
1088 
1089  expr denominator() const {
1090  assert(is_numeral());
1091  Z3_ast r = Z3_get_denominator(ctx(), m_ast);
1092  check_error();
1093  return expr(ctx(),r);
1094  }
1095 
1096 
1101  bool is_string_value() const { return Z3_is_string(ctx(), m_ast); }
1102 
1108  std::string get_string() const {
1109  assert(is_string_value());
1110  char const* s = Z3_get_string(ctx(), m_ast);
1111  check_error();
1112  return std::string(s);
1113  }
1114 
1120  std::u32string get_u32string() const {
1121  assert(is_string_value());
1122  unsigned n = Z3_get_string_length(ctx(), m_ast);
1123  std::u32string s;
1124  s.resize(n);
1125  Z3_get_string_contents(ctx(), m_ast, n, (unsigned*)s.data());
1126  return s;
1127  }
1128 
1129  operator Z3_app() const { assert(is_app()); return reinterpret_cast<Z3_app>(m_ast); }
1130 
1137  func_decl decl() const { Z3_func_decl f = Z3_get_app_decl(ctx(), *this); check_error(); return func_decl(ctx(), f); }
1144  unsigned num_args() const { unsigned r = Z3_get_app_num_args(ctx(), *this); check_error(); return r; }
1152  expr arg(unsigned i) const { Z3_ast r = Z3_get_app_arg(ctx(), *this, i); check_error(); return expr(ctx(), r); }
1153 
1159  expr body() const { assert(is_quantifier()); Z3_ast r = Z3_get_quantifier_body(ctx(), *this); check_error(); return expr(ctx(), r); }
1160 
1166  friend expr operator!(expr const & a);
1167 
1174  friend expr operator&&(expr const & a, expr const & b);
1175 
1176 
1183  friend expr operator&&(expr const & a, bool b);
1190  friend expr operator&&(bool a, expr const & b);
1191 
1198  friend expr operator||(expr const & a, expr const & b);
1205  friend expr operator||(expr const & a, bool b);
1206 
1213  friend expr operator||(bool a, expr const & b);
1214 
1215  friend expr implies(expr const & a, expr const & b);
1216  friend expr implies(expr const & a, bool b);
1217  friend expr implies(bool a, expr const & b);
1218 
1219  friend expr mk_or(expr_vector const& args);
1220  friend expr mk_xor(expr_vector const& args);
1221  friend expr mk_and(expr_vector const& args);
1222 
1223  friend expr ite(expr const & c, expr const & t, expr const & e);
1224 
1225  bool is_true() const { return is_app() && Z3_OP_TRUE == decl().decl_kind(); }
1226  bool is_false() const { return is_app() && Z3_OP_FALSE == decl().decl_kind(); }
1227  bool is_not() const { return is_app() && Z3_OP_NOT == decl().decl_kind(); }
1228  bool is_and() const { return is_app() && Z3_OP_AND == decl().decl_kind(); }
1229  bool is_or() const { return is_app() && Z3_OP_OR == decl().decl_kind(); }
1230  bool is_xor() const { return is_app() && Z3_OP_XOR == decl().decl_kind(); }
1231  bool is_implies() const { return is_app() && Z3_OP_IMPLIES == decl().decl_kind(); }
1232  bool is_eq() const { return is_app() && Z3_OP_EQ == decl().decl_kind(); }
1233  bool is_ite() const { return is_app() && Z3_OP_ITE == decl().decl_kind(); }
1234  bool is_distinct() const { return is_app() && Z3_OP_DISTINCT == decl().decl_kind(); }
1235 
1236  friend expr distinct(expr_vector const& args);
1237  friend expr concat(expr const& a, expr const& b);
1238  friend expr concat(expr_vector const& args);
1239 
1240  friend expr operator==(expr const & a, expr const & b);
1241  friend expr operator==(expr const & a, int b);
1242  friend expr operator==(int a, expr const & b);
1243 
1244  friend expr operator!=(expr const & a, expr const & b);
1245  friend expr operator!=(expr const & a, int b);
1246  friend expr operator!=(int a, expr const & b);
1247 
1248  friend expr operator+(expr const & a, expr const & b);
1249  friend expr operator+(expr const & a, int b);
1250  friend expr operator+(int a, expr const & b);
1251  friend expr sum(expr_vector const& args);
1252 
1253  friend expr operator*(expr const & a, expr const & b);
1254  friend expr operator*(expr const & a, int b);
1255  friend expr operator*(int a, expr const & b);
1256 
1257  /* \brief Power operator */
1258  friend expr pw(expr const & a, expr const & b);
1259  friend expr pw(expr const & a, int b);
1260  friend expr pw(int a, expr const & b);
1261 
1262  /* \brief mod operator */
1263  friend expr mod(expr const& a, expr const& b);
1264  friend expr mod(expr const& a, int b);
1265  friend expr mod(int a, expr const& b);
1266 
1267  /* \brief rem operator */
1268  friend expr rem(expr const& a, expr const& b);
1269  friend expr rem(expr const& a, int b);
1270  friend expr rem(int a, expr const& b);
1271 
1272  friend expr is_int(expr const& e);
1273 
1274  friend expr operator/(expr const & a, expr const & b);
1275  friend expr operator/(expr const & a, int b);
1276  friend expr operator/(int a, expr const & b);
1277 
1278  friend expr operator-(expr const & a);
1279 
1280  friend expr operator-(expr const & a, expr const & b);
1281  friend expr operator-(expr const & a, int b);
1282  friend expr operator-(int a, expr const & b);
1283 
1284  friend expr operator<=(expr const & a, expr const & b);
1285  friend expr operator<=(expr const & a, int b);
1286  friend expr operator<=(int a, expr const & b);
1287 
1288 
1289  friend expr operator>=(expr const & a, expr const & b);
1290  friend expr operator>=(expr const & a, int b);
1291  friend expr operator>=(int a, expr const & b);
1292 
1293  friend expr operator<(expr const & a, expr const & b);
1294  friend expr operator<(expr const & a, int b);
1295  friend expr operator<(int a, expr const & b);
1296 
1297  friend expr operator>(expr const & a, expr const & b);
1298  friend expr operator>(expr const & a, int b);
1299  friend expr operator>(int a, expr const & b);
1300 
1301  friend expr pble(expr_vector const& es, int const * coeffs, int bound);
1302  friend expr pbge(expr_vector const& es, int const * coeffs, int bound);
1303  friend expr pbeq(expr_vector const& es, int const * coeffs, int bound);
1304  friend expr atmost(expr_vector const& es, unsigned bound);
1305  friend expr atleast(expr_vector const& es, unsigned bound);
1306 
1307  friend expr operator&(expr const & a, expr const & b);
1308  friend expr operator&(expr const & a, int b);
1309  friend expr operator&(int a, expr const & b);
1310 
1311  friend expr operator^(expr const & a, expr const & b);
1312  friend expr operator^(expr const & a, int b);
1313  friend expr operator^(int a, expr const & b);
1314 
1315  friend expr operator|(expr const & a, expr const & b);
1316  friend expr operator|(expr const & a, int b);
1317  friend expr operator|(int a, expr const & b);
1318  friend expr nand(expr const& a, expr const& b);
1319  friend expr nor(expr const& a, expr const& b);
1320  friend expr xnor(expr const& a, expr const& b);
1321 
1322  friend expr min(expr const& a, expr const& b);
1323  friend expr max(expr const& a, expr const& b);
1324 
1325  friend expr bv2int(expr const& a, bool is_signed);
1326  friend expr int2bv(unsigned n, expr const& a);
1327  friend expr bvadd_no_overflow(expr const& a, expr const& b, bool is_signed);
1328  friend expr bvadd_no_underflow(expr const& a, expr const& b);
1329  friend expr bvsub_no_overflow(expr const& a, expr const& b);
1330  friend expr bvsub_no_underflow(expr const& a, expr const& b, bool is_signed);
1331  friend expr bvsdiv_no_overflow(expr const& a, expr const& b);
1332  friend expr bvneg_no_overflow(expr const& a);
1333  friend expr bvmul_no_overflow(expr const& a, expr const& b, bool is_signed);
1334  friend expr bvmul_no_underflow(expr const& a, expr const& b);
1335 
1336  expr rotate_left(unsigned i) { Z3_ast r = Z3_mk_rotate_left(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1337  expr rotate_right(unsigned i) { Z3_ast r = Z3_mk_rotate_right(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1338  expr repeat(unsigned i) { Z3_ast r = Z3_mk_repeat(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1339 
1340  friend expr bvredor(expr const & a);
1341  friend expr bvredand(expr const & a);
1342 
1343  friend expr abs(expr const & a);
1344  friend expr sqrt(expr const & a, expr const & rm);
1345  friend expr fp_eq(expr const & a, expr const & b);
1346 
1347  friend expr operator~(expr const & a);
1348  expr extract(unsigned hi, unsigned lo) const { Z3_ast r = Z3_mk_extract(ctx(), hi, lo, *this); ctx().check_error(); return expr(ctx(), r); }
1349  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)); }
1350  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)); }
1351 
1355  friend expr fma(expr const& a, expr const& b, expr const& c, expr const& rm);
1356 
1360  friend expr fpa_fp(expr const& sgn, expr const& exp, expr const& sig);
1361 
1365  friend expr fpa_to_sbv(expr const& t, unsigned sz);
1366 
1370  friend expr fpa_to_ubv(expr const& t, unsigned sz);
1371 
1375  friend expr sbv_to_fpa(expr const& t, sort s);
1376 
1380  friend expr ubv_to_fpa(expr const& t, sort s);
1381 
1385  friend expr fpa_to_fpa(expr const& t, sort s);
1386 
1390  friend expr round_fpa_to_closest_integer(expr const& t);
1391 
1397  expr extract(expr const& offset, expr const& length) const {
1398  check_context(*this, offset); check_context(offset, length);
1399  Z3_ast r = Z3_mk_seq_extract(ctx(), *this, offset, length); check_error(); return expr(ctx(), r);
1400  }
1401  expr replace(expr const& src, expr const& dst) const {
1402  check_context(*this, src); check_context(src, dst);
1403  Z3_ast r = Z3_mk_seq_replace(ctx(), *this, src, dst);
1404  check_error();
1405  return expr(ctx(), r);
1406  }
1407  expr unit() const {
1408  Z3_ast r = Z3_mk_seq_unit(ctx(), *this);
1409  check_error();
1410  return expr(ctx(), r);
1411  }
1412  expr contains(expr const& s) const {
1413  check_context(*this, s);
1414  Z3_ast r = Z3_mk_seq_contains(ctx(), *this, s);
1415  check_error();
1416  return expr(ctx(), r);
1417  }
1418  expr at(expr const& index) const {
1419  check_context(*this, index);
1420  Z3_ast r = Z3_mk_seq_at(ctx(), *this, index);
1421  check_error();
1422  return expr(ctx(), r);
1423  }
1424  expr nth(expr const& index) const {
1425  check_context(*this, index);
1426  Z3_ast r = Z3_mk_seq_nth(ctx(), *this, index);
1427  check_error();
1428  return expr(ctx(), r);
1429  }
1430  expr length() const {
1431  Z3_ast r = Z3_mk_seq_length(ctx(), *this);
1432  check_error();
1433  return expr(ctx(), r);
1434  }
1435  expr stoi() const {
1436  Z3_ast r = Z3_mk_str_to_int(ctx(), *this);
1437  check_error();
1438  return expr(ctx(), r);
1439  }
1440  expr itos() const {
1441  Z3_ast r = Z3_mk_int_to_str(ctx(), *this);
1442  check_error();
1443  return expr(ctx(), r);
1444  }
1445  expr ubvtos() const {
1446  Z3_ast r = Z3_mk_ubv_to_str(ctx(), *this);
1447  check_error();
1448  return expr(ctx(), r);
1449  }
1450  expr sbvtos() const {
1451  Z3_ast r = Z3_mk_sbv_to_str(ctx(), *this);
1452  check_error();
1453  return expr(ctx(), r);
1454  }
1455  expr char_to_int() const {
1456  Z3_ast r = Z3_mk_char_to_int(ctx(), *this);
1457  check_error();
1458  return expr(ctx(), r);
1459  }
1460  expr char_to_bv() const {
1461  Z3_ast r = Z3_mk_char_to_bv(ctx(), *this);
1462  check_error();
1463  return expr(ctx(), r);
1464  }
1465  expr char_from_bv() const {
1466  Z3_ast r = Z3_mk_char_from_bv(ctx(), *this);
1467  check_error();
1468  return expr(ctx(), r);
1469  }
1470  expr is_digit() const {
1471  Z3_ast r = Z3_mk_char_is_digit(ctx(), *this);
1472  check_error();
1473  return expr(ctx(), r);
1474  }
1475 
1476  friend expr range(expr const& lo, expr const& hi);
1480  expr loop(unsigned lo) {
1481  Z3_ast r = Z3_mk_re_loop(ctx(), m_ast, lo, 0);
1482  check_error();
1483  return expr(ctx(), r);
1484  }
1485  expr loop(unsigned lo, unsigned hi) {
1486  Z3_ast r = Z3_mk_re_loop(ctx(), m_ast, lo, hi);
1487  check_error();
1488  return expr(ctx(), r);
1489  }
1490 
1494  expr operator[](expr const& index) const {
1495  assert(is_array() || is_seq());
1496  if (is_array()) {
1497  return select(*this, index);
1498  }
1499  return nth(index);
1500  }
1501 
1502  expr operator[](expr_vector const& index) const {
1503  return select(*this, index);
1504  }
1505 
1509  expr simplify() const { Z3_ast r = Z3_simplify(ctx(), m_ast); check_error(); return expr(ctx(), r); }
1513  expr simplify(params const & p) const { Z3_ast r = Z3_simplify_ex(ctx(), m_ast, p); check_error(); return expr(ctx(), r); }
1514 
1518  expr substitute(expr_vector const& src, expr_vector const& dst);
1519 
1523  expr substitute(expr_vector const& dst);
1524 
1525 
1526  class iterator {
1527  expr& e;
1528  unsigned i;
1529  public:
1530  iterator(expr& e, unsigned i): e(e), i(i) {}
1531  bool operator==(iterator const& other) noexcept {
1532  return i == other.i;
1533  }
1534  bool operator!=(iterator const& other) noexcept {
1535  return i != other.i;
1536  }
1537  expr operator*() const { return e.arg(i); }
1538  iterator& operator++() { ++i; return *this; }
1539  iterator operator++(int) { assert(false); return *this; }
1540  };
1541 
1542  iterator begin() { return iterator(*this, 0); }
1543  iterator end() { return iterator(*this, is_app() ? num_args() : 0); }
1544 
1545  };
1546 
1547 #define _Z3_MK_BIN_(a, b, binop) \
1548  check_context(a, b); \
1549  Z3_ast r = binop(a.ctx(), a, b); \
1550  a.check_error(); \
1551  return expr(a.ctx(), r); \
1552 
1553 
1554  inline expr implies(expr const & a, expr const & b) {
1555  assert(a.is_bool() && b.is_bool());
1556  _Z3_MK_BIN_(a, b, Z3_mk_implies);
1557  }
1558  inline expr implies(expr const & a, bool b) { return implies(a, a.ctx().bool_val(b)); }
1559  inline expr implies(bool a, expr const & b) { return implies(b.ctx().bool_val(a), b); }
1560 
1561 
1562  inline expr pw(expr const & a, expr const & b) { _Z3_MK_BIN_(a, b, Z3_mk_power); }
1563  inline expr pw(expr const & a, int b) { return pw(a, a.ctx().num_val(b, a.get_sort())); }
1564  inline expr pw(int a, expr const & b) { return pw(b.ctx().num_val(a, b.get_sort()), b); }
1565 
1566  inline expr mod(expr const& a, expr const& b) {
1567  if (a.is_bv()) {
1568  _Z3_MK_BIN_(a, b, Z3_mk_bvsmod);
1569  }
1570  else {
1571  _Z3_MK_BIN_(a, b, Z3_mk_mod);
1572  }
1573  }
1574  inline expr mod(expr const & a, int b) { return mod(a, a.ctx().num_val(b, a.get_sort())); }
1575  inline expr mod(int a, expr const & b) { return mod(b.ctx().num_val(a, b.get_sort()), b); }
1576 
1577  inline expr operator%(expr const& a, expr const& b) { return mod(a, b); }
1578  inline expr operator%(expr const& a, int b) { return mod(a, b); }
1579  inline expr operator%(int a, expr const& b) { return mod(a, b); }
1580 
1581 
1582  inline expr rem(expr const& a, expr const& b) {
1583  if (a.is_fpa() && b.is_fpa()) {
1584  _Z3_MK_BIN_(a, b, Z3_mk_fpa_rem);
1585  } else {
1586  _Z3_MK_BIN_(a, b, Z3_mk_rem);
1587  }
1588  }
1589  inline expr rem(expr const & a, int b) { return rem(a, a.ctx().num_val(b, a.get_sort())); }
1590  inline expr rem(int a, expr const & b) { return rem(b.ctx().num_val(a, b.get_sort()), b); }
1591 
1592 #undef _Z3_MK_BIN_
1593 
1594 #define _Z3_MK_UN_(a, mkun) \
1595  Z3_ast r = mkun(a.ctx(), a); \
1596  a.check_error(); \
1597  return expr(a.ctx(), r); \
1598 
1599 
1600  inline expr operator!(expr const & a) { assert(a.is_bool()); _Z3_MK_UN_(a, Z3_mk_not); }
1601 
1602  inline expr is_int(expr const& e) { _Z3_MK_UN_(e, Z3_mk_is_int); }
1603 
1604 #undef _Z3_MK_UN_
1605 
1606  inline expr operator&&(expr const & a, expr const & b) {
1607  check_context(a, b);
1608  assert(a.is_bool() && b.is_bool());
1609  Z3_ast args[2] = { a, b };
1610  Z3_ast r = Z3_mk_and(a.ctx(), 2, args);
1611  a.check_error();
1612  return expr(a.ctx(), r);
1613  }
1614 
1615  inline expr operator&&(expr const & a, bool b) { return a && a.ctx().bool_val(b); }
1616  inline expr operator&&(bool a, expr const & b) { return b.ctx().bool_val(a) && b; }
1617 
1618  inline expr operator||(expr const & a, expr const & b) {
1619  check_context(a, b);
1620  assert(a.is_bool() && b.is_bool());
1621  Z3_ast args[2] = { a, b };
1622  Z3_ast r = Z3_mk_or(a.ctx(), 2, args);
1623  a.check_error();
1624  return expr(a.ctx(), r);
1625  }
1626 
1627  inline expr operator||(expr const & a, bool b) { return a || a.ctx().bool_val(b); }
1628 
1629  inline expr operator||(bool a, expr const & b) { return b.ctx().bool_val(a) || b; }
1630 
1631  inline expr operator==(expr const & a, expr const & b) {
1632  check_context(a, b);
1633  Z3_ast r = Z3_mk_eq(a.ctx(), a, b);
1634  a.check_error();
1635  return expr(a.ctx(), r);
1636  }
1637  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()); }
1638  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; }
1639  inline expr operator==(expr const & a, double b) { assert(a.is_fpa()); return a == a.ctx().fpa_val(b); }
1640  inline expr operator==(double a, expr const & b) { assert(b.is_fpa()); return b.ctx().fpa_val(a) == b; }
1641 
1642  inline expr operator!=(expr const & a, expr const & b) {
1643  check_context(a, b);
1644  Z3_ast args[2] = { a, b };
1645  Z3_ast r = Z3_mk_distinct(a.ctx(), 2, args);
1646  a.check_error();
1647  return expr(a.ctx(), r);
1648  }
1649  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()); }
1650  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; }
1651  inline expr operator!=(expr const & a, double b) { assert(a.is_fpa()); return a != a.ctx().fpa_val(b); }
1652  inline expr operator!=(double a, expr const & b) { assert(b.is_fpa()); return b.ctx().fpa_val(a) != b; }
1653 
1654  inline expr operator+(expr const & a, expr const & b) {
1655  check_context(a, b);
1656  Z3_ast r = 0;
1657  if (a.is_arith() && b.is_arith()) {
1658  Z3_ast args[2] = { a, b };
1659  r = Z3_mk_add(a.ctx(), 2, args);
1660  }
1661  else if (a.is_bv() && b.is_bv()) {
1662  r = Z3_mk_bvadd(a.ctx(), a, b);
1663  }
1664  else if (a.is_seq() && b.is_seq()) {
1665  return concat(a, b);
1666  }
1667  else if (a.is_re() && b.is_re()) {
1668  Z3_ast _args[2] = { a, b };
1669  r = Z3_mk_re_union(a.ctx(), 2, _args);
1670  }
1671  else if (a.is_fpa() && b.is_fpa()) {
1672  r = Z3_mk_fpa_add(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1673  }
1674  else {
1675  // operator is not supported by given arguments.
1676  assert(false);
1677  }
1678  a.check_error();
1679  return expr(a.ctx(), r);
1680  }
1681  inline expr operator+(expr const & a, int b) { return a + a.ctx().num_val(b, a.get_sort()); }
1682  inline expr operator+(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) + b; }
1683 
1684  inline expr operator*(expr const & a, expr const & b) {
1685  check_context(a, b);
1686  Z3_ast r = 0;
1687  if (a.is_arith() && b.is_arith()) {
1688  Z3_ast args[2] = { a, b };
1689  r = Z3_mk_mul(a.ctx(), 2, args);
1690  }
1691  else if (a.is_bv() && b.is_bv()) {
1692  r = Z3_mk_bvmul(a.ctx(), a, b);
1693  }
1694  else if (a.is_fpa() && b.is_fpa()) {
1695  r = Z3_mk_fpa_mul(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1696  }
1697  else {
1698  // operator is not supported by given arguments.
1699  assert(false);
1700  }
1701  a.check_error();
1702  return expr(a.ctx(), r);
1703  }
1704  inline expr operator*(expr const & a, int b) { return a * a.ctx().num_val(b, a.get_sort()); }
1705  inline expr operator*(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) * b; }
1706 
1707 
1708  inline expr operator>=(expr const & a, expr const & b) {
1709  check_context(a, b);
1710  Z3_ast r = 0;
1711  if (a.is_arith() && b.is_arith()) {
1712  r = Z3_mk_ge(a.ctx(), a, b);
1713  }
1714  else if (a.is_bv() && b.is_bv()) {
1715  r = Z3_mk_bvsge(a.ctx(), a, b);
1716  }
1717  else if (a.is_fpa() && b.is_fpa()) {
1718  r = Z3_mk_fpa_geq(a.ctx(), a, b);
1719  }
1720  else {
1721  // operator is not supported by given arguments.
1722  assert(false);
1723  }
1724  a.check_error();
1725  return expr(a.ctx(), r);
1726  }
1727 
1728  inline expr operator/(expr const & a, expr const & b) {
1729  check_context(a, b);
1730  Z3_ast r = 0;
1731  if (a.is_arith() && b.is_arith()) {
1732  r = Z3_mk_div(a.ctx(), a, b);
1733  }
1734  else if (a.is_bv() && b.is_bv()) {
1735  r = Z3_mk_bvsdiv(a.ctx(), a, b);
1736  }
1737  else if (a.is_fpa() && b.is_fpa()) {
1738  r = Z3_mk_fpa_div(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1739  }
1740  else {
1741  // operator is not supported by given arguments.
1742  assert(false);
1743  }
1744  a.check_error();
1745  return expr(a.ctx(), r);
1746  }
1747  inline expr operator/(expr const & a, int b) { return a / a.ctx().num_val(b, a.get_sort()); }
1748  inline expr operator/(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) / b; }
1749 
1750  inline expr operator-(expr const & a) {
1751  Z3_ast r = 0;
1752  if (a.is_arith()) {
1753  r = Z3_mk_unary_minus(a.ctx(), a);
1754  }
1755  else if (a.is_bv()) {
1756  r = Z3_mk_bvneg(a.ctx(), a);
1757  }
1758  else if (a.is_fpa()) {
1759  r = Z3_mk_fpa_neg(a.ctx(), a);
1760  }
1761  else {
1762  // operator is not supported by given arguments.
1763  assert(false);
1764  }
1765  a.check_error();
1766  return expr(a.ctx(), r);
1767  }
1768 
1769  inline expr operator-(expr const & a, expr const & b) {
1770  check_context(a, b);
1771  Z3_ast r = 0;
1772  if (a.is_arith() && b.is_arith()) {
1773  Z3_ast args[2] = { a, b };
1774  r = Z3_mk_sub(a.ctx(), 2, args);
1775  }
1776  else if (a.is_bv() && b.is_bv()) {
1777  r = Z3_mk_bvsub(a.ctx(), a, b);
1778  }
1779  else if (a.is_fpa() && b.is_fpa()) {
1780  r = Z3_mk_fpa_sub(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1781  }
1782  else {
1783  // operator is not supported by given arguments.
1784  assert(false);
1785  }
1786  a.check_error();
1787  return expr(a.ctx(), r);
1788  }
1789  inline expr operator-(expr const & a, int b) { return a - a.ctx().num_val(b, a.get_sort()); }
1790  inline expr operator-(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) - b; }
1791 
1792  inline expr operator<=(expr const & a, expr const & b) {
1793  check_context(a, b);
1794  Z3_ast r = 0;
1795  if (a.is_arith() && b.is_arith()) {
1796  r = Z3_mk_le(a.ctx(), a, b);
1797  }
1798  else if (a.is_bv() && b.is_bv()) {
1799  r = Z3_mk_bvsle(a.ctx(), a, b);
1800  }
1801  else if (a.is_fpa() && b.is_fpa()) {
1802  r = Z3_mk_fpa_leq(a.ctx(), a, b);
1803  }
1804  else {
1805  // operator is not supported by given arguments.
1806  assert(false);
1807  }
1808  a.check_error();
1809  return expr(a.ctx(), r);
1810  }
1811  inline expr operator<=(expr const & a, int b) { return a <= a.ctx().num_val(b, a.get_sort()); }
1812  inline expr operator<=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) <= b; }
1813 
1814  inline expr operator>=(expr const & a, int b) { return a >= a.ctx().num_val(b, a.get_sort()); }
1815  inline expr operator>=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) >= b; }
1816 
1817  inline expr operator<(expr const & a, expr const & b) {
1818  check_context(a, b);
1819  Z3_ast r = 0;
1820  if (a.is_arith() && b.is_arith()) {
1821  r = Z3_mk_lt(a.ctx(), a, b);
1822  }
1823  else if (a.is_bv() && b.is_bv()) {
1824  r = Z3_mk_bvslt(a.ctx(), a, b);
1825  }
1826  else if (a.is_fpa() && b.is_fpa()) {
1827  r = Z3_mk_fpa_lt(a.ctx(), a, b);
1828  }
1829  else {
1830  // operator is not supported by given arguments.
1831  assert(false);
1832  }
1833  a.check_error();
1834  return expr(a.ctx(), r);
1835  }
1836  inline expr operator<(expr const & a, int b) { return a < a.ctx().num_val(b, a.get_sort()); }
1837  inline expr operator<(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) < b; }
1838 
1839  inline expr operator>(expr const & a, expr const & b) {
1840  check_context(a, b);
1841  Z3_ast r = 0;
1842  if (a.is_arith() && b.is_arith()) {
1843  r = Z3_mk_gt(a.ctx(), a, b);
1844  }
1845  else if (a.is_bv() && b.is_bv()) {
1846  r = Z3_mk_bvsgt(a.ctx(), a, b);
1847  }
1848  else if (a.is_fpa() && b.is_fpa()) {
1849  r = Z3_mk_fpa_gt(a.ctx(), a, b);
1850  }
1851  else {
1852  // operator is not supported by given arguments.
1853  assert(false);
1854  }
1855  a.check_error();
1856  return expr(a.ctx(), r);
1857  }
1858  inline expr operator>(expr const & a, int b) { return a > a.ctx().num_val(b, a.get_sort()); }
1859  inline expr operator>(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) > b; }
1860 
1861  inline expr operator&(expr const & a, expr const & b) { if (a.is_bool()) return a && b; check_context(a, b); Z3_ast r = Z3_mk_bvand(a.ctx(), a, b); return expr(a.ctx(), r); }
1862  inline expr operator&(expr const & a, int b) { return a & a.ctx().num_val(b, a.get_sort()); }
1863  inline expr operator&(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) & b; }
1864 
1865  inline expr operator^(expr const & a, expr const & b) { check_context(a, b); Z3_ast r = a.is_bool() ? Z3_mk_xor(a.ctx(), a, b) : Z3_mk_bvxor(a.ctx(), a, b); return expr(a.ctx(), r); }
1866  inline expr operator^(expr const & a, int b) { return a ^ a.ctx().num_val(b, a.get_sort()); }
1867  inline expr operator^(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) ^ b; }
1868 
1869  inline expr operator|(expr const & a, expr const & b) { if (a.is_bool()) return a || b; check_context(a, b); Z3_ast r = Z3_mk_bvor(a.ctx(), a, b); return expr(a.ctx(), r); }
1870  inline expr operator|(expr const & a, int b) { return a | a.ctx().num_val(b, a.get_sort()); }
1871  inline expr operator|(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) | b; }
1872 
1873  inline expr nand(expr const& a, expr const& b) { if (a.is_bool()) return !(a && b); check_context(a, b); Z3_ast r = Z3_mk_bvnand(a.ctx(), a, b); return expr(a.ctx(), r); }
1874  inline expr nor(expr const& a, expr const& b) { if (a.is_bool()) return !(a || b); check_context(a, b); Z3_ast r = Z3_mk_bvnor(a.ctx(), a, b); return expr(a.ctx(), r); }
1875  inline expr xnor(expr const& a, expr const& b) { if (a.is_bool()) return !(a ^ b); check_context(a, b); Z3_ast r = Z3_mk_bvxnor(a.ctx(), a, b); return expr(a.ctx(), r); }
1876  inline expr min(expr const& a, expr const& b) {
1877  check_context(a, b);
1878  Z3_ast r;
1879  if (a.is_arith()) {
1880  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), b, a);
1881  }
1882  else if (a.is_bv()) {
1883  r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), b, a);
1884  }
1885  else {
1886  assert(a.is_fpa());
1887  r = Z3_mk_fpa_min(a.ctx(), a, b);
1888  }
1889  return expr(a.ctx(), r);
1890  }
1891  inline expr max(expr const& a, expr const& b) {
1892  check_context(a, b);
1893  Z3_ast r;
1894  if (a.is_arith()) {
1895  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), a, b);
1896  }
1897  else if (a.is_bv()) {
1898  r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), a, b);
1899  }
1900  else {
1901  assert(a.is_fpa());
1902  r = Z3_mk_fpa_max(a.ctx(), a, b);
1903  }
1904  return expr(a.ctx(), r);
1905  }
1906  inline expr bvredor(expr const & a) {
1907  assert(a.is_bv());
1908  Z3_ast r = Z3_mk_bvredor(a.ctx(), a);
1909  a.check_error();
1910  return expr(a.ctx(), r);
1911  }
1912  inline expr bvredand(expr const & a) {
1913  assert(a.is_bv());
1914  Z3_ast r = Z3_mk_bvredor(a.ctx(), a);
1915  a.check_error();
1916  return expr(a.ctx(), r);
1917  }
1918  inline expr abs(expr const & a) {
1919  Z3_ast r;
1920  if (a.is_int()) {
1921  expr zero = a.ctx().int_val(0);
1922  expr ge = a >= zero;
1923  expr na = -a;
1924  r = Z3_mk_ite(a.ctx(), ge, a, na);
1925  }
1926  else if (a.is_real()) {
1927  expr zero = a.ctx().real_val(0);
1928  expr ge = a >= zero;
1929  expr na = -a;
1930  r = Z3_mk_ite(a.ctx(), ge, a, na);
1931  }
1932  else {
1933  r = Z3_mk_fpa_abs(a.ctx(), a);
1934  }
1935  a.check_error();
1936  return expr(a.ctx(), r);
1937  }
1938  inline expr sqrt(expr const & a, expr const& rm) {
1939  check_context(a, rm);
1940  assert(a.is_fpa());
1941  Z3_ast r = Z3_mk_fpa_sqrt(a.ctx(), rm, a);
1942  a.check_error();
1943  return expr(a.ctx(), r);
1944  }
1945  inline expr fp_eq(expr const & a, expr const & b) {
1946  check_context(a, b);
1947  assert(a.is_fpa());
1948  Z3_ast r = Z3_mk_fpa_eq(a.ctx(), a, b);
1949  a.check_error();
1950  return expr(a.ctx(), r);
1951  }
1952  inline expr operator~(expr const & a) { Z3_ast r = Z3_mk_bvnot(a.ctx(), a); return expr(a.ctx(), r); }
1953 
1954  inline expr fma(expr const& a, expr const& b, expr const& c, expr const& rm) {
1955  check_context(a, b); check_context(a, c); check_context(a, rm);
1956  assert(a.is_fpa() && b.is_fpa() && c.is_fpa());
1957  Z3_ast r = Z3_mk_fpa_fma(a.ctx(), rm, a, b, c);
1958  a.check_error();
1959  return expr(a.ctx(), r);
1960  }
1961 
1962  inline expr fpa_fp(expr const& sgn, expr const& exp, expr const& sig) {
1963  check_context(sgn, exp); check_context(exp, sig);
1964  assert(sgn.is_bv() && exp.is_bv() && sig.is_bv());
1965  Z3_ast r = Z3_mk_fpa_fp(sgn.ctx(), sgn, exp, sig);
1966  sgn.check_error();
1967  return expr(sgn.ctx(), r);
1968  }
1969 
1970  inline expr fpa_to_sbv(expr const& t, unsigned sz) {
1971  assert(t.is_fpa());
1972  Z3_ast r = Z3_mk_fpa_to_sbv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
1973  t.check_error();
1974  return expr(t.ctx(), r);
1975  }
1976 
1977  inline expr fpa_to_ubv(expr const& t, unsigned sz) {
1978  assert(t.is_fpa());
1979  Z3_ast r = Z3_mk_fpa_to_ubv(t.ctx(), t.ctx().fpa_rounding_mode(), t, sz);
1980  t.check_error();
1981  return expr(t.ctx(), r);
1982  }
1983 
1984  inline expr sbv_to_fpa(expr const& t, sort s) {
1985  assert(t.is_bv());
1986  Z3_ast r = Z3_mk_fpa_to_fp_signed(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
1987  t.check_error();
1988  return expr(t.ctx(), r);
1989  }
1990 
1991  inline expr ubv_to_fpa(expr const& t, sort s) {
1992  assert(t.is_bv());
1993  Z3_ast r = Z3_mk_fpa_to_fp_unsigned(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
1994  t.check_error();
1995  return expr(t.ctx(), r);
1996  }
1997 
1998  inline expr fpa_to_fpa(expr const& t, sort s) {
1999  assert(t.is_fpa());
2000  Z3_ast r = Z3_mk_fpa_to_fp_float(t.ctx(), t.ctx().fpa_rounding_mode(), t, s);
2001  t.check_error();
2002  return expr(t.ctx(), r);
2003  }
2004 
2006  assert(t.is_fpa());
2007  Z3_ast r = Z3_mk_fpa_round_to_integral(t.ctx(), t.ctx().fpa_rounding_mode(), t);
2008  t.check_error();
2009  return expr(t.ctx(), r);
2010  }
2011 
2017  inline expr ite(expr const & c, expr const & t, expr const & e) {
2018  check_context(c, t); check_context(c, e);
2019  assert(c.is_bool());
2020  Z3_ast r = Z3_mk_ite(c.ctx(), c, t, e);
2021  c.check_error();
2022  return expr(c.ctx(), r);
2023  }
2024 
2025 
2030  inline expr to_expr(context & c, Z3_ast a) {
2031  c.check_error();
2032  assert(Z3_get_ast_kind(c, a) == Z3_APP_AST ||
2033  Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST ||
2034  Z3_get_ast_kind(c, a) == Z3_VAR_AST ||
2036  return expr(c, a);
2037  }
2038 
2039  inline sort to_sort(context & c, Z3_sort s) {
2040  c.check_error();
2041  return sort(c, s);
2042  }
2043 
2044  inline func_decl to_func_decl(context & c, Z3_func_decl f) {
2045  c.check_error();
2046  return func_decl(c, f);
2047  }
2048 
2052  inline expr sle(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsle(a.ctx(), a, b)); }
2053  inline expr sle(expr const & a, int b) { return sle(a, a.ctx().num_val(b, a.get_sort())); }
2054  inline expr sle(int a, expr const & b) { return sle(b.ctx().num_val(a, b.get_sort()), b); }
2058  inline expr slt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvslt(a.ctx(), a, b)); }
2059  inline expr slt(expr const & a, int b) { return slt(a, a.ctx().num_val(b, a.get_sort())); }
2060  inline expr slt(int a, expr const & b) { return slt(b.ctx().num_val(a, b.get_sort()), b); }
2064  inline expr sge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsge(a.ctx(), a, b)); }
2065  inline expr sge(expr const & a, int b) { return sge(a, a.ctx().num_val(b, a.get_sort())); }
2066  inline expr sge(int a, expr const & b) { return sge(b.ctx().num_val(a, b.get_sort()), b); }
2070  inline expr sgt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsgt(a.ctx(), a, b)); }
2071  inline expr sgt(expr const & a, int b) { return sgt(a, a.ctx().num_val(b, a.get_sort())); }
2072  inline expr sgt(int a, expr const & b) { return sgt(b.ctx().num_val(a, b.get_sort()), b); }
2073 
2074 
2078  inline expr ule(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvule(a.ctx(), a, b)); }
2079  inline expr ule(expr const & a, int b) { return ule(a, a.ctx().num_val(b, a.get_sort())); }
2080  inline expr ule(int a, expr const & b) { return ule(b.ctx().num_val(a, b.get_sort()), b); }
2084  inline expr ult(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvult(a.ctx(), a, b)); }
2085  inline expr ult(expr const & a, int b) { return ult(a, a.ctx().num_val(b, a.get_sort())); }
2086  inline expr ult(int a, expr const & b) { return ult(b.ctx().num_val(a, b.get_sort()), b); }
2090  inline expr uge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b)); }
2091  inline expr uge(expr const & a, int b) { return uge(a, a.ctx().num_val(b, a.get_sort())); }
2092  inline expr uge(int a, expr const & b) { return uge(b.ctx().num_val(a, b.get_sort()), b); }
2096  inline expr ugt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvugt(a.ctx(), a, b)); }
2097  inline expr ugt(expr const & a, int b) { return ugt(a, a.ctx().num_val(b, a.get_sort())); }
2098  inline expr ugt(int a, expr const & b) { return ugt(b.ctx().num_val(a, b.get_sort()), b); }
2102  inline expr udiv(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvudiv(a.ctx(), a, b)); }
2103  inline expr udiv(expr const & a, int b) { return udiv(a, a.ctx().num_val(b, a.get_sort())); }
2104  inline expr udiv(int a, expr const & b) { return udiv(b.ctx().num_val(a, b.get_sort()), b); }
2105 
2109  inline expr srem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsrem(a.ctx(), a, b)); }
2110  inline expr srem(expr const & a, int b) { return srem(a, a.ctx().num_val(b, a.get_sort())); }
2111  inline expr srem(int a, expr const & b) { return srem(b.ctx().num_val(a, b.get_sort()), b); }
2112 
2116  inline expr smod(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsmod(a.ctx(), a, b)); }
2117  inline expr smod(expr const & a, int b) { return smod(a, a.ctx().num_val(b, a.get_sort())); }
2118  inline expr smod(int a, expr const & b) { return smod(b.ctx().num_val(a, b.get_sort()), b); }
2119 
2123  inline expr urem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvurem(a.ctx(), a, b)); }
2124  inline expr urem(expr const & a, int b) { return urem(a, a.ctx().num_val(b, a.get_sort())); }
2125  inline expr urem(int a, expr const & b) { return urem(b.ctx().num_val(a, b.get_sort()), b); }
2126 
2130  inline expr shl(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvshl(a.ctx(), a, b)); }
2131  inline expr shl(expr const & a, int b) { return shl(a, a.ctx().num_val(b, a.get_sort())); }
2132  inline expr shl(int a, expr const & b) { return shl(b.ctx().num_val(a, b.get_sort()), b); }
2133 
2137  inline expr lshr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvlshr(a.ctx(), a, b)); }
2138  inline expr lshr(expr const & a, int b) { return lshr(a, a.ctx().num_val(b, a.get_sort())); }
2139  inline expr lshr(int a, expr const & b) { return lshr(b.ctx().num_val(a, b.get_sort()), b); }
2140 
2144  inline expr ashr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvashr(a.ctx(), a, b)); }
2145  inline expr ashr(expr const & a, int b) { return ashr(a, a.ctx().num_val(b, a.get_sort())); }
2146  inline expr ashr(int a, expr const & b) { return ashr(b.ctx().num_val(a, b.get_sort()), b); }
2147 
2151  inline expr zext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_zero_ext(a.ctx(), i, a)); }
2152 
2156  inline expr bv2int(expr const& a, bool is_signed) { Z3_ast r = Z3_mk_bv2int(a.ctx(), a, is_signed); a.check_error(); return expr(a.ctx(), r); }
2157  inline expr int2bv(unsigned n, expr const& a) { Z3_ast r = Z3_mk_int2bv(a.ctx(), n, a); a.check_error(); return expr(a.ctx(), r); }
2158 
2162  inline expr bvadd_no_overflow(expr const& a, expr const& b, bool is_signed) {
2163  check_context(a, b); Z3_ast r = Z3_mk_bvadd_no_overflow(a.ctx(), a, b, is_signed); a.check_error(); return expr(a.ctx(), r);
2164  }
2165  inline expr bvadd_no_underflow(expr const& a, expr const& b) {
2166  check_context(a, b); Z3_ast r = Z3_mk_bvadd_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2167  }
2168  inline expr bvsub_no_overflow(expr const& a, expr const& b) {
2169  check_context(a, b); Z3_ast r = Z3_mk_bvsub_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2170  }
2171  inline expr bvsub_no_underflow(expr const& a, expr const& b, bool is_signed) {
2172  check_context(a, b); Z3_ast r = Z3_mk_bvsub_no_underflow(a.ctx(), a, b, is_signed); a.check_error(); return expr(a.ctx(), r);
2173  }
2174  inline expr bvsdiv_no_overflow(expr const& a, expr const& b) {
2175  check_context(a, b); Z3_ast r = Z3_mk_bvsdiv_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2176  }
2177  inline expr bvneg_no_overflow(expr const& a) {
2178  Z3_ast r = Z3_mk_bvneg_no_overflow(a.ctx(), a); a.check_error(); return expr(a.ctx(), r);
2179  }
2180  inline expr bvmul_no_overflow(expr const& a, expr const& b, bool is_signed) {
2181  check_context(a, b); Z3_ast r = Z3_mk_bvmul_no_overflow(a.ctx(), a, b, is_signed); a.check_error(); return expr(a.ctx(), r);
2182  }
2183  inline expr bvmul_no_underflow(expr const& a, expr const& b) {
2184  check_context(a, b); Z3_ast r = Z3_mk_bvmul_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
2185  }
2186 
2187 
2191  inline expr sext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_sign_ext(a.ctx(), i, a)); }
2192 
2193  inline func_decl linear_order(sort const& a, unsigned index) {
2194  return to_func_decl(a.ctx(), Z3_mk_linear_order(a.ctx(), a, index));
2195  }
2196  inline func_decl partial_order(sort const& a, unsigned index) {
2197  return to_func_decl(a.ctx(), Z3_mk_partial_order(a.ctx(), a, index));
2198  }
2199  inline func_decl piecewise_linear_order(sort const& a, unsigned index) {
2200  return to_func_decl(a.ctx(), Z3_mk_piecewise_linear_order(a.ctx(), a, index));
2201  }
2202  inline func_decl tree_order(sort const& a, unsigned index) {
2203  return to_func_decl(a.ctx(), Z3_mk_tree_order(a.ctx(), a, index));
2204  }
2205 
2206  template<> class cast_ast<ast> {
2207  public:
2208  ast operator()(context & c, Z3_ast a) { return ast(c, a); }
2209  };
2210 
2211  template<> class cast_ast<expr> {
2212  public:
2213  expr operator()(context & c, Z3_ast a) {
2214  assert(Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST ||
2215  Z3_get_ast_kind(c, a) == Z3_APP_AST ||
2217  Z3_get_ast_kind(c, a) == Z3_VAR_AST);
2218  return expr(c, a);
2219  }
2220  };
2221 
2222  template<> class cast_ast<sort> {
2223  public:
2224  sort operator()(context & c, Z3_ast a) {
2225  assert(Z3_get_ast_kind(c, a) == Z3_SORT_AST);
2226  return sort(c, reinterpret_cast<Z3_sort>(a));
2227  }
2228  };
2229 
2230  template<> class cast_ast<func_decl> {
2231  public:
2232  func_decl operator()(context & c, Z3_ast a) {
2233  assert(Z3_get_ast_kind(c, a) == Z3_FUNC_DECL_AST);
2234  return func_decl(c, reinterpret_cast<Z3_func_decl>(a));
2235  }
2236  };
2237 
2238  template<typename T>
2239  template<typename T2>
2240  array<T>::array(ast_vector_tpl<T2> const & v):m_array(new T[v.size()]), m_size(v.size()) {
2241  for (unsigned i = 0; i < m_size; i++) {
2242  m_array[i] = v[i];
2243  }
2244  }
2245 
2246  // Basic functions for creating quantified formulas.
2247  // The C API should be used for creating quantifiers with patterns, weights, many variables, etc.
2248  inline expr forall(expr const & x, expr const & b) {
2249  check_context(x, b);
2250  Z3_app vars[] = {(Z3_app) x};
2251  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2252  }
2253  inline expr forall(expr const & x1, expr const & x2, expr const & b) {
2254  check_context(x1, b); check_context(x2, b);
2255  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2256  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2257  }
2258  inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2259  check_context(x1, b); check_context(x2, b); check_context(x3, b);
2260  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2261  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2262  }
2263  inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2264  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2265  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2266  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2267  }
2268  inline expr forall(expr_vector const & xs, expr const & b) {
2269  array<Z3_app> vars(xs);
2270  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);
2271  }
2272  inline expr exists(expr const & x, expr const & b) {
2273  check_context(x, b);
2274  Z3_app vars[] = {(Z3_app) x};
2275  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2276  }
2277  inline expr exists(expr const & x1, expr const & x2, expr const & b) {
2278  check_context(x1, b); check_context(x2, b);
2279  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2280  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2281  }
2282  inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2283  check_context(x1, b); check_context(x2, b); check_context(x3, b);
2284  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2285  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2286  }
2287  inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2288  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2289  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2290  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2291  }
2292  inline expr exists(expr_vector const & xs, expr const & b) {
2293  array<Z3_app> vars(xs);
2294  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);
2295  }
2296  inline expr lambda(expr const & x, expr const & b) {
2297  check_context(x, b);
2298  Z3_app vars[] = {(Z3_app) x};
2299  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 1, vars, b); b.check_error(); return expr(b.ctx(), r);
2300  }
2301  inline expr lambda(expr const & x1, expr const & x2, expr const & b) {
2302  check_context(x1, b); check_context(x2, b);
2303  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2304  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 2, vars, b); b.check_error(); return expr(b.ctx(), r);
2305  }
2306  inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2307  check_context(x1, b); check_context(x2, b); check_context(x3, b);
2308  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2309  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 3, vars, b); b.check_error(); return expr(b.ctx(), r);
2310  }
2311  inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2312  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2313  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2314  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 4, vars, b); b.check_error(); return expr(b.ctx(), r);
2315  }
2316  inline expr lambda(expr_vector const & xs, expr const & b) {
2317  array<Z3_app> vars(xs);
2318  Z3_ast r = Z3_mk_lambda_const(b.ctx(), vars.size(), vars.ptr(), b); b.check_error(); return expr(b.ctx(), r);
2319  }
2320 
2321  inline expr pble(expr_vector const& es, int const* coeffs, int bound) {
2322  assert(es.size() > 0);
2323  context& ctx = es[0].ctx();
2324  array<Z3_ast> _es(es);
2325  Z3_ast r = Z3_mk_pble(ctx, _es.size(), _es.ptr(), coeffs, bound);
2326  ctx.check_error();
2327  return expr(ctx, r);
2328  }
2329  inline expr pbge(expr_vector const& es, int const* coeffs, int bound) {
2330  assert(es.size() > 0);
2331  context& ctx = es[0].ctx();
2332  array<Z3_ast> _es(es);
2333  Z3_ast r = Z3_mk_pbge(ctx, _es.size(), _es.ptr(), coeffs, bound);
2334  ctx.check_error();
2335  return expr(ctx, r);
2336  }
2337  inline expr pbeq(expr_vector const& es, int const* coeffs, int bound) {
2338  assert(es.size() > 0);
2339  context& ctx = es[0].ctx();
2340  array<Z3_ast> _es(es);
2341  Z3_ast r = Z3_mk_pbeq(ctx, _es.size(), _es.ptr(), coeffs, bound);
2342  ctx.check_error();
2343  return expr(ctx, r);
2344  }
2345  inline expr atmost(expr_vector const& es, unsigned bound) {
2346  assert(es.size() > 0);
2347  context& ctx = es[0].ctx();
2348  array<Z3_ast> _es(es);
2349  Z3_ast r = Z3_mk_atmost(ctx, _es.size(), _es.ptr(), bound);
2350  ctx.check_error();
2351  return expr(ctx, r);
2352  }
2353  inline expr atleast(expr_vector const& es, unsigned bound) {
2354  assert(es.size() > 0);
2355  context& ctx = es[0].ctx();
2356  array<Z3_ast> _es(es);
2357  Z3_ast r = Z3_mk_atleast(ctx, _es.size(), _es.ptr(), bound);
2358  ctx.check_error();
2359  return expr(ctx, r);
2360  }
2361  inline expr sum(expr_vector const& args) {
2362  assert(args.size() > 0);
2363  context& ctx = args[0].ctx();
2364  array<Z3_ast> _args(args);
2365  Z3_ast r = Z3_mk_add(ctx, _args.size(), _args.ptr());
2366  ctx.check_error();
2367  return expr(ctx, r);
2368  }
2369 
2370  inline expr distinct(expr_vector const& args) {
2371  assert(args.size() > 0);
2372  context& ctx = args[0].ctx();
2373  array<Z3_ast> _args(args);
2374  Z3_ast r = Z3_mk_distinct(ctx, _args.size(), _args.ptr());
2375  ctx.check_error();
2376  return expr(ctx, r);
2377  }
2378 
2379  inline expr concat(expr const& a, expr const& b) {
2380  check_context(a, b);
2381  Z3_ast r;
2382  if (Z3_is_seq_sort(a.ctx(), a.get_sort())) {
2383  Z3_ast _args[2] = { a, b };
2384  r = Z3_mk_seq_concat(a.ctx(), 2, _args);
2385  }
2386  else if (Z3_is_re_sort(a.ctx(), a.get_sort())) {
2387  Z3_ast _args[2] = { a, b };
2388  r = Z3_mk_re_concat(a.ctx(), 2, _args);
2389  }
2390  else {
2391  r = Z3_mk_concat(a.ctx(), a, b);
2392  }
2393  a.ctx().check_error();
2394  return expr(a.ctx(), r);
2395  }
2396 
2397  inline expr concat(expr_vector const& args) {
2398  Z3_ast r;
2399  assert(args.size() > 0);
2400  if (args.size() == 1) {
2401  return args[0];
2402  }
2403  context& ctx = args[0].ctx();
2404  array<Z3_ast> _args(args);
2405  if (Z3_is_seq_sort(ctx, args[0].get_sort())) {
2406  r = Z3_mk_seq_concat(ctx, _args.size(), _args.ptr());
2407  }
2408  else if (Z3_is_re_sort(ctx, args[0].get_sort())) {
2409  r = Z3_mk_re_concat(ctx, _args.size(), _args.ptr());
2410  }
2411  else {
2412  r = _args[args.size()-1];
2413  for (unsigned i = args.size()-1; i > 0; ) {
2414  --i;
2415  r = Z3_mk_concat(ctx, _args[i], r);
2416  ctx.check_error();
2417  }
2418  }
2419  ctx.check_error();
2420  return expr(ctx, r);
2421  }
2422 
2423  inline expr mk_or(expr_vector const& args) {
2424  array<Z3_ast> _args(args);
2425  Z3_ast r = Z3_mk_or(args.ctx(), _args.size(), _args.ptr());
2426  args.check_error();
2427  return expr(args.ctx(), r);
2428  }
2429  inline expr mk_and(expr_vector const& args) {
2430  array<Z3_ast> _args(args);
2431  Z3_ast r = Z3_mk_and(args.ctx(), _args.size(), _args.ptr());
2432  args.check_error();
2433  return expr(args.ctx(), r);
2434  }
2435  inline expr mk_xor(expr_vector const& args) {
2436  if (args.empty())
2437  return args.ctx().bool_val(false);
2438  expr r = args[0];
2439  for (unsigned i = 1; i < args.size(); ++i)
2440  r = r ^ args[i];
2441  return r;
2442  }
2443 
2444 
2445  class func_entry : public object {
2446  Z3_func_entry m_entry;
2447  void init(Z3_func_entry e) {
2448  m_entry = e;
2449  Z3_func_entry_inc_ref(ctx(), m_entry);
2450  }
2451  public:
2452  func_entry(context & c, Z3_func_entry e):object(c) { init(e); }
2453  func_entry(func_entry const & s):object(s) { init(s.m_entry); }
2455  operator Z3_func_entry() const { return m_entry; }
2457  Z3_func_entry_inc_ref(s.ctx(), s.m_entry);
2458  Z3_func_entry_dec_ref(ctx(), m_entry);
2459  object::operator=(s);
2460  m_entry = s.m_entry;
2461  return *this;
2462  }
2463  expr value() const { Z3_ast r = Z3_func_entry_get_value(ctx(), m_entry); check_error(); return expr(ctx(), r); }
2464  unsigned num_args() const { unsigned r = Z3_func_entry_get_num_args(ctx(), m_entry); check_error(); return r; }
2465  expr arg(unsigned i) const { Z3_ast r = Z3_func_entry_get_arg(ctx(), m_entry, i); check_error(); return expr(ctx(), r); }
2466  };
2467 
2468  class func_interp : public object {
2469  Z3_func_interp m_interp;
2470  void init(Z3_func_interp e) {
2471  m_interp = e;
2472  Z3_func_interp_inc_ref(ctx(), m_interp);
2473  }
2474  public:
2475  func_interp(context & c, Z3_func_interp e):object(c) { init(e); }
2476  func_interp(func_interp const & s):object(s) { init(s.m_interp); }
2478  operator Z3_func_interp() const { return m_interp; }
2480  Z3_func_interp_inc_ref(s.ctx(), s.m_interp);
2481  Z3_func_interp_dec_ref(ctx(), m_interp);
2482  object::operator=(s);
2483  m_interp = s.m_interp;
2484  return *this;
2485  }
2486  expr else_value() const { Z3_ast r = Z3_func_interp_get_else(ctx(), m_interp); check_error(); return expr(ctx(), r); }
2487  unsigned num_entries() const { unsigned r = Z3_func_interp_get_num_entries(ctx(), m_interp); check_error(); return r; }
2488  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); }
2489  void add_entry(expr_vector const& args, expr& value) {
2490  Z3_func_interp_add_entry(ctx(), m_interp, args, value);
2491  check_error();
2492  }
2493  void set_else(expr& value) {
2494  Z3_func_interp_set_else(ctx(), m_interp, value);
2495  check_error();
2496  }
2497  };
2498 
2499  class model : public object {
2500  Z3_model m_model;
2501  void init(Z3_model m) {
2502  m_model = m;
2503  Z3_model_inc_ref(ctx(), m);
2504  }
2505  public:
2506  struct translate {};
2507  model(context & c):object(c) { init(Z3_mk_model(c)); }
2508  model(context & c, Z3_model m):object(c) { init(m); }
2509  model(model const & s):object(s) { init(s.m_model); }
2510  model(model& src, context& dst, translate) : object(dst) { init(Z3_model_translate(src.ctx(), src, dst)); }
2511  ~model() { Z3_model_dec_ref(ctx(), m_model); }
2512  operator Z3_model() const { return m_model; }
2513  model & operator=(model const & s) {
2514  Z3_model_inc_ref(s.ctx(), s.m_model);
2515  Z3_model_dec_ref(ctx(), m_model);
2516  object::operator=(s);
2517  m_model = s.m_model;
2518  return *this;
2519  }
2520 
2521  expr eval(expr const & n, bool model_completion=false) const {
2522  check_context(*this, n);
2523  Z3_ast r = 0;
2524  bool status = Z3_model_eval(ctx(), m_model, n, model_completion, &r);
2525  check_error();
2526  if (status == false && ctx().enable_exceptions())
2527  Z3_THROW(exception("failed to evaluate expression"));
2528  return expr(ctx(), r);
2529  }
2530 
2531  unsigned num_consts() const { return Z3_model_get_num_consts(ctx(), m_model); }
2532  unsigned num_funcs() const { return Z3_model_get_num_funcs(ctx(), m_model); }
2533  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); }
2534  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); }
2535  unsigned size() const { return num_consts() + num_funcs(); }
2536  func_decl operator[](int i) const {
2537  assert(0 <= i);
2538  return static_cast<unsigned>(i) < num_consts() ? get_const_decl(i) : get_func_decl(i - num_consts());
2539  }
2540 
2541  // returns interpretation of constant declaration c.
2542  // If c is not assigned any value in the model it returns
2543  // an expression with a null ast reference.
2545  check_context(*this, c);
2546  Z3_ast r = Z3_model_get_const_interp(ctx(), m_model, c);
2547  check_error();
2548  return expr(ctx(), r);
2549  }
2551  check_context(*this, f);
2552  Z3_func_interp r = Z3_model_get_func_interp(ctx(), m_model, f);
2553  check_error();
2554  return func_interp(ctx(), r);
2555  }
2556 
2557  // returns true iff the model contains an interpretation
2558  // for function f.
2559  bool has_interp(func_decl f) const {
2560  check_context(*this, f);
2561  return Z3_model_has_interp(ctx(), m_model, f);
2562  }
2563 
2565  Z3_func_interp r = Z3_add_func_interp(ctx(), m_model, f, else_val);
2566  check_error();
2567  return func_interp(ctx(), r);
2568  }
2569 
2570  void add_const_interp(func_decl& f, expr& value) {
2571  Z3_add_const_interp(ctx(), m_model, f, value);
2572  check_error();
2573  }
2574 
2575  friend std::ostream & operator<<(std::ostream & out, model const & m);
2576 
2577  std::string to_string() const { return std::string(Z3_model_to_string(ctx(), m_model)); }
2578  };
2579  inline std::ostream & operator<<(std::ostream & out, model const & m) { out << Z3_model_to_string(m.ctx(), m); return out; }
2580 
2581  class stats : public object {
2582  Z3_stats m_stats;
2583  void init(Z3_stats e) {
2584  m_stats = e;
2585  Z3_stats_inc_ref(ctx(), m_stats);
2586  }
2587  public:
2588  stats(context & c):object(c), m_stats(0) {}
2589  stats(context & c, Z3_stats e):object(c) { init(e); }
2590  stats(stats const & s):object(s) { init(s.m_stats); }
2591  ~stats() { if (m_stats) Z3_stats_dec_ref(ctx(), m_stats); }
2592  operator Z3_stats() const { return m_stats; }
2593  stats & operator=(stats const & s) {
2594  Z3_stats_inc_ref(s.ctx(), s.m_stats);
2595  if (m_stats) Z3_stats_dec_ref(ctx(), m_stats);
2596  object::operator=(s);
2597  m_stats = s.m_stats;
2598  return *this;
2599  }
2600  unsigned size() const { return Z3_stats_size(ctx(), m_stats); }
2601  std::string key(unsigned i) const { Z3_string s = Z3_stats_get_key(ctx(), m_stats, i); check_error(); return s; }
2602  bool is_uint(unsigned i) const { bool r = Z3_stats_is_uint(ctx(), m_stats, i); check_error(); return r; }
2603  bool is_double(unsigned i) const { bool r = Z3_stats_is_double(ctx(), m_stats, i); check_error(); return r; }
2604  unsigned uint_value(unsigned i) const { unsigned r = Z3_stats_get_uint_value(ctx(), m_stats, i); check_error(); return r; }
2605  double double_value(unsigned i) const { double r = Z3_stats_get_double_value(ctx(), m_stats, i); check_error(); return r; }
2606  friend std::ostream & operator<<(std::ostream & out, stats const & s);
2607  };
2608  inline std::ostream & operator<<(std::ostream & out, stats const & s) { out << Z3_stats_to_string(s.ctx(), s); return out; }
2609 
2610 
2611  inline std::ostream & operator<<(std::ostream & out, check_result r) {
2612  if (r == unsat) out << "unsat";
2613  else if (r == sat) out << "sat";
2614  else out << "unknown";
2615  return out;
2616  }
2617 
2618 
2619  class solver : public object {
2620  Z3_solver m_solver;
2621  void init(Z3_solver s) {
2622  m_solver = s;
2623  Z3_solver_inc_ref(ctx(), s);
2624  }
2625  public:
2626  struct simple {};
2627  struct translate {};
2628  solver(context & c):object(c) { init(Z3_mk_solver(c)); }
2630  solver(context & c, Z3_solver s):object(c) { init(s); }
2631  solver(context & c, char const * logic):object(c) { init(Z3_mk_solver_for_logic(c, c.str_symbol(logic))); }
2632  solver(context & c, solver const& src, translate): object(c) { init(Z3_solver_translate(src.ctx(), src, c)); }
2633  solver(solver const & s):object(s) { init(s.m_solver); }
2634  ~solver() { Z3_solver_dec_ref(ctx(), m_solver); }
2635  operator Z3_solver() const { return m_solver; }
2636  solver & operator=(solver const & s) {
2637  Z3_solver_inc_ref(s.ctx(), s.m_solver);
2638  Z3_solver_dec_ref(ctx(), m_solver);
2639  object::operator=(s);
2640  m_solver = s.m_solver;
2641  return *this;
2642  }
2643  void set(params const & p) { Z3_solver_set_params(ctx(), m_solver, p); check_error(); }
2644  void set(char const * k, bool v) { params p(ctx()); p.set(k, v); set(p); }
2645  void set(char const * k, unsigned v) { params p(ctx()); p.set(k, v); set(p); }
2646  void set(char const * k, double v) { params p(ctx()); p.set(k, v); set(p); }
2647  void set(char const * k, symbol const & v) { params p(ctx()); p.set(k, v); set(p); }
2648  void set(char const * k, char const* v) { params p(ctx()); p.set(k, v); set(p); }
2649  void push() { Z3_solver_push(ctx(), m_solver); check_error(); }
2650  void pop(unsigned n = 1) { Z3_solver_pop(ctx(), m_solver, n); check_error(); }
2651  void reset() { Z3_solver_reset(ctx(), m_solver); check_error(); }
2652  void add(expr const & e) { assert(e.is_bool()); Z3_solver_assert(ctx(), m_solver, e); check_error(); }
2653  void add(expr const & e, expr const & p) {
2654  assert(e.is_bool()); assert(p.is_bool()); assert(p.is_const());
2655  Z3_solver_assert_and_track(ctx(), m_solver, e, p);
2656  check_error();
2657  }
2658  void add(expr const & e, char const * p) {
2659  add(e, ctx().bool_const(p));
2660  }
2661  void add(expr_vector const& v) {
2662  check_context(*this, v);
2663  for (unsigned i = 0; i < v.size(); ++i)
2664  add(v[i]);
2665  }
2666  void from_file(char const* file) { Z3_solver_from_file(ctx(), m_solver, file); ctx().check_parser_error(); }
2667  void from_string(char const* s) { Z3_solver_from_string(ctx(), m_solver, s); ctx().check_parser_error(); }
2668 
2670  check_result check(unsigned n, expr * const assumptions) {
2671  array<Z3_ast> _assumptions(n);
2672  for (unsigned i = 0; i < n; i++) {
2673  check_context(*this, assumptions[i]);
2674  _assumptions[i] = assumptions[i];
2675  }
2676  Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
2677  check_error();
2678  return to_check_result(r);
2679  }
2680  check_result check(expr_vector const& assumptions) {
2681  unsigned n = assumptions.size();
2682  array<Z3_ast> _assumptions(n);
2683  for (unsigned i = 0; i < n; i++) {
2684  check_context(*this, assumptions[i]);
2685  _assumptions[i] = assumptions[i];
2686  }
2687  Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
2688  check_error();
2689  return to_check_result(r);
2690  }
2691  model get_model() const { Z3_model m = Z3_solver_get_model(ctx(), m_solver); check_error(); return model(ctx(), m); }
2692  check_result consequences(expr_vector& assumptions, expr_vector& vars, expr_vector& conseq) {
2693  Z3_lbool r = Z3_solver_get_consequences(ctx(), m_solver, assumptions, vars, conseq);
2694  check_error();
2695  return to_check_result(r);
2696  }
2697  std::string reason_unknown() const { Z3_string r = Z3_solver_get_reason_unknown(ctx(), m_solver); check_error(); return r; }
2698  stats statistics() const { Z3_stats r = Z3_solver_get_statistics(ctx(), m_solver); check_error(); return stats(ctx(), r); }
2699  expr_vector unsat_core() const { Z3_ast_vector r = Z3_solver_get_unsat_core(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2700  expr_vector assertions() const { Z3_ast_vector r = Z3_solver_get_assertions(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2701  expr_vector non_units() const { Z3_ast_vector r = Z3_solver_get_non_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2702  expr_vector units() const { Z3_ast_vector r = Z3_solver_get_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2703  expr_vector trail() const { Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2704  expr_vector trail(array<unsigned>& levels) const {
2705  Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver);
2706  check_error();
2707  expr_vector result(ctx(), r);
2708  unsigned sz = result.size();
2709  levels.resize(sz);
2710  Z3_solver_get_levels(ctx(), m_solver, r, sz, levels.ptr());
2711  check_error();
2712  return result;
2713  }
2714  expr proof() const { Z3_ast r = Z3_solver_get_proof(ctx(), m_solver); check_error(); return expr(ctx(), r); }
2715  friend std::ostream & operator<<(std::ostream & out, solver const & s);
2716 
2717  std::string to_smt2(char const* status = "unknown") {
2718  array<Z3_ast> es(assertions());
2719  Z3_ast const* fmls = es.ptr();
2720  Z3_ast fml = 0;
2721  unsigned sz = es.size();
2722  if (sz > 0) {
2723  --sz;
2724  fml = fmls[sz];
2725  }
2726  else {
2727  fml = ctx().bool_val(true);
2728  }
2729  return std::string(Z3_benchmark_to_smtlib_string(
2730  ctx(),
2731  "", "", status, "",
2732  sz,
2733  fmls,
2734  fml));
2735  }
2736 
2737  std::string dimacs(bool include_names = true) const { return std::string(Z3_solver_to_dimacs_string(ctx(), m_solver, include_names)); }
2738 
2740 
2741 
2742  expr_vector cube(expr_vector& vars, unsigned cutoff) {
2743  Z3_ast_vector r = Z3_solver_cube(ctx(), m_solver, vars, cutoff);
2744  check_error();
2745  return expr_vector(ctx(), r);
2746  }
2747 
2749  solver& m_solver;
2750  unsigned& m_cutoff;
2751  expr_vector& m_vars;
2752  expr_vector m_cube;
2753  bool m_end;
2754  bool m_empty;
2755 
2756  void inc() {
2757  assert(!m_end && !m_empty);
2758  m_cube = m_solver.cube(m_vars, m_cutoff);
2759  m_cutoff = 0xFFFFFFFF;
2760  if (m_cube.size() == 1 && m_cube[0].is_false()) {
2761  m_cube = z3::expr_vector(m_solver.ctx());
2762  m_end = true;
2763  }
2764  else if (m_cube.empty()) {
2765  m_empty = true;
2766  }
2767  }
2768  public:
2769  cube_iterator(solver& s, expr_vector& vars, unsigned& cutoff, bool end):
2770  m_solver(s),
2771  m_cutoff(cutoff),
2772  m_vars(vars),
2773  m_cube(s.ctx()),
2774  m_end(end),
2775  m_empty(false) {
2776  if (!m_end) {
2777  inc();
2778  }
2779  }
2780 
2782  assert(!m_end);
2783  if (m_empty) {
2784  m_end = true;
2785  }
2786  else {
2787  inc();
2788  }
2789  return *this;
2790  }
2791  cube_iterator operator++(int) { assert(false); return *this; }
2792  expr_vector const * operator->() const { return &(operator*()); }
2793  expr_vector const& operator*() const noexcept { return m_cube; }
2794 
2795  bool operator==(cube_iterator const& other) noexcept {
2796  return other.m_end == m_end;
2797  };
2798  bool operator!=(cube_iterator const& other) noexcept {
2799  return other.m_end != m_end;
2800  };
2801 
2802  };
2803 
2805  solver& m_solver;
2806  unsigned m_cutoff;
2807  expr_vector m_default_vars;
2808  expr_vector& m_vars;
2809  public:
2811  m_solver(s),
2812  m_cutoff(0xFFFFFFFF),
2813  m_default_vars(s.ctx()),
2814  m_vars(m_default_vars)
2815  {}
2816 
2817  cube_generator(solver& s, expr_vector& vars):
2818  m_solver(s),
2819  m_cutoff(0xFFFFFFFF),
2820  m_default_vars(s.ctx()),
2821  m_vars(vars)
2822  {}
2823 
2824  cube_iterator begin() { return cube_iterator(m_solver, m_vars, m_cutoff, false); }
2825  cube_iterator end() { return cube_iterator(m_solver, m_vars, m_cutoff, true); }
2826  void set_cutoff(unsigned c) noexcept { m_cutoff = c; }
2827  };
2828 
2829  cube_generator cubes() { return cube_generator(*this); }
2830  cube_generator cubes(expr_vector& vars) { return cube_generator(*this, vars); }
2831 
2832  };
2833  inline std::ostream & operator<<(std::ostream & out, solver const & s) { out << Z3_solver_to_string(s.ctx(), s); return out; }
2834 
2835  class goal : public object {
2836  Z3_goal m_goal;
2837  void init(Z3_goal s) {
2838  m_goal = s;
2839  Z3_goal_inc_ref(ctx(), s);
2840  }
2841  public:
2842  goal(context & c, bool models=true, bool unsat_cores=false, bool proofs=false):object(c) { init(Z3_mk_goal(c, models, unsat_cores, proofs)); }
2843  goal(context & c, Z3_goal s):object(c) { init(s); }
2844  goal(goal const & s):object(s) { init(s.m_goal); }
2845  ~goal() { Z3_goal_dec_ref(ctx(), m_goal); }
2846  operator Z3_goal() const { return m_goal; }
2847  goal & operator=(goal const & s) {
2848  Z3_goal_inc_ref(s.ctx(), s.m_goal);
2849  Z3_goal_dec_ref(ctx(), m_goal);
2850  object::operator=(s);
2851  m_goal = s.m_goal;
2852  return *this;
2853  }
2854  void add(expr const & f) { check_context(*this, f); Z3_goal_assert(ctx(), m_goal, f); check_error(); }
2855  void add(expr_vector const& v) { check_context(*this, v); for (unsigned i = 0; i < v.size(); ++i) add(v[i]); }
2856  unsigned size() const { return Z3_goal_size(ctx(), m_goal); }
2857  expr operator[](int i) const { assert(0 <= i); Z3_ast r = Z3_goal_formula(ctx(), m_goal, i); check_error(); return expr(ctx(), r); }
2858  Z3_goal_prec precision() const { return Z3_goal_precision(ctx(), m_goal); }
2859  bool inconsistent() const { return Z3_goal_inconsistent(ctx(), m_goal); }
2860  unsigned depth() const { return Z3_goal_depth(ctx(), m_goal); }
2861  void reset() { Z3_goal_reset(ctx(), m_goal); }
2862  unsigned num_exprs() const { return Z3_goal_num_exprs(ctx(), m_goal); }
2863  bool is_decided_sat() const { return Z3_goal_is_decided_sat(ctx(), m_goal); }
2864  bool is_decided_unsat() const { return Z3_goal_is_decided_unsat(ctx(), m_goal); }
2865  model convert_model(model const & m) const {
2866  check_context(*this, m);
2867  Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, m);
2868  check_error();
2869  return model(ctx(), new_m);
2870  }
2871  model get_model() const {
2872  Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, 0);
2873  check_error();
2874  return model(ctx(), new_m);
2875  }
2876  expr as_expr() const {
2877  unsigned n = size();
2878  if (n == 0)
2879  return ctx().bool_val(true);
2880  else if (n == 1)
2881  return operator[](0);
2882  else {
2883  array<Z3_ast> args(n);
2884  for (unsigned i = 0; i < n; i++)
2885  args[i] = operator[](i);
2886  return expr(ctx(), Z3_mk_and(ctx(), n, args.ptr()));
2887  }
2888  }
2889  std::string dimacs(bool include_names = true) const { return std::string(Z3_goal_to_dimacs_string(ctx(), m_goal, include_names)); }
2890  friend std::ostream & operator<<(std::ostream & out, goal const & g);
2891  };
2892  inline std::ostream & operator<<(std::ostream & out, goal const & g) { out << Z3_goal_to_string(g.ctx(), g); return out; }
2893 
2894  class apply_result : public object {
2895  Z3_apply_result m_apply_result;
2896  void init(Z3_apply_result s) {
2897  m_apply_result = s;
2899  }
2900  public:
2901  apply_result(context & c, Z3_apply_result s):object(c) { init(s); }
2902  apply_result(apply_result const & s):object(s) { init(s.m_apply_result); }
2903  ~apply_result() { Z3_apply_result_dec_ref(ctx(), m_apply_result); }
2904  operator Z3_apply_result() const { return m_apply_result; }
2906  Z3_apply_result_inc_ref(s.ctx(), s.m_apply_result);
2907  Z3_apply_result_dec_ref(ctx(), m_apply_result);
2908  object::operator=(s);
2909  m_apply_result = s.m_apply_result;
2910  return *this;
2911  }
2912  unsigned size() const { return Z3_apply_result_get_num_subgoals(ctx(), m_apply_result); }
2913  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); }
2914  friend std::ostream & operator<<(std::ostream & out, apply_result const & r);
2915  };
2916  inline std::ostream & operator<<(std::ostream & out, apply_result const & r) { out << Z3_apply_result_to_string(r.ctx(), r); return out; }
2917 
2918  class tactic : public object {
2919  Z3_tactic m_tactic;
2920  void init(Z3_tactic s) {
2921  m_tactic = s;
2922  Z3_tactic_inc_ref(ctx(), s);
2923  }
2924  public:
2925  tactic(context & c, char const * name):object(c) { Z3_tactic r = Z3_mk_tactic(c, name); check_error(); init(r); }
2926  tactic(context & c, Z3_tactic s):object(c) { init(s); }
2927  tactic(tactic const & s):object(s) { init(s.m_tactic); }
2928  ~tactic() { Z3_tactic_dec_ref(ctx(), m_tactic); }
2929  operator Z3_tactic() const { return m_tactic; }
2930  tactic & operator=(tactic const & s) {
2931  Z3_tactic_inc_ref(s.ctx(), s.m_tactic);
2932  Z3_tactic_dec_ref(ctx(), m_tactic);
2933  object::operator=(s);
2934  m_tactic = s.m_tactic;
2935  return *this;
2936  }
2937  solver mk_solver() const { Z3_solver r = Z3_mk_solver_from_tactic(ctx(), m_tactic); check_error(); return solver(ctx(), r); }
2938  apply_result apply(goal const & g) const {
2939  check_context(*this, g);
2940  Z3_apply_result r = Z3_tactic_apply(ctx(), m_tactic, g);
2941  check_error();
2942  return apply_result(ctx(), r);
2943  }
2944  apply_result operator()(goal const & g) const {
2945  return apply(g);
2946  }
2947  std::string help() const { char const * r = Z3_tactic_get_help(ctx(), m_tactic); check_error(); return r; }
2948  friend tactic operator&(tactic const & t1, tactic const & t2);
2949  friend tactic operator|(tactic const & t1, tactic const & t2);
2950  friend tactic repeat(tactic const & t, unsigned max);
2951  friend tactic with(tactic const & t, params const & p);
2952  friend tactic try_for(tactic const & t, unsigned ms);
2953  friend tactic par_or(unsigned n, tactic const* tactics);
2954  friend tactic par_and_then(tactic const& t1, tactic const& t2);
2956  };
2957 
2958  inline tactic operator&(tactic const & t1, tactic const & t2) {
2959  check_context(t1, t2);
2960  Z3_tactic r = Z3_tactic_and_then(t1.ctx(), t1, t2);
2961  t1.check_error();
2962  return tactic(t1.ctx(), r);
2963  }
2964 
2965  inline tactic operator|(tactic const & t1, tactic const & t2) {
2966  check_context(t1, t2);
2967  Z3_tactic r = Z3_tactic_or_else(t1.ctx(), t1, t2);
2968  t1.check_error();
2969  return tactic(t1.ctx(), r);
2970  }
2971 
2972  inline tactic repeat(tactic const & t, unsigned max=UINT_MAX) {
2973  Z3_tactic r = Z3_tactic_repeat(t.ctx(), t, max);
2974  t.check_error();
2975  return tactic(t.ctx(), r);
2976  }
2977 
2978  inline tactic with(tactic const & t, params const & p) {
2979  Z3_tactic r = Z3_tactic_using_params(t.ctx(), t, p);
2980  t.check_error();
2981  return tactic(t.ctx(), r);
2982  }
2983  inline tactic try_for(tactic const & t, unsigned ms) {
2984  Z3_tactic r = Z3_tactic_try_for(t.ctx(), t, ms);
2985  t.check_error();
2986  return tactic(t.ctx(), r);
2987  }
2988  inline tactic par_or(unsigned n, tactic const* tactics) {
2989  if (n == 0) {
2990  Z3_THROW(exception("a non-zero number of tactics need to be passed to par_or"));
2991  }
2992  array<Z3_tactic> buffer(n);
2993  for (unsigned i = 0; i < n; ++i) buffer[i] = tactics[i];
2994  return tactic(tactics[0].ctx(), Z3_tactic_par_or(tactics[0].ctx(), n, buffer.ptr()));
2995  }
2996 
2997  inline tactic par_and_then(tactic const & t1, tactic const & t2) {
2998  check_context(t1, t2);
2999  Z3_tactic r = Z3_tactic_par_and_then(t1.ctx(), t1, t2);
3000  t1.check_error();
3001  return tactic(t1.ctx(), r);
3002  }
3003 
3004  class probe : public object {
3005  Z3_probe m_probe;
3006  void init(Z3_probe s) {
3007  m_probe = s;
3008  Z3_probe_inc_ref(ctx(), s);
3009  }
3010  public:
3011  probe(context & c, char const * name):object(c) { Z3_probe r = Z3_mk_probe(c, name); check_error(); init(r); }
3012  probe(context & c, double val):object(c) { Z3_probe r = Z3_probe_const(c, val); check_error(); init(r); }
3013  probe(context & c, Z3_probe s):object(c) { init(s); }
3014  probe(probe const & s):object(s) { init(s.m_probe); }
3015  ~probe() { Z3_probe_dec_ref(ctx(), m_probe); }
3016  operator Z3_probe() const { return m_probe; }
3017  probe & operator=(probe const & s) {
3018  Z3_probe_inc_ref(s.ctx(), s.m_probe);
3019  Z3_probe_dec_ref(ctx(), m_probe);
3020  object::operator=(s);
3021  m_probe = s.m_probe;
3022  return *this;
3023  }
3024  double apply(goal const & g) const { double r = Z3_probe_apply(ctx(), m_probe, g); check_error(); return r; }
3025  double operator()(goal const & g) const { return apply(g); }
3026  friend probe operator<=(probe const & p1, probe const & p2);
3027  friend probe operator<=(probe const & p1, double p2);
3028  friend probe operator<=(double p1, probe const & p2);
3029  friend probe operator>=(probe const & p1, probe const & p2);
3030  friend probe operator>=(probe const & p1, double p2);
3031  friend probe operator>=(double p1, probe const & p2);
3032  friend probe operator<(probe const & p1, probe const & p2);
3033  friend probe operator<(probe const & p1, double p2);
3034  friend probe operator<(double p1, probe const & p2);
3035  friend probe operator>(probe const & p1, probe const & p2);
3036  friend probe operator>(probe const & p1, double p2);
3037  friend probe operator>(double p1, probe const & p2);
3038  friend probe operator==(probe const & p1, probe const & p2);
3039  friend probe operator==(probe const & p1, double p2);
3040  friend probe operator==(double p1, probe const & p2);
3041  friend probe operator&&(probe const & p1, probe const & p2);
3042  friend probe operator||(probe const & p1, probe const & p2);
3043  friend probe operator!(probe const & p);
3044  };
3045 
3046  inline probe operator<=(probe const & p1, probe const & p2) {
3047  check_context(p1, p2); Z3_probe r = Z3_probe_le(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3048  }
3049  inline probe operator<=(probe const & p1, double p2) { return p1 <= probe(p1.ctx(), p2); }
3050  inline probe operator<=(double p1, probe const & p2) { return probe(p2.ctx(), p1) <= p2; }
3051  inline probe operator>=(probe const & p1, probe const & p2) {
3052  check_context(p1, p2); Z3_probe r = Z3_probe_ge(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3053  }
3054  inline probe operator>=(probe const & p1, double p2) { return p1 >= probe(p1.ctx(), p2); }
3055  inline probe operator>=(double p1, probe const & p2) { return probe(p2.ctx(), p1) >= p2; }
3056  inline probe operator<(probe const & p1, probe const & p2) {
3057  check_context(p1, p2); Z3_probe r = Z3_probe_lt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3058  }
3059  inline probe operator<(probe const & p1, double p2) { return p1 < probe(p1.ctx(), p2); }
3060  inline probe operator<(double p1, probe const & p2) { return probe(p2.ctx(), p1) < p2; }
3061  inline probe operator>(probe const & p1, probe const & p2) {
3062  check_context(p1, p2); Z3_probe r = Z3_probe_gt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3063  }
3064  inline probe operator>(probe const & p1, double p2) { return p1 > probe(p1.ctx(), p2); }
3065  inline probe operator>(double p1, probe const & p2) { return probe(p2.ctx(), p1) > p2; }
3066  inline probe operator==(probe const & p1, probe const & p2) {
3067  check_context(p1, p2); Z3_probe r = Z3_probe_eq(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3068  }
3069  inline probe operator==(probe const & p1, double p2) { return p1 == probe(p1.ctx(), p2); }
3070  inline probe operator==(double p1, probe const & p2) { return probe(p2.ctx(), p1) == p2; }
3071  inline probe operator&&(probe const & p1, probe const & p2) {
3072  check_context(p1, p2); Z3_probe r = Z3_probe_and(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3073  }
3074  inline probe operator||(probe const & p1, probe const & p2) {
3075  check_context(p1, p2); Z3_probe r = Z3_probe_or(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
3076  }
3077  inline probe operator!(probe const & p) {
3078  Z3_probe r = Z3_probe_not(p.ctx(), p); p.check_error(); return probe(p.ctx(), r);
3079  }
3080 
3081  class optimize : public object {
3082  Z3_optimize m_opt;
3083 
3084  public:
3085  class handle final {
3086  unsigned m_h;
3087  public:
3088  handle(unsigned h): m_h(h) {}
3089  unsigned h() const { return m_h; }
3090  };
3091  optimize(context& c):object(c) { m_opt = Z3_mk_optimize(c); Z3_optimize_inc_ref(c, m_opt); }
3092  optimize(optimize const & o):object(o), m_opt(o.m_opt) {
3093  Z3_optimize_inc_ref(o.ctx(), o.m_opt);
3094  }
3096  m_opt = Z3_mk_optimize(c);
3097  Z3_optimize_inc_ref(c, m_opt);
3098  add(expr_vector(c, src.assertions()));
3099  expr_vector v(c, src.objectives());
3100  for (expr_vector::iterator it = v.begin(); it != v.end(); ++it) minimize(*it);
3101  }
3103  Z3_optimize_inc_ref(o.ctx(), o.m_opt);
3104  Z3_optimize_dec_ref(ctx(), m_opt);
3105  m_opt = o.m_opt;
3106  object::operator=(o);
3107  return *this;
3108  }
3110  operator Z3_optimize() const { return m_opt; }
3111  void add(expr const& e) {
3112  assert(e.is_bool());
3113  Z3_optimize_assert(ctx(), m_opt, e);
3114  }
3115  void add(expr_vector const& es) {
3116  for (expr_vector::iterator it = es.begin(); it != es.end(); ++it) add(*it);
3117  }
3118  void add(expr const& e, expr const& t) {
3119  assert(e.is_bool());
3120  Z3_optimize_assert_and_track(ctx(), m_opt, e, t);
3121  }
3122  void add(expr const& e, char const* p) {
3123  assert(e.is_bool());
3124  add(e, ctx().bool_const(p));
3125  }
3126  handle add_soft(expr const& e, unsigned weight) {
3127  assert(e.is_bool());
3128  auto str = std::to_string(weight);
3129  return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, str.c_str(), 0));
3130  }
3131  handle add_soft(expr const& e, char const* weight) {
3132  assert(e.is_bool());
3133  return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, weight, 0));
3134  }
3135  handle add(expr const& e, unsigned weight) {
3136  return add_soft(e, weight);
3137  }
3138  handle maximize(expr const& e) {
3139  return handle(Z3_optimize_maximize(ctx(), m_opt, e));
3140  }
3141  handle minimize(expr const& e) {
3142  return handle(Z3_optimize_minimize(ctx(), m_opt, e));
3143  }
3144  void push() {
3145  Z3_optimize_push(ctx(), m_opt);
3146  }
3147  void pop() {
3148  Z3_optimize_pop(ctx(), m_opt);
3149  }
3151  check_result check(expr_vector const& asms) {
3152  unsigned n = asms.size();
3153  array<Z3_ast> _asms(n);
3154  for (unsigned i = 0; i < n; i++) {
3155  check_context(*this, asms[i]);
3156  _asms[i] = asms[i];
3157  }
3158  Z3_lbool r = Z3_optimize_check(ctx(), m_opt, n, _asms.ptr());
3159  check_error();
3160  return to_check_result(r);
3161  }
3162  model get_model() const { Z3_model m = Z3_optimize_get_model(ctx(), m_opt); check_error(); return model(ctx(), m); }
3163  expr_vector unsat_core() const { Z3_ast_vector r = Z3_optimize_get_unsat_core(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3164  void set(params const & p) { Z3_optimize_set_params(ctx(), m_opt, p); check_error(); }
3165  expr lower(handle const& h) {
3166  Z3_ast r = Z3_optimize_get_lower(ctx(), m_opt, h.h());
3167  check_error();
3168  return expr(ctx(), r);
3169  }
3170  expr upper(handle const& h) {
3171  Z3_ast r = Z3_optimize_get_upper(ctx(), m_opt, h.h());
3172  check_error();
3173  return expr(ctx(), r);
3174  }
3175  expr_vector assertions() const { Z3_ast_vector r = Z3_optimize_get_assertions(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3176  expr_vector objectives() const { Z3_ast_vector r = Z3_optimize_get_objectives(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
3177  stats statistics() const { Z3_stats r = Z3_optimize_get_statistics(ctx(), m_opt); check_error(); return stats(ctx(), r); }
3178  friend std::ostream & operator<<(std::ostream & out, optimize const & s);
3179  void from_file(char const* filename) { Z3_optimize_from_file(ctx(), m_opt, filename); check_error(); }
3180  void from_string(char const* constraints) { Z3_optimize_from_string(ctx(), m_opt, constraints); check_error(); }
3181  std::string help() const { char const * r = Z3_optimize_get_help(ctx(), m_opt); check_error(); return r; }
3182  };
3183  inline std::ostream & operator<<(std::ostream & out, optimize const & s) { out << Z3_optimize_to_string(s.ctx(), s.m_opt); return out; }
3184 
3185  class fixedpoint : public object {
3186  Z3_fixedpoint m_fp;
3187  public:
3189  fixedpoint(fixedpoint const & o):object(o), m_fp(o.m_fp) { Z3_fixedpoint_inc_ref(ctx(), m_fp); }
3192  Z3_fixedpoint_inc_ref(o.ctx(), o.m_fp);
3193  Z3_fixedpoint_dec_ref(ctx(), m_fp);
3194  m_fp = o.m_fp;
3195  object::operator=(o);
3196  return *this;
3197  }
3198  operator Z3_fixedpoint() const { return m_fp; }
3199  expr_vector from_string(char const* s) {
3200  Z3_ast_vector r = Z3_fixedpoint_from_string(ctx(), m_fp, s);
3201  check_error();
3202  return expr_vector(ctx(), r);
3203  }
3204  expr_vector from_file(char const* s) {
3205  Z3_ast_vector r = Z3_fixedpoint_from_file(ctx(), m_fp, s);
3206  check_error();
3207  return expr_vector(ctx(), r);
3208  }
3209  void add_rule(expr& rule, symbol const& name) { Z3_fixedpoint_add_rule(ctx(), m_fp, rule, name); check_error(); }
3210  void add_fact(func_decl& f, unsigned * args) { Z3_fixedpoint_add_fact(ctx(), m_fp, f, f.arity(), args); check_error(); }
3212  check_result query(func_decl_vector& relations) {
3213  array<Z3_func_decl> rs(relations);
3214  Z3_lbool r = Z3_fixedpoint_query_relations(ctx(), m_fp, rs.size(), rs.ptr());
3215  check_error();
3216  return to_check_result(r);
3217  }
3218  expr get_answer() { Z3_ast r = Z3_fixedpoint_get_answer(ctx(), m_fp); check_error(); return expr(ctx(), r); }
3219  std::string reason_unknown() { return Z3_fixedpoint_get_reason_unknown(ctx(), m_fp); }
3220  void update_rule(expr& rule, symbol const& name) { Z3_fixedpoint_update_rule(ctx(), m_fp, rule, name); check_error(); }
3221  unsigned get_num_levels(func_decl& p) { unsigned r = Z3_fixedpoint_get_num_levels(ctx(), m_fp, p); check_error(); return r; }
3222  expr get_cover_delta(int level, func_decl& p) {
3223  Z3_ast r = Z3_fixedpoint_get_cover_delta(ctx(), m_fp, level, p);
3224  check_error();
3225  return expr(ctx(), r);
3226  }
3227  void add_cover(int level, func_decl& p, expr& property) { Z3_fixedpoint_add_cover(ctx(), m_fp, level, p, property); check_error(); }
3228  stats statistics() const { Z3_stats r = Z3_fixedpoint_get_statistics(ctx(), m_fp); check_error(); return stats(ctx(), r); }
3230  expr_vector assertions() const { Z3_ast_vector r = Z3_fixedpoint_get_assertions(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
3231  expr_vector rules() const { Z3_ast_vector r = Z3_fixedpoint_get_rules(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
3232  void set(params const & p) { Z3_fixedpoint_set_params(ctx(), m_fp, p); check_error(); }
3233  std::string help() const { return Z3_fixedpoint_get_help(ctx(), m_fp); }
3235  std::string to_string() { return Z3_fixedpoint_to_string(ctx(), m_fp, 0, 0); }
3236  std::string to_string(expr_vector const& queries) {
3237  array<Z3_ast> qs(queries);
3238  return Z3_fixedpoint_to_string(ctx(), m_fp, qs.size(), qs.ptr());
3239  }
3240  };
3241  inline std::ostream & operator<<(std::ostream & out, fixedpoint const & f) { return out << Z3_fixedpoint_to_string(f.ctx(), f, 0, 0); }
3242 
3243  inline tactic fail_if(probe const & p) {
3244  Z3_tactic r = Z3_tactic_fail_if(p.ctx(), p);
3245  p.check_error();
3246  return tactic(p.ctx(), r);
3247  }
3248  inline tactic when(probe const & p, tactic const & t) {
3249  check_context(p, t);
3250  Z3_tactic r = Z3_tactic_when(t.ctx(), p, t);
3251  t.check_error();
3252  return tactic(t.ctx(), r);
3253  }
3254  inline tactic cond(probe const & p, tactic const & t1, tactic const & t2) {
3255  check_context(p, t1); check_context(p, t2);
3256  Z3_tactic r = Z3_tactic_cond(t1.ctx(), p, t1, t2);
3257  t1.check_error();
3258  return tactic(t1.ctx(), r);
3259  }
3260 
3261  inline symbol context::str_symbol(char const * s) { Z3_symbol r = Z3_mk_string_symbol(m_ctx, s); check_error(); return symbol(*this, r); }
3262  inline symbol context::int_symbol(int n) { Z3_symbol r = Z3_mk_int_symbol(m_ctx, n); check_error(); return symbol(*this, r); }
3263 
3264  inline sort context::bool_sort() { Z3_sort s = Z3_mk_bool_sort(m_ctx); check_error(); return sort(*this, s); }
3265  inline sort context::int_sort() { Z3_sort s = Z3_mk_int_sort(m_ctx); check_error(); return sort(*this, s); }
3266  inline sort context::real_sort() { Z3_sort s = Z3_mk_real_sort(m_ctx); check_error(); return sort(*this, s); }
3267  inline sort context::bv_sort(unsigned sz) { Z3_sort s = Z3_mk_bv_sort(m_ctx, sz); check_error(); return sort(*this, s); }
3268  inline sort context::string_sort() { Z3_sort s = Z3_mk_string_sort(m_ctx); check_error(); return sort(*this, s); }
3269  inline sort context::char_sort() { Z3_sort s = Z3_mk_char_sort(m_ctx); check_error(); return sort(*this, s); }
3270  inline sort context::seq_sort(sort& s) { Z3_sort r = Z3_mk_seq_sort(m_ctx, s); check_error(); return sort(*this, r); }
3271  inline sort context::re_sort(sort& s) { Z3_sort r = Z3_mk_re_sort(m_ctx, s); check_error(); return sort(*this, r); }
3272  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); }
3273 
3274  template<>
3275  inline sort context::fpa_sort<16>() { return fpa_sort(5, 11); }
3276 
3277  template<>
3278  inline sort context::fpa_sort<32>() { return fpa_sort(8, 24); }
3279 
3280  template<>
3281  inline sort context::fpa_sort<64>() { return fpa_sort(11, 53); }
3282 
3283  template<>
3284  inline sort context::fpa_sort<128>() { return fpa_sort(15, 113); }
3285 
3286  inline sort context::fpa_rounding_mode_sort() { Z3_sort r = Z3_mk_fpa_rounding_mode_sort(m_ctx); check_error(); return sort(*this, r); }
3287 
3288  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); }
3289  inline sort context::array_sort(sort_vector const& d, sort r) {
3290  array<Z3_sort> dom(d);
3291  Z3_sort s = Z3_mk_array_sort_n(m_ctx, dom.size(), dom.ptr(), r); check_error(); return sort(*this, s);
3292  }
3293  inline sort context::enumeration_sort(char const * name, unsigned n, char const * const * enum_names, func_decl_vector & cs, func_decl_vector & ts) {
3294  array<Z3_symbol> _enum_names(n);
3295  for (unsigned i = 0; i < n; i++) { _enum_names[i] = Z3_mk_string_symbol(*this, enum_names[i]); }
3296  array<Z3_func_decl> _cs(n);
3297  array<Z3_func_decl> _ts(n);
3298  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3299  sort s = to_sort(*this, Z3_mk_enumeration_sort(*this, _name, n, _enum_names.ptr(), _cs.ptr(), _ts.ptr()));
3300  check_error();
3301  for (unsigned i = 0; i < n; i++) { cs.push_back(func_decl(*this, _cs[i])); ts.push_back(func_decl(*this, _ts[i])); }
3302  return s;
3303  }
3304  inline func_decl context::tuple_sort(char const * name, unsigned n, char const * const * names, sort const* sorts, func_decl_vector & projs) {
3305  array<Z3_symbol> _names(n);
3306  array<Z3_sort> _sorts(n);
3307  for (unsigned i = 0; i < n; i++) { _names[i] = Z3_mk_string_symbol(*this, names[i]); _sorts[i] = sorts[i]; }
3308  array<Z3_func_decl> _projs(n);
3309  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3310  Z3_func_decl tuple;
3311  sort _ignore_s = to_sort(*this, Z3_mk_tuple_sort(*this, _name, n, _names.ptr(), _sorts.ptr(), &tuple, _projs.ptr()));
3312  check_error();
3313  for (unsigned i = 0; i < n; i++) { projs.push_back(func_decl(*this, _projs[i])); }
3314  return func_decl(*this, tuple);
3315  }
3316 
3317  inline sort context::uninterpreted_sort(char const* name) {
3318  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3319  return to_sort(*this, Z3_mk_uninterpreted_sort(*this, _name));
3320  }
3322  return to_sort(*this, Z3_mk_uninterpreted_sort(*this, name));
3323  }
3324 
3325  inline func_decl context::function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3326  array<Z3_sort> args(arity);
3327  for (unsigned i = 0; i < arity; i++) {
3328  check_context(domain[i], range);
3329  args[i] = domain[i];
3330  }
3331  Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, arity, args.ptr(), range);
3332  check_error();
3333  return func_decl(*this, f);
3334  }
3335 
3336  inline func_decl context::function(char const * name, unsigned arity, sort const * domain, sort const & range) {
3337  return function(range.ctx().str_symbol(name), arity, domain, range);
3338  }
3339 
3340  inline func_decl context::function(symbol const& name, sort_vector const& domain, sort const& range) {
3341  array<Z3_sort> args(domain.size());
3342  for (unsigned i = 0; i < domain.size(); i++) {
3343  check_context(domain[i], range);
3344  args[i] = domain[i];
3345  }
3346  Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, domain.size(), args.ptr(), range);
3347  check_error();
3348  return func_decl(*this, f);
3349  }
3350 
3351  inline func_decl context::function(char const * name, sort_vector const& domain, sort const& range) {
3352  return function(range.ctx().str_symbol(name), domain, range);
3353  }
3354 
3355 
3356  inline func_decl context::function(char const * name, sort const & domain, sort const & range) {
3357  check_context(domain, range);
3358  Z3_sort args[1] = { domain };
3359  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 1, args, range);
3360  check_error();
3361  return func_decl(*this, f);
3362  }
3363 
3364  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & range) {
3365  check_context(d1, range); check_context(d2, range);
3366  Z3_sort args[2] = { d1, d2 };
3367  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 2, args, range);
3368  check_error();
3369  return func_decl(*this, f);
3370  }
3371 
3372  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
3373  check_context(d1, range); check_context(d2, range); check_context(d3, range);
3374  Z3_sort args[3] = { d1, d2, d3 };
3375  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 3, args, range);
3376  check_error();
3377  return func_decl(*this, f);
3378  }
3379 
3380  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
3381  check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range);
3382  Z3_sort args[4] = { d1, d2, d3, d4 };
3383  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 4, args, range);
3384  check_error();
3385  return func_decl(*this, f);
3386  }
3387 
3388  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) {
3389  check_context(d1, range); check_context(d2, range); check_context(d3, range); check_context(d4, range); check_context(d5, range);
3390  Z3_sort args[5] = { d1, d2, d3, d4, d5 };
3391  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 5, args, range);
3392  check_error();
3393  return func_decl(*this, f);
3394  }
3395 
3396  inline func_decl context::recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3397  array<Z3_sort> args(arity);
3398  for (unsigned i = 0; i < arity; i++) {
3399  check_context(domain[i], range);
3400  args[i] = domain[i];
3401  }
3402  Z3_func_decl f = Z3_mk_rec_func_decl(m_ctx, name, arity, args.ptr(), range);
3403  check_error();
3404  return func_decl(*this, f);
3405 
3406  }
3407 
3408  inline func_decl context::recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
3409  return recfun(str_symbol(name), arity, domain, range);
3410  }
3411 
3412  inline func_decl context::recfun(char const * name, sort const& d1, sort const & range) {
3413  return recfun(str_symbol(name), 1, &d1, range);
3414  }
3415 
3416  inline func_decl context::recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
3417  sort dom[2] = { d1, d2 };
3418  return recfun(str_symbol(name), 2, dom, range);
3419  }
3420 
3421  inline void context::recdef(func_decl f, expr_vector const& args, expr const& body) {
3422  check_context(f, args); check_context(f, body);
3423  array<Z3_ast> vars(args);
3424  Z3_add_rec_def(f.ctx(), f, vars.size(), vars.ptr(), body);
3425  }
3426 
3427  inline expr context::constant(symbol const & name, sort const & s) {
3428  Z3_ast r = Z3_mk_const(m_ctx, name, s);
3429  check_error();
3430  return expr(*this, r);
3431  }
3432  inline expr context::constant(char const * name, sort const & s) { return constant(str_symbol(name), s); }
3433  inline expr context::bool_const(char const * name) { return constant(name, bool_sort()); }
3434  inline expr context::int_const(char const * name) { return constant(name, int_sort()); }
3435  inline expr context::real_const(char const * name) { return constant(name, real_sort()); }
3436  inline expr context::string_const(char const * name) { return constant(name, string_sort()); }
3437  inline expr context::bv_const(char const * name, unsigned sz) { return constant(name, bv_sort(sz)); }
3438  inline expr context::fpa_const(char const * name, unsigned ebits, unsigned sbits) { return constant(name, fpa_sort(ebits, sbits)); }
3439 
3440  template<size_t precision>
3441  inline expr context::fpa_const(char const * name) { return constant(name, fpa_sort<precision>()); }
3442 
3443  inline void context::set_rounding_mode(rounding_mode rm) { m_rounding_mode = rm; }
3444 
3446  switch (m_rounding_mode) {
3447  case RNA: return expr(*this, Z3_mk_fpa_rna(m_ctx));
3448  case RNE: return expr(*this, Z3_mk_fpa_rne(m_ctx));
3449  case RTP: return expr(*this, Z3_mk_fpa_rtp(m_ctx));
3450  case RTN: return expr(*this, Z3_mk_fpa_rtn(m_ctx));
3451  case RTZ: return expr(*this, Z3_mk_fpa_rtz(m_ctx));
3452  default: return expr(*this);
3453  }
3454  }
3455 
3456  inline expr context::bool_val(bool b) { return b ? expr(*this, Z3_mk_true(m_ctx)) : expr(*this, Z3_mk_false(m_ctx)); }
3457 
3458  inline expr context::int_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, int_sort()); check_error(); return expr(*this, r); }
3459  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); }
3460  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); }
3461  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); }
3462  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); }
3463 
3464  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); }
3465  inline expr context::real_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, real_sort()); check_error(); return expr(*this, r); }
3466  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); }
3467  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); }
3468  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); }
3469  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); }
3470 
3471  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); }
3472  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); }
3473  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); }
3474  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); }
3475  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); }
3476  inline expr context::bv_val(unsigned n, bool const* bits) {
3477  array<bool> _bits(n);
3478  for (unsigned i = 0; i < n; ++i) _bits[i] = bits[i] ? 1 : 0;
3479  Z3_ast r = Z3_mk_bv_numeral(m_ctx, n, _bits.ptr()); check_error(); return expr(*this, r);
3480  }
3481 
3482  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); }
3483  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); }
3484  inline expr context::fpa_nan(sort const & s) { Z3_ast r = Z3_mk_fpa_nan(m_ctx, s); check_error(); return expr(*this, r); }
3485  inline expr context::fpa_inf(sort const & s, bool sgn) { Z3_ast r = Z3_mk_fpa_inf(m_ctx, s, sgn); check_error(); return expr(*this, r); }
3486 
3487  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); }
3488  inline expr context::string_val(char const* s) { Z3_ast r = Z3_mk_string(m_ctx, s); check_error(); return expr(*this, r); }
3489  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); }
3490  inline expr context::string_val(std::u32string const& s) { Z3_ast r = Z3_mk_u32string(m_ctx, (unsigned)s.size(), (unsigned const*)s.c_str()); check_error(); return expr(*this, r); }
3491 
3492  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); }
3493 
3494  inline expr func_decl::operator()(unsigned n, expr const * args) const {
3495  array<Z3_ast> _args(n);
3496  for (unsigned i = 0; i < n; i++) {
3497  check_context(*this, args[i]);
3498  _args[i] = args[i];
3499  }
3500  Z3_ast r = Z3_mk_app(ctx(), *this, n, _args.ptr());
3501  check_error();
3502  return expr(ctx(), r);
3503 
3504  }
3505  inline expr func_decl::operator()(expr_vector const& args) const {
3506  array<Z3_ast> _args(args.size());
3507  for (unsigned i = 0; i < args.size(); i++) {
3508  check_context(*this, args[i]);
3509  _args[i] = args[i];
3510  }
3511  Z3_ast r = Z3_mk_app(ctx(), *this, args.size(), _args.ptr());
3512  check_error();
3513  return expr(ctx(), r);
3514  }
3515  inline expr func_decl::operator()() const {
3516  Z3_ast r = Z3_mk_app(ctx(), *this, 0, 0);
3517  ctx().check_error();
3518  return expr(ctx(), r);
3519  }
3520  inline expr func_decl::operator()(expr const & a) const {
3521  check_context(*this, a);
3522  Z3_ast args[1] = { a };
3523  Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
3524  ctx().check_error();
3525  return expr(ctx(), r);
3526  }
3527  inline expr func_decl::operator()(int a) const {
3528  Z3_ast args[1] = { ctx().num_val(a, domain(0)) };
3529  Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
3530  ctx().check_error();
3531  return expr(ctx(), r);
3532  }
3533  inline expr func_decl::operator()(expr const & a1, expr const & a2) const {
3534  check_context(*this, a1); check_context(*this, a2);
3535  Z3_ast args[2] = { a1, a2 };
3536  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
3537  ctx().check_error();
3538  return expr(ctx(), r);
3539  }
3540  inline expr func_decl::operator()(expr const & a1, int a2) const {
3541  check_context(*this, a1);
3542  Z3_ast args[2] = { a1, ctx().num_val(a2, domain(1)) };
3543  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
3544  ctx().check_error();
3545  return expr(ctx(), r);
3546  }
3547  inline expr func_decl::operator()(int a1, expr const & a2) const {
3548  check_context(*this, a2);
3549  Z3_ast args[2] = { ctx().num_val(a1, domain(0)), a2 };
3550  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
3551  ctx().check_error();
3552  return expr(ctx(), r);
3553  }
3554  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3) const {
3555  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3);
3556  Z3_ast args[3] = { a1, a2, a3 };
3557  Z3_ast r = Z3_mk_app(ctx(), *this, 3, args);
3558  ctx().check_error();
3559  return expr(ctx(), r);
3560  }
3561  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const {
3562  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4);
3563  Z3_ast args[4] = { a1, a2, a3, a4 };
3564  Z3_ast r = Z3_mk_app(ctx(), *this, 4, args);
3565  ctx().check_error();
3566  return expr(ctx(), r);
3567  }
3568  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const {
3569  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4); check_context(*this, a5);
3570  Z3_ast args[5] = { a1, a2, a3, a4, a5 };
3571  Z3_ast r = Z3_mk_app(ctx(), *this, 5, args);
3572  ctx().check_error();
3573  return expr(ctx(), r);
3574  }
3575 
3576  inline expr to_real(expr const & a) { Z3_ast r = Z3_mk_int2real(a.ctx(), a); a.check_error(); return expr(a.ctx(), r); }
3577 
3578  inline func_decl function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3579  return range.ctx().function(name, arity, domain, range);
3580  }
3581  inline func_decl function(char const * name, unsigned arity, sort const * domain, sort const & range) {
3582  return range.ctx().function(name, arity, domain, range);
3583  }
3584  inline func_decl function(char const * name, sort const & domain, sort const & range) {
3585  return range.ctx().function(name, domain, range);
3586  }
3587  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & range) {
3588  return range.ctx().function(name, d1, d2, range);
3589  }
3590  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
3591  return range.ctx().function(name, d1, d2, d3, range);
3592  }
3593  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
3594  return range.ctx().function(name, d1, d2, d3, d4, range);
3595  }
3596  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) {
3597  return range.ctx().function(name, d1, d2, d3, d4, d5, range);
3598  }
3599  inline func_decl function(char const* name, sort_vector const& domain, sort const& range) {
3600  return range.ctx().function(name, domain, range);
3601  }
3602  inline func_decl function(std::string const& name, sort_vector const& domain, sort const& range) {
3603  return range.ctx().function(name.c_str(), domain, range);
3604  }
3605 
3606  inline func_decl recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3607  return range.ctx().recfun(name, arity, domain, range);
3608  }
3609  inline func_decl recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
3610  return range.ctx().recfun(name, arity, domain, range);
3611  }
3612  inline func_decl recfun(char const * name, sort const& d1, sort const & range) {
3613  return range.ctx().recfun(name, d1, range);
3614  }
3615  inline func_decl recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
3616  return range.ctx().recfun(name, d1, d2, range);
3617  }
3618 
3619  inline expr select(expr const & a, expr const & i) {
3620  check_context(a, i);
3621  Z3_ast r = Z3_mk_select(a.ctx(), a, i);
3622  a.check_error();
3623  return expr(a.ctx(), r);
3624  }
3625  inline expr select(expr const & a, int i) {
3626  return select(a, a.ctx().num_val(i, a.get_sort().array_domain()));
3627  }
3628  inline expr select(expr const & a, expr_vector const & i) {
3629  check_context(a, i);
3630  array<Z3_ast> idxs(i);
3631  Z3_ast r = Z3_mk_select_n(a.ctx(), a, idxs.size(), idxs.ptr());
3632  a.check_error();
3633  return expr(a.ctx(), r);
3634  }
3635 
3636  inline expr store(expr const & a, expr const & i, expr const & v) {
3637  check_context(a, i); check_context(a, v);
3638  Z3_ast r = Z3_mk_store(a.ctx(), a, i, v);
3639  a.check_error();
3640  return expr(a.ctx(), r);
3641  }
3642 
3643  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); }
3644  inline expr store(expr const & a, expr i, int v) { return store(a, i, a.ctx().num_val(v, a.get_sort().array_range())); }
3645  inline expr store(expr const & a, int i, int v) {
3646  return store(a, a.ctx().num_val(i, a.get_sort().array_domain()), a.ctx().num_val(v, a.get_sort().array_range()));
3647  }
3648  inline expr store(expr const & a, expr_vector const & i, expr const & v) {
3649  check_context(a, i); check_context(a, v);
3650  array<Z3_ast> idxs(i);
3651  Z3_ast r = Z3_mk_store_n(a.ctx(), a, idxs.size(), idxs.ptr(), v);
3652  a.check_error();
3653  return expr(a.ctx(), r);
3654  }
3655 
3656  inline expr as_array(func_decl & f) {
3657  Z3_ast r = Z3_mk_as_array(f.ctx(), f);
3658  f.check_error();
3659  return expr(f.ctx(), r);
3660  }
3661 
3662 #define MK_EXPR1(_fn, _arg) \
3663  Z3_ast r = _fn(_arg.ctx(), _arg); \
3664  _arg.check_error(); \
3665  return expr(_arg.ctx(), r);
3666 
3667 #define MK_EXPR2(_fn, _arg1, _arg2) \
3668  check_context(_arg1, _arg2); \
3669  Z3_ast r = _fn(_arg1.ctx(), _arg1, _arg2); \
3670  _arg1.check_error(); \
3671  return expr(_arg1.ctx(), r);
3672 
3673  inline expr const_array(sort const & d, expr const & v) {
3674  MK_EXPR2(Z3_mk_const_array, d, v);
3675  }
3676 
3677  inline expr empty_set(sort const& s) {
3679  }
3680 
3681  inline expr full_set(sort const& s) {
3683  }
3684 
3685  inline expr set_add(expr const& s, expr const& e) {
3686  MK_EXPR2(Z3_mk_set_add, s, e);
3687  }
3688 
3689  inline expr set_del(expr const& s, expr const& e) {
3690  MK_EXPR2(Z3_mk_set_del, s, e);
3691  }
3692 
3693  inline expr set_union(expr const& a, expr const& b) {
3694  check_context(a, b);
3695  Z3_ast es[2] = { a, b };
3696  Z3_ast r = Z3_mk_set_union(a.ctx(), 2, es);
3697  a.check_error();
3698  return expr(a.ctx(), r);
3699  }
3700 
3701  inline expr set_intersect(expr const& a, expr const& b) {
3702  check_context(a, b);
3703  Z3_ast es[2] = { a, b };
3704  Z3_ast r = Z3_mk_set_intersect(a.ctx(), 2, es);
3705  a.check_error();
3706  return expr(a.ctx(), r);
3707  }
3708 
3709  inline expr set_difference(expr const& a, expr const& b) {
3711  }
3712 
3713  inline expr set_complement(expr const& a) {
3715  }
3716 
3717  inline expr set_member(expr const& s, expr const& e) {
3718  MK_EXPR2(Z3_mk_set_member, s, e);
3719  }
3720 
3721  inline expr set_subset(expr const& a, expr const& b) {
3722  MK_EXPR2(Z3_mk_set_subset, a, b);
3723  }
3724 
3725  // sequence and regular expression operations.
3726  // union is +
3727  // concat is overloaded to handle sequences and regular expressions
3728 
3729  inline expr empty(sort const& s) {
3730  Z3_ast r = Z3_mk_seq_empty(s.ctx(), s);
3731  s.check_error();
3732  return expr(s.ctx(), r);
3733  }
3734  inline expr suffixof(expr const& a, expr const& b) {
3735  check_context(a, b);
3736  Z3_ast r = Z3_mk_seq_suffix(a.ctx(), a, b);
3737  a.check_error();
3738  return expr(a.ctx(), r);
3739  }
3740  inline expr prefixof(expr const& a, expr const& b) {
3741  check_context(a, b);
3742  Z3_ast r = Z3_mk_seq_prefix(a.ctx(), a, b);
3743  a.check_error();
3744  return expr(a.ctx(), r);
3745  }
3746  inline expr indexof(expr const& s, expr const& substr, expr const& offset) {
3747  check_context(s, substr); check_context(s, offset);
3748  Z3_ast r = Z3_mk_seq_index(s.ctx(), s, substr, offset);
3749  s.check_error();
3750  return expr(s.ctx(), r);
3751  }
3752  inline expr last_indexof(expr const& s, expr const& substr) {
3753  check_context(s, substr);
3754  Z3_ast r = Z3_mk_seq_last_index(s.ctx(), s, substr);
3755  s.check_error();
3756  return expr(s.ctx(), r);
3757  }
3758  inline expr to_re(expr const& s) {
3760  }
3761  inline expr in_re(expr const& s, expr const& re) {
3762  MK_EXPR2(Z3_mk_seq_in_re, s, re);
3763  }
3764  inline expr plus(expr const& re) {
3765  MK_EXPR1(Z3_mk_re_plus, re);
3766  }
3767  inline expr option(expr const& re) {
3769  }
3770  inline expr star(expr const& re) {
3771  MK_EXPR1(Z3_mk_re_star, re);
3772  }
3773  inline expr re_empty(sort const& s) {
3774  Z3_ast r = Z3_mk_re_empty(s.ctx(), s);
3775  s.check_error();
3776  return expr(s.ctx(), r);
3777  }
3778  inline expr re_full(sort const& s) {
3779  Z3_ast r = Z3_mk_re_full(s.ctx(), s);
3780  s.check_error();
3781  return expr(s.ctx(), r);
3782  }
3783  inline expr re_intersect(expr_vector const& args) {
3784  assert(args.size() > 0);
3785  context& ctx = args[0].ctx();
3786  array<Z3_ast> _args(args);
3787  Z3_ast r = Z3_mk_re_intersect(ctx, _args.size(), _args.ptr());
3788  ctx.check_error();
3789  return expr(ctx, r);
3790  }
3791  inline expr re_complement(expr const& a) {
3793  }
3794  inline expr range(expr const& lo, expr const& hi) {
3795  check_context(lo, hi);
3796  Z3_ast r = Z3_mk_re_range(lo.ctx(), lo, hi);
3797  lo.check_error();
3798  return expr(lo.ctx(), r);
3799  }
3800 
3801 
3802 
3803 
3804 
3805  inline expr_vector context::parse_string(char const* s) {
3806  Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, 0, 0, 0, 0, 0, 0);
3807  check_error();
3808  return expr_vector(*this, r);
3809 
3810  }
3811  inline expr_vector context::parse_file(char const* s) {
3812  Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, 0, 0, 0, 0, 0, 0);
3813  check_error();
3814  return expr_vector(*this, r);
3815  }
3816 
3817  inline expr_vector context::parse_string(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
3818  array<Z3_symbol> sort_names(sorts.size());
3819  array<Z3_symbol> decl_names(decls.size());
3820  array<Z3_sort> sorts1(sorts);
3821  array<Z3_func_decl> decls1(decls);
3822  for (unsigned i = 0; i < sorts.size(); ++i) {
3823  sort_names[i] = sorts[i].name();
3824  }
3825  for (unsigned i = 0; i < decls.size(); ++i) {
3826  decl_names[i] = decls[i].name();
3827  }
3828 
3829  Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
3830  check_error();
3831  return expr_vector(*this, r);
3832  }
3833 
3834  inline expr_vector context::parse_file(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
3835  array<Z3_symbol> sort_names(sorts.size());
3836  array<Z3_symbol> decl_names(decls.size());
3837  array<Z3_sort> sorts1(sorts);
3838  array<Z3_func_decl> decls1(decls);
3839  for (unsigned i = 0; i < sorts.size(); ++i) {
3840  sort_names[i] = sorts[i].name();
3841  }
3842  for (unsigned i = 0; i < decls.size(); ++i) {
3843  decl_names[i] = decls[i].name();
3844  }
3845  Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
3846  check_error();
3847  return expr_vector(*this, r);
3848  }
3849 
3850 
3851  inline expr expr::substitute(expr_vector const& src, expr_vector const& dst) {
3852  assert(src.size() == dst.size());
3853  array<Z3_ast> _src(src.size());
3854  array<Z3_ast> _dst(dst.size());
3855  for (unsigned i = 0; i < src.size(); ++i) {
3856  _src[i] = src[i];
3857  _dst[i] = dst[i];
3858  }
3859  Z3_ast r = Z3_substitute(ctx(), m_ast, src.size(), _src.ptr(), _dst.ptr());
3860  check_error();
3861  return expr(ctx(), r);
3862  }
3863 
3864  inline expr expr::substitute(expr_vector const& dst) {
3865  array<Z3_ast> _dst(dst.size());
3866  for (unsigned i = 0; i < dst.size(); ++i) {
3867  _dst[i] = dst[i];
3868  }
3869  Z3_ast r = Z3_substitute_vars(ctx(), m_ast, dst.size(), _dst.ptr());
3870  check_error();
3871  return expr(ctx(), r);
3872  }
3873 
3874 
3876 
3877  typedef std::function<void(unsigned, expr const&)> fixed_eh_t;
3878  typedef std::function<void(void)> final_eh_t;
3879  typedef std::function<void(unsigned, unsigned)> eq_eh_t;
3880 
3881  final_eh_t m_final_eh;
3882  eq_eh_t m_eq_eh;
3883  fixed_eh_t m_fixed_eh;
3884  solver* s;
3885  Z3_context c;
3886  Z3_solver_callback cb { nullptr };
3887 
3888  Z3_context ctx() {
3889  return c ? c : (Z3_context)s->ctx();
3890  }
3891 
3892  struct scoped_cb {
3894  scoped_cb(void* _p, Z3_solver_callback cb):p(*static_cast<user_propagator_base*>(_p)) {
3895  p.cb = cb;
3896  }
3897  ~scoped_cb() {
3898  p.cb = nullptr;
3899  }
3900  };
3901 
3902  static void push_eh(void* p) {
3903  static_cast<user_propagator_base*>(p)->push();
3904  }
3905 
3906  static void pop_eh(void* p, unsigned num_scopes) {
3907  static_cast<user_propagator_base*>(p)->pop(num_scopes);
3908  }
3909 
3910  static void* fresh_eh(void* p, Z3_context ctx) {
3911  return static_cast<user_propagator_base*>(p)->fresh(ctx);
3912  }
3913 
3914  static void fixed_eh(void* _p, Z3_solver_callback cb, unsigned id, Z3_ast _value) {
3915  user_propagator_base* p = static_cast<user_propagator_base*>(_p);
3916  scoped_cb _cb(p, cb);
3917  scoped_context ctx(p->ctx());
3918  expr value(ctx(), _value);
3919  static_cast<user_propagator_base*>(p)->m_fixed_eh(id, value);
3920  }
3921 
3922  static void eq_eh(void* p, Z3_solver_callback cb, unsigned x, unsigned y) {
3923  scoped_cb _cb(p, cb);
3924  static_cast<user_propagator_base*>(p)->m_eq_eh(x, y);
3925  }
3926 
3927  static void final_eh(void* p, Z3_solver_callback cb) {
3928  scoped_cb _cb(p, cb);
3929  static_cast<user_propagator_base*>(p)->m_final_eh();
3930  }
3931 
3932 
3933  public:
3934  user_propagator_base(Z3_context c) : s(nullptr), c(c) {}
3935 
3936  user_propagator_base(solver* s): s(s), c(nullptr) {
3937  Z3_solver_propagate_init(ctx(), *s, this, push_eh, pop_eh, fresh_eh);
3938  }
3939 
3940  virtual void push() = 0;
3941  virtual void pop(unsigned num_scopes) = 0;
3942 
3943  virtual ~user_propagator_base() = default;
3944 
3953  virtual user_propagator_base* fresh(Z3_context ctx) = 0;
3954 
3961  void register_fixed(fixed_eh_t& f) {
3962  assert(s);
3963  m_fixed_eh = f;
3964  Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
3965  }
3966 
3968  assert(s);
3969  m_fixed_eh = [this](unsigned id, expr const& e) {
3970  fixed(id, e);
3971  };
3972  Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
3973  }
3974 
3975  void register_eq(eq_eh_t& f) {
3976  assert(s);
3977  m_eq_eh = f;
3978  Z3_solver_propagate_eq(ctx(), *s, eq_eh);
3979  }
3980 
3981  void register_eq() {
3982  assert(s);
3983  m_eq_eh = [this](unsigned x, unsigned y) {
3984  eq(x, y);
3985  };
3986  Z3_solver_propagate_eq(ctx(), *s, eq_eh);
3987  }
3988 
3997  void register_final(final_eh_t& f) {
3998  assert(s);
3999  m_final_eh = f;
4000  Z3_solver_propagate_final(ctx(), *s, final_eh);
4001  }
4002 
4003  void register_final() {
4004  assert(s);
4005  m_final_eh = [this]() {
4006  final();
4007  };
4008  Z3_solver_propagate_final(ctx(), *s, final_eh);
4009  }
4010 
4011 
4012  virtual void fixed(unsigned /*id*/, expr const& /*e*/) { }
4013 
4014  virtual void eq(unsigned /*x*/, unsigned /*y*/) { }
4015 
4016  virtual void final() { }
4017 
4032  unsigned add(expr const& e) {
4033  assert(s);
4034  return Z3_solver_propagate_register(ctx(), *s, e);
4035  }
4036 
4037  void conflict(unsigned num_fixed, unsigned const* fixed) {
4038  assert(cb);
4039  scoped_context _ctx(ctx());
4040  expr conseq = _ctx().bool_val(false);
4041  Z3_solver_propagate_consequence(ctx(), cb, num_fixed, fixed, 0, nullptr, nullptr, conseq);
4042  }
4043 
4044  void propagate(unsigned num_fixed, unsigned const* fixed, expr const& conseq) {
4045  assert(cb);
4046  assert(conseq.ctx() == ctx());
4047  Z3_solver_propagate_consequence(ctx(), cb, num_fixed, fixed, 0, nullptr, nullptr, conseq);
4048  }
4049 
4050  void propagate(unsigned num_fixed, unsigned const* fixed,
4051  unsigned num_eqs, unsigned const* lhs, unsigned const * rhs,
4052  expr const& conseq) {
4053  assert(cb);
4054  assert(conseq.ctx() == ctx());
4055  Z3_solver_propagate_consequence(ctx(), cb, num_fixed, fixed, num_eqs, lhs, rhs, conseq);
4056  }
4057  };
4058 
4059 
4060 
4061 
4062 }
4063 
4066 #undef Z3_THROW
4067 
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:2830
ast_vector_tpl(context &c)
Definition: z3++.h:544
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:2370
expr mod(expr const &a, expr const &b)
Definition: z3++.h:1566
friend expr mk_or(expr_vector const &args)
Definition: z3++.h:2423
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.
expr bvadd_no_overflow(expr const &a, expr const &b, bool is_signed)
bit-vector overflow/underflow checks
Definition: z3++.h:2162
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.
void Z3_API Z3_solver_propagate_fixed(Z3_context c, Z3_solver s, Z3_fixed_eh fixed_eh)
register a callback for when an expression is bound to a fixed value. The supported expression types ...
Z3_ast Z3_API Z3_mk_true(Z3_context c)
Create an AST node representing true.
Z3_ast Z3_API Z3_mk_distinct(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing distinct(args[0], ..., args[num_args-1]).
Z3_fixedpoint Z3_API Z3_mk_fixedpoint(Z3_context c)
Create a new fixedpoint context.
user_propagator_base(solver *s)
Definition: z3++.h:3936
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:149
bool is_numeral_u(unsigned &i) const
Definition: z3++.h:829
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:1869
Z3_ast Z3_API Z3_mk_bvnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nor.
void register_final(final_eh_t &f)
register a callback on final-check. During the final check stage, all propagations have been processe...
Definition: z3++.h:3997
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:2697
std::string help() const
Definition: z3++.h:2947
sort bool_sort()
Return the Boolean sort.
Definition: z3++.h:3264
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:2345
void check_parser_error() const
Definition: z3++.h:195
handle add_soft(expr const &e, char const *weight)
Definition: z3++.h:3131
friend expr operator+(expr const &a, expr const &b)
Definition: z3++.h:1654
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:2570
expr mk_and(expr_vector const &args)
Definition: z3++.h:2429
friend expr pw(expr const &a, expr const &b)
Definition: z3++.h:1562
double as_double() const
Definition: z3++.h:835
bool is_numeral_i64(int64_t &i) const
Definition: z3++.h:826
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: ...
unsigned Z3_API Z3_get_string_length(Z3_context c, Z3_ast s)
Retrieve the length of the unescaped string constant stored in s.
bool as_binary(std::string &s) const
Definition: z3++.h:833
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:2644
model(context &c)
Definition: z3++.h:2507
friend expr bv2int(expr const &a, bool is_signed)
bit-vector and integer conversions.
Definition: z3++.h:2156
bool is_int() const
Return true if this sort is the Integer sort.
Definition: z3++.h:637
Z3_ast Z3_API Z3_mk_false(Z3_context c)
Create an AST node representing false.
Z3_ast_vector Z3_API Z3_solver_get_assertions(Z3_context c, Z3_solver s)
Return the set of asserted formulas on the solver.
Z3_ast Z3_API Z3_mk_mod(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 mod arg2.
iterator & operator++()
Definition: z3++.h:1538
Z3_probe Z3_API Z3_probe_ge(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when the value returned by p1 is greater than or equal to the...
tactic & operator=(tactic const &s)
Definition: z3++.h:2930
expr operator[](expr const &index) const
Definition: z3++.h:1494
sort re_sort(sort &seq_sort)
Return a regular expression sort over sequences seq_sort.
Definition: z3++.h:3271
expr sle(expr const &a, expr const &b)
signed less than or equal to operator for bitvectors.
Definition: z3++.h:2052
expr bvredand(expr const &a)
Definition: z3++.h:1912
void add_fact(func_decl &f, unsigned *args)
Definition: z3++.h:3210
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:3013
void Z3_API Z3_goal_reset(Z3_context c, Z3_goal g)
Erase all formulas from the given goal.
Z3_ast Z3_API Z3_mk_fpa_fp(Z3_context c, Z3_ast sgn, Z3_ast exp, Z3_ast sig)
Create an expression of FloatingPoint sort from three bit-vector expressions.
expr pbeq(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2337
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:1875
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:3017
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:2533
void register_fixed(fixed_eh_t &f)
register callbacks. Callbacks can only be registered with user_propagators that were created using a ...
Definition: z3++.h:3961
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:3221
std::string documentation(symbol const &s)
Definition: z3++.h:472
Z3_ast Z3_API Z3_mk_fpa_to_ubv(Z3_context c, Z3_ast rm, Z3_ast t, unsigned sz)
Conversion of a floating-point term into an unsigned bit-vector.
Z3_ast Z3_API Z3_mk_mul(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] * ... * args[num_args-1].
Z3_ast Z3_API Z3_mk_seq_concat(Z3_context c, unsigned n, Z3_ast const args[])
Concatenate sequences.
Z3_func_decl Z3_API Z3_mk_transitive_closure(Z3_context c, Z3_func_decl f)
create transitive closure of binary relation.
void Z3_API Z3_tactic_inc_ref(Z3_context c, Z3_tactic t)
Increment the reference counter of the given tactic.
friend expr operator>=(expr const &a, expr const &b)
Definition: z3++.h:1708
#define Z3_THROW(x)
Definition: z3++.h:100
iterator & operator++() noexcept
Definition: z3++.h:589
bool is_array() const
Return true if this is a Array expression.
Definition: z3++.h:788
unsigned id() const
retrieve unique identifier for expression.
Definition: z3++.h:1001
void Z3_API Z3_solver_pop(Z3_context c, Z3_solver s, unsigned n)
Backtrack n backtracking points.
Z3_symbol Z3_API Z3_get_decl_name(Z3_context c, Z3_func_decl d)
Return the constant declaration name as a symbol.
Z3_string Z3_API Z3_param_descrs_get_documentation(Z3_context c, Z3_param_descrs p, Z3_symbol s)
Retrieve documentation string corresponding to parameter name s.
Z3_sort Z3_API Z3_mk_fpa_sort(Z3_context c, unsigned ebits, unsigned sbits)
Create a FloatingPoint sort.
symbol str_symbol(char const *s)
Create a Z3 symbol based on the given string.
Definition: z3++.h:3261
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:2151
uint64_t as_int64() const
Definition: z3++.h:837
Z3_ast Z3_API Z3_mk_full_set(Z3_context c, Z3_sort domain)
Create the full set.
Z3_ast Z3_API Z3_mk_char_is_digit(Z3_context c, Z3_ast ch)
Create a check if the character is a digit.
void set(char const *k, symbol const &s)
Definition: z3++.h:495
Z3_ast Z3_API Z3_mk_seq_at(Z3_context c, Z3_ast s, Z3_ast index)
Retrieve from s the unit sequence positioned at position index. The sequence is empty if the index is...
friend std::ostream & operator<<(std::ostream &out, sort const &s)
Definition: z3++.h:702
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:537
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:2199
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:2649
friend expr bvmul_no_overflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:2180
expr length() const
Definition: z3++.h:1430
expr bvsub_no_underflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:2171
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:2698
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:3254
Z3_ast Z3_API Z3_mk_fpa_to_sbv(Z3_context c, Z3_ast rm, Z3_ast t, unsigned sz)
Conversion of a floating-point term into a signed bit-vector.
Z3_ast Z3_API Z3_mk_unary_minus(Z3_context c, Z3_ast arg)
Create an AST node representing - arg.
friend expr bvadd_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:2165
solver(context &c, simple)
Definition: z3++.h:2629
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:757
friend expr fp_eq(expr const &a, expr const &b)
Definition: z3++.h:1945
char const * msg() const
Definition: z3++.h:90
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:3794
expr bv_val(int n, unsigned sz)
Definition: z3++.h:3471
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:1642
expr value() const
Definition: z3++.h:2463
Z3_ast Z3_API Z3_mk_bvlshr(Z3_context c, Z3_ast t1, Z3_ast t2)
Logical shift right.
Z3_func_decl Z3_API Z3_model_get_func_decl(Z3_context c, Z3_model m, unsigned i)
Return the declaration of the i-th function in the given model.
Z3_ast Z3_API Z3_mk_fpa_is_zero(Z3_context c, Z3_ast t)
Predicate indicating whether t is a floating-point number with zero value, i.e., +zero or -zero...
Z3_sort Z3_API Z3_mk_int_sort(Z3_context c)
Create the integer type.
friend expr bvsub_no_underflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:2171
Z3_ast Z3_API Z3_mk_fpa_round_to_integral(Z3_context c, Z3_ast rm, Z3_ast t)
Floating-point roundToIntegral. Rounds a floating-point number to the closest integer, again represented as a floating-point number.
Z3_ast_vector Z3_API Z3_fixedpoint_from_string(Z3_context c, Z3_fixedpoint f, Z3_string s)
Parse an SMT-LIB2 string with fixedpoint rules. Add the rules to the current fixedpoint context...
bool is_real() const
Return true if this is a real expression.
Definition: z3++.h:776
Definition: z3_api.h:1370
func_interp & operator=(func_interp const &s)
Definition: z3++.h:2479
friend expr operator!=(expr const &a, expr const &b)
Definition: z3++.h:1642
Z3_string Z3_API Z3_goal_to_dimacs_string(Z3_context c, Z3_goal g, bool include_names)
Convert a goal into a DIMACS formatted string. The goal must be in CNF. You can convert a goal to CNF...
friend expr bvredor(expr const &a)
Definition: z3++.h:1906
expr fpa_rounding_mode()
Definition: z3++.h:3445
Z3_ast Z3_API Z3_mk_bvashr(Z3_context c, Z3_ast t1, Z3_ast t2)
Arithmetic shift right.
Z3_ast Z3_API Z3_mk_xor(Z3_context c, Z3_ast t1, Z3_ast t2)
Create an AST node representing t1 xor t2.
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:3012
bool Z3_API Z3_is_algebraic_number(Z3_context c, Z3_ast a)
Return true if the given AST is a real algebraic number.
uint64_t as_uint64() const
Definition: z3++.h:836
expr itos() const
Definition: z3++.h:1440
Definition: z3++.h:133
std::string help() const
Definition: z3++.h:3181
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:2456
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:118
expr_vector units() const
Definition: z3++.h:2702
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:2648
expr is_digit() const
Definition: z3++.h:1470
Definition: z3++.h:140
expr fma(expr const &a, expr const &b, expr const &c, expr const &rm)
Definition: z3++.h:1954
tactic when(probe const &p, tactic const &t)
Definition: z3++.h:3248
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:2493
friend expr round_fpa_to_closest_integer(expr const &t)
Round a floating-point term into its closest integer.
Definition: z3++.h:2005
config()
Definition: z3++.h:112
friend std::ostream & operator<<(std::ostream &out, params const &p)
Definition: z3++.h:500
void set(char const *k, double n)
Definition: z3++.h:494
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:3165
cube_generator cubes()
Definition: z3++.h:2829
bool is_numeral_u64(uint64_t &i) const
Definition: z3++.h:827
friend expr operator/(expr const &a, expr const &b)
Definition: z3++.h:1728
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:213
array(unsigned sz)
Definition: z3++.h:412
handle add_soft(expr const &e, unsigned weight)
Definition: z3++.h:3126
expr mk_is_inf() const
Return Boolean expression to test for whether an FP expression is inf.
Definition: z3++.h:883
std::ostream & operator<<(std::ostream &out, exception const &e)
Definition: z3++.h:94
void Z3_API Z3_get_string_contents(Z3_context c, Z3_ast s, unsigned length, unsigned contents[])
Retrieve the unescaped string constant stored in s.
Z3_solver Z3_API Z3_mk_solver(Z3_context c)
Create a new solver. This solver is a "combined solver" (see combined_solver module) that internally ...
A Z3 sort (aka type). Every expression (i.e., formula or term) in Z3 has a sort.
Definition: z3++.h:610
optimize(context &c, optimize &src)
Definition: z3++.h:3095
~solver()
Definition: z3++.h:2634
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:1509
unsigned bv_size() const
Return the size of this Bit-vector sort.
Definition: z3++.h:684
bool is_bv() const
Return true if this sort is a Bit-vector sort.
Definition: z3++.h:649
Z3_ast Z3_API Z3_mk_bvuge(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than or equal to.
Z3_ast Z3_API Z3_mk_bvugt(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than.
virtual user_propagator_base * fresh(Z3_context ctx)=0
user_propagators created using fresh() are created during search and their lifetimes are restricted t...
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:711
int to_int() const
Definition: z3++.h:441
friend expr operator^(expr const &a, expr const &b)
Definition: z3++.h:1865
void pop_back()
Definition: z3++.h:556
expr full_set(sort const &s)
Definition: z3++.h:3681
model(model &src, context &dst, translate)
Definition: z3++.h:2510
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.
virtual void eq(unsigned, unsigned)
Definition: z3++.h:4014
friend expr fpa_to_ubv(expr const &t, unsigned sz)
Conversion of a floating-point term into an unsigned bit-vector.
Definition: z3++.h:1977
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:533
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:1225
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:3267
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:230
bool is_double(unsigned i) const
Definition: z3++.h:2603
expr lshr(expr const &a, expr const &b)
logic shift right operator for bitvectors
Definition: z3++.h:2137
expr udiv(expr const &a, expr const &b)
unsigned division operator for bitvectors.
Definition: z3++.h:2102
apply_result operator()(goal const &g) const
Definition: z3++.h:2944
Z3_ast Z3_API Z3_mk_le(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than or equal to.
bool empty() const
Definition: z3++.h:557
T back() const
Definition: z3++.h:555
solver mk_solver() const
Definition: z3++.h:2937
friend expr concat(expr const &a, expr const &b)
Definition: z3++.h:2379
friend expr mod(expr const &a, expr const &b)
Definition: z3++.h:1566
Z3_symbol Z3_API Z3_param_descrs_get_name(Z3_context c, Z3_param_descrs p, unsigned i)
Return the name of the parameter at given index i.
Z3_ast Z3_API Z3_mk_bvmul_no_underflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed multiplication of t1 and t2 does not underflo...
expr upper(handle const &h)
Definition: z3++.h:3170
Z3_goal_prec
A Goal is essentially a set of formulas. Z3 provide APIs for building strategies/tactics for solving ...
Definition: z3_api.h:1417
Z3_error_code
Z3 error codes (See Z3_get_error_code).
Definition: z3_api.h:1368
goal(context &c, Z3_goal s)
Definition: z3++.h:2843
optimize(optimize const &o)
Definition: z3++.h:3092
optimize & operator=(optimize const &o)
Definition: z3++.h:3102
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:473
expr eval(expr const &n, bool model_completion=false) const
Definition: z3++.h:2521
model(context &c, Z3_model m)
Definition: z3++.h:2508
Z3_ast_kind kind() const
Definition: z3++.h:522
sort array_sort(sort d, sort r)
Return an array sort for arrays from d to r.
Definition: z3++.h:3288
expr constant(symbol const &name, sort const &s)
Definition: z3++.h:3427
void pop()
Definition: z3++.h:3147
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.
void Z3_API Z3_solver_propagate_consequence(Z3_context c, Z3_solver_callback, unsigned num_fixed, unsigned const *fixed_ids, unsigned num_eqs, unsigned const *eq_lhs, unsigned const *eq_rhs, Z3_ast conseq)
propagate a consequence based on fixed values. This is a callback a client may invoke during the fixe...
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:2536
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:3211
bool is_ite() const
Definition: z3++.h:1233
unsigned fpa_sbits() const
Definition: z3++.h:688
fixedpoint(context &c)
Definition: z3++.h:3188
Z3_ast Z3_API Z3_mk_bvule(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned less than or equal to.
sort char_sort()
Return the sort for Unicode characters.
Definition: z3++.h:3269
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:2927
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:1618
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:206
~probe()
Definition: z3++.h:3015
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:792
void add(expr const &e, expr const &t)
Definition: z3++.h:3118
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:1337
~tactic()
Definition: z3++.h:2928
bool Z3_API Z3_is_quantifier_exists(Z3_context c, Z3_ast a)
Determine if ast is an existential quantifier.
virtual void fixed(unsigned, expr const &)
Definition: z3++.h:4012
sort operator()(context &c, Z3_ast a)
Definition: z3++.h:2224
check_result check()
Definition: z3++.h:3150
expr ubv_to_fpa(expr const &t, sort s)
Definition: z3++.h:1991
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:3074
expr is_int(expr const &e)
Definition: z3++.h:1602
void Z3_API Z3_optimize_inc_ref(Z3_context c, Z3_optimize d)
Increment the reference counter of the given optimize context.
expr fpa_to_fpa(expr const &t, sort s)
Definition: z3++.h:1998
expr contains(expr const &s) const
Definition: z3++.h:1412
friend expr bvadd_no_overflow(expr const &a, expr const &b, bool is_signed)
bit-vector overflow/underflow checks
Definition: z3++.h:2162
Z3_ast Z3_API Z3_solver_get_proof(Z3_context c, Z3_solver s)
Retrieve the proof for the last Z3_solver_check or Z3_solver_check_assumptions.
iterator operator++(int) noexcept
Definition: z3++.h:596
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:1865
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:3183
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:3180
void add(expr const &e, char const *p)
Definition: z3++.h:3122
unsigned lo() const
Definition: z3++.h:1349
Exception used to sign API usage errors.
Definition: z3++.h:85
expr operator*(expr const &a, expr const &b)
Definition: z3++.h:1684
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:2604
unsigned Z3_API Z3_get_sort_id(Z3_context c, Z3_sort s)
Return a unique identifier for s.
Z3_context Z3_API Z3_mk_context_rc(Z3_config c)
Create a context using the given configuration. This function is similar to Z3_mk_context. However, in the context returned by this function, the user is responsible for managing Z3_ast reference counters. Managing reference counters is a burden and error-prone, but allows the user to use the memory more efficiently. The user must invoke Z3_inc_ref for any Z3_ast returned by Z3, and Z3_dec_ref whenever the Z3_ast is not needed anymore. This idiom is similar to the one used in BDD (binary decision diagrams) packages such as CUDD.
Z3_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:1424
bool Z3_API Z3_get_numeral_uint64(Z3_context c, Z3_ast v, uint64_t *u)
Similar to Z3_get_numeral_string, but only succeeds if the value can fit in a machine uint64_t int...
ast_vector_tpl(context &c, Z3_ast_vector v)
Definition: z3++.h:545
A Z3 expression is used to represent formulas and terms. For Z3, a formula is any expression of sort ...
Definition: z3++.h:755
void reset_params()
Definition: z3++.h:80
void Z3_API Z3_update_param_value(Z3_context c, Z3_string param_id, Z3_string param_value)
Set a value of a context parameter.
Z3_string Z3_API Z3_sort_to_string(Z3_context c, Z3_sort s)
expr operator!(expr const &a)
Definition: z3++.h:1600
unsigned Z3_API Z3_solver_propagate_register(Z3_context c, Z3_solver s, Z3_ast e)
register an expression to propagate on with the solver. Only expressions of type Bool and type Bit-Ve...
ast_vector_tpl & set(unsigned idx, ast &a)
Definition: z3++.h:565
expr set_subset(expr const &a, expr const &b)
Definition: z3++.h:3721
Z3_ast Z3_API Z3_mk_empty_set(Z3_context c, Z3_sort domain)
Create the empty set.
void add(expr_vector const &es)
Definition: z3++.h:3115
unsigned Z3_API Z3_fpa_get_sbits(Z3_context c, Z3_sort s)
Retrieves the number of bits reserved for the significand in a FloatingPoint sort.
void Z3_API Z3_solver_reset(Z3_context c, Z3_solver s)
Remove all assertions from the solver.
unsigned num_exprs() const
Definition: z3++.h:2862
bool Z3_API Z3_goal_inconsistent(Z3_context c, Z3_goal g)
Return true if the given goal contains the formula false.
Z3_ast Z3_API Z3_mk_fpa_is_subnormal(Z3_context c, Z3_ast t)
Predicate indicating whether t is a subnormal floating-point number.
bool is_uint(unsigned i) const
Definition: z3++.h:2602
expr ule(expr const &a, expr const &b)
unsigned less than or equal to operator for bitvectors.
Definition: z3++.h:2078
expr in_re(expr const &s, expr const &re)
Definition: z3++.h:3761
symbol name(unsigned i)
Definition: z3++.h:470
void recdef(func_decl, expr_vector const &args, expr const &body)
Definition: z3++.h:3421
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:2699
bool is_lambda() const
Return true if this expression is a lambda expression.
Definition: z3++.h:864
iterator end() const
Definition: z3++.h:601
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:818
Z3_ast Z3_API Z3_mk_seq_prefix(Z3_context c, Z3_ast prefix, Z3_ast s)
Check if prefix is a prefix of s.
Z3_error_code check_error() const
Definition: z3++.h:429
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:221
static param_descrs simplify_param_descrs(context &c)
Definition: z3++.h:467
friend expr mk_and(expr_vector const &args)
Definition: z3++.h:2429
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:2487
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:2824
unsigned arity() const
Definition: z3++.h:720
iterator begin()
Definition: z3++.h:1542
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:3220
bool enable_exceptions() const
Definition: z3++.h:208
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:673
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:2232
std::string to_string(expr_vector const &queries)
Definition: z3++.h:3236
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:75
stats(context &c)
Definition: z3++.h:2588
expr algebraic_upper(unsigned precision) const
Definition: z3++.h:971
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:1708
std::string reason_unknown()
Definition: z3++.h:3219
#define MK_EXPR2(_fn, _arg1, _arg2)
Definition: z3++.h:3667
void Z3_API Z3_solver_propagate_final(Z3_context c, Z3_solver s, Z3_final_eh final_eh)
register a callback on final check. This provides freedom to the propagator to delay actions or imple...
expr replace(expr const &src, expr const &dst) const
Definition: z3++.h:1401
void add_entry(expr_vector const &args, expr &value)
Definition: z3++.h:2489
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:1562
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:2892
friend expr fpa_fp(expr const &sgn, expr const &exp, expr const &sig)
Create an expression of FloatingPoint sort from three bit-vector expressions.
Definition: z3++.h:1962
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:3051
expr(context &c, Z3_ast n)
Definition: z3++.h:758
~goal()
Definition: z3++.h:2845
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:3709
symbol name() const
Return name of sort.
Definition: z3++.h:629
T * operator->() const
Definition: z3++.h:597
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:1228
unsigned id() const
retrieve unique identifier for func_decl.
Definition: z3++.h:718
expr operator~(expr const &a)
Definition: z3++.h:1952
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:2857
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:3230
friend expr int2bv(unsigned n, expr const &a)
Definition: z3++.h:2157
expr_vector assertions() const
Definition: z3++.h:3175
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:3163
friend expr operator-(expr const &a)
Definition: z3++.h:1750
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:2370
check_result check(unsigned n, expr *const assumptions)
Definition: z3++.h:2670
Z3_ast Z3_API Z3_mk_bvnand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nand.
expr bvredor(expr const &a)
Definition: z3++.h:1906
expr rem(expr const &a, expr const &b)
Definition: z3++.h:1582
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:1684
probe(context &c, char const *name)
Definition: z3++.h:3011
friend std::ostream & operator<<(std::ostream &out, solver const &s)
Definition: z3++.h:2833
iterator operator++(int)
Definition: z3++.h:1539
Z3_ast Z3_API Z3_mk_bvslt(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed less than.
#define MK_EXPR1(_fn, _arg)
Definition: z3++.h:3662
expr get_answer()
Definition: z3++.h:3218
Z3_sort Z3_API Z3_mk_string_sort(Z3_context c)
Create a sort for unicode strings.
~stats()
Definition: z3++.h:2591
bool is_forall() const
Return true if this expression is a universal quantifier.
Definition: z3++.h:856
friend expr min(expr const &a, expr const &b)
Definition: z3++.h:1876
sort seq_sort(sort &s)
Return a sequence sort over base sort s.
Definition: z3++.h:3270
void Z3_API Z3_optimize_set_params(Z3_context c, Z3_optimize o, Z3_params p)
Set parameters on optimization context.
friend expr bvmul_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:2183
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:1792
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...
Z3_ast Z3_API Z3_mk_char_to_bv(Z3_context c, Z3_ast ch)
Create a bit-vector (code point) from character.
expr bvmul_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:2183
friend expr bvredand(expr const &a)
Definition: z3++.h:1912
expr get_const_interp(func_decl c) const
Definition: z3++.h:2544
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:156
Definition: z3++.h:504
Z3 C++ namespace.
Definition: z3++.h:49
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:3685
expr ashr(expr const &a, expr const &b)
arithmetic shift right operator for bitvectors
Definition: z3++.h:2144
expr re_empty(sort const &s)
Definition: z3++.h:3773
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:2965
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:1513
expr nor(expr const &a, expr const &b)
Definition: z3++.h:1874
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.
Z3_ast Z3_API Z3_mk_fpa_to_fp_bv(Z3_context c, Z3_ast bv, Z3_sort s)
Conversion of a single IEEE 754-2008 bit-vector into a floating-point number.
Z3_param_descrs Z3_API Z3_simplify_get_param_descrs(Z3_context c)
Return the parameter description set for the simplify procedure.
fixedpoint(fixedpoint const &o)
Definition: z3++.h:3189
solver(context &c, Z3_solver s)
Definition: z3++.h:2630
expr ubvtos() const
Definition: z3++.h:1445
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:107
solver & operator=(solver const &s)
Definition: z3++.h:2636
Z3_ast Z3_API Z3_mk_char_from_bv(Z3_context c, Z3_ast bv)
Create a character from a bit-vector (code point).
Z3_ast Z3_API Z3_mk_fpa_rtp(Z3_context c)
Create a numeral of RoundingMode sort which represents the TowardPositive rounding mode...
void set(char const *param, int value)
Set global parameter param with integer value.
Definition: z3++.h:126
void add_cover(int level, func_decl &p, expr &property)
Definition: z3++.h:3227
expr substitute(expr_vector const &src, expr_vector const &dst)
Apply substitution. Replace src expressions by dst.
Definition: z3++.h:3851
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:509
ast_vector_tpl & operator=(ast_vector_tpl const &s)
Definition: z3++.h:558
expr_vector cube(expr_vector &vars, unsigned cutoff)
Definition: z3++.h:2742
friend expr fpa_to_sbv(expr const &t, unsigned sz)
Conversion of a floating-point term into a signed bit-vector.
Definition: z3++.h:1970
expr operator<=(expr const &a, expr const &b)
Definition: z3++.h:1792
friend std::ostream & operator<<(std::ostream &out, apply_result const &r)
Definition: z3++.h:2916
bool is_finite_domain() const
Return true if this is a Finite-domain expression.
Definition: z3++.h:814
expr proof() const
Definition: z3++.h:2714
void set(char const *k, char const *s)
Definition: z3++.h:496
expr bv_const(char const *name, unsigned sz)
Definition: z3++.h:3437
sort fpa_sort()
Definition: z3++.h:3275
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.
expr string_val(char const *s)
Definition: z3++.h:3488
uint64_t get_numeral_uint64() const
Return uint64_t value of numeral, throw if result cannot fit in uint64_t.
Definition: z3++.h:1066
tactic(context &c, char const *name)
Definition: z3++.h:2925
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 Unicode strings.
Definition: z3++.h:3268
std::string str() const
Definition: z3++.h:440
tactic with(tactic const &t, params const &p)
Definition: z3++.h:2978
expr empty_set(sort const &s)
Definition: z3++.h:3677
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:3656
expr plus(expr const &re)
Definition: z3++.h:3764
func_decl partial_order(sort const &a, unsigned index)
Definition: z3++.h:2196
expr xnor(expr const &a, expr const &b)
Definition: z3++.h:1875
expr char_to_bv() const
Definition: z3++.h:1460
void reset()
Definition: z3++.h:2651
Z3_ast Z3_API Z3_mk_fpa_to_fp_unsigned(Z3_context c, Z3_ast rm, Z3_ast t, Z3_sort s)
Conversion of a 2's complement unsigned bit-vector term into a term of FloatingPoint sort...
expr operator*() const
Definition: z3++.h:1537
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.
void propagate(unsigned num_fixed, unsigned const *fixed, expr const &conseq)
Definition: z3++.h:4044
Z3_ast Z3_API Z3_mk_bvshl(Z3_context c, Z3_ast t1, Z3_ast t2)
Shift left.
std::string get_decimal_string(int precision) const
Return string representation of numeral or algebraic number This method assumes the expression is num...
Definition: z3++.h:956
~config()
Definition: z3++.h:113
void from_string(char const *s)
Definition: z3++.h:2667
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:694
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:180
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:2353
void Z3_API Z3_func_entry_inc_ref(Z3_context c, Z3_func_entry e)
Increment the reference counter of the given Z3_func_entry object.
expr fpa_fp(expr const &sgn, expr const &exp, expr const &sig)
Definition: z3++.h:1962
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_...
Z3_ast Z3_API Z3_mk_fpa_to_fp_signed(Z3_context c, Z3_ast rm, Z3_ast t, Z3_sort s)
Conversion of a 2's complement signed bit-vector term into a term of FloatingPoint sort...
func_entry(context &c, Z3_func_entry e)
Definition: z3++.h:2452
void resize(unsigned sz)
Definition: z3++.h:554
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:869
expr extract(unsigned hi, unsigned lo) const
Definition: z3++.h:1348
model get_model() const
Definition: z3++.h:2871
Z3_ast_vector Z3_API Z3_algebraic_get_poly(Z3_context c, Z3_ast a)
Return the coefficients of the defining polynomial.
expr operator[](expr_vector const &index) const
Definition: z3++.h:1502
void add(expr const &e, char const *p)
Definition: z3++.h:2658
func_decl to_func_decl(context &c, Z3_func_decl f)
Definition: z3++.h:2044
unsigned depth() const
Definition: z3++.h:2860
optimize(context &c)
Definition: z3++.h:3091
expr min(expr const &a, expr const &b)
Definition: z3++.h:1876
context & ctx() const
Definition: z3++.h:428
sort array_range() const
Return the range of this Array sort.
Definition: z3++.h:700
cube_iterator(solver &s, expr_vector &vars, unsigned &cutoff, bool end)
Definition: z3++.h:2769
param_descrs(param_descrs const &o)
Definition: z3++.h:458
void Z3_API Z3_optimize_push(Z3_context c, Z3_optimize d)
Create a backtracking point.
void set_cutoff(unsigned c) noexcept
Definition: z3++.h:2826
Z3_ast Z3_API Z3_mk_not(Z3_context c, Z3_ast a)
Create an AST node representing not(a).
Z3_ast Z3_API Z3_mk_re_option(Z3_context c, Z3_ast re)
Create the regular language [re].
friend expr fpa_to_fpa(expr const &t, sort s)
Conversion of a floating-point term into another floating-point.
Definition: z3++.h:1998
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:2445
bool is_const() const
Definition: z3++.h:730
Z3_sort Z3_API Z3_mk_array_sort(Z3_context c, Z3_sort domain, Z3_sort range)
Create an array type.
sort fpa_rounding_mode_sort()
Return a RoundingMode sort.
Definition: z3++.h:3286
bool is_string_value() const
Return true if this expression is a string literal. The string can be accessed using get_string() and...
Definition: z3++.h:1101
check_result check()
Definition: z3++.h:2669
unsigned size() const
Definition: z3++.h:2912
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:2717
unsigned get_numeral_uint() const
Return uint value of numeral, throw if result cannot fit in machine uint.
Definition: z3++.h:1032
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:2534
expr operator+(expr const &a, expr const &b)
Definition: z3++.h:1654
func_decl function(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:3325
expr operator()(context &c, Z3_ast a)
Definition: z3++.h:2213
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:3077
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:2876
bool is_numeral() const
Return true if this expression is a numeral. Specialized functions also return representations for th...
Definition: z3++.h:825
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:3396
expr bvadd_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:2165
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.
expr int2bv(unsigned n, expr const &a)
Definition: z3++.h:2157
unsigned Z3_API Z3_get_ast_hash(Z3_context c, Z3_ast a)
Return a hash code for the given AST. The hash code is structural but two different AST objects can m...
expr bvneg_no_overflow(expr const &a)
Definition: z3++.h:2177
func_decl tree_order(sort const &a, unsigned index)
Definition: z3++.h:2202
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:3791
model convert_model(model const &m) const
Definition: z3++.h:2865
unsigned h() const
Definition: z3++.h:3089
expr srem(expr const &a, expr const &b)
signed remainder operator for bitvectors
Definition: z3++.h:2109
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:1861
expr set_intersect(expr const &a, expr const &b)
Definition: z3++.h:3701
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:89
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:2633
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:101
Z3_ast_vector Z3_API Z3_fixedpoint_from_file(Z3_context c, Z3_fixedpoint f, Z3_string s)
Parse an SMT-LIB2 file with fixedpoint rules. Add the rules to the current fixedpoint context...
Z3_sort Z3_API Z3_mk_fpa_rounding_mode_sort(Z3_context c)
Create the RoundingMode sort.
~optimize()
Definition: z3++.h:3109
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:1891
Z3_tactic Z3_API Z3_tactic_par_and_then(Z3_context c, Z3_tactic t1, Z3_tactic t2)
Return a tactic that applies t1 to a given goal and then t2 to every subgoal produced by t1...
bool operator!=(iterator const &other) noexcept
Definition: z3++.h:1534
expr fpa_const(char const *name, unsigned ebits, unsigned sbits)
Definition: z3++.h:3438
virtual void pop(unsigned num_scopes)=0
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:3619
expr re_intersect(expr_vector const &args)
Definition: z3++.h:3783
friend expr ubv_to_fpa(expr const &t, sort s)
Conversion of an unsigned bit-vector term into a floating-point.
Definition: z3++.h:1991
Z3_ast Z3_API Z3_mk_fpa_is_infinite(Z3_context c, Z3_ast t)
Predicate indicating whether t is a floating-point number representing +oo or -oo.
Z3_ast Z3_API Z3_mk_string(Z3_context c, Z3_string s)
Create a string constant out of the string that is passed in The string may contain escape encoding f...
expr real_val(int n, int d)
Definition: z3++.h:3464
ast_vector_tpl< sort > sort_vector
Definition: z3++.h:74
void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name)
load solver assertions from a file.
expr mk_xor(expr_vector const &args)
Definition: z3++.h:2435
void add(expr const &e)
Definition: z3++.h:3111
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:3740
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_ubv_to_str(Z3_context c, Z3_ast s)
Unsigned bit-vector to string conversion.
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:2476
Z3_decl_kind decl_kind() const
Definition: z3++.h:724
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:2513
void Z3_API Z3_model_dec_ref(Z3_context c, Z3_model m)
Decrement the reference counter of the given model.
Z3_ast Z3_API Z3_mk_u32string(Z3_context c, unsigned len, unsigned const chars[])
Create a string constant out of the string that is passed in It takes the length of the string as wel...
expr operator%(expr const &a, expr const &b)
Definition: z3++.h:1577
expr_vector parse_file(char const *file)
Definition: z3++.h:3811
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. Characters outside the basic printiable ASCII range are esc...
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:2997
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:1631
void set(char const *param, bool value)
Set global parameter param with Boolean value.
Definition: z3++.h:122
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:1480
stats statistics() const
Definition: z3++.h:3177
func_entry entry(unsigned i) const
Definition: z3++.h:2488
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:2652
void Z3_API Z3_fixedpoint_dec_ref(Z3_context c, Z3_fixedpoint d)
Decrement the reference counter of the given fixedpoint context.
virtual ~exception()
Definition: z3++.h:88
Z3_ast Z3_API Z3_mk_fpa_to_ieee_bv(Z3_context c, Z3_ast t)
Conversion of a floating-point term into a bit-vector term in IEEE 754-2008 format.
bool is_relation() const
Return true if this is a Relation expression.
Definition: z3++.h:796
Z3_ast Z3_API Z3_mk_bvsub_no_underflow(Z3_context c, Z3_ast t1, Z3_ast t2, bool is_signed)
Create a predicate that checks that the bit-wise subtraction of t1 and t2 does not underflow...
Z3_ast Z3_API Z3_mk_fpa_mul(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point multiplication.
unsigned Z3_API Z3_goal_size(Z3_context c, Z3_goal g)
Return the number of formulas in the given goal.
expr repeat(unsigned i)
Definition: z3++.h:1338
bool is_bool() const
Return true if this sort is the Boolean sort.
Definition: z3++.h:633
void resize(unsigned sz)
Definition: z3++.h:415
expr ugt(expr const &a, expr const &b)
unsigned greater than operator for bitvectors.
Definition: z3++.h:2096
Z3_ast Z3_API Z3_mk_fpa_is_normal(Z3_context c, Z3_ast t)
Predicate indicating whether t is a normal floating-point number.
Z3_ast Z3_API Z3_mk_bvxnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise xnor.
goal & operator=(goal const &s)
Definition: z3++.h:2847
expr option(expr const &re)
Definition: z3++.h:3767
~params()
Definition: z3++.h:483
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:3673
stats(stats const &s)
Definition: z3++.h:2590
T const * ptr() const
Definition: z3++.h:419
cube_iterator operator++(int)
Definition: z3++.h:2791
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:3717
Z3_model Z3_API Z3_mk_model(Z3_context c)
Create a fresh model object. It has reference count 0.
void propagate(unsigned num_fixed, unsigned const *fixed, unsigned num_eqs, unsigned const *lhs, unsigned const *rhs, expr const &conseq)
Definition: z3++.h:4050
unsigned id() const
retrieve unique identifier for func_decl.
Definition: z3++.h:620
bool is_distinct() const
Definition: z3++.h:1234
friend std::ostream & operator<<(std::ostream &out, model const &m)
Definition: z3++.h:2579
bool is_or() const
Definition: z3++.h:1229
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:1227
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:2454
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:3317
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:2913
check_result check(expr_vector const &assumptions)
Definition: z3++.h:2680
unsigned fpa_ebits() const
Definition: z3++.h:686
expr_vector trail() const
Definition: z3++.h:2703
iterator end()
Definition: z3++.h:1543
void reset()
Definition: z3++.h:2861
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:832
T * ptr()
Definition: z3++.h:420
bool is_implies() const
Definition: z3++.h:1231
params(params const &s)
Definition: z3++.h:482
Z3_ast Z3_API Z3_func_entry_get_value(Z3_context c, Z3_func_entry e)
Return the value of this point.
expr_vector algebraic_poly() const
Return coefficients for p of an algebraic number (root-obj p i)
Definition: z3++.h:981
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:77
unsigned Z3_API Z3_optimize_assert_soft(Z3_context c, Z3_optimize o, Z3_ast a, Z3_string weight, Z3_symbol id)
Assert soft constraint to the optimization context.
Z3_ast Z3_API Z3_mk_bvult(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned less than.
expr bv2int(expr const &a, bool is_signed)
bit-vector and integer conversions.
Definition: z3++.h:2156
friend void check_context(object const &a, object const &b)
Definition: z3++.h:432
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:3138
unsigned Z3_API Z3_model_get_num_funcs(Z3_context c, Z3_model m)
Return the number of function interpretations in the given model.
Z3_ast Z3_API Z3_mk_int2bv(Z3_context c, unsigned n, Z3_ast t1)
Create an n bit bit-vector from the integer argument t1.
func_decl decl() const
Return the declaration associated with this application. This method assumes the expression is an app...
Definition: z3++.h:1137
unsigned size() const
Definition: z3++.h:551
bool is_seq() const
Return true if this is a sequence expression.
Definition: z3++.h:800
std::u32string get_u32string() const
for a string value expression return an unespaced string value.
Definition: z3++.h:1120
Z3_param_kind
The different kinds of parameters that can be associated with parameter sets. (see Z3_mk_params)...
Definition: z3_api.h:1327
friend expr bvsdiv_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:2174
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:3046
friend expr operator&&(expr const &a, expr const &b)
Return an expression representing a and b.
Definition: z3++.h:1606
expr get_cover_delta(int level, func_decl &p)
Definition: z3++.h:3222
Z3_string Z3_API Z3_get_numeral_string(Z3_context c, Z3_ast a)
Return numeral value, as a decimal string of a numeric constant term.
bool Z3_API Z3_is_string(Z3_context c, Z3_ast s)
Determine if s is a string constant.
expr int_const(char const *name)
Definition: z3++.h:3434
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:1861
friend std::ostream & operator<<(std::ostream &out, exception const &e)
Definition: z3++.h:94
expr arg(unsigned i) const
Definition: z3++.h:2465
expr abs(expr const &a)
Definition: z3++.h:1918
Z3_ast_vector Z3_API Z3_parse_smtlib2_file(Z3_context c, Z3_string file_name, unsigned num_sorts, Z3_symbol const sort_names[], Z3_sort const sorts[], unsigned num_decls, Z3_symbol const decl_names[], Z3_func_decl const decls[])
Similar to Z3_parse_smtlib2_string, but reads the benchmark from a file.
unsigned Z3_API Z3_func_entry_get_num_args(Z3_context c, Z3_func_entry e)
Return the number of arguments in a Z3_func_entry object.
bool Z3_API Z3_get_numeral_int64(Z3_context c, Z3_ast v, int64_t *i)
Similar to Z3_get_numeral_string, but only succeeds if the value can fit in a machine int64_t int...
expr sbvtos() const
Definition: z3++.h:1450
unsigned num_args() const
Return the number of arguments in this application. This method assumes the expression is an applicat...
Definition: z3++.h:1144
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:115
expr sum(expr_vector const &args)
Definition: z3++.h:2361
Z3_string Z3_API Z3_get_numeral_binary_string(Z3_context c, Z3_ast a)
Return numeral value, as a binary string of a numeric constant term.
Z3_ast Z3_API Z3_mk_re_plus(Z3_context c, Z3_ast re)
Create the regular language re+.
Z3_ast Z3_API Z3_mk_fpa_eq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point equality.
Z3_ast Z3_API Z3_simplify(Z3_context c, Z3_ast a)
Interface to simplifier.
sort(context &c)
Definition: z3++.h:612
expr_vector from_string(char const *s)
Definition: z3++.h:3199
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:2842
context & operator()()
Definition: z3++.h:401
expr suffixof(expr const &a, expr const &b)
Definition: z3++.h:3734
void from_file(char const *filename)
Definition: z3++.h:3179
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:2792
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:2692
unsigned algebraic_i() const
Return i of an algebraic number (root-obj p i)
Definition: z3++.h:991
bool is_app() const
Return true if this expression is an application.
Definition: z3++.h:843
std::string to_string() const
Definition: z3++.h:2577
friend tactic operator&(tactic const &t1, tactic const &t2)
Definition: z3++.h:2958
expr operator<(expr const &a, expr const &b)
Definition: z3++.h:1817
object(context &c)
Definition: z3++.h:427
friend expr operator>(expr const &a, expr const &b)
Definition: z3++.h:1839
unsigned size() const
Definition: z3++.h:2856
Z3_func_decl Z3_API Z3_mk_tree_order(Z3_context c, Z3_sort a, unsigned id)
create a tree ordering relation over signature a identified using index id.
handle add(expr const &e, unsigned weight)
Definition: z3++.h:3135
Z3_param_descrs Z3_API Z3_fixedpoint_get_param_descrs(Z3_context c, Z3_fixedpoint f)
Return the parameter description set for the given fixedpoint object.
fixedpoint & operator=(fixedpoint const &o)
Definition: z3++.h:3191
ast(context &c)
Definition: z3++.h:508
Z3_symbol_kind kind() const
Definition: z3++.h:439
friend expr nand(expr const &a, expr const &b)
Definition: z3++.h:1873
void set(params const &p)
Definition: z3++.h:3232
expr fp_eq(expr const &a, expr const &b)
Definition: z3++.h:1945
expr atleast(expr_vector const &es, unsigned bound)
Definition: z3++.h:2353
friend tactic with(tactic const &t, params const &p)
Definition: z3++.h:2978
Z3_ast Z3_API Z3_mk_fpa_is_nan(Z3_context c, Z3_ast t)
Predicate indicating whether t is a NaN.
Z3_ast Z3_API Z3_mk_bvor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise or.
Z3_ast Z3_API Z3_mk_bvsdiv_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed division of t1 and t2 does not overflow...
bool Z3_API Z3_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:3435
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:614
friend expr sbv_to_fpa(expr const &t, sort s)
Conversion of a signed bit-vector term into a floating-point.
Definition: z3++.h:1984
stats statistics() const
Definition: z3++.h:3228
model get_model() const
Definition: z3++.h:3162
func_interp get_func_interp(func_decl f) const
Definition: z3++.h:2550
friend probe operator==(probe const &p1, probe const &p2)
Definition: z3++.h:3066
bool operator!=(cube_iterator const &other) noexcept
Definition: z3++.h:2798
Z3_ast Z3_API Z3_mk_bv2int(Z3_context c, Z3_ast t1, bool is_signed)
Create an integer from the bit-vector argument t1. If is_signed is false, then the bit-vector t1 is t...
bool is_numeral(std::string &s, unsigned precision) const
Definition: z3++.h:831
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 operator!=(iterator const &other) const noexcept
Definition: z3++.h:586
expr algebraic_lower(unsigned precision) const
Definition: z3++.h:964
bool is_eq() const
Definition: z3++.h:1232
Z3_tactic Z3_API Z3_tactic_using_params(Z3_context c, Z3_tactic t, Z3_params p)
Return a tactic that applies t using the given set of parameters.
double Z3_API Z3_get_numeral_double(Z3_context c, Z3_ast a)
Return numeral as a double.
Z3_ast Z3_API Z3_mk_bvneg_no_overflow(Z3_context c, Z3_ast t1)
Check that bit-wise negation does not overflow when t1 is interpreted as a signed bit-vector...
Z3_string Z3_API Z3_solver_to_string(Z3_context c, Z3_solver s)
Convert a solver into a string.
Z3_sort_kind sort_kind() const
Return the internal sort kind.
Definition: z3++.h:625
bool is_numeral(std::string &s) const
Definition: z3++.h:830
bool is_arith() const
Return true if this sort is the Integer or Real sort.
Definition: z3++.h:645
Z3_ast Z3_API Z3_mk_re_star(Z3_context c, Z3_ast re)
Create the regular language re*.
std::string dimacs(bool include_names=true) const
Definition: z3++.h:2737
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:2191
friend expr fma(expr const &a, expr const &b, expr const &c, expr const &rm)
FloatingPoint fused multiply-add.
Definition: z3++.h:1954
Z3_lbool Z3_API Z3_solver_check(Z3_context c, Z3_solver s)
Check whether the assertions in a given solver are consistent or not.
expr mk_is_zero() const
Return Boolean expression to test for whether an FP expression is a zero.
Definition: z3++.h:923
Z3_ast_vector Z3_API Z3_ast_vector_translate(Z3_context s, Z3_ast_vector v, Z3_context t)
Translate the AST vector v from context s into an AST vector in context t.
Z3_model Z3_API Z3_model_translate(Z3_context c, Z3_model m, Z3_context dst)
translate model from context c to context dst.
void from_file(char const *file)
Definition: z3++.h:2666
Z3_sort Z3_API Z3_get_domain(Z3_context c, Z3_func_decl d, unsigned i)
Return the sort of the i-th parameter of the given function declaration.
Z3_ast Z3_API Z3_mk_fpa_to_fp_float(Z3_context c, Z3_ast rm, Z3_ast t, Z3_sort s)
Conversion of a FloatingPoint term into another term of different FloatingPoint sort.
void Z3_API Z3_fixedpoint_add_cover(Z3_context c, Z3_fixedpoint d, int level, Z3_func_decl pred, Z3_ast property)
Add property about the predicate pred. Add a property of predicate pred at level. It gets pushed forw...
Definition: z3++.h:137
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:2337
expr at(expr const &index) const
Definition: z3++.h:1418
unsigned Z3_API Z3_get_ast_id(Z3_context c, Z3_ast t)
Return a unique identifier for t. The identifier is unique up to structural equality. Thus, two ast nodes created by the same context and having the same children and same function symbols have the same identifiers. Ast nodes created in the same context, but having different children or different functions have different identifiers. Variables and quantifiers are also assigned different identifiers according to their structure.
bool operator==(iterator const &other) const noexcept
Definition: z3++.h:583
void add(expr_vector const &v)
Definition: z3++.h:2855
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:2704
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:3729
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:878
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.
~model()
Definition: z3++.h:2511
Z3_ast Z3_API Z3_mk_char_to_int(Z3_context c, Z3_ast ch)
Create an integer (code point) from character.
cube_generator(solver &s, expr_vector &vars)
Definition: z3++.h:2817
friend tactic par_and_then(tactic const &t1, tactic const &t2)
Definition: z3++.h:2997
char const * what() const
Definition: z3++.h:91
sort real_sort()
Return the Real sort.
Definition: z3++.h:3266
void set(char const *k, unsigned v)
Definition: z3++.h:2645
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.
friend std::ostream & operator<<(std::ostream &out, ast_vector_tpl const &v)
Definition: z3++.h:602
expr re_full(sort const &s)
Definition: z3++.h:3778
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:2859
bool is_const() const
Return true if this expression is a constant (i.e., an application with 0 arguments).
Definition: z3++.h:847
expr arg(unsigned i) const
Return the i-th argument of this application. This method assumes the expression is an application...
Definition: z3++.h:1152
ast_vector_tpl(ast_vector_tpl const &s)
Definition: z3++.h:546
virtual ~user_propagator_base()=default
friend expr rem(expr const &a, expr const &b)
Definition: z3++.h:1582
expr num_val(int n, sort const &s)
Definition: z3++.h:3492
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:537
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:2531
symbol int_symbol(int n)
Create a Z3 symbol based on the given integer.
Definition: z3++.h:3262
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:1485
void add(expr_vector const &v)
Definition: z3++.h:2661
expr fpa_val(double n)
Definition: z3++.h:3482
func_decl transitive_closure(func_decl const &)
Definition: z3++.h:726
expr bvmul_no_overflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:2180
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:3061
expr indexof(expr const &s, expr const &substr, expr const &offset)
Definition: z3++.h:3746
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:3713
unsigned num_funcs() const
Definition: z3++.h:2532
bool is_algebraic() const
Return true if expression is an algebraic number.
Definition: z3++.h:873
expr operator()() const
Definition: z3++.h:3515
expr_vector non_units() const
Definition: z3++.h:2701
iterator(expr &e, unsigned i)
Definition: z3++.h:1530
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:459
expr operator>(expr const &a, expr const &b)
Definition: z3++.h:1839
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:144
expr star(expr const &re)
Definition: z3++.h:3770
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:1952
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:1631
user_propagator_base(Z3_context c)
Definition: z3++.h:3934
Z3_solver Z3_API Z3_mk_simple_solver(Z3_context c)
Create a new incremental solver.
Z3_ast Z3_API Z3_mk_power(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 ^ arg2.
Z3_ast Z3_API Z3_mk_implies(Z3_context c, Z3_ast t1, Z3_ast t2)
Create an AST node representing t1 implies t2.
Z3_tactic Z3_API Z3_tactic_try_for(Z3_context c, Z3_tactic t, unsigned ms)
Return a tactic that applies t to a given goal for ms milliseconds. If t does not terminate in ms mil...
param_descrs(context &c, Z3_param_descrs d)
Definition: z3++.h:457
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:2972
expr operator|(expr const &a, expr const &b)
Definition: z3++.h:1869
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...
T operator[](int i) const
Definition: z3++.h:552
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:2988
expr pbge(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2329
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:1918
tactic(context &c, Z3_tactic s)
Definition: z3++.h:2926
void check_context(object const &a, object const &b)
Definition: z3++.h:432
expr char_to_int() const
Definition: z3++.h:1455
Z3_ast_vector Z3_API Z3_optimize_get_assertions(Z3_context c, Z3_optimize o)
Return the set of asserted formulas on the optimization context.
Z3_ast Z3_API Z3_mk_bvadd_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2, bool is_signed)
Create a predicate that checks that the bit-wise addition of t1 and t2 does not overflow.
expr mk_from_ieee_bv(sort const &s) const
Convert this IEEE BV into a fpa.
Definition: z3++.h:943
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:3433
expr urem(expr const &a, expr const &b)
unsigned reminder operator for bitvectors
Definition: z3++.h:2123
void Z3_API Z3_params_set_double(Z3_context c, Z3_params p, Z3_symbol k, double v)
Add a double parameter k with value v to the parameter set p.
expr sbv_to_fpa(expr const &t, sort s)
Definition: z3++.h:1984
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:1606
double apply(goal const &g) const
Definition: z3++.h:3024
expr extract(expr const &offset, expr const &length) const
sequence and regular expression operations.
Definition: z3++.h:1397
rounding_mode
Definition: z3++.h:136
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.
Z3_ast Z3_API Z3_get_algebraic_number_upper(Z3_context c, Z3_ast a, unsigned precision)
Return a upper bound for the given real algebraic number. The interval isolating the number is smalle...
#define _Z3_MK_BIN_(a, b, binop)
Definition: z3++.h:1547
void set_rounding_mode(rounding_mode rm)
Sets RoundingMode of FloatingPoints.
Definition: z3++.h:3443
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:2017
Z3_lbool Z3_API Z3_solver_get_consequences(Z3_context c, Z3_solver s, Z3_ast_vector assumptions, Z3_ast_vector variables, Z3_ast_vector consequences)
retrieve consequences from solver that determine values of the supplied function symbols.
Z3_goal Z3_API Z3_apply_result_get_subgoal(Z3_context c, Z3_apply_result r, unsigned i)
Return one of the subgoals in the Z3_apply_result object returned by Z3_tactic_apply.
std::string dimacs(bool include_names=true) const
Definition: z3++.h:2889
expr_vector rules() const
Definition: z3++.h:3231
friend expr nor(expr const &a, expr const &b)
Definition: z3++.h:1874
params & operator=(params const &s)
Definition: z3++.h:485
friend std::ostream & operator<<(std::ostream &out, symbol const &s)
Definition: z3++.h:445
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:2509
unsigned hi() const
Definition: z3++.h:1350
check_result query(func_decl_vector &relations)
Definition: z3++.h:3212
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:3014
bool operator==(iterator const &other) noexcept
Definition: z3++.h:1531
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:581
Definition: z3++.h:141
friend expr operator<(expr const &a, expr const &b)
Definition: z3++.h:1817
friend expr operator!(expr const &a)
Return an expression representing not(a).
Definition: z3++.h:1600
Z3_ast Z3_API Z3_mk_bvredor(Z3_context c, Z3_ast t1)
Take disjunction of bits in vector, return vector of length 1.
friend expr bvsub_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:2168
solver(context &c, solver const &src, translate)
Definition: z3++.h:2632
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:2858
solver(context &c)
Definition: z3++.h:2628
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:2361
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:2296
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:712
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:71
bool is_decided_unsat() const
Definition: z3++.h:2864
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:3141
expr mk_is_subnormal() const
Return Boolean expression to test for whether an FP expression is a subnormal.
Definition: z3++.h:913
friend probe operator<(probe const &p1, probe const &p2)
Definition: z3++.h:3056
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:2700
cube_iterator & operator++()
Definition: z3++.h:2781
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)
bool operator==(cube_iterator const &other) noexcept
Definition: z3++.h:2795
sort get_sort() const
Return the sort of this expression.
Definition: z3++.h:763
friend probe operator&&(probe const &p1, probe const &p2)
Definition: z3++.h:3071
void set(char const *k, double v)
Definition: z3++.h:2646
void add(expr const &e, expr const &p)
Definition: z3++.h:2653
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:3636
Z3_ast Z3_API Z3_mk_fpa_geq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point greater than or equal.
bool is_exists() const
Return true if this expression is an existential quantifier.
Definition: z3++.h:860
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:493
scoped_context(Z3_context c)
Definition: z3++.h:399
Z3_ast Z3_API Z3_mk_bvsub_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed subtraction of t1 and t2 does not overflow...
iterator begin() const noexcept
Definition: z3++.h:600
expr_vector const & operator*() const noexcept
Definition: z3++.h:2793
friend expr pble(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2321
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:2601
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:661
Z3_ast m_ast
Definition: z3++.h:506
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:492
tactic repeat(tactic const &t, unsigned max=UINT_MAX)
Definition: z3++.h:2972
expr bool_val(bool b)
Definition: z3++.h:3456
~context()
Definition: z3++.h:182
expr operator||(expr const &a, expr const &b)
Definition: z3++.h:1618
expr ult(expr const &a, expr const &b)
unsigned less than operator for bitvectors.
Definition: z3++.h:2084
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:772
friend expr pbge(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2329
apply_result apply(goal const &g) const
Definition: z3++.h:2938
expr int_val(int n)
Definition: z3++.h:3458
bool is_arith() const
Return true if this is an integer or real expression.
Definition: z3++.h:780
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:2691
Z3_ast Z3_API Z3_mk_eq(Z3_context c, Z3_ast l, Z3_ast r)
Create an AST node representing l = r.
Z3_ast Z3_API Z3_mk_seq_in_re(Z3_context c, Z3_ast seq, Z3_ast re)
Check if seq is in the language generated by the regular expression re.
expr else_value() const
Definition: z3++.h:2486
expr mk_or(expr_vector const &args)
Definition: z3++.h:2423
tactic fail_if(probe const &p)
Definition: z3++.h:3243
Z3_func_decl Z3_API Z3_mk_linear_order(Z3_context c, Z3_sort a, unsigned id)
create a linear ordering relation over signature a. The relation is identified by the index id...
Z3_param_kind kind(symbol const &s)
Definition: z3++.h:471
stats(context &c, Z3_stats e)
Definition: z3++.h:2589
expr exists(expr const &x, expr const &b)
Definition: z3++.h:2272
expr round_fpa_to_closest_integer(expr const &t)
Definition: z3++.h:2005
std::string to_string()
Definition: z3++.h:3235
expr sge(expr const &a, expr const &b)
signed greater than or equal to operator for bitvectors.
Definition: z3++.h:2064
ast operator()(context &c, Z3_ast a)
Definition: z3++.h:2208
Z3_ast Z3_API Z3_mk_atmost(Z3_context c, unsigned num_args, Z3_ast const args[], unsigned k)
Pseudo-Boolean relations.
Definition: z3++.h:139
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:3805
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:181
expr unit() const
Definition: z3++.h:1407
bool is_array() const
Return true if this sort is a Array sort.
Definition: z3++.h:653
Z3_param_descrs Z3_API Z3_solver_get_param_descrs(Z3_context c, Z3_solver s)
Return the parameter description set for the given solver object.
unsigned Z3_API Z3_func_interp_get_num_entries(Z3_context c, Z3_func_interp f)
Return the number of entries in the given function interpretation.
void Z3_API Z3_solver_get_levels(Z3_context c, Z3_solver s, Z3_ast_vector literals, unsigned sz, unsigned levels[])
retrieve the decision depth of Boolean literals (variables or their negations). Assumes a check-sat c...
expr_vector from_file(char const *s)
Definition: z3++.h:3204
void set(char const *k, symbol const &v)
Definition: z3++.h:2647
expr ite(expr const &c, expr const &t, expr const &e)
Create the if-then-else expression ite(c, t, e)
Definition: z3++.h:2017
T const & operator[](int i) const
Definition: z3++.h:418
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:2453
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:2605
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:3606
void register_eq(eq_eh_t &f)
Definition: z3++.h:3975
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:1159
std::string get_string() const
for a string value expression return an escaped string value.
Definition: z3++.h:1108
~ast()
Definition: z3++.h:511
expr char_from_bv() const
Definition: z3++.h:1465
friend expr bvneg_no_overflow(expr const &a)
Definition: z3++.h:2177
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:2810
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:514
bool is_seq() const
Return true if this sort is a Sequence sort.
Definition: z3++.h:665
func_interp add_func_interp(func_decl &f, expr &else_val)
Definition: z3++.h:2564
bool is_bv() const
Return true if this is a Bit-vector expression.
Definition: z3++.h:784
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:2248
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:721
bool is_bool() const
Return true if this is a Boolean expression.
Definition: z3++.h:768
int64_t get_numeral_int64() const
Return int64_t value of numeral, throw if result cannot fit in int64_t.
Definition: z3++.h:1049
sort(context &c, Z3_sort s)
Definition: z3++.h:613
unsigned hash() const
Definition: z3++.h:523
double operator()(goal const &g) const
Definition: z3++.h:3025
Z3_error_code check_error() const
Auxiliary method used to check for API usage errors.
Definition: z3++.h:188
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.
Z3_ast Z3_API Z3_get_algebraic_number_lower(Z3_context c, Z3_ast a, unsigned precision)
Return a lower bound for the given real algebraic number. The interval isolating the number is smalle...
Z3_ast Z3_API Z3_mk_ite(Z3_context c, Z3_ast t1, Z3_ast t2, Z3_ast t3)
Create an AST node representing an if-then-else: ite(t1, t2, t3).
bool is_datatype() const
Return true if this sort is a Datatype sort.
Definition: z3++.h:657
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:525
expr implies(expr const &a, expr const &b)
Definition: z3++.h:1554
void Z3_API Z3_solver_propagate_init(Z3_context c, Z3_solver s, void *user_context, Z3_push_eh push_eh, Z3_pop_eh pop_eh, Z3_fresh_eh fresh_eh)
register a user-properator with the solver.
Z3_func_entry Z3_API Z3_func_interp_get_entry(Z3_context c, Z3_func_interp f, unsigned i)
Return a "point" of the given function interpretation. It represents the value of f in a particular p...
friend expr sqrt(expr const &a, expr const &rm)
Definition: z3++.h:1938
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:2030
expr rotate_left(unsigned i)
Definition: z3++.h:1336
bool has_interp(func_decl f) const
Definition: z3++.h:2559
Z3_sort Z3_API Z3_mk_char_sort(Z3_context c)
Create a sort for unicode characters.
expr mk_is_normal() const
Return Boolean expression to test for whether an FP expression is a normal.
Definition: z3++.h:903
expr concat(expr const &a, expr const &b)
Definition: z3++.h:2379
symbol(context &c, Z3_symbol s)
Definition: z3++.h:437
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:2631
bool is_false() const
Definition: z3++.h:1226
tactic try_for(tactic const &t, unsigned ms)
Definition: z3++.h:2983
func_interp(context &c, Z3_func_interp e)
Definition: z3++.h:2475
Z3_ast Z3_API Z3_mk_fpa_inf(Z3_context c, Z3_sort s, bool negative)
Create a floating-point infinity of sort s.
void register_relation(func_decl &p)
Definition: z3++.h:3229
unsigned Z3_API Z3_get_arity(Z3_context c, Z3_func_decl d)
Alias for Z3_get_domain_size.
expr fpa_nan(sort const &s)
Definition: z3++.h:3484
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:3209
expr shl(expr const &a, expr const &b)
shift left operator for bitvectors
Definition: z3++.h:2130
expr bvsdiv_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:2174
params(context &c)
Definition: z3++.h:481
Z3_string Z3_API Z3_solver_to_dimacs_string(Z3_context c, Z3_solver s, bool include_names)
Convert a solver into a DIMACS formatted string.
Z3_ast Z3_API Z3_mk_rotate_left(Z3_context c, unsigned i, Z3_ast t1)
Rotate bits of t1 to the left i times.
friend tactic try_for(tactic const &t, unsigned ms)
Definition: z3++.h:2983
void push_back(T const &e)
Definition: z3++.h:553
expr pble(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2321
expr max(expr const &a, expr const &b)
Definition: z3++.h:1891
sort range() const
Definition: z3++.h:722
expr sqrt(expr const &a, expr const &rm)
Definition: z3++.h:1938
expr mk_to_ieee_bv() const
Convert this fpa into an IEEE BV.
Definition: z3++.h:933
ast_vector_tpl< expr > expr_vector
Definition: z3++.h:73
bool is_re() const
Return true if this is a regular expression.
Definition: z3++.h:804
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 mk_is_nan() const
Return Boolean expression to test for whether an FP expression is a NaN.
Definition: z3++.h:893
expr uge(expr const &a, expr const &b)
unsigned greater than or equal to operator for bitvectors.
Definition: z3++.h:2090
void push()
Definition: z3++.h:3144
expr last_indexof(expr const &s, expr const &substr)
Definition: z3++.h:3752
expr slt(expr const &a, expr const &b)
signed less than operator for bitvectors.
Definition: z3++.h:2058
void set(char const *param, bool value)
Update global parameter param with Boolean value.
Definition: z3++.h:217
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:2643
bool is_re() const
Return true if this sort is a regular expression sort.
Definition: z3++.h:669
Z3_ast Z3_API Z3_goal_formula(Z3_context c, Z3_goal g, unsigned idx)
Return a formula from the given goal.
Z3_symbol Z3_API Z3_get_sort_name(Z3_context c, Z3_sort d)
Return the sort name as a symbol.
bool is_quantifier() const
Return true if this expression is a quantifier.
Definition: z3++.h:851
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:3304
context * m_ctx
Definition: z3++.h:425
unsigned size()
Definition: z3++.h:469
unsigned size() const
Definition: z3++.h:416
void Z3_API Z3_fixedpoint_set_params(Z3_context c, Z3_fixedpoint f, Z3_params p)
Set parameters on fixedpoint context.
Z3_ast Z3_API Z3_mk_fpa_nan(Z3_context c, Z3_sort s)
Create a floating-point NaN of sort s.
expr fpa_inf(sort const &s, bool sgn)
Definition: z3++.h:3485
symbol name() const
Definition: z3++.h:723
std::string help() const
Definition: z3++.h:3233
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:1750
void pop(unsigned n=1)
Definition: z3++.h:2650
friend std::ostream & operator<<(std::ostream &out, stats const &s)
Definition: z3++.h:2608
expr smod(expr const &a, expr const &b)
signed modulus operator for bitvectors
Definition: z3++.h:2116
void conflict(unsigned num_fixed, unsigned const *fixed)
Definition: z3++.h:4037
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:3576
cube_iterator end()
Definition: z3++.h:2825
handle(unsigned h)
Definition: z3++.h:3088
unsigned size() const
Definition: z3++.h:2600
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:1554
void Z3_API Z3_fixedpoint_register_relation(Z3_context c, Z3_fixedpoint d, Z3_func_decl f)
Register relation as Fixedpoint defined. Fixedpoint defined relations have least-fixedpoint semantics...
virtual void push()=0
param_descrs get_param_descrs()
Definition: z3++.h:2739
Definition: z3++.h:138
unsigned add(expr const &e)
tracks e by a unique identifier that is returned by the call.
Definition: z3++.h:4032
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:510
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:3293
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:2988
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.
Z3_ast_vector Z3_API Z3_optimize_get_unsat_core(Z3_context c, Z3_optimize o)
Retrieve the unsat core for the last Z3_optimize_check The unsat core is a subset of the assumptions ...
Z3_decl_kind
The different kinds of interpreted function kinds.
Definition: z3_api.h:1001
unsigned Z3_API Z3_optimize_maximize(Z3_context c, Z3_optimize o, Z3_ast t)
Add a maximization constraint.
expr sgt(expr const &a, expr const &b)
signed greater than operator for bitvectors.
Definition: z3++.h:2070
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:2901
expr nand(expr const &a, expr const &b)
Definition: z3++.h:1873
def tactics
Definition: z3py.py:8334
unsigned Z3_API Z3_apply_result_get_num_subgoals(Z3_context c, Z3_apply_result r)
Return the number of subgoals in the Z3_apply_result object returned by Z3_tactic_apply.
Z3_sort Z3_API Z3_mk_re_sort(Z3_context c, Z3_sort seq)
Create a regular expression sort out of a sequence sort.
Z3_ast Z3_API Z3_fixedpoint_get_answer(Z3_context c, Z3_fixedpoint d)
Retrieve a formula that encodes satisfying answers to the query.
Z3_string Z3_API Z3_fixedpoint_to_string(Z3_context c, Z3_fixedpoint f, unsigned num_queries, Z3_ast queries[])
Print the current rules and background axioms as a string.
Z3_lbool Z3_API Z3_fixedpoint_query_relations(Z3_context c, Z3_fixedpoint d, unsigned num_relations, Z3_func_decl const relations[])
Pose multiple queries against the asserted rules.
void Z3_API Z3_ast_vector_set(Z3_context c, Z3_ast_vector v, unsigned i, Z3_ast a)
Update position i of the AST vector v with the AST a.
expr fpa_to_ubv(expr const &t, unsigned sz)
Definition: z3++.h:1977
expr stoi() const
Definition: z3++.h:1435
expr operator/(expr const &a, expr const &b)
Definition: z3++.h:1728
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:709
expr set_union(expr const &a, expr const &b)
Definition: z3++.h:3693
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:417
expr_vector objectives() const
Definition: z3++.h:3176
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:1013
param_descrs get_param_descrs()
Definition: z3++.h:2955
Z3_ast Z3_API Z3_mk_bvmul_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2, bool is_signed)
Create a predicate that checks that the bit-wise multiplication of t1 and t2 does not overflow...
bool is_xor() const
Definition: z3++.h:1230
Z3_probe Z3_API Z3_probe_or(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when p1 or p2 evaluates to true.
goal(goal const &s)
Definition: z3++.h:2844
sort int_sort()
Return the integer sort.
Definition: z3++.h:3265
Z3_ast Z3_API Z3_mk_bvadd_no_underflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed addition of t1 and t2 does not underflow...
ast_vector_tpl(context &c, ast_vector_tpl const &src)
Definition: z3++.h:547
expr set_del(expr const &s, expr const &e)
Definition: z3++.h:3689
void set(params const &p)
Definition: z3++.h:3164
check_result check(expr_vector const &asms)
Definition: z3++.h:3151
#define _Z3_MK_UN_(a, mkun)
Definition: z3++.h:1594
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:2593
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.
unsigned num_args() const
Definition: z3++.h:2464
expr bvsub_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:2168
Z3_ast Z3_API Z3_mk_sbv_to_str(Z3_context c, Z3_ast s)
Signed bit-vector to string conversion.
Z3_lbool bool_value() const
Definition: z3++.h:1077
expr fpa_to_sbv(expr const &t, unsigned sz)
Definition: z3++.h:1970
apply_result & operator=(apply_result const &s)
Definition: z3++.h:2905
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:2345
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:641
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:2039
expr string_const(char const *name)
Definition: z3++.h:3436
context()
Definition: z3++.h:180
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:1081
void Z3_API Z3_solver_propagate_eq(Z3_context c, Z3_solver s, Z3_eq_eh eq_eh)
register a callback on expression equalities.
bool is_decided_sat() const
Definition: z3++.h:2863
void add(expr const &f)
Definition: z3++.h:2854
friend expr mk_xor(expr_vector const &args)
Definition: z3++.h:2435
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:3794
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:3758
func_decl linear_order(sort const &a, unsigned index)
Definition: z3++.h:2193
void Z3_API Z3_optimize_from_string(Z3_context c, Z3_optimize o, Z3_string s)
Parse an SMT-LIB2 string with assertions, soft constraints and optimization objectives. Add the parsed constraints and objectives to the optimization context.
Z3_ast Z3_API Z3_mk_seq_contains(Z3_context c, Z3_ast container, Z3_ast containee)
Check if container contains containee.
check_result
Definition: z3++.h:132
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:1089
std::string to_string() const
Definition: z3++.h:603
bool is_numeral_i(int &i) const
Definition: z3++.h:828
param_descrs get_param_descrs()
Definition: z3++.h:3234
unsigned size() const
Definition: z3++.h:2535
const char * Z3_string
Z3 string type. It is just an alias for const char *.
Definition: z3_api.h:84
unsigned Z3_API Z3_algebraic_get_i(Z3_context c, Z3_ast a)
Return which root of the polynomial the algebraic number represents.
Z3_ast Z3_API Z3_mk_select_n(Z3_context c, Z3_ast a, unsigned n, Z3_ast const *idxs)
n-ary Array read. The argument a is the array and idxs are the indices of the array that gets read...
apply_result(apply_result const &s)
Definition: z3++.h:2902
bool is_fpa() const
Return true if this sort is a Floating point sort.
Definition: z3++.h:677