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<z3.h>
28 #include<limits.h>
29 #include<functional>
30 
31 #undef min
32 #undef max
33 
39 
44 
48 namespace z3 {
49 
50  class exception;
51  class config;
52  class context;
53  class symbol;
54  class params;
55  class param_descrs;
56  class ast;
57  class sort;
58  class func_decl;
59  class expr;
60  class solver;
61  class goal;
62  class tactic;
63  class probe;
64  class model;
65  class func_interp;
66  class func_entry;
67  class statistics;
68  class apply_result;
69  template<typename T> class cast_ast;
70  template<typename T> class ast_vector_tpl;
75 
76  inline void set_param(char const * param, char const * value) { Z3_global_param_set(param, value); }
77  inline void set_param(char const * param, bool value) { Z3_global_param_set(param, value ? "true" : "false"); }
78  inline void set_param(char const * param, int value) { auto str = std::to_string(value); Z3_global_param_set(param, str.c_str()); }
80 
84  class exception : public std::exception {
85  std::string m_msg;
86  public:
87  exception(char const * msg):m_msg(msg) {}
88  virtual ~exception() throw() {}
89  char const * msg() const { return m_msg.c_str(); }
90  char const * what() const throw() { return m_msg.c_str(); }
91  friend std::ostream & operator<<(std::ostream & out, exception const & e);
92  };
93  inline std::ostream & operator<<(std::ostream & out, exception const & e) { out << e.msg(); return out; }
94 
95 #if !defined(Z3_THROW)
96 #if __cpp_exceptions || _CPPUNWIND || __EXCEPTIONS
97 #define Z3_THROW(x) throw x
98 #else
99 #define Z3_THROW(x) {}
100 #endif
101 #endif // !defined(Z3_THROW)
102 
106  class config {
107  Z3_config m_cfg;
108  config(config const & s);
109  config & operator=(config const & s);
110  public:
111  config() { m_cfg = Z3_mk_config(); }
112  ~config() { Z3_del_config(m_cfg); }
113  operator Z3_config() const { return m_cfg; }
117  void set(char const * param, char const * value) { Z3_set_param_value(m_cfg, param, value); }
121  void set(char const * param, bool value) { Z3_set_param_value(m_cfg, param, value ? "true" : "false"); }
125  void set(char const * param, int value) {
126  auto str = std::to_string(value);
127  Z3_set_param_value(m_cfg, param, str.c_str());
128  }
129  };
130 
133  };
134 
140  RTZ
141  };
142 
144  if (l == Z3_L_TRUE) return sat;
145  else if (l == Z3_L_FALSE) return unsat;
146  return unknown;
147  }
148 
149 
155  class context {
156  private:
157  bool m_enable_exceptions;
158  rounding_mode m_rounding_mode;
159  Z3_context m_ctx;
160  void init(config & c) {
161  set_context(Z3_mk_context_rc(c));
162  }
163  void set_context(Z3_context ctx) {
164  m_ctx = ctx;
165  m_enable_exceptions = true;
166  m_rounding_mode = RNA;
167  Z3_set_error_handler(m_ctx, 0);
169  }
170 
171 
172  context(context const & s);
173  context & operator=(context const & s);
174 
175  friend class scoped_context;
176  context(Z3_context c) { set_context(c); }
177  void detach() { m_ctx = nullptr; }
178  public:
179  context() { config c; init(c); }
180  context(config & c) { init(c); }
181  ~context() { if (m_ctx) Z3_del_context(m_ctx); }
182  operator Z3_context() const { return m_ctx; }
183 
188  Z3_error_code e = Z3_get_error_code(m_ctx);
189  if (e != Z3_OK && enable_exceptions())
190  Z3_THROW(exception(Z3_get_error_msg(m_ctx, e)));
191  return e;
192  }
193 
194  void check_parser_error() const {
195  check_error();
196  }
197 
205  void set_enable_exceptions(bool f) { m_enable_exceptions = f; }
206 
207  bool enable_exceptions() const { return m_enable_exceptions; }
208 
212  void set(char const * param, char const * value) { Z3_update_param_value(m_ctx, param, value); }
216  void set(char const * param, bool value) { Z3_update_param_value(m_ctx, param, value ? "true" : "false"); }
220  void set(char const * param, int value) {
221  auto str = std::to_string(value);
222  Z3_update_param_value(m_ctx, param, str.c_str());
223  }
224 
229  void interrupt() { Z3_interrupt(m_ctx); }
230 
234  symbol str_symbol(char const * s);
238  symbol int_symbol(int n);
242  sort bool_sort();
246  sort int_sort();
250  sort real_sort();
254  sort bv_sort(unsigned sz);
258  sort string_sort();
262  sort seq_sort(sort& s);
272  sort array_sort(sort d, sort r);
273  sort array_sort(sort_vector const& d, sort r);
280  sort fpa_sort(unsigned ebits, unsigned sbits);
284  template<size_t precision>
299  sort enumeration_sort(char const * name, unsigned n, char const * const * enum_names, func_decl_vector & cs, func_decl_vector & ts);
300 
307  func_decl tuple_sort(char const * name, unsigned n, char const * const * names, sort const* sorts, func_decl_vector & projs);
308 
312  sort uninterpreted_sort(char const* name);
313  sort uninterpreted_sort(symbol const& name);
314 
315  func_decl function(symbol const & name, unsigned arity, sort const * domain, sort const & range);
316  func_decl function(char const * name, unsigned arity, sort const * domain, sort const & range);
317  func_decl function(symbol const& name, sort_vector const& domain, sort const& range);
318  func_decl function(char const * name, sort_vector const& domain, sort const& range);
319  func_decl function(char const * name, sort const & domain, sort const & range);
320  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & range);
321  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range);
322  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range);
323  func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & d5, sort const & range);
324 
325  func_decl recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range);
326  func_decl recfun(char const * name, unsigned arity, sort const * domain, sort const & range);
327  func_decl recfun(char const * name, sort const & domain, sort const & range);
328  func_decl recfun(char const * name, sort const & d1, sort const & d2, sort const & range);
329 
330  void recdef(func_decl, expr_vector const& args, expr const& body);
331 
332  expr constant(symbol const & name, sort const & s);
333  expr constant(char const * name, sort const & s);
334  expr bool_const(char const * name);
335  expr int_const(char const * name);
336  expr real_const(char const * name);
337  expr bv_const(char const * name, unsigned sz);
338  expr fpa_const(char const * name, unsigned ebits, unsigned sbits);
339 
340  template<size_t precision>
341  expr fpa_const(char const * name);
342 
343  expr bool_val(bool b);
344 
345  expr int_val(int n);
346  expr int_val(unsigned n);
347  expr int_val(int64_t n);
348  expr int_val(uint64_t n);
349  expr int_val(char const * n);
350 
351  expr real_val(int n, int d);
352  expr real_val(int n);
353  expr real_val(unsigned n);
354  expr real_val(int64_t n);
355  expr real_val(uint64_t n);
356  expr real_val(char const * n);
357 
358  expr bv_val(int n, unsigned sz);
359  expr bv_val(unsigned n, unsigned sz);
360  expr bv_val(int64_t n, unsigned sz);
361  expr bv_val(uint64_t n, unsigned sz);
362  expr bv_val(char const * n, unsigned sz);
363  expr bv_val(unsigned n, bool const* bits);
364 
365  expr fpa_val(double n);
366  expr fpa_val(float n);
367 
368  expr string_val(char const* s);
369  expr string_val(char const* s, unsigned n);
370  expr string_val(std::string const& s);
371 
372  expr num_val(int n, sort const & s);
373 
377  expr_vector parse_string(char const* s);
378  expr_vector parse_file(char const* file);
379 
380  expr_vector parse_string(char const* s, sort_vector const& sorts, func_decl_vector const& decls);
381  expr_vector parse_file(char const* s, sort_vector const& sorts, func_decl_vector const& decls);
382  };
383 
385  context m_ctx;
386  public:
387  scoped_context(Z3_context c): m_ctx(c) {}
388  ~scoped_context() { m_ctx.detach(); }
389  context& operator()() { return m_ctx; }
390  };
391 
392 
393  template<typename T>
394  class array {
395  T * m_array;
396  unsigned m_size;
397  array(array const & s);
398  array & operator=(array const & s);
399  public:
400  array(unsigned sz):m_size(sz) { m_array = new T[sz]; }
401  template<typename T2>
402  array(ast_vector_tpl<T2> const & v);
403  ~array() { delete[] m_array; }
404  void resize(unsigned sz) { delete[] m_array; m_size = sz; m_array = new T[sz]; }
405  unsigned size() const { return m_size; }
406  T & operator[](int i) { assert(0 <= i); assert(static_cast<unsigned>(i) < m_size); return m_array[i]; }
407  T const & operator[](int i) const { assert(0 <= i); assert(static_cast<unsigned>(i) < m_size); return m_array[i]; }
408  T const * ptr() const { return m_array; }
409  T * ptr() { return m_array; }
410  };
411 
412  class object {
413  protected:
415  public:
416  object(context & c):m_ctx(&c) {}
417  object(object const & s):m_ctx(s.m_ctx) {}
418  context & ctx() const { return *m_ctx; }
420  friend void check_context(object const & a, object const & b);
421  };
422  inline void check_context(object const & a, object const & b) { (void)a; (void)b; assert(a.m_ctx == b.m_ctx); }
423 
424  class symbol : public object {
425  Z3_symbol m_sym;
426  public:
427  symbol(context & c, Z3_symbol s):object(c), m_sym(s) {}
428  symbol(symbol const & s):object(s), m_sym(s.m_sym) {}
429  symbol & operator=(symbol const & s) { m_ctx = s.m_ctx; m_sym = s.m_sym; return *this; }
430  operator Z3_symbol() const { return m_sym; }
431  Z3_symbol_kind kind() const { return Z3_get_symbol_kind(ctx(), m_sym); }
432  std::string str() const { assert(kind() == Z3_STRING_SYMBOL); return Z3_get_symbol_string(ctx(), m_sym); }
433  int to_int() const { assert(kind() == Z3_INT_SYMBOL); return Z3_get_symbol_int(ctx(), m_sym); }
434  friend std::ostream & operator<<(std::ostream & out, symbol const & s);
435  };
436 
437  inline std::ostream & operator<<(std::ostream & out, symbol const & s) {
438  if (s.kind() == Z3_INT_SYMBOL)
439  out << "k!" << s.to_int();
440  else
441  out << s.str();
442  return out;
443  }
444 
445 
446  class param_descrs : public object {
447  Z3_param_descrs m_descrs;
448  public:
449  param_descrs(context& c, Z3_param_descrs d): object(c), m_descrs(d) { Z3_param_descrs_inc_ref(c, d); }
450  param_descrs(param_descrs const& o): object(o.ctx()), m_descrs(o.m_descrs) { Z3_param_descrs_inc_ref(ctx(), m_descrs); }
452  Z3_param_descrs_inc_ref(o.ctx(), o.m_descrs);
453  Z3_param_descrs_dec_ref(ctx(), m_descrs);
454  m_descrs = o.m_descrs;
455  m_ctx = o.m_ctx;
456  return *this;
457  }
460 
461  unsigned size() { return Z3_param_descrs_size(ctx(), m_descrs); }
462  symbol name(unsigned i) { return symbol(ctx(), Z3_param_descrs_get_name(ctx(), m_descrs, i)); }
463  Z3_param_kind kind(symbol const& s) { return Z3_param_descrs_get_kind(ctx(), m_descrs, s); }
464  std::string documentation(symbol const& s) { char const* r = Z3_param_descrs_get_documentation(ctx(), m_descrs, s); check_error(); return r; }
465  std::string to_string() const { return Z3_param_descrs_to_string(ctx(), m_descrs); }
466  };
467 
468  inline std::ostream& operator<<(std::ostream & out, param_descrs const & d) { return out << d.to_string(); }
469 
470  class params : public object {
471  Z3_params m_params;
472  public:
473  params(context & c):object(c) { m_params = Z3_mk_params(c); Z3_params_inc_ref(ctx(), m_params); }
474  params(params const & s):object(s), m_params(s.m_params) { Z3_params_inc_ref(ctx(), m_params); }
475  ~params() { Z3_params_dec_ref(ctx(), m_params); }
476  operator Z3_params() const { return m_params; }
477  params & operator=(params const & s) {
478  Z3_params_inc_ref(s.ctx(), s.m_params);
479  Z3_params_dec_ref(ctx(), m_params);
480  m_ctx = s.m_ctx;
481  m_params = s.m_params;
482  return *this;
483  }
484  void set(char const * k, bool b) { Z3_params_set_bool(ctx(), m_params, ctx().str_symbol(k), b); }
485  void set(char const * k, unsigned n) { Z3_params_set_uint(ctx(), m_params, ctx().str_symbol(k), n); }
486  void set(char const * k, double n) { Z3_params_set_double(ctx(), m_params, ctx().str_symbol(k), n); }
487  void set(char const * k, symbol const & s) { Z3_params_set_symbol(ctx(), m_params, ctx().str_symbol(k), s); }
488  void set(char const * k, char const* s) { Z3_params_set_symbol(ctx(), m_params, ctx().str_symbol(k), ctx().str_symbol(s)); }
489  friend std::ostream & operator<<(std::ostream & out, params const & p);
490  };
491 
492  inline std::ostream & operator<<(std::ostream & out, params const & p) {
493  out << Z3_params_to_string(p.ctx(), p); return out;
494  }
495 
496  class ast : public object {
497  protected:
498  Z3_ast m_ast;
499  public:
500  ast(context & c):object(c), m_ast(0) {}
501  ast(context & c, Z3_ast n):object(c), m_ast(n) { Z3_inc_ref(ctx(), m_ast); }
502  ast(ast const & s):object(s), m_ast(s.m_ast) { Z3_inc_ref(ctx(), m_ast); }
503  ~ast() { if (m_ast) Z3_dec_ref(*m_ctx, m_ast); }
504  operator Z3_ast() const { return m_ast; }
505  operator bool() const { return m_ast != 0; }
506  ast & operator=(ast const & s) { Z3_inc_ref(s.ctx(), s.m_ast); if (m_ast) Z3_dec_ref(ctx(), m_ast); m_ctx = s.m_ctx; m_ast = s.m_ast; return *this; }
507  Z3_ast_kind kind() const { Z3_ast_kind r = Z3_get_ast_kind(ctx(), m_ast); check_error(); return r; }
508  unsigned hash() const { unsigned r = Z3_get_ast_hash(ctx(), m_ast); check_error(); return r; }
509  friend std::ostream & operator<<(std::ostream & out, ast const & n);
510  std::string to_string() const { return std::string(Z3_ast_to_string(ctx(), m_ast)); }
511 
512 
516  friend bool eq(ast const & a, ast const & b);
517  };
518  inline std::ostream & operator<<(std::ostream & out, ast const & n) {
519  out << Z3_ast_to_string(n.ctx(), n.m_ast); return out;
520  }
521 
522  inline bool eq(ast const & a, ast const & b) { return Z3_is_eq_ast(a.ctx(), a, b); }
523 
524  template<typename T>
525  class ast_vector_tpl : public object {
526  Z3_ast_vector m_vector;
527  void init(Z3_ast_vector v) { Z3_ast_vector_inc_ref(ctx(), v); m_vector = v; }
528  public:
530  ast_vector_tpl(context & c, Z3_ast_vector v):object(c) { init(v); }
531  ast_vector_tpl(ast_vector_tpl const & s):object(s), m_vector(s.m_vector) { Z3_ast_vector_inc_ref(ctx(), m_vector); }
532  ast_vector_tpl(context& c, ast_vector_tpl const& src): object(c) { init(Z3_ast_vector_translate(src.ctx(), src, c)); }
533 
534  ~ast_vector_tpl() { Z3_ast_vector_dec_ref(ctx(), m_vector); }
535  operator Z3_ast_vector() const { return m_vector; }
536  unsigned size() const { return Z3_ast_vector_size(ctx(), m_vector); }
537  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); }
538  void push_back(T const & e) { Z3_ast_vector_push(ctx(), m_vector, e); check_error(); }
539  void resize(unsigned sz) { Z3_ast_vector_resize(ctx(), m_vector, sz); check_error(); }
540  T back() const { return operator[](size() - 1); }
541  void pop_back() { assert(size() > 0); resize(size() - 1); }
542  bool empty() const { return size() == 0; }
544  Z3_ast_vector_inc_ref(s.ctx(), s.m_vector);
545  Z3_ast_vector_dec_ref(ctx(), m_vector);
546  m_ctx = s.m_ctx;
547  m_vector = s.m_vector;
548  return *this;
549  }
550  ast_vector_tpl& set(unsigned idx, ast& a) {
551  Z3_ast_vector_set(ctx(), m_vector, idx, a);
552  return *this;
553  }
554  /*
555  Disabled pending C++98 build upgrade
556  bool contains(T const& x) const {
557  for (T y : *this) if (eq(x, y)) return true;
558  return false;
559  }
560  */
561 
562  class iterator {
563  ast_vector_tpl const* m_vector;
564  unsigned m_index;
565  public:
566  iterator(ast_vector_tpl const* v, unsigned i): m_vector(v), m_index(i) {}
567  iterator(iterator const& other): m_vector(other.m_vector), m_index(other.m_index) {}
568  iterator operator=(iterator const& other) { m_vector = other.m_vector; m_index = other.m_index; return *this; }
569 
570  bool operator==(iterator const& other) const {
571  return other.m_index == m_index;
572  };
573  bool operator!=(iterator const& other) const {
574  return other.m_index != m_index;
575  };
577  ++m_index;
578  return *this;
579  }
580  void set(T& arg) {
581  Z3_ast_vector_set(m_vector->ctx(), *m_vector, m_index, arg);
582  }
583  iterator operator++(int) { iterator tmp = *this; ++m_index; return tmp; }
584  T * operator->() const { return &(operator*()); }
585  T operator*() const { return (*m_vector)[m_index]; }
586  };
587  iterator begin() const { return iterator(this, 0); }
588  iterator end() const { return iterator(this, size()); }
589  friend std::ostream & operator<<(std::ostream & out, ast_vector_tpl const & v) { out << Z3_ast_vector_to_string(v.ctx(), v); return out; }
590  };
591 
592 
596  class sort : public ast {
597  public:
598  sort(context & c):ast(c) {}
599  sort(context & c, Z3_sort s):ast(c, reinterpret_cast<Z3_ast>(s)) {}
600  sort(context & c, Z3_ast a):ast(c, a) {}
601  sort(sort const & s):ast(s) {}
602  operator Z3_sort() const { return reinterpret_cast<Z3_sort>(m_ast); }
603 
607  unsigned id() const { unsigned r = Z3_get_sort_id(ctx(), *this); check_error(); return r; }
608 
612  sort & operator=(sort const & s) { return static_cast<sort&>(ast::operator=(s)); }
616  Z3_sort_kind sort_kind() const { return Z3_get_sort_kind(*m_ctx, *this); }
620  symbol name() const { Z3_symbol s = Z3_get_sort_name(ctx(), *this); check_error(); return symbol(ctx(), s); }
624  bool is_bool() const { return sort_kind() == Z3_BOOL_SORT; }
628  bool is_int() const { return sort_kind() == Z3_INT_SORT; }
632  bool is_real() const { return sort_kind() == Z3_REAL_SORT; }
636  bool is_arith() const { return is_int() || is_real(); }
640  bool is_bv() const { return sort_kind() == Z3_BV_SORT; }
644  bool is_array() const { return sort_kind() == Z3_ARRAY_SORT; }
648  bool is_datatype() const { return sort_kind() == Z3_DATATYPE_SORT; }
652  bool is_relation() const { return sort_kind() == Z3_RELATION_SORT; }
656  bool is_seq() const { return sort_kind() == Z3_SEQ_SORT; }
660  bool is_re() const { return sort_kind() == Z3_RE_SORT; }
664  bool is_finite_domain() const { return sort_kind() == Z3_FINITE_DOMAIN_SORT; }
668  bool is_fpa() const { return sort_kind() == Z3_FLOATING_POINT_SORT; }
669 
675  unsigned bv_size() const { assert(is_bv()); unsigned r = Z3_get_bv_sort_size(ctx(), *this); check_error(); return r; }
676 
677  unsigned fpa_ebits() const { assert(is_fpa()); unsigned r = Z3_fpa_get_ebits(ctx(), *this); check_error(); return r; }
678 
679  unsigned fpa_sbits() const { assert(is_fpa()); unsigned r = Z3_fpa_get_sbits(ctx(), *this); check_error(); return r; }
685  sort array_domain() const { assert(is_array()); Z3_sort s = Z3_get_array_sort_domain(ctx(), *this); check_error(); return sort(ctx(), s); }
691  sort array_range() const { assert(is_array()); Z3_sort s = Z3_get_array_sort_range(ctx(), *this); check_error(); return sort(ctx(), s); }
692  };
693 
698  class func_decl : public ast {
699  public:
700  func_decl(context & c):ast(c) {}
701  func_decl(context & c, Z3_func_decl n):ast(c, reinterpret_cast<Z3_ast>(n)) {}
702  func_decl(func_decl const & s):ast(s) {}
703  operator Z3_func_decl() const { return reinterpret_cast<Z3_func_decl>(m_ast); }
704  func_decl & operator=(func_decl const & s) { return static_cast<func_decl&>(ast::operator=(s)); }
705 
709  unsigned id() const { unsigned r = Z3_get_func_decl_id(ctx(), *this); check_error(); return r; }
710 
711  unsigned arity() const { return Z3_get_arity(ctx(), *this); }
712  sort domain(unsigned i) const { assert(i < arity()); Z3_sort r = Z3_get_domain(ctx(), *this, i); check_error(); return sort(ctx(), r); }
713  sort range() const { Z3_sort r = Z3_get_range(ctx(), *this); check_error(); return sort(ctx(), r); }
714  symbol name() const { Z3_symbol s = Z3_get_decl_name(ctx(), *this); check_error(); return symbol(ctx(), s); }
715  Z3_decl_kind decl_kind() const { return Z3_get_decl_kind(ctx(), *this); }
716 
718  Z3_func_decl tc = Z3_mk_transitive_closure(ctx(), *this); check_error(); return func_decl(ctx(), tc);
719  }
720 
721  bool is_const() const { return arity() == 0; }
722 
723  expr operator()() const;
724  expr operator()(unsigned n, expr const * args) const;
725  expr operator()(expr_vector const& v) const;
726  expr operator()(expr const & a) const;
727  expr operator()(int a) const;
728  expr operator()(expr const & a1, expr const & a2) const;
729  expr operator()(expr const & a1, int a2) const;
730  expr operator()(int a1, expr const & a2) const;
731  expr operator()(expr const & a1, expr const & a2, expr const & a3) const;
732  expr operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const;
733  expr operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const;
734  };
735 
739  expr select(expr const & a, expr const& i);
740  expr select(expr const & a, expr_vector const & i);
741 
746  class expr : public ast {
747  public:
748  expr(context & c):ast(c) {}
749  expr(context & c, Z3_ast n):ast(c, reinterpret_cast<Z3_ast>(n)) {}
750  expr(expr const & n):ast(n) {}
751  expr & operator=(expr const & n) { return static_cast<expr&>(ast::operator=(n)); }
752 
756  sort get_sort() const { Z3_sort s = Z3_get_sort(*m_ctx, m_ast); check_error(); return sort(*m_ctx, s); }
757 
761  bool is_bool() const { return get_sort().is_bool(); }
765  bool is_int() const { return get_sort().is_int(); }
769  bool is_real() const { return get_sort().is_real(); }
773  bool is_arith() const { return get_sort().is_arith(); }
777  bool is_bv() const { return get_sort().is_bv(); }
781  bool is_array() const { return get_sort().is_array(); }
785  bool is_datatype() const { return get_sort().is_datatype(); }
789  bool is_relation() const { return get_sort().is_relation(); }
793  bool is_seq() const { return get_sort().is_seq(); }
797  bool is_re() const { return get_sort().is_re(); }
798 
807  bool is_finite_domain() const { return get_sort().is_finite_domain(); }
811  bool is_fpa() const { return get_sort().is_fpa(); }
812 
818  bool is_numeral() const { return kind() == Z3_NUMERAL_AST; }
819  bool is_numeral_i64(int64_t& i) const { bool r = Z3_get_numeral_int64(ctx(), m_ast, &i); check_error(); return r;}
820  bool is_numeral_u64(uint64_t& i) const { bool r = Z3_get_numeral_uint64(ctx(), m_ast, &i); check_error(); return r;}
821  bool is_numeral_i(int& i) const { bool r = Z3_get_numeral_int(ctx(), m_ast, &i); check_error(); return r;}
822  bool is_numeral_u(unsigned& i) const { bool r = Z3_get_numeral_uint(ctx(), m_ast, &i); check_error(); return r;}
823  bool is_numeral(std::string& s) const { if (!is_numeral()) return false; s = Z3_get_numeral_string(ctx(), m_ast); check_error(); return true; }
824  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; }
825  bool is_numeral(double& d) const { if (!is_numeral()) return false; d = Z3_get_numeral_double(ctx(), m_ast); check_error(); return true; }
826  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; }
827 
831  bool is_app() const { return kind() == Z3_APP_AST || kind() == Z3_NUMERAL_AST; }
835  bool is_const() const { return is_app() && num_args() == 0; }
839  bool is_quantifier() const { return kind() == Z3_QUANTIFIER_AST; }
840 
844  bool is_forall() const { return Z3_is_quantifier_forall(ctx(), m_ast); }
848  bool is_exists() const { return Z3_is_quantifier_exists(ctx(), m_ast); }
852  bool is_lambda() const { return Z3_is_lambda(ctx(), m_ast); }
857  bool is_var() const { return kind() == Z3_VAR_AST; }
861  bool is_algebraic() const { return Z3_is_algebraic_number(ctx(), m_ast); }
862 
866  bool is_well_sorted() const { bool r = Z3_is_well_sorted(ctx(), m_ast); check_error(); return r; }
867 
874  std::string get_decimal_string(int precision) const {
875  assert(is_numeral() || is_algebraic());
876  return std::string(Z3_get_numeral_decimal_string(ctx(), m_ast, precision));
877  }
878 
882  expr algebraic_lower(unsigned precision) const {
883  assert(is_algebraic());
884  Z3_ast r = Z3_get_algebraic_number_lower(ctx(), m_ast, precision);
885  check_error();
886  return expr(ctx(), r);
887  }
888 
889  expr algebraic_upper(unsigned precision) const {
890  assert(is_algebraic());
891  Z3_ast r = Z3_get_algebraic_number_upper(ctx(), m_ast, precision);
892  check_error();
893  return expr(ctx(), r);
894  }
895 
900  assert(is_algebraic());
901  Z3_ast_vector r = Z3_algebraic_get_poly(ctx(), m_ast);
902  check_error();
903  return expr_vector(ctx(), r);
904  }
905 
909  unsigned algebraic_i() const {
910  assert(is_algebraic());
911  unsigned i = Z3_algebraic_get_i(ctx(), m_ast);
912  check_error();
913  return i;
914  }
915 
919  unsigned id() const { unsigned r = Z3_get_ast_id(ctx(), m_ast); check_error(); return r; }
920 
931  int get_numeral_int() const {
932  int result = 0;
933  if (!is_numeral_i(result)) {
934  assert(ctx().enable_exceptions());
935  if (!ctx().enable_exceptions()) return 0;
936  Z3_THROW(exception("numeral does not fit in machine int"));
937  }
938  return result;
939  }
940 
950  unsigned get_numeral_uint() const {
951  assert(is_numeral());
952  unsigned result = 0;
953  if (!is_numeral_u(result)) {
954  assert(ctx().enable_exceptions());
955  if (!ctx().enable_exceptions()) return 0;
956  Z3_THROW(exception("numeral does not fit in machine uint"));
957  }
958  return result;
959  }
960 
967  int64_t get_numeral_int64() const {
968  assert(is_numeral());
969  int64_t result = 0;
970  if (!is_numeral_i64(result)) {
971  assert(ctx().enable_exceptions());
972  if (!ctx().enable_exceptions()) return 0;
973  Z3_THROW(exception("numeral does not fit in machine int64_t"));
974  }
975  return result;
976  }
977 
984  uint64_t get_numeral_uint64() const {
985  assert(is_numeral());
986  uint64_t result = 0;
987  if (!is_numeral_u64(result)) {
988  assert(ctx().enable_exceptions());
989  if (!ctx().enable_exceptions()) return 0;
990  Z3_THROW(exception("numeral does not fit in machine uint64_t"));
991  }
992  return result;
993  }
994 
996  return Z3_get_bool_value(ctx(), m_ast);
997  }
998 
999  expr numerator() const {
1000  assert(is_numeral());
1001  Z3_ast r = Z3_get_numerator(ctx(), m_ast);
1002  check_error();
1003  return expr(ctx(),r);
1004  }
1005 
1006 
1007  expr denominator() const {
1008  assert(is_numeral());
1009  Z3_ast r = Z3_get_denominator(ctx(), m_ast);
1010  check_error();
1011  return expr(ctx(),r);
1012  }
1013 
1014 
1019  bool is_string_value() const { return Z3_is_string(ctx(), m_ast); }
1020 
1026  std::string get_escaped_string() const {
1027  assert(is_string_value());
1028  char const* s = Z3_get_string(ctx(), m_ast);
1029  check_error();
1030  return std::string(s);
1031  }
1032 
1033  std::string get_string() const {
1034  assert(is_string_value());
1035  unsigned n;
1036  char const* s = Z3_get_lstring(ctx(), m_ast, &n);
1037  check_error();
1038  return std::string(s, n);
1039  }
1040 
1041  operator Z3_app() const { assert(is_app()); return reinterpret_cast<Z3_app>(m_ast); }
1042 
1047  assert(is_fpa());
1048  Z3_sort s = ctx().fpa_rounding_mode();
1049  check_error();
1050  return sort(ctx(), s);
1051  }
1052 
1053 
1060  func_decl decl() const { Z3_func_decl f = Z3_get_app_decl(ctx(), *this); check_error(); return func_decl(ctx(), f); }
1067  unsigned num_args() const { unsigned r = Z3_get_app_num_args(ctx(), *this); check_error(); return r; }
1075  expr arg(unsigned i) const { Z3_ast r = Z3_get_app_arg(ctx(), *this, i); check_error(); return expr(ctx(), r); }
1076 
1082  expr body() const { assert(is_quantifier()); Z3_ast r = Z3_get_quantifier_body(ctx(), *this); check_error(); return expr(ctx(), r); }
1083 
1089  friend expr operator!(expr const & a);
1090 
1097  friend expr operator&&(expr const & a, expr const & b);
1098 
1099 
1106  friend expr operator&&(expr const & a, bool b);
1113  friend expr operator&&(bool a, expr const & b);
1114 
1121  friend expr operator||(expr const & a, expr const & b);
1128  friend expr operator||(expr const & a, bool b);
1129 
1136  friend expr operator||(bool a, expr const & b);
1137 
1138  friend expr implies(expr const & a, expr const & b);
1139  friend expr implies(expr const & a, bool b);
1140  friend expr implies(bool a, expr const & b);
1141 
1142  friend expr mk_or(expr_vector const& args);
1143  friend expr mk_and(expr_vector const& args);
1144 
1145  friend expr ite(expr const & c, expr const & t, expr const & e);
1146 
1147  bool is_true() const { return is_app() && Z3_OP_TRUE == decl().decl_kind(); }
1148  bool is_false() const { return is_app() && Z3_OP_FALSE == decl().decl_kind(); }
1149  bool is_not() const { return is_app() && Z3_OP_NOT == decl().decl_kind(); }
1150  bool is_and() const { return is_app() && Z3_OP_AND == decl().decl_kind(); }
1151  bool is_or() const { return is_app() && Z3_OP_OR == decl().decl_kind(); }
1152  bool is_xor() const { return is_app() && Z3_OP_XOR == decl().decl_kind(); }
1153  bool is_implies() const { return is_app() && Z3_OP_IMPLIES == decl().decl_kind(); }
1154  bool is_eq() const { return is_app() && Z3_OP_EQ == decl().decl_kind(); }
1155  bool is_ite() const { return is_app() && Z3_OP_ITE == decl().decl_kind(); }
1156  bool is_distinct() const { return is_app() && Z3_OP_DISTINCT == decl().decl_kind(); }
1157 
1158  friend expr distinct(expr_vector const& args);
1159  friend expr concat(expr const& a, expr const& b);
1160  friend expr concat(expr_vector const& args);
1161 
1162  friend expr operator==(expr const & a, expr const & b);
1163  friend expr operator==(expr const & a, int b);
1164  friend expr operator==(int a, expr const & b);
1165 
1166  friend expr operator!=(expr const & a, expr const & b);
1167  friend expr operator!=(expr const & a, int b);
1168  friend expr operator!=(int a, expr const & b);
1169 
1170  friend expr operator+(expr const & a, expr const & b);
1171  friend expr operator+(expr const & a, int b);
1172  friend expr operator+(int a, expr const & b);
1173  friend expr sum(expr_vector const& args);
1174 
1175  friend expr operator*(expr const & a, expr const & b);
1176  friend expr operator*(expr const & a, int b);
1177  friend expr operator*(int a, expr const & b);
1178 
1179  /* \brief Power operator */
1180  friend expr pw(expr const & a, expr const & b);
1181  friend expr pw(expr const & a, int b);
1182  friend expr pw(int a, expr const & b);
1183 
1184  /* \brief mod operator */
1185  friend expr mod(expr const& a, expr const& b);
1186  friend expr mod(expr const& a, int b);
1187  friend expr mod(int a, expr const& b);
1188 
1189  /* \brief rem operator */
1190  friend expr rem(expr const& a, expr const& b);
1191  friend expr rem(expr const& a, int b);
1192  friend expr rem(int a, expr const& b);
1193 
1194  friend expr is_int(expr const& e);
1195 
1196  friend expr operator/(expr const & a, expr const & b);
1197  friend expr operator/(expr const & a, int b);
1198  friend expr operator/(int a, expr const & b);
1199 
1200  friend expr operator-(expr const & a);
1201 
1202  friend expr operator-(expr const & a, expr const & b);
1203  friend expr operator-(expr const & a, int b);
1204  friend expr operator-(int a, expr const & b);
1205 
1206  friend expr operator<=(expr const & a, expr const & b);
1207  friend expr operator<=(expr const & a, int b);
1208  friend expr operator<=(int a, expr const & b);
1209 
1210 
1211  friend expr operator>=(expr const & a, expr const & b);
1212  friend expr operator>=(expr const & a, int b);
1213  friend expr operator>=(int a, expr const & b);
1214 
1215  friend expr operator<(expr const & a, expr const & b);
1216  friend expr operator<(expr const & a, int b);
1217  friend expr operator<(int a, expr const & b);
1218 
1219  friend expr operator>(expr const & a, expr const & b);
1220  friend expr operator>(expr const & a, int b);
1221  friend expr operator>(int a, expr const & b);
1222 
1223  friend expr pble(expr_vector const& es, int const * coeffs, int bound);
1224  friend expr pbge(expr_vector const& es, int const * coeffs, int bound);
1225  friend expr pbeq(expr_vector const& es, int const * coeffs, int bound);
1226  friend expr atmost(expr_vector const& es, unsigned bound);
1227  friend expr atleast(expr_vector const& es, unsigned bound);
1228 
1229  friend expr operator&(expr const & a, expr const & b);
1230  friend expr operator&(expr const & a, int b);
1231  friend expr operator&(int a, expr const & b);
1232 
1233  friend expr operator^(expr const & a, expr const & b);
1234  friend expr operator^(expr const & a, int b);
1235  friend expr operator^(int a, expr const & b);
1236 
1237  friend expr operator|(expr const & a, expr const & b);
1238  friend expr operator|(expr const & a, int b);
1239  friend expr operator|(int a, expr const & b);
1240  friend expr nand(expr const& a, expr const& b);
1241  friend expr nor(expr const& a, expr const& b);
1242  friend expr xnor(expr const& a, expr const& b);
1243 
1244  friend expr min(expr const& a, expr const& b);
1245  friend expr max(expr const& a, expr const& b);
1246 
1247  friend expr bv2int(expr const& a, bool is_signed);
1248  friend expr int2bv(unsigned n, expr const& a);
1249  friend expr bvadd_no_overflow(expr const& a, expr const& b, bool is_signed);
1250  friend expr bvadd_no_underflow(expr const& a, expr const& b);
1251  friend expr bvsub_no_overflow(expr const& a, expr const& b);
1252  friend expr bvsub_no_underflow(expr const& a, expr const& b, bool is_signed);
1253  friend expr bvsdiv_no_overflow(expr const& a, expr const& b);
1254  friend expr bvneg_no_overflow(expr const& a);
1255  friend expr bvmul_no_overflow(expr const& a, expr const& b, bool is_signed);
1256  friend expr bvmul_no_underflow(expr const& a, expr const& b);
1257 
1258  expr rotate_left(unsigned i) { Z3_ast r = Z3_mk_rotate_left(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1259  expr rotate_right(unsigned i) { Z3_ast r = Z3_mk_rotate_right(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1260  expr repeat(unsigned i) { Z3_ast r = Z3_mk_repeat(ctx(), i, *this); ctx().check_error(); return expr(ctx(), r); }
1261 
1262  friend expr abs(expr const & a);
1263  friend expr sqrt(expr const & a, expr const & rm);
1264 
1265  friend expr operator~(expr const & a);
1266  expr extract(unsigned hi, unsigned lo) const { Z3_ast r = Z3_mk_extract(ctx(), hi, lo, *this); ctx().check_error(); return expr(ctx(), r); }
1267  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)); }
1268  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)); }
1269 
1273  friend expr fma(expr const& a, expr const& b, expr const& c, expr const& rm);
1274 
1280  expr extract(expr const& offset, expr const& length) const {
1281  check_context(*this, offset); check_context(offset, length);
1282  Z3_ast r = Z3_mk_seq_extract(ctx(), *this, offset, length); check_error(); return expr(ctx(), r);
1283  }
1284  expr replace(expr const& src, expr const& dst) const {
1285  check_context(*this, src); check_context(src, dst);
1286  Z3_ast r = Z3_mk_seq_replace(ctx(), *this, src, dst);
1287  check_error();
1288  return expr(ctx(), r);
1289  }
1290  expr unit() const {
1291  Z3_ast r = Z3_mk_seq_unit(ctx(), *this);
1292  check_error();
1293  return expr(ctx(), r);
1294  }
1295  expr contains(expr const& s) {
1296  check_context(*this, s);
1297  Z3_ast r = Z3_mk_seq_contains(ctx(), *this, s);
1298  check_error();
1299  return expr(ctx(), r);
1300  }
1301  expr at(expr const& index) const {
1302  check_context(*this, index);
1303  Z3_ast r = Z3_mk_seq_at(ctx(), *this, index);
1304  check_error();
1305  return expr(ctx(), r);
1306  }
1307  expr nth(expr const& index) const {
1308  check_context(*this, index);
1309  Z3_ast r = Z3_mk_seq_nth(ctx(), *this, index);
1310  check_error();
1311  return expr(ctx(), r);
1312  }
1313  expr length() const {
1314  Z3_ast r = Z3_mk_seq_length(ctx(), *this);
1315  check_error();
1316  return expr(ctx(), r);
1317  }
1318  expr stoi() const {
1319  Z3_ast r = Z3_mk_str_to_int(ctx(), *this);
1320  check_error();
1321  return expr(ctx(), r);
1322  }
1323  expr itos() const {
1324  Z3_ast r = Z3_mk_int_to_str(ctx(), *this);
1325  check_error();
1326  return expr(ctx(), r);
1327  }
1328 
1329  friend expr range(expr const& lo, expr const& hi);
1333  expr loop(unsigned lo) {
1334  Z3_ast r = Z3_mk_re_loop(ctx(), m_ast, lo, 0);
1335  check_error();
1336  return expr(ctx(), r);
1337  }
1338  expr loop(unsigned lo, unsigned hi) {
1339  Z3_ast r = Z3_mk_re_loop(ctx(), m_ast, lo, hi);
1340  check_error();
1341  return expr(ctx(), r);
1342  }
1343 
1347  expr operator[](expr const& index) const {
1348  assert(is_array() || is_seq());
1349  if (is_array()) {
1350  return select(*this, index);
1351  }
1352  return nth(index);
1353  }
1354 
1355  expr operator[](expr_vector const& index) const {
1356  return select(*this, index);
1357  }
1358 
1362  expr simplify() const { Z3_ast r = Z3_simplify(ctx(), m_ast); check_error(); return expr(ctx(), r); }
1366  expr simplify(params const & p) const { Z3_ast r = Z3_simplify_ex(ctx(), m_ast, p); check_error(); return expr(ctx(), r); }
1367 
1371  expr substitute(expr_vector const& src, expr_vector const& dst);
1372 
1376  expr substitute(expr_vector const& dst);
1377 
1378  };
1379 
1380 #define _Z3_MK_BIN_(a, b, binop) \
1381  check_context(a, b); \
1382  Z3_ast r = binop(a.ctx(), a, b); \
1383  a.check_error(); \
1384  return expr(a.ctx(), r); \
1385 
1386 
1387  inline expr implies(expr const & a, expr const & b) {
1388  assert(a.is_bool() && b.is_bool());
1389  _Z3_MK_BIN_(a, b, Z3_mk_implies);
1390  }
1391  inline expr implies(expr const & a, bool b) { return implies(a, a.ctx().bool_val(b)); }
1392  inline expr implies(bool a, expr const & b) { return implies(b.ctx().bool_val(a), b); }
1393 
1394 
1395  inline expr pw(expr const & a, expr const & b) { _Z3_MK_BIN_(a, b, Z3_mk_power); }
1396  inline expr pw(expr const & a, int b) { return pw(a, a.ctx().num_val(b, a.get_sort())); }
1397  inline expr pw(int a, expr const & b) { return pw(b.ctx().num_val(a, b.get_sort()), b); }
1398 
1399  inline expr mod(expr const& a, expr const& b) {
1400  if (a.is_bv()) {
1401  _Z3_MK_BIN_(a, b, Z3_mk_bvsmod);
1402  }
1403  else {
1404  _Z3_MK_BIN_(a, b, Z3_mk_mod);
1405  }
1406  }
1407  inline expr mod(expr const & a, int b) { return mod(a, a.ctx().num_val(b, a.get_sort())); }
1408  inline expr mod(int a, expr const & b) { return mod(b.ctx().num_val(a, b.get_sort()), b); }
1409 
1410  inline expr operator%(expr const& a, expr const& b) { return mod(a, b); }
1411  inline expr operator%(expr const& a, int b) { return mod(a, b); }
1412  inline expr operator%(int a, expr const& b) { return mod(a, b); }
1413 
1414 
1415  inline expr rem(expr const& a, expr const& b) {
1416  if (a.is_fpa() && b.is_fpa()) {
1417  _Z3_MK_BIN_(a, b, Z3_mk_fpa_rem);
1418  } else {
1419  _Z3_MK_BIN_(a, b, Z3_mk_rem);
1420  }
1421  }
1422  inline expr rem(expr const & a, int b) { return rem(a, a.ctx().num_val(b, a.get_sort())); }
1423  inline expr rem(int a, expr const & b) { return rem(b.ctx().num_val(a, b.get_sort()), b); }
1424 
1425 #undef _Z3_MK_BIN_
1426 
1427 #define _Z3_MK_UN_(a, mkun) \
1428  Z3_ast r = mkun(a.ctx(), a); \
1429  a.check_error(); \
1430  return expr(a.ctx(), r); \
1431 
1432 
1433  inline expr operator!(expr const & a) { assert(a.is_bool()); _Z3_MK_UN_(a, Z3_mk_not); }
1434 
1435  inline expr is_int(expr const& e) { _Z3_MK_UN_(e, Z3_mk_is_int); }
1436 
1437 #undef _Z3_MK_UN_
1438 
1439  inline expr operator&&(expr const & a, expr const & b) {
1440  check_context(a, b);
1441  assert(a.is_bool() && b.is_bool());
1442  Z3_ast args[2] = { a, b };
1443  Z3_ast r = Z3_mk_and(a.ctx(), 2, args);
1444  a.check_error();
1445  return expr(a.ctx(), r);
1446  }
1447 
1448  inline expr operator&&(expr const & a, bool b) { return a && a.ctx().bool_val(b); }
1449  inline expr operator&&(bool a, expr const & b) { return b.ctx().bool_val(a) && b; }
1450 
1451  inline expr operator||(expr const & a, expr const & b) {
1452  check_context(a, b);
1453  assert(a.is_bool() && b.is_bool());
1454  Z3_ast args[2] = { a, b };
1455  Z3_ast r = Z3_mk_or(a.ctx(), 2, args);
1456  a.check_error();
1457  return expr(a.ctx(), r);
1458  }
1459 
1460  inline expr operator||(expr const & a, bool b) { return a || a.ctx().bool_val(b); }
1461 
1462  inline expr operator||(bool a, expr const & b) { return b.ctx().bool_val(a) || b; }
1463 
1464  inline expr operator==(expr const & a, expr const & b) {
1465  check_context(a, b);
1466  Z3_ast r = Z3_mk_eq(a.ctx(), a, b);
1467  a.check_error();
1468  return expr(a.ctx(), r);
1469  }
1470  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()); }
1471  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; }
1472 
1473  inline expr operator!=(expr const & a, expr const & b) {
1474  check_context(a, b);
1475  Z3_ast args[2] = { a, b };
1476  Z3_ast r = Z3_mk_distinct(a.ctx(), 2, args);
1477  a.check_error();
1478  return expr(a.ctx(), r);
1479  }
1480  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()); }
1481  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; }
1482 
1483  inline expr operator+(expr const & a, expr const & b) {
1484  check_context(a, b);
1485  Z3_ast r = 0;
1486  if (a.is_arith() && b.is_arith()) {
1487  Z3_ast args[2] = { a, b };
1488  r = Z3_mk_add(a.ctx(), 2, args);
1489  }
1490  else if (a.is_bv() && b.is_bv()) {
1491  r = Z3_mk_bvadd(a.ctx(), a, b);
1492  }
1493  else if (a.is_seq() && b.is_seq()) {
1494  return concat(a, b);
1495  }
1496  else if (a.is_re() && b.is_re()) {
1497  Z3_ast _args[2] = { a, b };
1498  r = Z3_mk_re_union(a.ctx(), 2, _args);
1499  }
1500  else if (a.is_fpa() && b.is_fpa()) {
1501  r = Z3_mk_fpa_add(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1502  }
1503  else {
1504  // operator is not supported by given arguments.
1505  assert(false);
1506  }
1507  a.check_error();
1508  return expr(a.ctx(), r);
1509  }
1510  inline expr operator+(expr const & a, int b) { return a + a.ctx().num_val(b, a.get_sort()); }
1511  inline expr operator+(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) + b; }
1512 
1513  inline expr operator*(expr const & a, expr const & b) {
1514  check_context(a, b);
1515  Z3_ast r = 0;
1516  if (a.is_arith() && b.is_arith()) {
1517  Z3_ast args[2] = { a, b };
1518  r = Z3_mk_mul(a.ctx(), 2, args);
1519  }
1520  else if (a.is_bv() && b.is_bv()) {
1521  r = Z3_mk_bvmul(a.ctx(), a, b);
1522  }
1523  else if (a.is_fpa() && b.is_fpa()) {
1524  r = Z3_mk_fpa_mul(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1525  }
1526  else {
1527  // operator is not supported by given arguments.
1528  assert(false);
1529  }
1530  a.check_error();
1531  return expr(a.ctx(), r);
1532  }
1533  inline expr operator*(expr const & a, int b) { return a * a.ctx().num_val(b, a.get_sort()); }
1534  inline expr operator*(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) * b; }
1535 
1536 
1537  inline expr operator>=(expr const & a, expr const & b) {
1538  check_context(a, b);
1539  Z3_ast r = 0;
1540  if (a.is_arith() && b.is_arith()) {
1541  r = Z3_mk_ge(a.ctx(), a, b);
1542  }
1543  else if (a.is_bv() && b.is_bv()) {
1544  r = Z3_mk_bvsge(a.ctx(), a, b);
1545  }
1546  else {
1547  // operator is not supported by given arguments.
1548  assert(false);
1549  }
1550  a.check_error();
1551  return expr(a.ctx(), r);
1552  }
1553 
1554  inline expr operator/(expr const & a, expr const & b) {
1555  check_context(a, b);
1556  Z3_ast r = 0;
1557  if (a.is_arith() && b.is_arith()) {
1558  r = Z3_mk_div(a.ctx(), a, b);
1559  }
1560  else if (a.is_bv() && b.is_bv()) {
1561  r = Z3_mk_bvsdiv(a.ctx(), a, b);
1562  }
1563  else if (a.is_fpa() && b.is_fpa()) {
1564  r = Z3_mk_fpa_div(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1565  }
1566  else {
1567  // operator is not supported by given arguments.
1568  assert(false);
1569  }
1570  a.check_error();
1571  return expr(a.ctx(), r);
1572  }
1573  inline expr operator/(expr const & a, int b) { return a / a.ctx().num_val(b, a.get_sort()); }
1574  inline expr operator/(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) / b; }
1575 
1576  inline expr operator-(expr const & a) {
1577  Z3_ast r = 0;
1578  if (a.is_arith()) {
1579  r = Z3_mk_unary_minus(a.ctx(), a);
1580  }
1581  else if (a.is_bv()) {
1582  r = Z3_mk_bvneg(a.ctx(), a);
1583  }
1584  else if (a.is_fpa()) {
1585  r = Z3_mk_fpa_neg(a.ctx(), a);
1586  }
1587  else {
1588  // operator is not supported by given arguments.
1589  assert(false);
1590  }
1591  a.check_error();
1592  return expr(a.ctx(), r);
1593  }
1594 
1595  inline expr operator-(expr const & a, expr const & b) {
1596  check_context(a, b);
1597  Z3_ast r = 0;
1598  if (a.is_arith() && b.is_arith()) {
1599  Z3_ast args[2] = { a, b };
1600  r = Z3_mk_sub(a.ctx(), 2, args);
1601  }
1602  else if (a.is_bv() && b.is_bv()) {
1603  r = Z3_mk_bvsub(a.ctx(), a, b);
1604  }
1605  else if (a.is_fpa() && b.is_fpa()) {
1606  r = Z3_mk_fpa_sub(a.ctx(), a.ctx().fpa_rounding_mode(), a, b);
1607  }
1608  else {
1609  // operator is not supported by given arguments.
1610  assert(false);
1611  }
1612  a.check_error();
1613  return expr(a.ctx(), r);
1614  }
1615  inline expr operator-(expr const & a, int b) { return a - a.ctx().num_val(b, a.get_sort()); }
1616  inline expr operator-(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) - b; }
1617 
1618  inline expr operator<=(expr const & a, expr const & b) {
1619  check_context(a, b);
1620  Z3_ast r = 0;
1621  if (a.is_arith() && b.is_arith()) {
1622  r = Z3_mk_le(a.ctx(), a, b);
1623  }
1624  else if (a.is_bv() && b.is_bv()) {
1625  r = Z3_mk_bvsle(a.ctx(), a, b);
1626  }
1627  else if (a.is_fpa() && b.is_fpa()) {
1628  r = Z3_mk_fpa_leq(a.ctx(), a, b);
1629  }
1630  else {
1631  // operator is not supported by given arguments.
1632  assert(false);
1633  }
1634  a.check_error();
1635  return expr(a.ctx(), r);
1636  }
1637  inline expr operator<=(expr const & a, int b) { return a <= a.ctx().num_val(b, a.get_sort()); }
1638  inline expr operator<=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) <= b; }
1639 
1640  inline expr operator>=(expr const & a, int b) { return a >= a.ctx().num_val(b, a.get_sort()); }
1641  inline expr operator>=(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) >= b; }
1642 
1643  inline expr operator<(expr const & a, expr const & b) {
1644  check_context(a, b);
1645  Z3_ast r = 0;
1646  if (a.is_arith() && b.is_arith()) {
1647  r = Z3_mk_lt(a.ctx(), a, b);
1648  }
1649  else if (a.is_bv() && b.is_bv()) {
1650  r = Z3_mk_bvslt(a.ctx(), a, b);
1651  }
1652  else if (a.is_fpa() && b.is_fpa()) {
1653  r = Z3_mk_fpa_lt(a.ctx(), a, b);
1654  }
1655  else {
1656  // operator is not supported by given arguments.
1657  assert(false);
1658  }
1659  a.check_error();
1660  return expr(a.ctx(), r);
1661  }
1662  inline expr operator<(expr const & a, int b) { return a < a.ctx().num_val(b, a.get_sort()); }
1663  inline expr operator<(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) < b; }
1664 
1665  inline expr operator>(expr const & a, expr const & b) {
1666  check_context(a, b);
1667  Z3_ast r = 0;
1668  if (a.is_arith() && b.is_arith()) {
1669  r = Z3_mk_gt(a.ctx(), a, b);
1670  }
1671  else if (a.is_bv() && b.is_bv()) {
1672  r = Z3_mk_bvsgt(a.ctx(), a, b);
1673  }
1674  else if (a.is_fpa() && b.is_fpa()) {
1675  r = Z3_mk_fpa_gt(a.ctx(), a, b);
1676  }
1677  else {
1678  // operator is not supported by given arguments.
1679  assert(false);
1680  }
1681  a.check_error();
1682  return expr(a.ctx(), r);
1683  }
1684  inline expr operator>(expr const & a, int b) { return a > a.ctx().num_val(b, a.get_sort()); }
1685  inline expr operator>(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) > b; }
1686 
1687  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); }
1688  inline expr operator&(expr const & a, int b) { return a & a.ctx().num_val(b, a.get_sort()); }
1689  inline expr operator&(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) & b; }
1690 
1691  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); }
1692  inline expr operator^(expr const & a, int b) { return a ^ a.ctx().num_val(b, a.get_sort()); }
1693  inline expr operator^(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) ^ b; }
1694 
1695  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); }
1696  inline expr operator|(expr const & a, int b) { return a | a.ctx().num_val(b, a.get_sort()); }
1697  inline expr operator|(int a, expr const & b) { return b.ctx().num_val(a, b.get_sort()) | b; }
1698 
1699  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); }
1700  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); }
1701  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); }
1702  inline expr min(expr const& a, expr const& b) {
1703  check_context(a, b);
1704  Z3_ast r;
1705  if (a.is_arith()) {
1706  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), b, a);
1707  }
1708  else if (a.is_bv()) {
1709  r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), b, a);
1710  }
1711  else {
1712  assert(a.is_fpa());
1713  r = Z3_mk_fpa_min(a.ctx(), a, b);
1714  }
1715  return expr(a.ctx(), r);
1716  }
1717  inline expr max(expr const& a, expr const& b) {
1718  check_context(a, b);
1719  Z3_ast r;
1720  if (a.is_arith()) {
1721  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, b), a, b);
1722  }
1723  else if (a.is_bv()) {
1724  r = Z3_mk_ite(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b), a, b);
1725  }
1726  else {
1727  assert(a.is_fpa());
1728  r = Z3_mk_fpa_max(a.ctx(), a, b);
1729  }
1730  return expr(a.ctx(), r);
1731  }
1732  inline expr abs(expr const & a) {
1733  Z3_ast r;
1734  if (a.is_int()) {
1735  expr zero = a.ctx().int_val(0);
1736  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, zero), a, -a);
1737  }
1738  else if (a.is_real()) {
1739  expr zero = a.ctx().real_val(0);
1740  r = Z3_mk_ite(a.ctx(), Z3_mk_ge(a.ctx(), a, zero), a, -a);
1741  }
1742  else {
1743  r = Z3_mk_fpa_abs(a.ctx(), a);
1744  }
1745  a.check_error();
1746  return expr(a.ctx(), r);
1747  }
1748  inline expr sqrt(expr const & a, expr const& rm) {
1749  check_context(a, rm);
1750  assert(a.is_fpa());
1751  Z3_ast r = Z3_mk_fpa_sqrt(a.ctx(), rm, a);
1752  a.check_error();
1753  return expr(a.ctx(), r);
1754  }
1755  inline expr operator~(expr const & a) { Z3_ast r = Z3_mk_bvnot(a.ctx(), a); return expr(a.ctx(), r); }
1756 
1757  inline expr fma(expr const& a, expr const& b, expr const& c, expr const& rm) {
1758  check_context(a, b); check_context(a, c); check_context(a, rm);
1759  assert(a.is_fpa() && b.is_fpa() && c.is_fpa());
1760  Z3_ast r = Z3_mk_fpa_fma(a.ctx(), rm, a, b, c);
1761  a.check_error();
1762  return expr(a.ctx(), r);
1763  }
1764 
1765 
1771  inline expr ite(expr const & c, expr const & t, expr const & e) {
1772  check_context(c, t); check_context(c, e);
1773  assert(c.is_bool());
1774  Z3_ast r = Z3_mk_ite(c.ctx(), c, t, e);
1775  c.check_error();
1776  return expr(c.ctx(), r);
1777  }
1778 
1779 
1784  inline expr to_expr(context & c, Z3_ast a) {
1785  c.check_error();
1786  assert(Z3_get_ast_kind(c, a) == Z3_APP_AST ||
1787  Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST ||
1788  Z3_get_ast_kind(c, a) == Z3_VAR_AST ||
1790  return expr(c, a);
1791  }
1792 
1793  inline sort to_sort(context & c, Z3_sort s) {
1794  c.check_error();
1795  return sort(c, s);
1796  }
1797 
1798  inline func_decl to_func_decl(context & c, Z3_func_decl f) {
1799  c.check_error();
1800  return func_decl(c, f);
1801  }
1802 
1806  inline expr sle(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsle(a.ctx(), a, b)); }
1807  inline expr sle(expr const & a, int b) { return sle(a, a.ctx().num_val(b, a.get_sort())); }
1808  inline expr sle(int a, expr const & b) { return sle(b.ctx().num_val(a, b.get_sort()), b); }
1812  inline expr slt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvslt(a.ctx(), a, b)); }
1813  inline expr slt(expr const & a, int b) { return slt(a, a.ctx().num_val(b, a.get_sort())); }
1814  inline expr slt(int a, expr const & b) { return slt(b.ctx().num_val(a, b.get_sort()), b); }
1815 
1816 
1820  inline expr ule(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvule(a.ctx(), a, b)); }
1821  inline expr ule(expr const & a, int b) { return ule(a, a.ctx().num_val(b, a.get_sort())); }
1822  inline expr ule(int a, expr const & b) { return ule(b.ctx().num_val(a, b.get_sort()), b); }
1826  inline expr ult(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvult(a.ctx(), a, b)); }
1827  inline expr ult(expr const & a, int b) { return ult(a, a.ctx().num_val(b, a.get_sort())); }
1828  inline expr ult(int a, expr const & b) { return ult(b.ctx().num_val(a, b.get_sort()), b); }
1832  inline expr uge(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvuge(a.ctx(), a, b)); }
1833  inline expr uge(expr const & a, int b) { return uge(a, a.ctx().num_val(b, a.get_sort())); }
1834  inline expr uge(int a, expr const & b) { return uge(b.ctx().num_val(a, b.get_sort()), b); }
1838  inline expr ugt(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvugt(a.ctx(), a, b)); }
1839  inline expr ugt(expr const & a, int b) { return ugt(a, a.ctx().num_val(b, a.get_sort())); }
1840  inline expr ugt(int a, expr const & b) { return ugt(b.ctx().num_val(a, b.get_sort()), b); }
1844  inline expr udiv(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvudiv(a.ctx(), a, b)); }
1845  inline expr udiv(expr const & a, int b) { return udiv(a, a.ctx().num_val(b, a.get_sort())); }
1846  inline expr udiv(int a, expr const & b) { return udiv(b.ctx().num_val(a, b.get_sort()), b); }
1847 
1851  inline expr srem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsrem(a.ctx(), a, b)); }
1852  inline expr srem(expr const & a, int b) { return srem(a, a.ctx().num_val(b, a.get_sort())); }
1853  inline expr srem(int a, expr const & b) { return srem(b.ctx().num_val(a, b.get_sort()), b); }
1854 
1858  inline expr smod(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvsmod(a.ctx(), a, b)); }
1859  inline expr smod(expr const & a, int b) { return smod(a, a.ctx().num_val(b, a.get_sort())); }
1860  inline expr smod(int a, expr const & b) { return smod(b.ctx().num_val(a, b.get_sort()), b); }
1861 
1865  inline expr urem(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvurem(a.ctx(), a, b)); }
1866  inline expr urem(expr const & a, int b) { return urem(a, a.ctx().num_val(b, a.get_sort())); }
1867  inline expr urem(int a, expr const & b) { return urem(b.ctx().num_val(a, b.get_sort()), b); }
1868 
1872  inline expr shl(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvshl(a.ctx(), a, b)); }
1873  inline expr shl(expr const & a, int b) { return shl(a, a.ctx().num_val(b, a.get_sort())); }
1874  inline expr shl(int a, expr const & b) { return shl(b.ctx().num_val(a, b.get_sort()), b); }
1875 
1879  inline expr lshr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvlshr(a.ctx(), a, b)); }
1880  inline expr lshr(expr const & a, int b) { return lshr(a, a.ctx().num_val(b, a.get_sort())); }
1881  inline expr lshr(int a, expr const & b) { return lshr(b.ctx().num_val(a, b.get_sort()), b); }
1882 
1886  inline expr ashr(expr const & a, expr const & b) { return to_expr(a.ctx(), Z3_mk_bvashr(a.ctx(), a, b)); }
1887  inline expr ashr(expr const & a, int b) { return ashr(a, a.ctx().num_val(b, a.get_sort())); }
1888  inline expr ashr(int a, expr const & b) { return ashr(b.ctx().num_val(a, b.get_sort()), b); }
1889 
1893  inline expr zext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_zero_ext(a.ctx(), i, a)); }
1894 
1898  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); }
1899  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); }
1900 
1904  inline expr bvadd_no_overflow(expr const& a, expr const& b, bool is_signed) {
1905  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);
1906  }
1907  inline expr bvadd_no_underflow(expr const& a, expr const& b) {
1908  check_context(a, b); Z3_ast r = Z3_mk_bvadd_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
1909  }
1910  inline expr bvsub_no_overflow(expr const& a, expr const& b) {
1911  check_context(a, b); Z3_ast r = Z3_mk_bvsub_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
1912  }
1913  inline expr bvsub_no_underflow(expr const& a, expr const& b, bool is_signed) {
1914  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);
1915  }
1916  inline expr bvsdiv_no_overflow(expr const& a, expr const& b) {
1917  check_context(a, b); Z3_ast r = Z3_mk_bvsdiv_no_overflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
1918  }
1919  inline expr bvneg_no_overflow(expr const& a) {
1920  Z3_ast r = Z3_mk_bvneg_no_overflow(a.ctx(), a); a.check_error(); return expr(a.ctx(), r);
1921  }
1922  inline expr bvmul_no_overflow(expr const& a, expr const& b, bool is_signed) {
1923  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);
1924  }
1925  inline expr bvmul_no_underflow(expr const& a, expr const& b) {
1926  check_context(a, b); Z3_ast r = Z3_mk_bvmul_no_underflow(a.ctx(), a, b); a.check_error(); return expr(a.ctx(), r);
1927  }
1928 
1929 
1933  inline expr sext(expr const & a, unsigned i) { return to_expr(a.ctx(), Z3_mk_sign_ext(a.ctx(), i, a)); }
1934 
1935  inline func_decl linear_order(sort const& a, unsigned index) {
1936  return to_func_decl(a.ctx(), Z3_mk_linear_order(a.ctx(), a, index));
1937  }
1938  inline func_decl partial_order(sort const& a, unsigned index) {
1939  return to_func_decl(a.ctx(), Z3_mk_partial_order(a.ctx(), a, index));
1940  }
1941  inline func_decl piecewise_linear_order(sort const& a, unsigned index) {
1942  return to_func_decl(a.ctx(), Z3_mk_piecewise_linear_order(a.ctx(), a, index));
1943  }
1944  inline func_decl tree_order(sort const& a, unsigned index) {
1945  return to_func_decl(a.ctx(), Z3_mk_tree_order(a.ctx(), a, index));
1946  }
1947 
1948  template<> class cast_ast<ast> {
1949  public:
1950  ast operator()(context & c, Z3_ast a) { return ast(c, a); }
1951  };
1952 
1953  template<> class cast_ast<expr> {
1954  public:
1955  expr operator()(context & c, Z3_ast a) {
1956  assert(Z3_get_ast_kind(c, a) == Z3_NUMERAL_AST ||
1957  Z3_get_ast_kind(c, a) == Z3_APP_AST ||
1959  Z3_get_ast_kind(c, a) == Z3_VAR_AST);
1960  return expr(c, a);
1961  }
1962  };
1963 
1964  template<> class cast_ast<sort> {
1965  public:
1966  sort operator()(context & c, Z3_ast a) {
1967  assert(Z3_get_ast_kind(c, a) == Z3_SORT_AST);
1968  return sort(c, reinterpret_cast<Z3_sort>(a));
1969  }
1970  };
1971 
1972  template<> class cast_ast<func_decl> {
1973  public:
1974  func_decl operator()(context & c, Z3_ast a) {
1975  assert(Z3_get_ast_kind(c, a) == Z3_FUNC_DECL_AST);
1976  return func_decl(c, reinterpret_cast<Z3_func_decl>(a));
1977  }
1978  };
1979 
1980  template<typename T>
1981  template<typename T2>
1983  m_array = new T[v.size()];
1984  m_size = v.size();
1985  for (unsigned i = 0; i < m_size; i++) {
1986  m_array[i] = v[i];
1987  }
1988  }
1989 
1990  // Basic functions for creating quantified formulas.
1991  // The C API should be used for creating quantifiers with patterns, weights, many variables, etc.
1992  inline expr forall(expr const & x, expr const & b) {
1993  check_context(x, b);
1994  Z3_app vars[] = {(Z3_app) x};
1995  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
1996  }
1997  inline expr forall(expr const & x1, expr const & x2, expr const & b) {
1998  check_context(x1, b); check_context(x2, b);
1999  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2000  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2001  }
2002  inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2003  check_context(x1, b); check_context(x2, b); check_context(x3, b);
2004  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2005  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2006  }
2007  inline expr forall(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2008  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2009  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2010  Z3_ast r = Z3_mk_forall_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2011  }
2012  inline expr forall(expr_vector const & xs, expr const & b) {
2013  array<Z3_app> vars(xs);
2014  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);
2015  }
2016  inline expr exists(expr const & x, expr const & b) {
2017  check_context(x, b);
2018  Z3_app vars[] = {(Z3_app) x};
2019  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 1, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2020  }
2021  inline expr exists(expr const & x1, expr const & x2, expr const & b) {
2022  check_context(x1, b); check_context(x2, b);
2023  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2024  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 2, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2025  }
2026  inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2027  check_context(x1, b); check_context(x2, b); check_context(x3, b);
2028  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2029  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 3, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2030  }
2031  inline expr exists(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2032  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2033  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2034  Z3_ast r = Z3_mk_exists_const(b.ctx(), 0, 4, vars, 0, 0, b); b.check_error(); return expr(b.ctx(), r);
2035  }
2036  inline expr exists(expr_vector const & xs, expr const & b) {
2037  array<Z3_app> vars(xs);
2038  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);
2039  }
2040  inline expr lambda(expr const & x, expr const & b) {
2041  check_context(x, b);
2042  Z3_app vars[] = {(Z3_app) x};
2043  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 1, vars, b); b.check_error(); return expr(b.ctx(), r);
2044  }
2045  inline expr lambda(expr const & x1, expr const & x2, expr const & b) {
2046  check_context(x1, b); check_context(x2, b);
2047  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2};
2048  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 2, vars, b); b.check_error(); return expr(b.ctx(), r);
2049  }
2050  inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & b) {
2051  check_context(x1, b); check_context(x2, b); check_context(x3, b);
2052  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3 };
2053  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 3, vars, b); b.check_error(); return expr(b.ctx(), r);
2054  }
2055  inline expr lambda(expr const & x1, expr const & x2, expr const & x3, expr const & x4, expr const & b) {
2056  check_context(x1, b); check_context(x2, b); check_context(x3, b); check_context(x4, b);
2057  Z3_app vars[] = {(Z3_app) x1, (Z3_app) x2, (Z3_app) x3, (Z3_app) x4 };
2058  Z3_ast r = Z3_mk_lambda_const(b.ctx(), 4, vars, b); b.check_error(); return expr(b.ctx(), r);
2059  }
2060  inline expr lambda(expr_vector const & xs, expr const & b) {
2061  array<Z3_app> vars(xs);
2062  Z3_ast r = Z3_mk_lambda_const(b.ctx(), vars.size(), vars.ptr(), b); b.check_error(); return expr(b.ctx(), r);
2063  }
2064 
2065  inline expr pble(expr_vector const& es, int const* coeffs, int bound) {
2066  assert(es.size() > 0);
2067  context& ctx = es[0].ctx();
2068  array<Z3_ast> _es(es);
2069  Z3_ast r = Z3_mk_pble(ctx, _es.size(), _es.ptr(), coeffs, bound);
2070  ctx.check_error();
2071  return expr(ctx, r);
2072  }
2073  inline expr pbge(expr_vector const& es, int const* coeffs, int bound) {
2074  assert(es.size() > 0);
2075  context& ctx = es[0].ctx();
2076  array<Z3_ast> _es(es);
2077  Z3_ast r = Z3_mk_pbge(ctx, _es.size(), _es.ptr(), coeffs, bound);
2078  ctx.check_error();
2079  return expr(ctx, r);
2080  }
2081  inline expr pbeq(expr_vector const& es, int const* coeffs, int bound) {
2082  assert(es.size() > 0);
2083  context& ctx = es[0].ctx();
2084  array<Z3_ast> _es(es);
2085  Z3_ast r = Z3_mk_pbeq(ctx, _es.size(), _es.ptr(), coeffs, bound);
2086  ctx.check_error();
2087  return expr(ctx, r);
2088  }
2089  inline expr atmost(expr_vector const& es, unsigned bound) {
2090  assert(es.size() > 0);
2091  context& ctx = es[0].ctx();
2092  array<Z3_ast> _es(es);
2093  Z3_ast r = Z3_mk_atmost(ctx, _es.size(), _es.ptr(), bound);
2094  ctx.check_error();
2095  return expr(ctx, r);
2096  }
2097  inline expr atleast(expr_vector const& es, unsigned bound) {
2098  assert(es.size() > 0);
2099  context& ctx = es[0].ctx();
2100  array<Z3_ast> _es(es);
2101  Z3_ast r = Z3_mk_atleast(ctx, _es.size(), _es.ptr(), bound);
2102  ctx.check_error();
2103  return expr(ctx, r);
2104  }
2105  inline expr sum(expr_vector const& args) {
2106  assert(args.size() > 0);
2107  context& ctx = args[0].ctx();
2108  array<Z3_ast> _args(args);
2109  Z3_ast r = Z3_mk_add(ctx, _args.size(), _args.ptr());
2110  ctx.check_error();
2111  return expr(ctx, r);
2112  }
2113 
2114  inline expr distinct(expr_vector const& args) {
2115  assert(args.size() > 0);
2116  context& ctx = args[0].ctx();
2117  array<Z3_ast> _args(args);
2118  Z3_ast r = Z3_mk_distinct(ctx, _args.size(), _args.ptr());
2119  ctx.check_error();
2120  return expr(ctx, r);
2121  }
2122 
2123  inline expr concat(expr const& a, expr const& b) {
2124  check_context(a, b);
2125  Z3_ast r;
2126  if (Z3_is_seq_sort(a.ctx(), a.get_sort())) {
2127  Z3_ast _args[2] = { a, b };
2128  r = Z3_mk_seq_concat(a.ctx(), 2, _args);
2129  }
2130  else if (Z3_is_re_sort(a.ctx(), a.get_sort())) {
2131  Z3_ast _args[2] = { a, b };
2132  r = Z3_mk_re_concat(a.ctx(), 2, _args);
2133  }
2134  else {
2135  r = Z3_mk_concat(a.ctx(), a, b);
2136  }
2137  a.ctx().check_error();
2138  return expr(a.ctx(), r);
2139  }
2140 
2141  inline expr concat(expr_vector const& args) {
2142  Z3_ast r;
2143  assert(args.size() > 0);
2144  if (args.size() == 1) {
2145  return args[0];
2146  }
2147  context& ctx = args[0].ctx();
2148  array<Z3_ast> _args(args);
2149  if (Z3_is_seq_sort(ctx, args[0].get_sort())) {
2150  r = Z3_mk_seq_concat(ctx, _args.size(), _args.ptr());
2151  }
2152  else if (Z3_is_re_sort(ctx, args[0].get_sort())) {
2153  r = Z3_mk_re_concat(ctx, _args.size(), _args.ptr());
2154  }
2155  else {
2156  r = _args[args.size()-1];
2157  for (unsigned i = args.size()-1; i > 0; ) {
2158  --i;
2159  r = Z3_mk_concat(ctx, _args[i], r);
2160  ctx.check_error();
2161  }
2162  }
2163  ctx.check_error();
2164  return expr(ctx, r);
2165  }
2166 
2167  inline expr mk_or(expr_vector const& args) {
2168  array<Z3_ast> _args(args);
2169  Z3_ast r = Z3_mk_or(args.ctx(), _args.size(), _args.ptr());
2170  args.check_error();
2171  return expr(args.ctx(), r);
2172  }
2173  inline expr mk_and(expr_vector const& args) {
2174  array<Z3_ast> _args(args);
2175  Z3_ast r = Z3_mk_and(args.ctx(), _args.size(), _args.ptr());
2176  args.check_error();
2177  return expr(args.ctx(), r);
2178  }
2179 
2180 
2181  class func_entry : public object {
2182  Z3_func_entry m_entry;
2183  void init(Z3_func_entry e) {
2184  m_entry = e;
2185  Z3_func_entry_inc_ref(ctx(), m_entry);
2186  }
2187  public:
2188  func_entry(context & c, Z3_func_entry e):object(c) { init(e); }
2189  func_entry(func_entry const & s):object(s) { init(s.m_entry); }
2191  operator Z3_func_entry() const { return m_entry; }
2193  Z3_func_entry_inc_ref(s.ctx(), s.m_entry);
2194  Z3_func_entry_dec_ref(ctx(), m_entry);
2195  m_ctx = s.m_ctx;
2196  m_entry = s.m_entry;
2197  return *this;
2198  }
2199  expr value() const { Z3_ast r = Z3_func_entry_get_value(ctx(), m_entry); check_error(); return expr(ctx(), r); }
2200  unsigned num_args() const { unsigned r = Z3_func_entry_get_num_args(ctx(), m_entry); check_error(); return r; }
2201  expr arg(unsigned i) const { Z3_ast r = Z3_func_entry_get_arg(ctx(), m_entry, i); check_error(); return expr(ctx(), r); }
2202  };
2203 
2204  class func_interp : public object {
2205  Z3_func_interp m_interp;
2206  void init(Z3_func_interp e) {
2207  m_interp = e;
2208  Z3_func_interp_inc_ref(ctx(), m_interp);
2209  }
2210  public:
2211  func_interp(context & c, Z3_func_interp e):object(c) { init(e); }
2212  func_interp(func_interp const & s):object(s) { init(s.m_interp); }
2214  operator Z3_func_interp() const { return m_interp; }
2216  Z3_func_interp_inc_ref(s.ctx(), s.m_interp);
2217  Z3_func_interp_dec_ref(ctx(), m_interp);
2218  m_ctx = s.m_ctx;
2219  m_interp = s.m_interp;
2220  return *this;
2221  }
2222  expr else_value() const { Z3_ast r = Z3_func_interp_get_else(ctx(), m_interp); check_error(); return expr(ctx(), r); }
2223  unsigned num_entries() const { unsigned r = Z3_func_interp_get_num_entries(ctx(), m_interp); check_error(); return r; }
2224  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); }
2225  void add_entry(expr_vector const& args, expr& value) {
2226  Z3_func_interp_add_entry(ctx(), m_interp, args, value);
2227  check_error();
2228  }
2229  void set_else(expr& value) {
2230  Z3_func_interp_set_else(ctx(), m_interp, value);
2231  check_error();
2232  }
2233  };
2234 
2235  class model : public object {
2236  Z3_model m_model;
2237  void init(Z3_model m) {
2238  m_model = m;
2239  Z3_model_inc_ref(ctx(), m);
2240  }
2241  public:
2242  struct translate {};
2243  model(context & c):object(c) { init(Z3_mk_model(c)); }
2244  model(context & c, Z3_model m):object(c) { init(m); }
2245  model(model const & s):object(s) { init(s.m_model); }
2246  model(model& src, context& dst, translate) : object(dst) { init(Z3_model_translate(src.ctx(), src, dst)); }
2247  ~model() { Z3_model_dec_ref(ctx(), m_model); }
2248  operator Z3_model() const { return m_model; }
2249  model & operator=(model const & s) {
2250  Z3_model_inc_ref(s.ctx(), s.m_model);
2251  Z3_model_dec_ref(ctx(), m_model);
2252  m_ctx = s.m_ctx;
2253  m_model = s.m_model;
2254  return *this;
2255  }
2256 
2257  expr eval(expr const & n, bool model_completion=false) const {
2258  check_context(*this, n);
2259  Z3_ast r = 0;
2260  bool status = Z3_model_eval(ctx(), m_model, n, model_completion, &r);
2261  check_error();
2262  if (status == false && ctx().enable_exceptions())
2263  Z3_THROW(exception("failed to evaluate expression"));
2264  return expr(ctx(), r);
2265  }
2266 
2267  unsigned num_consts() const { return Z3_model_get_num_consts(ctx(), m_model); }
2268  unsigned num_funcs() const { return Z3_model_get_num_funcs(ctx(), m_model); }
2269  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); }
2270  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); }
2271  unsigned size() const { return num_consts() + num_funcs(); }
2272  func_decl operator[](int i) const {
2273  assert(0 <= i);
2274  return static_cast<unsigned>(i) < num_consts() ? get_const_decl(i) : get_func_decl(i - num_consts());
2275  }
2276 
2277  // returns interpretation of constant declaration c.
2278  // If c is not assigned any value in the model it returns
2279  // an expression with a null ast reference.
2281  check_context(*this, c);
2282  Z3_ast r = Z3_model_get_const_interp(ctx(), m_model, c);
2283  check_error();
2284  return expr(ctx(), r);
2285  }
2287  check_context(*this, f);
2288  Z3_func_interp r = Z3_model_get_func_interp(ctx(), m_model, f);
2289  check_error();
2290  return func_interp(ctx(), r);
2291  }
2292 
2293  // returns true iff the model contains an interpretation
2294  // for function f.
2295  bool has_interp(func_decl f) const {
2296  check_context(*this, f);
2297  return Z3_model_has_interp(ctx(), m_model, f);
2298  }
2299 
2301  Z3_func_interp r = Z3_add_func_interp(ctx(), m_model, f, else_val);
2302  check_error();
2303  return func_interp(ctx(), r);
2304  }
2305 
2306  void add_const_interp(func_decl& f, expr& value) {
2307  Z3_add_const_interp(ctx(), m_model, f, value);
2308  check_error();
2309  }
2310 
2311  friend std::ostream & operator<<(std::ostream & out, model const & m);
2312 
2313  std::string to_string() const { return std::string(Z3_model_to_string(ctx(), m_model)); }
2314  };
2315  inline std::ostream & operator<<(std::ostream & out, model const & m) { out << Z3_model_to_string(m.ctx(), m); return out; }
2316 
2317  class stats : public object {
2318  Z3_stats m_stats;
2319  void init(Z3_stats e) {
2320  m_stats = e;
2321  Z3_stats_inc_ref(ctx(), m_stats);
2322  }
2323  public:
2324  stats(context & c):object(c), m_stats(0) {}
2325  stats(context & c, Z3_stats e):object(c) { init(e); }
2326  stats(stats const & s):object(s) { init(s.m_stats); }
2327  ~stats() { if (m_stats) Z3_stats_dec_ref(ctx(), m_stats); }
2328  operator Z3_stats() const { return m_stats; }
2329  stats & operator=(stats const & s) {
2330  Z3_stats_inc_ref(s.ctx(), s.m_stats);
2331  if (m_stats) Z3_stats_dec_ref(ctx(), m_stats);
2332  m_ctx = s.m_ctx;
2333  m_stats = s.m_stats;
2334  return *this;
2335  }
2336  unsigned size() const { return Z3_stats_size(ctx(), m_stats); }
2337  std::string key(unsigned i) const { Z3_string s = Z3_stats_get_key(ctx(), m_stats, i); check_error(); return s; }
2338  bool is_uint(unsigned i) const { bool r = Z3_stats_is_uint(ctx(), m_stats, i); check_error(); return r; }
2339  bool is_double(unsigned i) const { bool r = Z3_stats_is_double(ctx(), m_stats, i); check_error(); return r; }
2340  unsigned uint_value(unsigned i) const { unsigned r = Z3_stats_get_uint_value(ctx(), m_stats, i); check_error(); return r; }
2341  double double_value(unsigned i) const { double r = Z3_stats_get_double_value(ctx(), m_stats, i); check_error(); return r; }
2342  friend std::ostream & operator<<(std::ostream & out, stats const & s);
2343  };
2344  inline std::ostream & operator<<(std::ostream & out, stats const & s) { out << Z3_stats_to_string(s.ctx(), s); return out; }
2345 
2346 
2347  inline std::ostream & operator<<(std::ostream & out, check_result r) {
2348  if (r == unsat) out << "unsat";
2349  else if (r == sat) out << "sat";
2350  else out << "unknown";
2351  return out;
2352  }
2353 
2354 
2355  class solver : public object {
2356  Z3_solver m_solver;
2357  void init(Z3_solver s) {
2358  m_solver = s;
2359  Z3_solver_inc_ref(ctx(), s);
2360  }
2361  public:
2362  struct simple {};
2363  struct translate {};
2364  solver(context & c):object(c) { init(Z3_mk_solver(c)); }
2366  solver(context & c, Z3_solver s):object(c) { init(s); }
2367  solver(context & c, char const * logic):object(c) { init(Z3_mk_solver_for_logic(c, c.str_symbol(logic))); }
2368  solver(context & c, solver const& src, translate): object(c) { init(Z3_solver_translate(src.ctx(), src, c)); }
2369  solver(solver const & s):object(s) { init(s.m_solver); }
2370  ~solver() { Z3_solver_dec_ref(ctx(), m_solver); }
2371  operator Z3_solver() const { return m_solver; }
2372  solver & operator=(solver const & s) {
2373  Z3_solver_inc_ref(s.ctx(), s.m_solver);
2374  Z3_solver_dec_ref(ctx(), m_solver);
2375  m_ctx = s.m_ctx;
2376  m_solver = s.m_solver;
2377  return *this;
2378  }
2379  void set(params const & p) { Z3_solver_set_params(ctx(), m_solver, p); check_error(); }
2380  void set(char const * k, bool v) { params p(ctx()); p.set(k, v); set(p); }
2381  void set(char const * k, unsigned v) { params p(ctx()); p.set(k, v); set(p); }
2382  void set(char const * k, double v) { params p(ctx()); p.set(k, v); set(p); }
2383  void set(char const * k, symbol const & v) { params p(ctx()); p.set(k, v); set(p); }
2384  void set(char const * k, char const* v) { params p(ctx()); p.set(k, v); set(p); }
2385  void push() { Z3_solver_push(ctx(), m_solver); check_error(); }
2386  void pop(unsigned n = 1) { Z3_solver_pop(ctx(), m_solver, n); check_error(); }
2387  void reset() { Z3_solver_reset(ctx(), m_solver); check_error(); }
2388  void add(expr const & e) { assert(e.is_bool()); Z3_solver_assert(ctx(), m_solver, e); check_error(); }
2389  void add(expr const & e, expr const & p) {
2390  assert(e.is_bool()); assert(p.is_bool()); assert(p.is_const());
2391  Z3_solver_assert_and_track(ctx(), m_solver, e, p);
2392  check_error();
2393  }
2394  void add(expr const & e, char const * p) {
2395  add(e, ctx().bool_const(p));
2396  }
2397  void add(expr_vector const& v) {
2398  check_context(*this, v);
2399  for (unsigned i = 0; i < v.size(); ++i)
2400  add(v[i]);
2401  }
2402  void from_file(char const* file) { Z3_solver_from_file(ctx(), m_solver, file); ctx().check_parser_error(); }
2403  void from_string(char const* s) { Z3_solver_from_string(ctx(), m_solver, s); ctx().check_parser_error(); }
2404 
2405  expr lower(expr const& e) {
2406  Z3_ast r = Z3_solver_get_implied_lower(ctx(), m_solver, e); check_error(); return expr(ctx(), r);
2407  }
2408  expr upper(expr const& e) {
2409  Z3_ast r = Z3_solver_get_implied_upper(ctx(), m_solver, e); check_error(); return expr(ctx(), r);
2410  }
2411  expr value(expr const& e) {
2412  Z3_ast r = Z3_solver_get_implied_value(ctx(), m_solver, e); check_error(); return expr(ctx(), r);
2413  }
2414 
2416  check_result check(unsigned n, expr * const assumptions) {
2417  array<Z3_ast> _assumptions(n);
2418  for (unsigned i = 0; i < n; i++) {
2419  check_context(*this, assumptions[i]);
2420  _assumptions[i] = assumptions[i];
2421  }
2422  Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
2423  check_error();
2424  return to_check_result(r);
2425  }
2426  check_result check(expr_vector const& assumptions) {
2427  unsigned n = assumptions.size();
2428  array<Z3_ast> _assumptions(n);
2429  for (unsigned i = 0; i < n; i++) {
2430  check_context(*this, assumptions[i]);
2431  _assumptions[i] = assumptions[i];
2432  }
2433  Z3_lbool r = Z3_solver_check_assumptions(ctx(), m_solver, n, _assumptions.ptr());
2434  check_error();
2435  return to_check_result(r);
2436  }
2437  model get_model() const { Z3_model m = Z3_solver_get_model(ctx(), m_solver); check_error(); return model(ctx(), m); }
2439  Z3_lbool r = Z3_solver_get_consequences(ctx(), m_solver, assumptions, vars, conseq);
2440  check_error();
2441  return to_check_result(r);
2442  }
2443  std::string reason_unknown() const { Z3_string r = Z3_solver_get_reason_unknown(ctx(), m_solver); check_error(); return r; }
2444  stats statistics() const { Z3_stats r = Z3_solver_get_statistics(ctx(), m_solver); check_error(); return stats(ctx(), r); }
2445  expr_vector unsat_core() const { Z3_ast_vector r = Z3_solver_get_unsat_core(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2446  expr_vector assertions() const { Z3_ast_vector r = Z3_solver_get_assertions(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2447  expr_vector non_units() const { Z3_ast_vector r = Z3_solver_get_non_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2448  expr_vector units() const { Z3_ast_vector r = Z3_solver_get_units(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2449  expr_vector trail() const { Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver); check_error(); return expr_vector(ctx(), r); }
2451  Z3_ast_vector r = Z3_solver_get_trail(ctx(), m_solver);
2452  check_error();
2453  expr_vector result(ctx(), r);
2454  unsigned sz = result.size();
2455  levels.resize(sz);
2456  Z3_solver_get_levels(ctx(), m_solver, r, sz, levels.ptr());
2457  check_error();
2458  return result;
2459  }
2460  expr proof() const { Z3_ast r = Z3_solver_get_proof(ctx(), m_solver); check_error(); return expr(ctx(), r); }
2461  friend std::ostream & operator<<(std::ostream & out, solver const & s);
2462 
2463  std::string to_smt2(char const* status = "unknown") {
2464  array<Z3_ast> es(assertions());
2465  Z3_ast const* fmls = es.ptr();
2466  Z3_ast fml = 0;
2467  unsigned sz = es.size();
2468  if (sz > 0) {
2469  --sz;
2470  fml = fmls[sz];
2471  }
2472  else {
2473  fml = ctx().bool_val(true);
2474  }
2475  return std::string(Z3_benchmark_to_smtlib_string(
2476  ctx(),
2477  "", "", status, "",
2478  sz,
2479  fmls,
2480  fml));
2481  }
2482 
2483  std::string dimacs(bool include_names = true) const { return std::string(Z3_solver_to_dimacs_string(ctx(), m_solver, include_names)); }
2484 
2486 
2487 
2488  expr_vector cube(expr_vector& vars, unsigned cutoff) {
2489  Z3_ast_vector r = Z3_solver_cube(ctx(), m_solver, vars, cutoff);
2490  check_error();
2491  return expr_vector(ctx(), r);
2492  }
2493 
2495  solver& m_solver;
2496  unsigned& m_cutoff;
2497  expr_vector& m_vars;
2498  expr_vector m_cube;
2499  bool m_end;
2500  bool m_empty;
2501 
2502  void inc() {
2503  assert(!m_end && !m_empty);
2504  m_cube = m_solver.cube(m_vars, m_cutoff);
2505  m_cutoff = 0xFFFFFFFF;
2506  if (m_cube.size() == 1 && m_cube[0].is_false()) {
2507  m_cube = z3::expr_vector(m_solver.ctx());
2508  m_end = true;
2509  }
2510  else if (m_cube.empty()) {
2511  m_empty = true;
2512  }
2513  }
2514  public:
2515  cube_iterator(solver& s, expr_vector& vars, unsigned& cutoff, bool end):
2516  m_solver(s),
2517  m_cutoff(cutoff),
2518  m_vars(vars),
2519  m_cube(s.ctx()),
2520  m_end(end),
2521  m_empty(false) {
2522  if (!m_end) {
2523  inc();
2524  }
2525  }
2526 
2528  assert(!m_end);
2529  if (m_empty) {
2530  m_end = true;
2531  }
2532  else {
2533  inc();
2534  }
2535  return *this;
2536  }
2537  cube_iterator operator++(int) { assert(false); return *this; }
2538  expr_vector const * operator->() const { return &(operator*()); }
2539  expr_vector const& operator*() const { return m_cube; }
2540 
2541  bool operator==(cube_iterator const& other) {
2542  return other.m_end == m_end;
2543  };
2544  bool operator!=(cube_iterator const& other) {
2545  return other.m_end != m_end;
2546  };
2547 
2548  };
2549 
2551  solver& m_solver;
2552  unsigned m_cutoff;
2553  expr_vector m_default_vars;
2554  expr_vector& m_vars;
2555  public:
2557  m_solver(s),
2558  m_cutoff(0xFFFFFFFF),
2559  m_default_vars(s.ctx()),
2560  m_vars(m_default_vars)
2561  {}
2562 
2564  m_solver(s),
2565  m_cutoff(0xFFFFFFFF),
2566  m_default_vars(s.ctx()),
2567  m_vars(vars)
2568  {}
2569 
2570  cube_iterator begin() { return cube_iterator(m_solver, m_vars, m_cutoff, false); }
2571  cube_iterator end() { return cube_iterator(m_solver, m_vars, m_cutoff, true); }
2572  void set_cutoff(unsigned c) { m_cutoff = c; }
2573  };
2574 
2575  cube_generator cubes() { return cube_generator(*this); }
2576  cube_generator cubes(expr_vector& vars) { return cube_generator(*this, vars); }
2577 
2578  };
2579  inline std::ostream & operator<<(std::ostream & out, solver const & s) { out << Z3_solver_to_string(s.ctx(), s); return out; }
2580 
2581  class goal : public object {
2582  Z3_goal m_goal;
2583  void init(Z3_goal s) {
2584  m_goal = s;
2585  Z3_goal_inc_ref(ctx(), s);
2586  }
2587  public:
2588  goal(context & c, bool models=true, bool unsat_cores=false, bool proofs=false):object(c) { init(Z3_mk_goal(c, models, unsat_cores, proofs)); }
2589  goal(context & c, Z3_goal s):object(c) { init(s); }
2590  goal(goal const & s):object(s) { init(s.m_goal); }
2591  ~goal() { Z3_goal_dec_ref(ctx(), m_goal); }
2592  operator Z3_goal() const { return m_goal; }
2593  goal & operator=(goal const & s) {
2594  Z3_goal_inc_ref(s.ctx(), s.m_goal);
2595  Z3_goal_dec_ref(ctx(), m_goal);
2596  m_ctx = s.m_ctx;
2597  m_goal = s.m_goal;
2598  return *this;
2599  }
2600  void add(expr const & f) { check_context(*this, f); Z3_goal_assert(ctx(), m_goal, f); check_error(); }
2601  void add(expr_vector const& v) { check_context(*this, v); for (unsigned i = 0; i < v.size(); ++i) add(v[i]); }
2602  unsigned size() const { return Z3_goal_size(ctx(), m_goal); }
2603  expr operator[](int i) const { assert(0 <= i); Z3_ast r = Z3_goal_formula(ctx(), m_goal, i); check_error(); return expr(ctx(), r); }
2604  Z3_goal_prec precision() const { return Z3_goal_precision(ctx(), m_goal); }
2605  bool inconsistent() const { return Z3_goal_inconsistent(ctx(), m_goal); }
2606  unsigned depth() const { return Z3_goal_depth(ctx(), m_goal); }
2607  void reset() { Z3_goal_reset(ctx(), m_goal); }
2608  unsigned num_exprs() const { return Z3_goal_num_exprs(ctx(), m_goal); }
2609  bool is_decided_sat() const { return Z3_goal_is_decided_sat(ctx(), m_goal); }
2610  bool is_decided_unsat() const { return Z3_goal_is_decided_unsat(ctx(), m_goal); }
2611  model convert_model(model const & m) const {
2612  check_context(*this, m);
2613  Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, m);
2614  check_error();
2615  return model(ctx(), new_m);
2616  }
2617  model get_model() const {
2618  Z3_model new_m = Z3_goal_convert_model(ctx(), m_goal, 0);
2619  check_error();
2620  return model(ctx(), new_m);
2621  }
2622  expr as_expr() const {
2623  unsigned n = size();
2624  if (n == 0)
2625  return ctx().bool_val(true);
2626  else if (n == 1)
2627  return operator[](0);
2628  else {
2629  array<Z3_ast> args(n);
2630  for (unsigned i = 0; i < n; i++)
2631  args[i] = operator[](i);
2632  return expr(ctx(), Z3_mk_and(ctx(), n, args.ptr()));
2633  }
2634  }
2635  std::string dimacs(bool include_names = true) const { return std::string(Z3_goal_to_dimacs_string(ctx(), m_goal, include_names)); }
2636  friend std::ostream & operator<<(std::ostream & out, goal const & g);
2637  };
2638  inline std::ostream & operator<<(std::ostream & out, goal const & g) { out << Z3_goal_to_string(g.ctx(), g); return out; }
2639 
2640  class apply_result : public object {
2641  Z3_apply_result m_apply_result;
2642  void init(Z3_apply_result s) {
2643  m_apply_result = s;
2645  }
2646  public:
2647  apply_result(context & c, Z3_apply_result s):object(c) { init(s); }
2648  apply_result(apply_result const & s):object(s) { init(s.m_apply_result); }
2649  ~apply_result() { Z3_apply_result_dec_ref(ctx(), m_apply_result); }
2650  operator Z3_apply_result() const { return m_apply_result; }
2652  Z3_apply_result_inc_ref(s.ctx(), s.m_apply_result);
2653  Z3_apply_result_dec_ref(ctx(), m_apply_result);
2654  m_ctx = s.m_ctx;
2655  m_apply_result = s.m_apply_result;
2656  return *this;
2657  }
2658  unsigned size() const { return Z3_apply_result_get_num_subgoals(ctx(), m_apply_result); }
2659  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); }
2660  friend std::ostream & operator<<(std::ostream & out, apply_result const & r);
2661  };
2662  inline std::ostream & operator<<(std::ostream & out, apply_result const & r) { out << Z3_apply_result_to_string(r.ctx(), r); return out; }
2663 
2664  class tactic : public object {
2665  Z3_tactic m_tactic;
2666  void init(Z3_tactic s) {
2667  m_tactic = s;
2668  Z3_tactic_inc_ref(ctx(), s);
2669  }
2670  public:
2671  tactic(context & c, char const * name):object(c) { Z3_tactic r = Z3_mk_tactic(c, name); check_error(); init(r); }
2672  tactic(context & c, Z3_tactic s):object(c) { init(s); }
2673  tactic(tactic const & s):object(s) { init(s.m_tactic); }
2674  ~tactic() { Z3_tactic_dec_ref(ctx(), m_tactic); }
2675  operator Z3_tactic() const { return m_tactic; }
2676  tactic & operator=(tactic const & s) {
2677  Z3_tactic_inc_ref(s.ctx(), s.m_tactic);
2678  Z3_tactic_dec_ref(ctx(), m_tactic);
2679  m_ctx = s.m_ctx;
2680  m_tactic = s.m_tactic;
2681  return *this;
2682  }
2683  solver mk_solver() const { Z3_solver r = Z3_mk_solver_from_tactic(ctx(), m_tactic); check_error(); return solver(ctx(), r); }
2684  apply_result apply(goal const & g) const {
2685  check_context(*this, g);
2686  Z3_apply_result r = Z3_tactic_apply(ctx(), m_tactic, g);
2687  check_error();
2688  return apply_result(ctx(), r);
2689  }
2690  apply_result operator()(goal const & g) const {
2691  return apply(g);
2692  }
2693  std::string help() const { char const * r = Z3_tactic_get_help(ctx(), m_tactic); check_error(); return r; }
2694  friend tactic operator&(tactic const & t1, tactic const & t2);
2695  friend tactic operator|(tactic const & t1, tactic const & t2);
2696  friend tactic repeat(tactic const & t, unsigned max);
2697  friend tactic with(tactic const & t, params const & p);
2698  friend tactic try_for(tactic const & t, unsigned ms);
2699  friend tactic par_or(unsigned n, tactic const* tactics);
2700  friend tactic par_and_then(tactic const& t1, tactic const& t2);
2702  };
2703 
2704  inline tactic operator&(tactic const & t1, tactic const & t2) {
2705  check_context(t1, t2);
2706  Z3_tactic r = Z3_tactic_and_then(t1.ctx(), t1, t2);
2707  t1.check_error();
2708  return tactic(t1.ctx(), r);
2709  }
2710 
2711  inline tactic operator|(tactic const & t1, tactic const & t2) {
2712  check_context(t1, t2);
2713  Z3_tactic r = Z3_tactic_or_else(t1.ctx(), t1, t2);
2714  t1.check_error();
2715  return tactic(t1.ctx(), r);
2716  }
2717 
2718  inline tactic repeat(tactic const & t, unsigned max=UINT_MAX) {
2719  Z3_tactic r = Z3_tactic_repeat(t.ctx(), t, max);
2720  t.check_error();
2721  return tactic(t.ctx(), r);
2722  }
2723 
2724  inline tactic with(tactic const & t, params const & p) {
2725  Z3_tactic r = Z3_tactic_using_params(t.ctx(), t, p);
2726  t.check_error();
2727  return tactic(t.ctx(), r);
2728  }
2729  inline tactic try_for(tactic const & t, unsigned ms) {
2730  Z3_tactic r = Z3_tactic_try_for(t.ctx(), t, ms);
2731  t.check_error();
2732  return tactic(t.ctx(), r);
2733  }
2734  inline tactic par_or(unsigned n, tactic const* tactics) {
2735  if (n == 0) {
2736  Z3_THROW(exception("a non-zero number of tactics need to be passed to par_or"));
2737  }
2738  array<Z3_tactic> buffer(n);
2739  for (unsigned i = 0; i < n; ++i) buffer[i] = tactics[i];
2740  return tactic(tactics[0].ctx(), Z3_tactic_par_or(tactics[0].ctx(), n, buffer.ptr()));
2741  }
2742 
2743  inline tactic par_and_then(tactic const & t1, tactic const & t2) {
2744  check_context(t1, t2);
2745  Z3_tactic r = Z3_tactic_par_and_then(t1.ctx(), t1, t2);
2746  t1.check_error();
2747  return tactic(t1.ctx(), r);
2748  }
2749 
2750  class probe : public object {
2751  Z3_probe m_probe;
2752  void init(Z3_probe s) {
2753  m_probe = s;
2754  Z3_probe_inc_ref(ctx(), s);
2755  }
2756  public:
2757  probe(context & c, char const * name):object(c) { Z3_probe r = Z3_mk_probe(c, name); check_error(); init(r); }
2758  probe(context & c, double val):object(c) { Z3_probe r = Z3_probe_const(c, val); check_error(); init(r); }
2759  probe(context & c, Z3_probe s):object(c) { init(s); }
2760  probe(probe const & s):object(s) { init(s.m_probe); }
2761  ~probe() { Z3_probe_dec_ref(ctx(), m_probe); }
2762  operator Z3_probe() const { return m_probe; }
2763  probe & operator=(probe const & s) {
2764  Z3_probe_inc_ref(s.ctx(), s.m_probe);
2765  Z3_probe_dec_ref(ctx(), m_probe);
2766  m_ctx = s.m_ctx;
2767  m_probe = s.m_probe;
2768  return *this;
2769  }
2770  double apply(goal const & g) const { double r = Z3_probe_apply(ctx(), m_probe, g); check_error(); return r; }
2771  double operator()(goal const & g) const { return apply(g); }
2772  friend probe operator<=(probe const & p1, probe const & p2);
2773  friend probe operator<=(probe const & p1, double p2);
2774  friend probe operator<=(double p1, probe const & p2);
2775  friend probe operator>=(probe const & p1, probe const & p2);
2776  friend probe operator>=(probe const & p1, double p2);
2777  friend probe operator>=(double p1, probe const & p2);
2778  friend probe operator<(probe const & p1, probe const & p2);
2779  friend probe operator<(probe const & p1, double p2);
2780  friend probe operator<(double p1, probe const & p2);
2781  friend probe operator>(probe const & p1, probe const & p2);
2782  friend probe operator>(probe const & p1, double p2);
2783  friend probe operator>(double p1, probe const & p2);
2784  friend probe operator==(probe const & p1, probe const & p2);
2785  friend probe operator==(probe const & p1, double p2);
2786  friend probe operator==(double p1, probe const & p2);
2787  friend probe operator&&(probe const & p1, probe const & p2);
2788  friend probe operator||(probe const & p1, probe const & p2);
2789  friend probe operator!(probe const & p);
2790  };
2791 
2792  inline probe operator<=(probe const & p1, probe const & p2) {
2793  check_context(p1, p2); Z3_probe r = Z3_probe_le(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2794  }
2795  inline probe operator<=(probe const & p1, double p2) { return p1 <= probe(p1.ctx(), p2); }
2796  inline probe operator<=(double p1, probe const & p2) { return probe(p2.ctx(), p1) <= p2; }
2797  inline probe operator>=(probe const & p1, probe const & p2) {
2798  check_context(p1, p2); Z3_probe r = Z3_probe_ge(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2799  }
2800  inline probe operator>=(probe const & p1, double p2) { return p1 >= probe(p1.ctx(), p2); }
2801  inline probe operator>=(double p1, probe const & p2) { return probe(p2.ctx(), p1) >= p2; }
2802  inline probe operator<(probe const & p1, probe const & p2) {
2803  check_context(p1, p2); Z3_probe r = Z3_probe_lt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2804  }
2805  inline probe operator<(probe const & p1, double p2) { return p1 < probe(p1.ctx(), p2); }
2806  inline probe operator<(double p1, probe const & p2) { return probe(p2.ctx(), p1) < p2; }
2807  inline probe operator>(probe const & p1, probe const & p2) {
2808  check_context(p1, p2); Z3_probe r = Z3_probe_gt(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2809  }
2810  inline probe operator>(probe const & p1, double p2) { return p1 > probe(p1.ctx(), p2); }
2811  inline probe operator>(double p1, probe const & p2) { return probe(p2.ctx(), p1) > p2; }
2812  inline probe operator==(probe const & p1, probe const & p2) {
2813  check_context(p1, p2); Z3_probe r = Z3_probe_eq(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2814  }
2815  inline probe operator==(probe const & p1, double p2) { return p1 == probe(p1.ctx(), p2); }
2816  inline probe operator==(double p1, probe const & p2) { return probe(p2.ctx(), p1) == p2; }
2817  inline probe operator&&(probe const & p1, probe const & p2) {
2818  check_context(p1, p2); Z3_probe r = Z3_probe_and(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2819  }
2820  inline probe operator||(probe const & p1, probe const & p2) {
2821  check_context(p1, p2); Z3_probe r = Z3_probe_or(p1.ctx(), p1, p2); p1.check_error(); return probe(p1.ctx(), r);
2822  }
2823  inline probe operator!(probe const & p) {
2824  Z3_probe r = Z3_probe_not(p.ctx(), p); p.check_error(); return probe(p.ctx(), r);
2825  }
2826 
2827  class optimize : public object {
2828  Z3_optimize m_opt;
2829 
2830  public:
2831  class handle {
2832  unsigned m_h;
2833  public:
2834  handle(unsigned h): m_h(h) {}
2835  unsigned h() const { return m_h; }
2836  };
2837  optimize(context& c):object(c) { m_opt = Z3_mk_optimize(c); Z3_optimize_inc_ref(c, m_opt); }
2839  Z3_optimize_inc_ref(o.ctx(), o.m_opt);
2840  m_opt = o.m_opt;
2841  }
2843  m_opt = Z3_mk_optimize(c);
2844  Z3_optimize_inc_ref(c, m_opt);
2845  add(expr_vector(c, src.assertions()));
2846  expr_vector v(c, src.objectives());
2847  for (expr_vector::iterator it = v.begin(); it != v.end(); ++it) minimize(*it);
2848  }
2850  Z3_optimize_inc_ref(o.ctx(), o.m_opt);
2851  Z3_optimize_dec_ref(ctx(), m_opt);
2852  m_opt = o.m_opt;
2853  m_ctx = o.m_ctx;
2854  return *this;
2855  }
2857  operator Z3_optimize() const { return m_opt; }
2858  void add(expr const& e) {
2859  assert(e.is_bool());
2860  Z3_optimize_assert(ctx(), m_opt, e);
2861  }
2862  void add(expr_vector const& es) {
2863  for (expr_vector::iterator it = es.begin(); it != es.end(); ++it) add(*it);
2864  }
2865  void add(expr const& e, expr const& t) {
2866  assert(e.is_bool());
2867  Z3_optimize_assert_and_track(ctx(), m_opt, e, t);
2868  }
2869  void add(expr const& e, char const* p) {
2870  assert(e.is_bool());
2871  add(e, ctx().bool_const(p));
2872  }
2873  handle add_soft(expr const& e, unsigned weight) {
2874  assert(e.is_bool());
2875  auto str = std::to_string(weight);
2876  return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, str.c_str(), 0));
2877  }
2878  handle add_soft(expr const& e, char const* weight) {
2879  assert(e.is_bool());
2880  return handle(Z3_optimize_assert_soft(ctx(), m_opt, e, weight, 0));
2881  }
2882  handle add(expr const& e, unsigned weight) {
2883  return add_soft(e, weight);
2884  }
2885  handle maximize(expr const& e) {
2886  return handle(Z3_optimize_maximize(ctx(), m_opt, e));
2887  }
2888  handle minimize(expr const& e) {
2889  return handle(Z3_optimize_minimize(ctx(), m_opt, e));
2890  }
2891  void push() {
2892  Z3_optimize_push(ctx(), m_opt);
2893  }
2894  void pop() {
2895  Z3_optimize_pop(ctx(), m_opt);
2896  }
2899  unsigned n = asms.size();
2900  array<Z3_ast> _asms(n);
2901  for (unsigned i = 0; i < n; i++) {
2902  check_context(*this, asms[i]);
2903  _asms[i] = asms[i];
2904  }
2905  Z3_lbool r = Z3_optimize_check(ctx(), m_opt, n, _asms.ptr());
2906  check_error();
2907  return to_check_result(r);
2908  }
2909  model get_model() const { Z3_model m = Z3_optimize_get_model(ctx(), m_opt); check_error(); return model(ctx(), m); }
2910  expr_vector unsat_core() const { Z3_ast_vector r = Z3_optimize_get_unsat_core(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
2911  void set(params const & p) { Z3_optimize_set_params(ctx(), m_opt, p); check_error(); }
2912  expr lower(handle const& h) {
2913  Z3_ast r = Z3_optimize_get_lower(ctx(), m_opt, h.h());
2914  check_error();
2915  return expr(ctx(), r);
2916  }
2917  expr upper(handle const& h) {
2918  Z3_ast r = Z3_optimize_get_upper(ctx(), m_opt, h.h());
2919  check_error();
2920  return expr(ctx(), r);
2921  }
2922  expr_vector assertions() const { Z3_ast_vector r = Z3_optimize_get_assertions(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
2923  expr_vector objectives() const { Z3_ast_vector r = Z3_optimize_get_objectives(ctx(), m_opt); check_error(); return expr_vector(ctx(), r); }
2924  stats statistics() const { Z3_stats r = Z3_optimize_get_statistics(ctx(), m_opt); check_error(); return stats(ctx(), r); }
2925  friend std::ostream & operator<<(std::ostream & out, optimize const & s);
2926  void from_file(char const* filename) { Z3_optimize_from_file(ctx(), m_opt, filename); check_error(); }
2927  void from_string(char const* constraints) { Z3_optimize_from_string(ctx(), m_opt, constraints); check_error(); }
2928  std::string help() const { char const * r = Z3_optimize_get_help(ctx(), m_opt); check_error(); return r; }
2929  };
2930  inline std::ostream & operator<<(std::ostream & out, optimize const & s) { out << Z3_optimize_to_string(s.ctx(), s.m_opt); return out; }
2931 
2932  class fixedpoint : public object {
2933  Z3_fixedpoint m_fp;
2934  public:
2937  operator Z3_fixedpoint() const { return m_fp; }
2938  void from_string(char const* s) { Z3_fixedpoint_from_string(ctx(), m_fp, s); check_error(); }
2939  void from_file(char const* s) { Z3_fixedpoint_from_file(ctx(), m_fp, s); check_error(); }
2940  void add_rule(expr& rule, symbol const& name) { Z3_fixedpoint_add_rule(ctx(), m_fp, rule, name); check_error(); }
2941  void add_fact(func_decl& f, unsigned * args) { Z3_fixedpoint_add_fact(ctx(), m_fp, f, f.arity(), args); check_error(); }
2944  array<Z3_func_decl> rs(relations);
2945  Z3_lbool r = Z3_fixedpoint_query_relations(ctx(), m_fp, rs.size(), rs.ptr());
2946  check_error();
2947  return to_check_result(r);
2948  }
2949  expr get_answer() { Z3_ast r = Z3_fixedpoint_get_answer(ctx(), m_fp); check_error(); return expr(ctx(), r); }
2950  std::string reason_unknown() { return Z3_fixedpoint_get_reason_unknown(ctx(), m_fp); }
2951  void update_rule(expr& rule, symbol const& name) { Z3_fixedpoint_update_rule(ctx(), m_fp, rule, name); check_error(); }
2952  unsigned get_num_levels(func_decl& p) { unsigned r = Z3_fixedpoint_get_num_levels(ctx(), m_fp, p); check_error(); return r; }
2953  expr get_cover_delta(int level, func_decl& p) {
2954  Z3_ast r = Z3_fixedpoint_get_cover_delta(ctx(), m_fp, level, p);
2955  check_error();
2956  return expr(ctx(), r);
2957  }
2958  void add_cover(int level, func_decl& p, expr& property) { Z3_fixedpoint_add_cover(ctx(), m_fp, level, p, property); check_error(); }
2959  stats statistics() const { Z3_stats r = Z3_fixedpoint_get_statistics(ctx(), m_fp); check_error(); return stats(ctx(), r); }
2961  expr_vector assertions() const { Z3_ast_vector r = Z3_fixedpoint_get_assertions(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
2962  expr_vector rules() const { Z3_ast_vector r = Z3_fixedpoint_get_rules(ctx(), m_fp); check_error(); return expr_vector(ctx(), r); }
2963  void set(params const & p) { Z3_fixedpoint_set_params(ctx(), m_fp, p); check_error(); }
2964  std::string help() const { return Z3_fixedpoint_get_help(ctx(), m_fp); }
2966  std::string to_string() { return Z3_fixedpoint_to_string(ctx(), m_fp, 0, 0); }
2967  std::string to_string(expr_vector const& queries) {
2968  array<Z3_ast> qs(queries);
2969  return Z3_fixedpoint_to_string(ctx(), m_fp, qs.size(), qs.ptr());
2970  }
2971  };
2972  inline std::ostream & operator<<(std::ostream & out, fixedpoint const & f) { return out << Z3_fixedpoint_to_string(f.ctx(), f, 0, 0); }
2973 
2974  inline tactic fail_if(probe const & p) {
2975  Z3_tactic r = Z3_tactic_fail_if(p.ctx(), p);
2976  p.check_error();
2977  return tactic(p.ctx(), r);
2978  }
2979  inline tactic when(probe const & p, tactic const & t) {
2980  check_context(p, t);
2981  Z3_tactic r = Z3_tactic_when(t.ctx(), p, t);
2982  t.check_error();
2983  return tactic(t.ctx(), r);
2984  }
2985  inline tactic cond(probe const & p, tactic const & t1, tactic const & t2) {
2986  check_context(p, t1); check_context(p, t2);
2987  Z3_tactic r = Z3_tactic_cond(t1.ctx(), p, t1, t2);
2988  t1.check_error();
2989  return tactic(t1.ctx(), r);
2990  }
2991 
2992  inline symbol context::str_symbol(char const * s) { Z3_symbol r = Z3_mk_string_symbol(m_ctx, s); check_error(); return symbol(*this, r); }
2993  inline symbol context::int_symbol(int n) { Z3_symbol r = Z3_mk_int_symbol(m_ctx, n); check_error(); return symbol(*this, r); }
2994 
2995  inline sort context::bool_sort() { Z3_sort s = Z3_mk_bool_sort(m_ctx); check_error(); return sort(*this, s); }
2996  inline sort context::int_sort() { Z3_sort s = Z3_mk_int_sort(m_ctx); check_error(); return sort(*this, s); }
2997  inline sort context::real_sort() { Z3_sort s = Z3_mk_real_sort(m_ctx); check_error(); return sort(*this, s); }
2998  inline sort context::bv_sort(unsigned sz) { Z3_sort s = Z3_mk_bv_sort(m_ctx, sz); check_error(); return sort(*this, s); }
2999  inline sort context::string_sort() { Z3_sort s = Z3_mk_string_sort(m_ctx); check_error(); return sort(*this, s); }
3000  inline sort context::seq_sort(sort& s) { Z3_sort r = Z3_mk_seq_sort(m_ctx, s); check_error(); return sort(*this, r); }
3001  inline sort context::re_sort(sort& s) { Z3_sort r = Z3_mk_re_sort(m_ctx, s); check_error(); return sort(*this, r); }
3002  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); }
3003 
3004  template<>
3005  inline sort context::fpa_sort<16>() { return fpa_sort(5, 11); }
3006 
3007  template<>
3008  inline sort context::fpa_sort<32>() { return fpa_sort(8, 24); }
3009 
3010  template<>
3011  inline sort context::fpa_sort<64>() { return fpa_sort(11, 53); }
3012 
3013  template<>
3014  inline sort context::fpa_sort<128>() { return fpa_sort(15, 113); }
3015 
3017  switch (m_rounding_mode) {
3018  case RNA: return sort(*this, Z3_mk_fpa_rna(m_ctx));
3019  case RNE: return sort(*this, Z3_mk_fpa_rne(m_ctx));
3020  case RTP: return sort(*this, Z3_mk_fpa_rtp(m_ctx));
3021  case RTN: return sort(*this, Z3_mk_fpa_rtn(m_ctx));
3022  case RTZ: return sort(*this, Z3_mk_fpa_rtz(m_ctx));
3023  default: return sort(*this);
3024  }
3025  }
3026 
3027  inline void context::set_rounding_mode(rounding_mode rm) { m_rounding_mode = rm; }
3028 
3029  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); }
3031  array<Z3_sort> dom(d);
3032  Z3_sort s = Z3_mk_array_sort_n(m_ctx, dom.size(), dom.ptr(), r); check_error(); return sort(*this, s);
3033  }
3034  inline sort context::enumeration_sort(char const * name, unsigned n, char const * const * enum_names, func_decl_vector & cs, func_decl_vector & ts) {
3035  array<Z3_symbol> _enum_names(n);
3036  for (unsigned i = 0; i < n; i++) { _enum_names[i] = Z3_mk_string_symbol(*this, enum_names[i]); }
3037  array<Z3_func_decl> _cs(n);
3038  array<Z3_func_decl> _ts(n);
3039  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3040  sort s = to_sort(*this, Z3_mk_enumeration_sort(*this, _name, n, _enum_names.ptr(), _cs.ptr(), _ts.ptr()));
3041  check_error();
3042  for (unsigned i = 0; i < n; i++) { cs.push_back(func_decl(*this, _cs[i])); ts.push_back(func_decl(*this, _ts[i])); }
3043  return s;
3044  }
3045  inline func_decl context::tuple_sort(char const * name, unsigned n, char const * const * names, sort const* sorts, func_decl_vector & projs) {
3046  array<Z3_symbol> _names(n);
3047  array<Z3_sort> _sorts(n);
3048  for (unsigned i = 0; i < n; i++) { _names[i] = Z3_mk_string_symbol(*this, names[i]); _sorts[i] = sorts[i]; }
3049  array<Z3_func_decl> _projs(n);
3050  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3051  Z3_func_decl tuple;
3052  sort _ignore_s = to_sort(*this, Z3_mk_tuple_sort(*this, _name, n, _names.ptr(), _sorts.ptr(), &tuple, _projs.ptr()));
3053  check_error();
3054  for (unsigned i = 0; i < n; i++) { projs.push_back(func_decl(*this, _projs[i])); }
3055  return func_decl(*this, tuple);
3056  }
3057 
3058  inline sort context::uninterpreted_sort(char const* name) {
3059  Z3_symbol _name = Z3_mk_string_symbol(*this, name);
3060  return to_sort(*this, Z3_mk_uninterpreted_sort(*this, _name));
3061  }
3063  return to_sort(*this, Z3_mk_uninterpreted_sort(*this, name));
3064  }
3065 
3066  inline func_decl context::function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3067  array<Z3_sort> args(arity);
3068  for (unsigned i = 0; i < arity; i++) {
3069  check_context(domain[i], range);
3070  args[i] = domain[i];
3071  }
3072  Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, arity, args.ptr(), range);
3073  check_error();
3074  return func_decl(*this, f);
3075  }
3076 
3077  inline func_decl context::function(char const * name, unsigned arity, sort const * domain, sort const & range) {
3078  return function(range.ctx().str_symbol(name), arity, domain, range);
3079  }
3080 
3081  inline func_decl context::function(symbol const& name, sort_vector const& domain, sort const& range) {
3082  array<Z3_sort> args(domain.size());
3083  for (unsigned i = 0; i < domain.size(); i++) {
3084  check_context(domain[i], range);
3085  args[i] = domain[i];
3086  }
3087  Z3_func_decl f = Z3_mk_func_decl(m_ctx, name, domain.size(), args.ptr(), range);
3088  check_error();
3089  return func_decl(*this, f);
3090  }
3091 
3092  inline func_decl context::function(char const * name, sort_vector const& domain, sort const& range) {
3093  return function(range.ctx().str_symbol(name), domain, range);
3094  }
3095 
3096 
3097  inline func_decl context::function(char const * name, sort const & domain, sort const & range) {
3098  check_context(domain, range);
3099  Z3_sort args[1] = { domain };
3100  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 1, args, range);
3101  check_error();
3102  return func_decl(*this, f);
3103  }
3104 
3105  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & range) {
3107  Z3_sort args[2] = { d1, d2 };
3108  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 2, args, range);
3109  check_error();
3110  return func_decl(*this, f);
3111  }
3112 
3113  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
3115  Z3_sort args[3] = { d1, d2, d3 };
3116  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 3, args, range);
3117  check_error();
3118  return func_decl(*this, f);
3119  }
3120 
3121  inline func_decl context::function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
3123  Z3_sort args[4] = { d1, d2, d3, d4 };
3124  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 4, args, range);
3125  check_error();
3126  return func_decl(*this, f);
3127  }
3128 
3129  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) {
3131  Z3_sort args[5] = { d1, d2, d3, d4, d5 };
3132  Z3_func_decl f = Z3_mk_func_decl(m_ctx, str_symbol(name), 5, args, range);
3133  check_error();
3134  return func_decl(*this, f);
3135  }
3136 
3137  inline func_decl context::recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3138  array<Z3_sort> args(arity);
3139  for (unsigned i = 0; i < arity; i++) {
3140  check_context(domain[i], range);
3141  args[i] = domain[i];
3142  }
3143  Z3_func_decl f = Z3_mk_rec_func_decl(m_ctx, name, arity, args.ptr(), range);
3144  check_error();
3145  return func_decl(*this, f);
3146 
3147  }
3148 
3149  inline func_decl context::recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
3150  return recfun(str_symbol(name), arity, domain, range);
3151  }
3152 
3153  inline func_decl context::recfun(char const * name, sort const& d1, sort const & range) {
3154  return recfun(str_symbol(name), 1, &d1, range);
3155  }
3156 
3157  inline func_decl context::recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
3158  sort dom[2] = { d1, d2 };
3159  return recfun(str_symbol(name), 2, dom, range);
3160  }
3161 
3162  inline void context::recdef(func_decl f, expr_vector const& args, expr const& body) {
3163  check_context(f, args); check_context(f, body);
3164  array<Z3_ast> vars(args);
3165  Z3_add_rec_def(f.ctx(), f, vars.size(), vars.ptr(), body);
3166  }
3167 
3168  inline expr context::constant(symbol const & name, sort const & s) {
3169  Z3_ast r = Z3_mk_const(m_ctx, name, s);
3170  check_error();
3171  return expr(*this, r);
3172  }
3173  inline expr context::constant(char const * name, sort const & s) { return constant(str_symbol(name), s); }
3174  inline expr context::bool_const(char const * name) { return constant(name, bool_sort()); }
3175  inline expr context::int_const(char const * name) { return constant(name, int_sort()); }
3176  inline expr context::real_const(char const * name) { return constant(name, real_sort()); }
3177  inline expr context::bv_const(char const * name, unsigned sz) { return constant(name, bv_sort(sz)); }
3178  inline expr context::fpa_const(char const * name, unsigned ebits, unsigned sbits) { return constant(name, fpa_sort(ebits, sbits)); }
3179 
3180  template<size_t precision>
3181  inline expr context::fpa_const(char const * name) { return constant(name, fpa_sort<precision>()); }
3182 
3183  inline expr context::bool_val(bool b) { return b ? expr(*this, Z3_mk_true(m_ctx)) : expr(*this, Z3_mk_false(m_ctx)); }
3184 
3185  inline expr context::int_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, int_sort()); check_error(); return expr(*this, r); }
3186  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); }
3187  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); }
3188  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); }
3189  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); }
3190 
3191  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); }
3192  inline expr context::real_val(int n) { Z3_ast r = Z3_mk_int(m_ctx, n, real_sort()); check_error(); return expr(*this, r); }
3193  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); }
3194  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); }
3195  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); }
3196  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); }
3197 
3198  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); }
3199  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); }
3200  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); }
3201  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); }
3202  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); }
3203  inline expr context::bv_val(unsigned n, bool const* bits) {
3204  array<bool> _bits(n);
3205  for (unsigned i = 0; i < n; ++i) _bits[i] = bits[i] ? 1 : 0;
3206  Z3_ast r = Z3_mk_bv_numeral(m_ctx, n, _bits.ptr()); check_error(); return expr(*this, r);
3207  }
3208 
3209  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); }
3210  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); }
3211 
3212  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); }
3213  inline expr context::string_val(char const* s) { Z3_ast r = Z3_mk_string(m_ctx, s); check_error(); return expr(*this, r); }
3214  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); }
3215 
3216  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); }
3217 
3218  inline expr func_decl::operator()(unsigned n, expr const * args) const {
3219  array<Z3_ast> _args(n);
3220  for (unsigned i = 0; i < n; i++) {
3221  check_context(*this, args[i]);
3222  _args[i] = args[i];
3223  }
3224  Z3_ast r = Z3_mk_app(ctx(), *this, n, _args.ptr());
3225  check_error();
3226  return expr(ctx(), r);
3227 
3228  }
3229  inline expr func_decl::operator()(expr_vector const& args) const {
3230  array<Z3_ast> _args(args.size());
3231  for (unsigned i = 0; i < args.size(); i++) {
3232  check_context(*this, args[i]);
3233  _args[i] = args[i];
3234  }
3235  Z3_ast r = Z3_mk_app(ctx(), *this, args.size(), _args.ptr());
3236  check_error();
3237  return expr(ctx(), r);
3238  }
3239  inline expr func_decl::operator()() const {
3240  Z3_ast r = Z3_mk_app(ctx(), *this, 0, 0);
3241  ctx().check_error();
3242  return expr(ctx(), r);
3243  }
3244  inline expr func_decl::operator()(expr const & a) const {
3245  check_context(*this, a);
3246  Z3_ast args[1] = { a };
3247  Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
3248  ctx().check_error();
3249  return expr(ctx(), r);
3250  }
3251  inline expr func_decl::operator()(int a) const {
3252  Z3_ast args[1] = { ctx().num_val(a, domain(0)) };
3253  Z3_ast r = Z3_mk_app(ctx(), *this, 1, args);
3254  ctx().check_error();
3255  return expr(ctx(), r);
3256  }
3257  inline expr func_decl::operator()(expr const & a1, expr const & a2) const {
3258  check_context(*this, a1); check_context(*this, a2);
3259  Z3_ast args[2] = { a1, a2 };
3260  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
3261  ctx().check_error();
3262  return expr(ctx(), r);
3263  }
3264  inline expr func_decl::operator()(expr const & a1, int a2) const {
3265  check_context(*this, a1);
3266  Z3_ast args[2] = { a1, ctx().num_val(a2, domain(1)) };
3267  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
3268  ctx().check_error();
3269  return expr(ctx(), r);
3270  }
3271  inline expr func_decl::operator()(int a1, expr const & a2) const {
3272  check_context(*this, a2);
3273  Z3_ast args[2] = { ctx().num_val(a1, domain(0)), a2 };
3274  Z3_ast r = Z3_mk_app(ctx(), *this, 2, args);
3275  ctx().check_error();
3276  return expr(ctx(), r);
3277  }
3278  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3) const {
3279  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3);
3280  Z3_ast args[3] = { a1, a2, a3 };
3281  Z3_ast r = Z3_mk_app(ctx(), *this, 3, args);
3282  ctx().check_error();
3283  return expr(ctx(), r);
3284  }
3285  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4) const {
3286  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4);
3287  Z3_ast args[4] = { a1, a2, a3, a4 };
3288  Z3_ast r = Z3_mk_app(ctx(), *this, 4, args);
3289  ctx().check_error();
3290  return expr(ctx(), r);
3291  }
3292  inline expr func_decl::operator()(expr const & a1, expr const & a2, expr const & a3, expr const & a4, expr const & a5) const {
3293  check_context(*this, a1); check_context(*this, a2); check_context(*this, a3); check_context(*this, a4); check_context(*this, a5);
3294  Z3_ast args[5] = { a1, a2, a3, a4, a5 };
3295  Z3_ast r = Z3_mk_app(ctx(), *this, 5, args);
3296  ctx().check_error();
3297  return expr(ctx(), r);
3298  }
3299 
3300  inline expr to_real(expr const & a) { Z3_ast r = Z3_mk_int2real(a.ctx(), a); a.check_error(); return expr(a.ctx(), r); }
3301 
3302  inline func_decl function(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3303  return range.ctx().function(name, arity, domain, range);
3304  }
3305  inline func_decl function(char const * name, unsigned arity, sort const * domain, sort const & range) {
3306  return range.ctx().function(name, arity, domain, range);
3307  }
3308  inline func_decl function(char const * name, sort const & domain, sort const & range) {
3309  return range.ctx().function(name, domain, range);
3310  }
3311  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & range) {
3312  return range.ctx().function(name, d1, d2, range);
3313  }
3314  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & range) {
3315  return range.ctx().function(name, d1, d2, d3, range);
3316  }
3317  inline func_decl function(char const * name, sort const & d1, sort const & d2, sort const & d3, sort const & d4, sort const & range) {
3318  return range.ctx().function(name, d1, d2, d3, d4, range);
3319  }
3320  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) {
3321  return range.ctx().function(name, d1, d2, d3, d4, d5, range);
3322  }
3323  inline func_decl function(char const* name, sort_vector const& domain, sort const& range) {
3324  return range.ctx().function(name, domain, range);
3325  }
3326  inline func_decl function(std::string const& name, sort_vector const& domain, sort const& range) {
3327  return range.ctx().function(name.c_str(), domain, range);
3328  }
3329 
3330  inline func_decl recfun(symbol const & name, unsigned arity, sort const * domain, sort const & range) {
3331  return range.ctx().recfun(name, arity, domain, range);
3332  }
3333  inline func_decl recfun(char const * name, unsigned arity, sort const * domain, sort const & range) {
3334  return range.ctx().recfun(name, arity, domain, range);
3335  }
3336  inline func_decl recfun(char const * name, sort const& d1, sort const & range) {
3337  return range.ctx().recfun(name, d1, range);
3338  }
3339  inline func_decl recfun(char const * name, sort const& d1, sort const& d2, sort const & range) {
3340  return range.ctx().recfun(name, d1, d2, range);
3341  }
3342 
3343  inline expr select(expr const & a, expr const & i) {
3344  check_context(a, i);
3345  Z3_ast r = Z3_mk_select(a.ctx(), a, i);
3346  a.check_error();
3347  return expr(a.ctx(), r);
3348  }
3349  inline expr select(expr const & a, int i) {
3350  return select(a, a.ctx().num_val(i, a.get_sort().array_domain()));
3351  }
3352  inline expr select(expr const & a, expr_vector const & i) {
3353  check_context(a, i);
3354  array<Z3_ast> idxs(i);
3355  Z3_ast r = Z3_mk_select_n(a.ctx(), a, idxs.size(), idxs.ptr());
3356  a.check_error();
3357  return expr(a.ctx(), r);
3358  }
3359 
3360  inline expr store(expr const & a, expr const & i, expr const & v) {
3361  check_context(a, i); check_context(a, v);
3362  Z3_ast r = Z3_mk_store(a.ctx(), a, i, v);
3363  a.check_error();
3364  return expr(a.ctx(), r);
3365  }
3366 
3367  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); }
3368  inline expr store(expr const & a, expr i, int v) { return store(a, i, a.ctx().num_val(v, a.get_sort().array_range())); }
3369  inline expr store(expr const & a, int i, int v) {
3370  return store(a, a.ctx().num_val(i, a.get_sort().array_domain()), a.ctx().num_val(v, a.get_sort().array_range()));
3371  }
3372  inline expr store(expr const & a, expr_vector const & i, expr const & v) {
3373  check_context(a, i); check_context(a, v);
3374  array<Z3_ast> idxs(i);
3375  Z3_ast r = Z3_mk_store_n(a.ctx(), a, idxs.size(), idxs.ptr(), v);
3376  a.check_error();
3377  return expr(a.ctx(), r);
3378  }
3379 
3380  inline expr as_array(func_decl & f) {
3381  Z3_ast r = Z3_mk_as_array(f.ctx(), f);
3382  f.check_error();
3383  return expr(f.ctx(), r);
3384  }
3385 
3386 #define MK_EXPR1(_fn, _arg) \
3387  Z3_ast r = _fn(_arg.ctx(), _arg); \
3388  _arg.check_error(); \
3389  return expr(_arg.ctx(), r);
3390 
3391 #define MK_EXPR2(_fn, _arg1, _arg2) \
3392  check_context(_arg1, _arg2); \
3393  Z3_ast r = _fn(_arg1.ctx(), _arg1, _arg2); \
3394  _arg1.check_error(); \
3395  return expr(_arg1.ctx(), r);
3396 
3397  inline expr const_array(sort const & d, expr const & v) {
3398  MK_EXPR2(Z3_mk_const_array, d, v);
3399  }
3400 
3401  inline expr empty_set(sort const& s) {
3403  }
3404 
3405  inline expr full_set(sort const& s) {
3407  }
3408 
3409  inline expr set_add(expr const& s, expr const& e) {
3410  MK_EXPR2(Z3_mk_set_add, s, e);
3411  }
3412 
3413  inline expr set_del(expr const& s, expr const& e) {
3414  MK_EXPR2(Z3_mk_set_del, s, e);
3415  }
3416 
3417  inline expr set_union(expr const& a, expr const& b) {
3418  check_context(a, b);
3419  Z3_ast es[2] = { a, b };
3420  Z3_ast r = Z3_mk_set_union(a.ctx(), 2, es);
3421  a.check_error();
3422  return expr(a.ctx(), r);
3423  }
3424 
3425  inline expr set_intersect(expr const& a, expr const& b) {
3426  check_context(a, b);
3427  Z3_ast es[2] = { a, b };
3428  Z3_ast r = Z3_mk_set_intersect(a.ctx(), 2, es);
3429  a.check_error();
3430  return expr(a.ctx(), r);
3431  }
3432 
3433  inline expr set_difference(expr const& a, expr const& b) {
3435  }
3436 
3437  inline expr set_complement(expr const& a) {
3439  }
3440 
3441  inline expr set_member(expr const& s, expr const& e) {
3442  MK_EXPR2(Z3_mk_set_member, s, e);
3443  }
3444 
3445  inline expr set_subset(expr const& a, expr const& b) {
3446  MK_EXPR2(Z3_mk_set_subset, a, b);
3447  }
3448 
3449  // sequence and regular expression operations.
3450  // union is +
3451  // concat is overloaded to handle sequences and regular expressions
3452 
3453  inline expr empty(sort const& s) {
3454  Z3_ast r = Z3_mk_seq_empty(s.ctx(), s);
3455  s.check_error();
3456  return expr(s.ctx(), r);
3457  }
3458  inline expr suffixof(expr const& a, expr const& b) {
3459  check_context(a, b);
3460  Z3_ast r = Z3_mk_seq_suffix(a.ctx(), a, b);
3461  a.check_error();
3462  return expr(a.ctx(), r);
3463  }
3464  inline expr prefixof(expr const& a, expr const& b) {
3465  check_context(a, b);
3466  Z3_ast r = Z3_mk_seq_prefix(a.ctx(), a, b);
3467  a.check_error();
3468  return expr(a.ctx(), r);
3469  }
3470  inline expr indexof(expr const& s, expr const& substr, expr const& offset) {
3471  check_context(s, substr); check_context(s, offset);
3472  Z3_ast r = Z3_mk_seq_index(s.ctx(), s, substr, offset);
3473  s.check_error();
3474  return expr(s.ctx(), r);
3475  }
3476  inline expr last_indexof(expr const& s, expr const& substr) {
3477  check_context(s, substr);
3478  Z3_ast r = Z3_mk_seq_last_index(s.ctx(), s, substr);
3479  s.check_error();
3480  return expr(s.ctx(), r);
3481  }
3482  inline expr to_re(expr const& s) {
3484  }
3485  inline expr in_re(expr const& s, expr const& re) {
3486  MK_EXPR2(Z3_mk_seq_in_re, s, re);
3487  }
3488  inline expr plus(expr const& re) {
3489  MK_EXPR1(Z3_mk_re_plus, re);
3490  }
3491  inline expr option(expr const& re) {
3493  }
3494  inline expr star(expr const& re) {
3495  MK_EXPR1(Z3_mk_re_star, re);
3496  }
3497  inline expr re_empty(sort const& s) {
3498  Z3_ast r = Z3_mk_re_empty(s.ctx(), s);
3499  s.check_error();
3500  return expr(s.ctx(), r);
3501  }
3502  inline expr re_full(sort const& s) {
3503  Z3_ast r = Z3_mk_re_full(s.ctx(), s);
3504  s.check_error();
3505  return expr(s.ctx(), r);
3506  }
3507  inline expr re_intersect(expr_vector const& args) {
3508  assert(args.size() > 0);
3509  context& ctx = args[0].ctx();
3510  array<Z3_ast> _args(args);
3511  Z3_ast r = Z3_mk_re_intersect(ctx, _args.size(), _args.ptr());
3512  ctx.check_error();
3513  return expr(ctx, r);
3514  }
3515  inline expr re_complement(expr const& a) {
3517  }
3518  inline expr range(expr const& lo, expr const& hi) {
3519  check_context(lo, hi);
3520  Z3_ast r = Z3_mk_re_range(lo.ctx(), lo, hi);
3521  lo.check_error();
3522  return expr(lo.ctx(), r);
3523  }
3524 
3525 
3526 
3527 
3528 
3529  inline expr_vector context::parse_string(char const* s) {
3530  Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, 0, 0, 0, 0, 0, 0);
3531  check_error();
3532  return expr_vector(*this, r);
3533 
3534  }
3535  inline expr_vector context::parse_file(char const* s) {
3536  Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, 0, 0, 0, 0, 0, 0);
3537  check_error();
3538  return expr_vector(*this, r);
3539  }
3540 
3541  inline expr_vector context::parse_string(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
3542  array<Z3_symbol> sort_names(sorts.size());
3543  array<Z3_symbol> decl_names(decls.size());
3544  array<Z3_sort> sorts1(sorts);
3545  array<Z3_func_decl> decls1(decls);
3546  for (unsigned i = 0; i < sorts.size(); ++i) {
3547  sort_names[i] = sorts[i].name();
3548  }
3549  for (unsigned i = 0; i < decls.size(); ++i) {
3550  decl_names[i] = decls[i].name();
3551  }
3552 
3553  Z3_ast_vector r = Z3_parse_smtlib2_string(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
3554  check_error();
3555  return expr_vector(*this, r);
3556  }
3557 
3558  inline expr_vector context::parse_file(char const* s, sort_vector const& sorts, func_decl_vector const& decls) {
3559  array<Z3_symbol> sort_names(sorts.size());
3560  array<Z3_symbol> decl_names(decls.size());
3561  array<Z3_sort> sorts1(sorts);
3562  array<Z3_func_decl> decls1(decls);
3563  for (unsigned i = 0; i < sorts.size(); ++i) {
3564  sort_names[i] = sorts[i].name();
3565  }
3566  for (unsigned i = 0; i < decls.size(); ++i) {
3567  decl_names[i] = decls[i].name();
3568  }
3569  Z3_ast_vector r = Z3_parse_smtlib2_file(*this, s, sorts.size(), sort_names.ptr(), sorts1.ptr(), decls.size(), decl_names.ptr(), decls1.ptr());
3570  check_error();
3571  return expr_vector(*this, r);
3572  }
3573 
3574 
3575  inline expr expr::substitute(expr_vector const& src, expr_vector const& dst) {
3576  assert(src.size() == dst.size());
3577  array<Z3_ast> _src(src.size());
3578  array<Z3_ast> _dst(dst.size());
3579  for (unsigned i = 0; i < src.size(); ++i) {
3580  _src[i] = src[i];
3581  _dst[i] = dst[i];
3582  }
3583  Z3_ast r = Z3_substitute(ctx(), m_ast, src.size(), _src.ptr(), _dst.ptr());
3584  check_error();
3585  return expr(ctx(), r);
3586  }
3587 
3588  inline expr expr::substitute(expr_vector const& dst) {
3589  array<Z3_ast> _dst(dst.size());
3590  for (unsigned i = 0; i < dst.size(); ++i) {
3591  _dst[i] = dst[i];
3592  }
3593  Z3_ast r = Z3_substitute_vars(ctx(), m_ast, dst.size(), _dst.ptr());
3594  check_error();
3595  return expr(ctx(), r);
3596  }
3597 
3598 
3600 
3601  typedef std::function<void(unsigned, expr const&)> fixed_eh_t;
3602  typedef std::function<void(void)> final_eh_t;
3603  typedef std::function<void(unsigned, unsigned)> eq_eh_t;
3604 
3605  final_eh_t m_final_eh;
3606  eq_eh_t m_eq_eh;
3607  fixed_eh_t m_fixed_eh;
3608  solver* s;
3609  Z3_context c;
3610  Z3_solver_callback cb { nullptr };
3611 
3612  Z3_context ctx() {
3613  return c ? c : (Z3_context)s->ctx();
3614  }
3615 
3616  struct scoped_cb {
3618  scoped_cb(void* _p, Z3_solver_callback cb):p(static_cast<user_propagator_base*>(_p)) {
3619  p->cb = cb;
3620  }
3621  ~scoped_cb() {
3622  p->cb = nullptr;
3623  }
3624  };
3625 
3626  static void push_eh(void* p) {
3627  static_cast<user_propagator_base*>(p)->push();
3628  }
3629 
3630  static void pop_eh(void* p, unsigned num_scopes) {
3631  static_cast<user_propagator_base*>(p)->pop(num_scopes);
3632  }
3633 
3634  static void* fresh_eh(void* p, Z3_context ctx) {
3635  return static_cast<user_propagator_base*>(p)->fresh(ctx);
3636  }
3637 
3638  static void fixed_eh(void* _p, Z3_solver_callback cb, unsigned id, Z3_ast _value) {
3639  user_propagator_base* p = static_cast<user_propagator_base*>(_p);
3640  scoped_cb _cb(p, cb);
3641  scoped_context ctx(p->ctx());
3642  expr value(ctx(), _value);
3643  static_cast<user_propagator_base*>(p)->m_fixed_eh(id, value);
3644  }
3645 
3646  static void eq_eh(void* p, Z3_solver_callback cb, unsigned x, unsigned y) {
3647  scoped_cb _cb(p, cb);
3648  static_cast<user_propagator_base*>(p)->m_eq_eh(x, y);
3649  }
3650 
3651  static void final_eh(void* p, Z3_solver_callback cb) {
3652  scoped_cb _cb(p, cb);
3653  static_cast<user_propagator_base*>(p)->m_final_eh();
3654  }
3655 
3656 
3657  public:
3658  user_propagator_base(solver* s): s(s), c(nullptr) {}
3659  user_propagator_base(Z3_context c): s(nullptr), c(c) {}
3660 
3661  virtual void push() = 0;
3662  virtual void pop(unsigned num_scopes) = 0;
3663 
3672  virtual user_propagator_base* fresh(Z3_context ctx) = 0;
3673 
3680  void fixed(fixed_eh_t& f) {
3681  assert(s);
3682  m_fixed_eh = f;
3683  Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
3684  }
3685 
3686  void eq(eq_eh_t& f) {
3687  assert(s);
3688  m_eq_eh = f;
3689  Z3_solver_propagate_eq(ctx(), *s, eq_eh);
3690  }
3691 
3700  void final(final_eh_t& f) {
3701  assert(s);
3702  m_final_eh = f;
3703  Z3_solver_propagate_final(ctx(), *s, final_eh);
3704  }
3705 
3720  unsigned add(expr const& e) {
3721  assert(s);
3722  return Z3_solver_propagate_register(ctx(), *s, e);
3723  }
3724 
3725  void conflict(unsigned num_fixed, unsigned const* fixed) {
3726  assert(cb);
3727  scoped_context _ctx(ctx());
3728  expr conseq = _ctx().bool_val(false);
3729  Z3_solver_propagate_consequence(ctx(), cb, num_fixed, fixed, 0, nullptr, nullptr, conseq);
3730  }
3731 
3732  void propagate(unsigned num_fixed, unsigned const* fixed, expr const& conseq) {
3733  assert(cb);
3734  assert(conseq.ctx() == ctx());
3735  Z3_solver_propagate_consequence(ctx(), cb, num_fixed, fixed, 0, nullptr, nullptr, conseq);
3736  }
3737 
3738  void propagate(unsigned num_fixed, unsigned const* fixed,
3739  unsigned num_eqs, unsigned const* lhs, unsigned const * rhs,
3740  expr const& conseq) {
3741  assert(cb);
3742  assert(conseq.ctx() == ctx());
3743  Z3_solver_propagate_consequence(ctx(), cb, num_fixed, fixed, num_eqs, lhs, rhs, conseq);
3744  }
3745  };
3746 
3747 
3748 
3749 
3750 }
3751 
3754 #undef Z3_THROW
3755 
z3::optimize::check
check_result check()
Definition: z3++.h:2897
Z3_mk_re_plus
Z3_ast Z3_API Z3_mk_re_plus(Z3_context c, Z3_ast re)
Create the regular language re+.
z3::operator!=
expr operator!=(expr const &a, expr const &b)
Definition: z3++.h:1473
z3::array::~array
~array()
Definition: z3++.h:403
z3::expr::stoi
expr stoi() const
Definition: z3++.h:1318
Z3_model_get_func_interp
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...
z3::params::~params
~params()
Definition: z3++.h:475
z3::ast::~ast
~ast()
Definition: z3++.h:503
Z3_model_eval
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.
Z3_global_param_reset_all
void Z3_API Z3_global_param_reset_all(void)
Restore the value of all global (and module) parameters. This command will not affect already created...
z3::optimize::add_soft
handle add_soft(expr const &e, char const *weight)
Definition: z3++.h:2878
Z3_mk_unary_minus
Z3_ast Z3_API Z3_mk_unary_minus(Z3_context c, Z3_ast arg)
Create an AST node representing - arg.
z3::plus
expr plus(expr const &re)
Definition: z3++.h:3488
z3::xnor
expr xnor(expr const &a, expr const &b)
Definition: z3++.h:1701
z3::stats::double_value
double double_value(unsigned i) const
Definition: z3++.h:2341
z3::goal
Definition: z3++.h:2581
z3::goal::add
void add(expr_vector const &v)
Definition: z3++.h:2601
z3::ast::ast
ast(context &c, Z3_ast n)
Definition: z3++.h:501
z3::suffixof
expr suffixof(expr const &a, expr const &b)
Definition: z3++.h:3458
z3::fail_if
tactic fail_if(probe const &p)
Definition: z3++.h:2974
z3::expr::lo
unsigned lo() const
Definition: z3++.h:1267
Z3_mk_store_n
Z3_ast Z3_API Z3_mk_store_n(Z3_context c, Z3_ast a, unsigned n, Z3_ast const *idxs, Z3_ast v)
n-ary Array update.
z3::optimize::from_string
void from_string(char const *constraints)
Definition: z3++.h:2927
Z3_solver_get_implied_lower
Z3_ast Z3_API Z3_solver_get_implied_lower(Z3_context c, Z3_solver s, Z3_ast e)
retrieve implied lower bound value for arithmetic expression. If a lower bound is implied at search l...
z3::pw
expr pw(expr const &a, expr const &b)
Definition: z3++.h:1395
Z3_model_dec_ref
void Z3_API Z3_model_dec_ref(Z3_context c, Z3_model m)
Decrement the reference counter of the given model.
Z3_model_translate
Z3_model Z3_API Z3_model_translate(Z3_context c, Z3_model m, Z3_context dst)
translate model from context c to context dst.
z3::ast::kind
Z3_ast_kind kind() const
Definition: z3++.h:507
z3::expr::at
expr at(expr const &index) const
Definition: z3++.h:1301
z3::expr::operator&
friend expr operator&(expr const &a, expr const &b)
Definition: z3++.h:1687
Z3_optimize_pop
void Z3_API Z3_optimize_pop(Z3_context c, Z3_optimize d)
Backtrack one level.
z3::set_difference
expr set_difference(expr const &a, expr const &b)
Definition: z3++.h:3433
Z3_mk_string_symbol
Z3_symbol Z3_API Z3_mk_string_symbol(Z3_context c, Z3_string s)
Create a Z3 symbol using a C string.
z3::ast_vector_tpl::back
T back() const
Definition: z3++.h:540
z3::as_array
expr as_array(func_decl &f)
Definition: z3++.h:3380
z3::fixedpoint::get_cover_delta
expr get_cover_delta(int level, func_decl &p)
Definition: z3++.h:2953
z3::context::interrupt
void interrupt()
Interrupt the current procedure being executed by any object managed by this context....
Definition: z3++.h:229
z3::expr::max
friend expr max(expr const &a, expr const &b)
Definition: z3++.h:1717
Z3_apply_result_to_string
Z3_string Z3_API Z3_apply_result_to_string(Z3_context c, Z3_apply_result r)
Convert the Z3_apply_result object returned by Z3_tactic_apply into a string.
Z3_mk_re_option
Z3_ast Z3_API Z3_mk_re_option(Z3_context c, Z3_ast re)
Create the regular language [re].
z3::bv2int
expr bv2int(expr const &a, bool is_signed)
bit-vector and integer conversions.
Definition: z3++.h:1898
z3::expr::as_binary
bool as_binary(std::string &s) const
Definition: z3++.h:826
Z3_mk_solver_from_tactic
Z3_solver Z3_API Z3_mk_solver_from_tactic(Z3_context c, Z3_tactic t)
Create a new solver that is implemented using the given tactic. The solver supports the commands Z3_s...
Z3_mk_bvshl
Z3_ast Z3_API Z3_mk_bvshl(Z3_context c, Z3_ast t1, Z3_ast t2)
Shift left.
z3::goal::add
void add(expr const &f)
Definition: z3++.h:2600
Z3_func_entry_inc_ref
void Z3_API Z3_func_entry_inc_ref(Z3_context c, Z3_func_entry e)
Increment the reference counter of the given Z3_func_entry object.
z3::solver::cube_iterator::operator!=
bool operator!=(cube_iterator const &other)
Definition: z3++.h:2544
z3::expr
A Z3 expression is used to represent formulas and terms. For Z3, a formula is any expression of sort ...
Definition: z3++.h:746
Z3_goal_is_decided_sat
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.
z3::solver::solver
solver(context &c, char const *logic)
Definition: z3++.h:2367
Z3_tactic_par_and_then
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....
Z3_model_has_interp
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.
z3::sort::sort_kind
Z3_sort_kind sort_kind() const
Return the internal sort kind.
Definition: z3++.h:616
z3::optimize::optimize
optimize(optimize &o)
Definition: z3++.h:2838
Z3_mk_forall_const
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::sort::is_fpa
bool is_fpa() const
Return true if this sort is a Floating point sort.
Definition: z3++.h:668
Z3_OP_XOR
@ Z3_OP_XOR
Definition: z3_api.h:1017
z3::ast_vector_tpl::end
iterator end() const
Definition: z3++.h:588
z3::goal::size
unsigned size() const
Definition: z3++.h:2602
z3::probe::operator()
double operator()(goal const &g) const
Definition: z3++.h:2771
Z3_mk_select
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::model::get_const_decl
func_decl get_const_decl(unsigned i) const
Definition: z3++.h:2269
z3::set_member
expr set_member(expr const &s, expr const &e)
Definition: z3++.h:3441
Z3_solver_to_string
Z3_string Z3_API Z3_solver_to_string(Z3_context c, Z3_solver s)
Convert a solver into a string.
Z3_mk_int_to_str
Z3_ast Z3_API Z3_mk_int_to_str(Z3_context c, Z3_ast s)
Integer to string conversion.
z3::config::config
config()
Definition: z3++.h:111
Z3_params_set_uint
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.
Z3_mk_re_complement
Z3_ast Z3_API Z3_mk_re_complement(Z3_context c, Z3_ast re)
Create the complement of the regular language re.
Z3_params_set_double
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.
Z3_mk_bv_numeral
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::expr::operator>
friend expr operator>(expr const &a, expr const &b)
Definition: z3++.h:1665
Z3_goal_prec
Z3_goal_prec
A Goal is essentially a set of formulas. Z3 provide APIs for building strategies/tactics for solving ...
Definition: z3_api.h:1412
z3::context::fpa_sort
sort fpa_sort()
Definition: z3++.h:3005
z3::solver::assertions
expr_vector assertions() const
Definition: z3++.h:2446
z3::param_descrs::param_descrs
param_descrs(context &c, Z3_param_descrs d)
Definition: z3++.h:449
z3::solver::operator=
solver & operator=(solver const &s)
Definition: z3++.h:2372
Z3_tactic_inc_ref
void Z3_API Z3_tactic_inc_ref(Z3_context c, Z3_tactic t)
Increment the reference counter of the given tactic.
z3::sort::is_relation
bool is_relation() const
Return true if this sort is a Relation sort.
Definition: z3++.h:652
z3::symbol::to_int
int to_int() const
Definition: z3++.h:433
Z3_solver_get_levels
void Z3_API Z3_solver_get_levels(Z3_context c, Z3_solver s, Z3_ast_vector literals, unsigned sz, unsigned levels[])
retrieve the decision depth of Boolean literals (variables or their negations). Assumes a check-sat c...
Z3_mk_fpa_rtn
Z3_ast Z3_API Z3_mk_fpa_rtn(Z3_context c)
Create a numeral of RoundingMode sort which represents the TowardNegative rounding mode.
Z3_solver_check
Z3_lbool Z3_API Z3_solver_check(Z3_context c, Z3_solver s)
Check whether the assertions in a given solver are consistent or not.
z3::sort_vector
ast_vector_tpl< sort > sort_vector
Definition: z3++.h:73
Z3_optimize_assert_and_track
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.
z3::context::string_sort
sort string_sort()
Return the sort for ASCII strings.
Definition: z3++.h:2999
z3::context::array_sort
sort array_sort(sort d, sort r)
Return an array sort for arrays from d to r.
Definition: z3++.h:3029
Z3_stats_get_double_value
double Z3_API Z3_stats_get_double_value(Z3_context c, Z3_stats s, unsigned idx)
Return the double value of the given statistical data.
z3::ast_vector_tpl::resize
void resize(unsigned sz)
Definition: z3++.h:539
z3::expr::operator==
friend expr operator==(expr const &a, expr const &b)
Definition: z3++.h:1464
z3::stats::operator<<
friend std::ostream & operator<<(std::ostream &out, stats const &s)
Definition: z3++.h:2344
z3::sort::name
symbol name() const
Return name of sort.
Definition: z3++.h:620
z3::set_complement
expr set_complement(expr const &a)
Definition: z3++.h:3437
z3::ast_vector_tpl::iterator::operator=
iterator operator=(iterator const &other)
Definition: z3++.h:568
z3::bvadd_no_overflow
expr bvadd_no_overflow(expr const &a, expr const &b, bool is_signed)
bit-vector overflow/underflow checks
Definition: z3++.h:1904
z3::ult
expr ult(expr const &a, expr const &b)
unsigned less than operator for bitvectors.
Definition: z3++.h:1826
z3::to_re
expr to_re(expr const &s)
Definition: z3++.h:3482
Z3_mk_fpa_min
Z3_ast Z3_API Z3_mk_fpa_min(Z3_context c, Z3_ast t1, Z3_ast t2)
Minimum of floating-point numbers.
z3::ast_vector_tpl::iterator::iterator
iterator(iterator const &other)
Definition: z3++.h:567
z3::params::params
params(params const &s)
Definition: z3++.h:474
z3::operator^
expr operator^(expr const &a, expr const &b)
Definition: z3++.h:1691
Z3_mk_bvslt
Z3_ast Z3_API Z3_mk_bvslt(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed less than.
z3::expr::is_const
bool is_const() const
Return true if this expression is a constant (i.e., an application with 0 arguments).
Definition: z3++.h:835
z3::par_and_then
tactic par_and_then(tactic const &t1, tactic const &t2)
Definition: z3++.h:2743
Z3_mk_ge
Z3_ast Z3_API Z3_mk_ge(Z3_context c, Z3_ast t1, Z3_ast t2)
Create greater than or equal to.
Z3_BV_SORT
@ Z3_BV_SORT
Definition: z3_api.h:153
Z3_solver_reset
void Z3_API Z3_solver_reset(Z3_context c, Z3_solver s)
Remove all assertions from the solver.
z3::model::add_const_interp
void add_const_interp(func_decl &f, expr &value)
Definition: z3++.h:2306
Z3_mk_true
Z3_ast Z3_API Z3_mk_true(Z3_context c)
Create an AST node representing true.
z3::solver::reason_unknown
std::string reason_unknown() const
Definition: z3++.h:2443
Z3_del_context
void Z3_API Z3_del_context(Z3_context c)
Delete the given logical context.
Z3_func_interp_set_else
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::expr::fma
friend expr fma(expr const &a, expr const &b, expr const &c, expr const &rm)
FloatingPoint fused multiply-add.
Definition: z3++.h:1757
Z3_dec_ref
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_parse_smtlib2_file
Z3_ast_vector Z3_API Z3_parse_smtlib2_file(Z3_context c, Z3_string file_name, unsigned num_sorts, Z3_symbol const sort_names[], Z3_sort const sorts[], unsigned num_decls, Z3_symbol const decl_names[], Z3_func_decl const decls[])
Similar to Z3_parse_smtlib2_string, but reads the benchmark from a file.
Z3_OK
@ Z3_OK
Definition: z3_api.h:1365
Z3_update_param_value
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_mk_bvmul_no_underflow
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...
z3::operator%
expr operator%(expr const &a, expr const &b)
Definition: z3++.h:1410
Z3_param_descrs_get_name
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::params::params
params(context &c)
Definition: z3++.h:473
z3::scoped_context::scoped_context
scoped_context(Z3_context c)
Definition: z3++.h:387
Z3_ast_vector_translate
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_mk_bvmul_no_overflow
Z3_ast Z3_API Z3_mk_bvmul_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2, bool is_signed)
Create a predicate that checks that the bit-wise multiplication of t1 and t2 does not overflow.
z3::tactic::try_for
friend tactic try_for(tactic const &t, unsigned ms)
Definition: z3++.h:2729
Z3_probe_dec_ref
void Z3_API Z3_probe_dec_ref(Z3_context c, Z3_probe p)
Decrement the reference counter of the given probe.
Z3_mk_fpa_rem
Z3_ast Z3_API Z3_mk_fpa_rem(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point remainder.
Z3_probe_le
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_get_error_msg
Z3_string Z3_API Z3_get_error_msg(Z3_context c, Z3_error_code err)
Return a string describing the given error code.
z3::context::int_sort
sort int_sort()
Return the integer sort.
Definition: z3++.h:2996
_Z3_MK_BIN_
#define _Z3_MK_BIN_(a, b, binop)
Definition: z3++.h:1380
z3::model::model
model(context &c)
Definition: z3++.h:2243
z3::stats::key
std::string key(unsigned i) const
Definition: z3++.h:2337
Z3_get_ast_kind
Z3_ast_kind Z3_API Z3_get_ast_kind(Z3_context c, Z3_ast a)
Return the kind of the given AST.
z3::probe::probe
probe(context &c, Z3_probe s)
Definition: z3++.h:2759
Z3_OP_FALSE
@ Z3_OP_FALSE
Definition: z3_api.h:1010
Z3_optimize_dec_ref
void Z3_API Z3_optimize_dec_ref(Z3_context c, Z3_optimize d)
Decrement the reference counter of the given optimize context.
z3::func_decl::is_const
bool is_const() const
Definition: z3++.h:721
Z3_probe_and
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.
z3::expr::is_numeral_i
bool is_numeral_i(int &i) const
Definition: z3++.h:821
Z3_mk_zero_ext
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::expr::replace
expr replace(expr const &src, expr const &dst) const
Definition: z3++.h:1284
Z3_fixedpoint_query
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::is_re
bool is_re() const
Return true if this sort is a regular expression sort.
Definition: z3++.h:660
z3::param_descrs::simplify_param_descrs
static param_descrs simplify_param_descrs(context &c)
Definition: z3++.h:459
z3::expr::bvsdiv_no_overflow
friend expr bvsdiv_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:1916
Z3_mk_seq_concat
Z3_ast Z3_API Z3_mk_seq_concat(Z3_context c, unsigned n, Z3_ast const args[])
Concatenate sequences.
z3::expr::operator&&
friend expr operator&&(expr const &a, expr const &b)
Return an expression representing a and b.
Definition: z3++.h:1439
z3::ast_vector_tpl::operator<<
friend std::ostream & operator<<(std::ostream &out, ast_vector_tpl const &v)
Definition: z3++.h:589
Z3_mk_config
Z3_config Z3_API Z3_mk_config(void)
Create a configuration object for the Z3 context object.
z3::solver::cube_iterator::cube_iterator
cube_iterator(solver &s, expr_vector &vars, unsigned &cutoff, bool end)
Definition: z3++.h:2515
z3::ast_vector_tpl::ast_vector_tpl
ast_vector_tpl(ast_vector_tpl const &s)
Definition: z3++.h:531
Z3_tactic_fail_if
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.
z3::goal::operator[]
expr operator[](int i) const
Definition: z3++.h:2603
Z3_mk_fpa_rtz
Z3_ast Z3_API Z3_mk_fpa_rtz(Z3_context c)
Create a numeral of RoundingMode sort which represents the TowardZero rounding mode.
z3::fixedpoint::rules
expr_vector rules() const
Definition: z3++.h:2962
z3::solver::translate
Definition: z3++.h:2363
z3::expr::is_forall
bool is_forall() const
Return true if this expression is a universal quantifier.
Definition: z3++.h:844
z3::cast_ast< func_decl >::operator()
func_decl operator()(context &c, Z3_ast a)
Definition: z3++.h:1974
Z3_inc_ref
void Z3_API Z3_inc_ref(Z3_context c, Z3_ast a)
Increment the reference counter of the given AST. The context c should have been created using Z3_mk_...
Z3_APP_AST
@ Z3_APP_AST
Definition: z3_api.h:180
z3::context::int_val
expr int_val(int n)
Definition: z3++.h:3185
Z3_FINITE_DOMAIN_SORT
@ Z3_FINITE_DOMAIN_SORT
Definition: z3_api.h:157
z3::context::str_symbol
symbol str_symbol(char const *s)
Create a Z3 symbol based on the given string.
Definition: z3++.h:2992
Z3_fixedpoint_update_rule
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.
z3::solver::add
void add(expr const &e, expr const &p)
Definition: z3++.h:2389
Z3_mk_gt
Z3_ast Z3_API Z3_mk_gt(Z3_context c, Z3_ast t1, Z3_ast t2)
Create greater than.
Z3_tactic_try_for
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...
z3::tactic::with
friend tactic with(tactic const &t, params const &p)
Definition: z3++.h:2724
Z3_get_symbol_kind
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...
z3::fixedpoint::from_file
void from_file(char const *s)
Definition: z3++.h:2939
z3::expr::algebraic_i
unsigned algebraic_i() const
Return i of an algebraic number (root-obj p i)
Definition: z3++.h:909
Z3_probe_const
Z3_probe Z3_API Z3_probe_const(Z3_context x, double val)
Return a probe that always evaluates to val.
Z3_solver_get_proof
Z3_ast Z3_API Z3_solver_get_proof(Z3_context c, Z3_solver s)
Retrieve the proof for the last Z3_solver_check or Z3_solver_check_assumptions.
Z3_fixedpoint_from_string
Z3_ast_vector Z3_API Z3_fixedpoint_from_string(Z3_context c, Z3_fixedpoint f, Z3_string s)
Parse an SMT-LIB2 string with fixedpoint rules. Add the rules to the current fixedpoint context....
Z3_param_descrs_to_string
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...
z3::model::model
model(context &c, Z3_model m)
Definition: z3++.h:2244
z3::expr::numerator
expr numerator() const
Definition: z3++.h:999
Z3_mk_fpa_fma
Z3_ast Z3_API Z3_mk_fpa_fma(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2, Z3_ast t3)
Floating-point fused multiply-add.
z3::bvsub_no_underflow
expr bvsub_no_underflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:1913
z3::model::to_string
std::string to_string() const
Definition: z3++.h:2313
z3::sort::operator=
sort & operator=(sort const &s)
Return true if this sort and s are equal.
Definition: z3++.h:612
z3::solver::cube_generator
Definition: z3++.h:2550
z3::range
expr range(expr const &lo, expr const &hi)
Definition: z3++.h:3518
Z3_goal_precision
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...
z3::expr::nand
friend expr nand(expr const &a, expr const &b)
Definition: z3++.h:1699
z3::expr::is_numeral
bool is_numeral(std::string &s, unsigned precision) const
Definition: z3++.h:824
z3::fixedpoint::set
void set(params const &p)
Definition: z3++.h:2963
z3::optimize::lower
expr lower(handle const &h)
Definition: z3++.h:2912
Z3_get_app_num_args
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...
Z3_mk_re_full
Z3_ast Z3_API Z3_mk_re_full(Z3_context c, Z3_sort re)
Create an universal regular expression of sort re.
Z3_mk_rotate_left
Z3_ast Z3_API Z3_mk_rotate_left(Z3_context c, unsigned i, Z3_ast t1)
Rotate bits of t1 to the left i times.
z3::expr::is_relation
bool is_relation() const
Return true if this is a Relation expression.
Definition: z3++.h:789
z3::optimize::upper
expr upper(handle const &h)
Definition: z3++.h:2917
Z3_get_app_decl
Z3_func_decl Z3_API Z3_get_app_decl(Z3_context c, Z3_app a)
Return the declaration of a constant or function application.
Z3_param_kind
Z3_param_kind
The different kinds of parameters that can be associated with parameter sets. (see Z3_mk_params).
Definition: z3_api.h:1322
Z3_get_ast_hash
unsigned Z3_API Z3_get_ast_hash(Z3_context c, Z3_ast a)
Return a hash code for the given AST. The hash code is structural. You can use Z3_get_ast_id intercha...
Z3_mk_bv2int
Z3_ast Z3_API Z3_mk_bv2int(Z3_context c, Z3_ast t1, bool is_signed)
Create an integer from the bit-vector argument t1. If is_signed is false, then the bit-vector t1 is t...
Z3_get_lstring
Z3_char_ptr Z3_API Z3_get_lstring(Z3_context c, Z3_ast s, unsigned *length)
Retrieve the unescaped string constant stored in s.
z3::model::operator[]
func_decl operator[](int i) const
Definition: z3++.h:2272
z3::optimize::operator=
optimize & operator=(optimize const &o)
Definition: z3++.h:2849
z3::model::get_func_decl
func_decl get_func_decl(unsigned i) const
Definition: z3++.h:2270
Z3_get_numeral_binary_string
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::goal::get_model
model get_model() const
Definition: z3++.h:2617
z3::user_propagator_base::user_propagator_base
user_propagator_base(solver *s)
Definition: z3++.h:3658
z3::is_int
expr is_int(expr const &e)
Definition: z3++.h:1435
z3::lambda
expr lambda(expr const &x, expr const &b)
Definition: z3++.h:2040
z3::expr::arg
expr arg(unsigned i) const
Return the i-th argument of this application. This method assumes the expression is an application.
Definition: z3++.h:1075
Z3_mk_and
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::probe::operator||
friend probe operator||(probe const &p1, probe const &p2)
Definition: z3++.h:2820
Z3_mk_fpa_sqrt
Z3_ast Z3_API Z3_mk_fpa_sqrt(Z3_context c, Z3_ast rm, Z3_ast t)
Floating-point square root.
Z3_THROW
#define Z3_THROW(x)
Definition: z3++.h:99
z3::solver::dimacs
std::string dimacs(bool include_names=true) const
Definition: z3++.h:2483
Z3_apply_result_get_num_subgoals
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::exception
Exception used to sign API usage errors.
Definition: z3++.h:84
z3::expr::is_numeral_u
bool is_numeral_u(unsigned &i) const
Definition: z3++.h:822
z3::bvmul_no_underflow
expr bvmul_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:1925
Z3_solver_get_reason_unknown
Z3_string Z3_API Z3_solver_get_reason_unknown(Z3_context c, Z3_solver s)
Return a brief justification for an "unknown" result (i.e., Z3_L_UNDEF) for the commands Z3_solver_ch...
Z3_get_decl_int_parameter
int Z3_API Z3_get_decl_int_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the integer value associated with an integer parameter.
Z3_add_rec_def
void Z3_API Z3_add_rec_def(Z3_context c, Z3_func_decl f, unsigned n, Z3_ast args[], Z3_ast body)
Define the body of a recursive function.
Z3_solver_pop
void Z3_API Z3_solver_pop(Z3_context c, Z3_solver s, unsigned n)
Backtrack n backtracking points.
z3::expr::id
unsigned id() const
retrieve unique identifier for expression.
Definition: z3++.h:919
z3::func_decl::func_decl
func_decl(context &c)
Definition: z3++.h:700
z3::goal::reset
void reset()
Definition: z3++.h:2607
z3::apply_result::operator[]
goal operator[](int i) const
Definition: z3++.h:2659
z3::solver::set
void set(char const *k, char const *v)
Definition: z3++.h:2384
z3::cast_ast< ast >::operator()
ast operator()(context &c, Z3_ast a)
Definition: z3++.h:1950
z3::optimize::set
void set(params const &p)
Definition: z3++.h:2911
z3::optimize::check
check_result check(expr_vector const &asms)
Definition: z3++.h:2898
z3::func_decl::domain
sort domain(unsigned i) const
Definition: z3++.h:712
Z3_params_to_string
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...
z3::ast
Definition: z3++.h:496
Z3_fixedpoint_set_params
void Z3_API Z3_fixedpoint_set_params(Z3_context c, Z3_fixedpoint f, Z3_params p)
Set parameters on fixedpoint context.
Z3_interrupt
void Z3_API Z3_interrupt(Z3_context c)
Interrupt the execution of a Z3 procedure. This procedure can be used to interrupt: solvers,...
z3::context::re_sort
sort re_sort(sort &seq_sort)
Return a regular expression sort over sequences seq_sort.
Definition: z3++.h:3001
Z3_optimize_from_string
void Z3_API Z3_optimize_from_string(Z3_context c, Z3_optimize o, Z3_string s)
Parse an SMT-LIB2 string with assertions, soft constraints and optimization objectives....
z3::expr::pbeq
friend expr pbeq(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2081
z3::optimize::get_model
model get_model() const
Definition: z3++.h:2909
z3py.tactics
def tactics(ctx=None)
Definition: z3py.py:7944
z3::expr::operator<
friend expr operator<(expr const &a, expr const &b)
Definition: z3++.h:1643
z3::ast_vector_tpl::iterator::operator*
T operator*() const
Definition: z3++.h:585
z3::recfun
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:3330
z3::expr::bvsub_no_overflow
friend expr bvsub_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:1910
z3::ast::ast
ast(ast const &s)
Definition: z3++.h:502
Z3_optimize_get_objectives
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::context::seq_sort
sort seq_sort(sort &s)
Return a sequence sort over base sort s.
Definition: z3++.h:3000
Z3_OP_IMPLIES
@ Z3_OP_IMPLIES
Definition: z3_api.h:1019
z3::tactic::operator=
tactic & operator=(tactic const &s)
Definition: z3++.h:2676
z3::exception::~exception
virtual ~exception()
Definition: z3++.h:88
Z3_goal_size
unsigned Z3_API Z3_goal_size(Z3_context c, Z3_goal g)
Return the number of formulas in the given goal.
z3::select
expr select(expr const &a, expr const &i)
forward declarations
Definition: z3++.h:3343
Z3_mk_set_del
Z3_ast Z3_API Z3_mk_set_del(Z3_context c, Z3_ast set, Z3_ast elem)
Remove an element to a set.
z3::abs
expr abs(expr const &a)
Definition: z3++.h:1732
z3::expr::rem
friend expr rem(expr const &a, expr const &b)
Definition: z3++.h:1415
z3::param_descrs::size
unsigned size()
Definition: z3++.h:461
z3::optimize::operator<<
friend std::ostream & operator<<(std::ostream &out, optimize const &s)
Definition: z3++.h:2930
Z3_set_param_value
void Z3_API Z3_set_param_value(Z3_config c, Z3_string param_id, Z3_string param_value)
Set a configuration parameter.
Z3_stats_is_uint
bool Z3_API Z3_stats_is_uint(Z3_context c, Z3_stats s, unsigned idx)
Return true if the given statistical data is a unsigned integer.
z3::context::set
void set(char const *param, int value)
Update global parameter param with Integer value.
Definition: z3++.h:220
Z3_mk_goal
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_mk_seq_suffix
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::sort::is_array
bool is_array() const
Return true if this sort is a Array sort.
Definition: z3++.h:644
z3::solver::check
check_result check(unsigned n, expr *const assumptions)
Definition: z3++.h:2416
Z3_mk_xor
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::option
expr option(expr const &re)
Definition: z3++.h:3491
z3::model::model
model(model &src, context &dst, translate)
Definition: z3++.h:2246
Z3_mk_tactic
Z3_tactic Z3_API Z3_mk_tactic(Z3_context c, Z3_string name)
Return a tactic associated with the given name. The complete list of tactics may be obtained using th...
z3::func_interp::operator=
func_interp & operator=(func_interp const &s)
Definition: z3++.h:2215
Z3_mk_bvneg_no_overflow
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::expr::loop
expr loop(unsigned lo, unsigned hi)
Definition: z3++.h:1338
z3::solver::pop
void pop(unsigned n=1)
Definition: z3++.h:2386
z3::symbol
Definition: z3++.h:424
Z3_param_descrs_size
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.
z3::udiv
expr udiv(expr const &a, expr const &b)
unsigned division operator for bitvectors.
Definition: z3++.h:1844
Z3_mk_bvmul
Z3_ast Z3_API Z3_mk_bvmul(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement multiplication.
z3::optimize::add
void add(expr_vector const &es)
Definition: z3++.h:2862
z3::sort::fpa_ebits
unsigned fpa_ebits() const
Definition: z3++.h:677
z3::solver::cube_iterator::operator++
cube_iterator operator++(int)
Definition: z3++.h:2537
Z3_solver_check_assumptions
Z3_lbool Z3_API Z3_solver_check_assumptions(Z3_context c, Z3_solver s, unsigned num_assumptions, Z3_ast const assumptions[])
Check whether the assertions in the given solver and optional assumptions are consistent or not.
Z3_optimize_get_statistics
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_mk_full_set
Z3_ast Z3_API Z3_mk_full_set(Z3_context c, Z3_sort domain)
Create the full set.
Z3_optimize_get_assertions
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::sext
expr sext(expr const &a, unsigned i)
Sign-extend of the given bit-vector to the (signed) equivalent bitvector of size m+i,...
Definition: z3++.h:1933
z3::solver::upper
expr upper(expr const &e)
Definition: z3++.h:2408
z3::optimize::optimize
optimize(context &c, optimize &src)
Definition: z3++.h:2842
Z3_is_eq_ast
bool Z3_API Z3_is_eq_ast(Z3_context c, Z3_ast t1, Z3_ast t2)
Compare terms.
z3::expr::pble
friend expr pble(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2065
Z3_get_sort_id
unsigned Z3_API Z3_get_sort_id(Z3_context c, Z3_sort s)
Return a unique identifier for s.
Z3_mk_solver_for_logic
Z3_solver Z3_API Z3_mk_solver_for_logic(Z3_context c, Z3_symbol logic)
Create a new solver customized for the given logic. It behaves like Z3_mk_solver if the logic is unkn...
Z3_fixedpoint_inc_ref
void Z3_API Z3_fixedpoint_inc_ref(Z3_context c, Z3_fixedpoint d)
Increment the reference counter of the given fixedpoint context.
z3::solver::reset
void reset()
Definition: z3++.h:2387
Z3_mk_or
Z3_ast Z3_API Z3_mk_or(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] or ... or args[num_args-1].
z3::solver::to_smt2
std::string to_smt2(char const *status="unknown")
Definition: z3++.h:2463
Z3_algebraic_get_i
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::operator<<
friend std::ostream & operator<<(std::ostream &out, ast const &n)
Definition: z3++.h:518
z3::ashr
expr ashr(expr const &a, expr const &b)
arithmetic shift right operator for bitvectors
Definition: z3++.h:1886
z3::reset_params
void reset_params()
Definition: z3++.h:79
z3::expr::operator~
friend expr operator~(expr const &a)
Definition: z3++.h:1755
z3::solver::cube_generator::end
cube_iterator end()
Definition: z3++.h:2571
z3::expr::pbge
friend expr pbge(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2073
z3::context::int_const
expr int_const(char const *name)
Definition: z3++.h:3175
z3::expr::hi
unsigned hi() const
Definition: z3++.h:1268
Z3_mk_set_union
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::params::set
void set(char const *k, symbol const &s)
Definition: z3++.h:487
z3::expr::simplify
expr simplify() const
Return a simplified version of this expression.
Definition: z3++.h:1362
z3::tactic::apply
apply_result apply(goal const &g) const
Definition: z3++.h:2684
z3::context::bv_const
expr bv_const(char const *name, unsigned sz)
Definition: z3++.h:3177
Z3_mk_set_intersect
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_fixedpoint_get_help
Z3_string Z3_API Z3_fixedpoint_get_help(Z3_context c, Z3_fixedpoint f)
Return a string describing all fixedpoint available parameters.
z3::user_propagator_base::user_propagator_base
user_propagator_base(Z3_context c)
Definition: z3++.h:3659
Z3_goal_reset
void Z3_API Z3_goal_reset(Z3_context c, Z3_goal g)
Erase all formulas from the given goal.
z3::expr::algebraic_lower
expr algebraic_lower(unsigned precision) const
Definition: z3++.h:882
z3::optimize::add
void add(expr const &e, char const *p)
Definition: z3++.h:2869
Z3_goal_num_exprs
unsigned Z3_API Z3_goal_num_exprs(Z3_context c, Z3_goal g)
Return the number of formulas, subformulas and terms in the given goal.
z3::expr::unit
expr unit() const
Definition: z3++.h:1290
z3::expr::abs
friend expr abs(expr const &a)
Definition: z3++.h:1732
Z3_ast_vector_push
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_interp_get_else
Z3_ast Z3_API Z3_func_interp_get_else(Z3_context c, Z3_func_interp f)
Return the 'else' value of the given function interpretation.
Z3_fixedpoint_query_relations
Z3_lbool Z3_API Z3_fixedpoint_query_relations(Z3_context c, Z3_fixedpoint d, unsigned num_relations, Z3_func_decl const relations[])
Pose multiple queries against the asserted rules.
z3::params::set
void set(char const *k, unsigned n)
Definition: z3++.h:485
Z3_mk_distinct
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_simplify_ex
Z3_ast Z3_API Z3_simplify_ex(Z3_context c, Z3_ast a, Z3_params p)
Interface to simplifier.
Z3_fixedpoint_from_file
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::probe::~probe
~probe()
Definition: z3++.h:2761
z3::expr::is_ite
bool is_ite() const
Definition: z3++.h:1155
Z3_solver_push
void Z3_API Z3_solver_push(Z3_context c, Z3_solver s)
Create a backtracking point.
Z3_mk_rec_func_decl
Z3_func_decl Z3_API Z3_mk_rec_func_decl(Z3_context c, Z3_symbol s, unsigned domain_size, Z3_sort const domain[], Z3_sort range)
Declare a recursive function.
Z3_model_get_const_decl
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.
Z3_mk_empty_set
Z3_ast Z3_API Z3_mk_empty_set(Z3_context c, Z3_sort domain)
Create the empty set.
z3::expr::ite
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:1771
z3::cast_ast< sort >::operator()
sort operator()(context &c, Z3_ast a)
Definition: z3++.h:1966
Z3_goal_formula
Z3_ast Z3_API Z3_goal_formula(Z3_context c, Z3_goal g, unsigned idx)
Return a formula from the given goal.
z3::bvmul_no_overflow
expr bvmul_no_overflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:1922
Z3_optimize_assert_soft
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_mk_bvnor
Z3_ast Z3_API Z3_mk_bvnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nor.
z3::expr::nor
friend expr nor(expr const &a, expr const &b)
Definition: z3++.h:1700
z3::goal::operator=
goal & operator=(goal const &s)
Definition: z3++.h:2593
Z3_solver_propagate_eq
void Z3_API Z3_solver_propagate_eq(Z3_context c, Z3_solver s, Z3_eq_eh eq_eh)
register a callback on expression equalities.
Z3_func_interp_add_entry
void Z3_API Z3_func_interp_add_entry(Z3_context c, Z3_func_interp fi, Z3_ast_vector args, Z3_ast value)
add a function entry to a function interpretation.
Z3_string
const char * Z3_string
Z3 string type. It is just an alias for const char *.
Definition: z3_api.h:82
Z3_OP_DISTINCT
@ Z3_OP_DISTINCT
Definition: z3_api.h:1012
z3::lshr
expr lshr(expr const &a, expr const &b)
logic shift right operator for bitvectors
Definition: z3++.h:1879
Z3_L_TRUE
@ Z3_L_TRUE
Definition: z3_api.h:103
z3::fixedpoint::query
check_result query(func_decl_vector &relations)
Definition: z3++.h:2943
Z3_get_numeral_string
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.
Z3_ast_vector_size
unsigned Z3_API Z3_ast_vector_size(Z3_context c, Z3_ast_vector v)
Return the size of the given AST vector.
z3::expr::num_args
unsigned num_args() const
Return the number of arguments in this application. This method assumes the expression is an applicat...
Definition: z3++.h:1067
Z3_mk_model
Z3_model Z3_API Z3_mk_model(Z3_context c)
Create a fresh model object. It has reference count 0.
Z3_mk_re_loop
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_mk_fpa_leq
Z3_ast Z3_API Z3_mk_fpa_leq(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point less than or equal.
z3::expr::is_not
bool is_not() const
Definition: z3++.h:1149
Z3_goal_depth
unsigned Z3_API Z3_goal_depth(Z3_context c, Z3_goal g)
Return the depth of the given goal. It tracks how many transformations were applied to it.
z3::optimize::add
void add(expr const &e, expr const &t)
Definition: z3++.h:2865
Z3_optimize_maximize
unsigned Z3_API Z3_optimize_maximize(Z3_context c, Z3_optimize o, Z3_ast t)
Add a maximization constraint.
z3::goal::is_decided_unsat
bool is_decided_unsat() const
Definition: z3++.h:2610
z3::solver::cubes
cube_generator cubes()
Definition: z3++.h:2575
Z3_mk_linear_order
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::tactic::operator()
apply_result operator()(goal const &g) const
Definition: z3++.h:2690
z3::array::array
array(unsigned sz)
Definition: z3++.h:400
z3::stats::size
unsigned size() const
Definition: z3++.h:2336
z3::expr::bvneg_no_overflow
friend expr bvneg_no_overflow(expr const &a)
Definition: z3++.h:1919
z3::exists
expr exists(expr const &x, expr const &b)
Definition: z3++.h:2016
Z3_lbool
Z3_lbool
Lifted Boolean type: false, undefined, true.
Definition: z3_api.h:100
z3::expr::sum
friend expr sum(expr_vector const &args)
Definition: z3++.h:2105
Z3_fixedpoint_get_answer
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::symbol::str
std::string str() const
Definition: z3++.h:432
z3::expr::get_numeral_int
int get_numeral_int() const
Return int value of numeral, throw if result cannot fit in machine int.
Definition: z3++.h:931
z3::optimize::assertions
expr_vector assertions() const
Definition: z3++.h:2922
Z3_optimize_to_string
Z3_string Z3_API Z3_optimize_to_string(Z3_context c, Z3_optimize o)
Print the current context as a string.
z3::expr::operator!
friend expr operator!(expr const &a)
Return an expression representing not(a).
Definition: z3++.h:1433
z3::sort::is_bv
bool is_bv() const
Return true if this sort is a Bit-vector sort.
Definition: z3++.h:640
z3::solver::solver
solver(context &c, Z3_solver s)
Definition: z3++.h:2366
Z3_mk_add
Z3_ast Z3_API Z3_mk_add(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] + ... + args[num_args-1].
Z3_tactic_dec_ref
void Z3_API Z3_tactic_dec_ref(Z3_context c, Z3_tactic g)
Decrement the reference counter of the given tactic.
z3::check_result
check_result
Definition: z3++.h:131
Z3_OP_AND
@ Z3_OP_AND
Definition: z3_api.h:1014
Z3_is_quantifier_forall
bool Z3_API Z3_is_quantifier_forall(Z3_context c, Z3_ast a)
Determine if an ast is a universal quantifier.
Z3_is_string
bool Z3_API Z3_is_string(Z3_context c, Z3_ast s)
Determine if s is a string constant.
z3::ast_vector_tpl::iterator::operator++
iterator operator++(int)
Definition: z3++.h:583
z3::optimize::pop
void pop()
Definition: z3++.h:2894
z3::uge
expr uge(expr const &a, expr const &b)
unsigned greater than or equal to operator for bitvectors.
Definition: z3++.h:1832
z3::try_for
tactic try_for(tactic const &t, unsigned ms)
Definition: z3++.h:2729
z3::goal::goal
goal(goal const &s)
Definition: z3++.h:2590
z3::context::function
func_decl function(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:3066
z3::scoped_context
Definition: z3++.h:384
z3::array::operator[]
T const & operator[](int i) const
Definition: z3++.h:407
z3::tactic
Definition: z3++.h:2664
z3::operator||
expr operator||(expr const &a, expr const &b)
Definition: z3++.h:1451
z3::context::constant
expr constant(symbol const &name, sort const &s)
Definition: z3++.h:3168
z3::expr::rotate_left
expr rotate_left(unsigned i)
Definition: z3++.h:1258
z3::config
Z3 global configuration object.
Definition: z3++.h:106
z3::fixedpoint::statistics
stats statistics() const
Definition: z3++.h:2959
Z3_probe_or
Z3_probe Z3_API Z3_probe_or(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when p1 or p2 evaluates to true.
Z3_set_ast_print_mode
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.
z3::apply_result::size
unsigned size() const
Definition: z3++.h:2658
Z3_mk_bvugt
Z3_ast Z3_API Z3_mk_bvugt(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than.
z3::expr::is_var
bool is_var() const
Return true if this expression is a variable.
Definition: z3++.h:857
Z3_solver_get_assertions
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_FUNC_DECL_AST
@ Z3_FUNC_DECL_AST
Definition: z3_api.h:184
Z3_mk_seq_prefix
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_param_descrs_dec_ref
void Z3_API Z3_param_descrs_dec_ref(Z3_context c, Z3_param_descrs p)
Decrement the reference counter of the given parameter description set.
z3::stats::stats
stats(context &c)
Definition: z3++.h:2324
z3::expr::sqrt
friend expr sqrt(expr const &a, expr const &rm)
Definition: z3++.h:1748
Z3_mk_fpa_rna
Z3_ast Z3_API Z3_mk_fpa_rna(Z3_context c)
Create a numeral of RoundingMode sort which represents the NearestTiesToAway rounding mode.
z3::ast_vector_tpl::push_back
void push_back(T const &e)
Definition: z3++.h:538
z3::goal::operator<<
friend std::ostream & operator<<(std::ostream &out, goal const &g)
Definition: z3++.h:2638
Z3_get_algebraic_number_upper
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...
z3::ast_vector_tpl::size
unsigned size() const
Definition: z3++.h:536
Z3_mk_app
Z3_ast Z3_API Z3_mk_app(Z3_context c, Z3_func_decl d, unsigned num_args, Z3_ast const args[])
Create a constant or function application.
Z3_mk_concat
Z3_ast Z3_API Z3_mk_concat(Z3_context c, Z3_ast t1, Z3_ast t2)
Concatenate the given bit-vectors.
z3::solver::cube_iterator::operator==
bool operator==(cube_iterator const &other)
Definition: z3++.h:2541
z3::operator!
expr operator!(expr const &a)
Definition: z3++.h:1433
Z3_is_well_sorted
bool Z3_API Z3_is_well_sorted(Z3_context c, Z3_ast t)
Return true if the given expression t is well sorted.
z3::ast::operator=
ast & operator=(ast const &s)
Definition: z3++.h:506
Z3_mk_implies
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_solver_propagate_consequence
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...
z3::params::operator<<
friend std::ostream & operator<<(std::ostream &out, params const &p)
Definition: z3++.h:492
z3::optimize::optimize
optimize(context &c)
Definition: z3++.h:2837
z3::expr::get_numeral_uint64
uint64_t get_numeral_uint64() const
Return uint64_t value of numeral, throw if result cannot fit in uint64_t.
Definition: z3++.h:984
z3::solver::from_string
void from_string(char const *s)
Definition: z3++.h:2403
Z3_mk_rem
Z3_ast Z3_API Z3_mk_rem(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 rem arg2.
Z3_algebraic_get_poly
Z3_ast_vector Z3_API Z3_algebraic_get_poly(Z3_context c, Z3_ast a)
Return the coefficients of the defining polynomial.
z3::exception::exception
exception(char const *msg)
Definition: z3++.h:87
Z3_RELATION_SORT
@ Z3_RELATION_SORT
Definition: z3_api.h:156
Z3_mk_seq_unit
Z3_ast Z3_API Z3_mk_seq_unit(Z3_context c, Z3_ast a)
Create a unit sequence of a.
Z3_add_func_interp
Z3_func_interp Z3_API Z3_add_func_interp(Z3_context c, Z3_model m, Z3_func_decl f, Z3_ast default_value)
Create a fresh func_interp object, add it to a model for a specified function. It has reference count...
z3::context::fpa_const
expr fpa_const(char const *name, unsigned ebits, unsigned sbits)
Definition: z3++.h:3178
Z3_get_sort_kind
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).
Z3_mk_pbeq
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_is_re_sort
bool Z3_API Z3_is_re_sort(Z3_context c, Z3_sort s)
Check if s is a regular expression sort.
z3::expr::is_numeral
bool is_numeral(std::string &s) const
Definition: z3++.h:823
Z3_mk_numeral
Z3_ast Z3_API Z3_mk_numeral(Z3_context c, Z3_string numeral, Z3_sort ty)
Create a numeral of a given sort.
_Z3_MK_UN_
#define _Z3_MK_UN_(a, mkun)
Definition: z3++.h:1427
z3::apply_result::~apply_result
~apply_result()
Definition: z3++.h:2649
Z3_mk_bvadd_no_overflow
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.
z3::urem
expr urem(expr const &a, expr const &b)
unsigned reminder operator for bitvectors
Definition: z3++.h:1865
Z3_params_set_bool
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.
Z3_fixedpoint_dec_ref
void Z3_API Z3_fixedpoint_dec_ref(Z3_context c, Z3_fixedpoint d)
Decrement the reference counter of the given fixedpoint context.
z3::context::set_enable_exceptions
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:205
Z3_ARRAY_SORT
@ Z3_ARRAY_SORT
Definition: z3_api.h:154
Z3_mk_fpa_rne
Z3_ast Z3_API Z3_mk_fpa_rne(Z3_context c)
Create a numeral of RoundingMode sort which represents the NearestTiesToEven rounding mode.
Z3_mk_bvnot
Z3_ast Z3_API Z3_mk_bvnot(Z3_context c, Z3_ast t1)
Bitwise negation.
z3::optimize::objectives
expr_vector objectives() const
Definition: z3++.h:2923
z3::tactic::tactic
tactic(tactic const &s)
Definition: z3++.h:2673
Z3_stats_get_uint_value
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.
z3::solver::solver
solver(solver const &s)
Definition: z3++.h:2369
z3::fixedpoint::to_string
std::string to_string()
Definition: z3++.h:2966
z3::ast_vector_tpl::ast_vector_tpl
ast_vector_tpl(context &c)
Definition: z3++.h:529
Z3_mk_string
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.
z3::ast::to_string
std::string to_string() const
Definition: z3++.h:510
Z3_mk_fpa_sort
Z3_sort Z3_API Z3_mk_fpa_sort(Z3_context c, unsigned ebits, unsigned sbits)
Create a FloatingPoint sort.
Z3_mk_fpa_rtp
Z3_ast Z3_API Z3_mk_fpa_rtp(Z3_context c)
Create a numeral of RoundingMode sort which represents the TowardPositive rounding mode.
Z3_ast_to_string
Z3_string Z3_API Z3_ast_to_string(Z3_context c, Z3_ast a)
Convert the given AST node into a string.
Z3_fpa_get_sbits
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.
z3::sort::sort
sort(context &c, Z3_ast a)
Definition: z3++.h:600
z3::expr::is_quantifier
bool is_quantifier() const
Return true if this expression is a quantifier.
Definition: z3++.h:839
Z3_mk_seq_length
Z3_ast Z3_API Z3_mk_seq_length(Z3_context c, Z3_ast s)
Return the length of the sequence s.
Z3_OP_TRUE
@ Z3_OP_TRUE
Definition: z3_api.h:1009
z3::solver::cube
expr_vector cube(expr_vector &vars, unsigned cutoff)
Definition: z3++.h:2488
z3::solver::value
expr value(expr const &e)
Definition: z3++.h:2411
Z3_mk_re_star
Z3_ast Z3_API Z3_mk_re_star(Z3_context c, Z3_ast re)
Create the regular language re*.
z3::stats::stats
stats(stats const &s)
Definition: z3++.h:2326
z3::probe::probe
probe(context &c, char const *name)
Definition: z3++.h:2757
z3::last_indexof
expr last_indexof(expr const &s, expr const &substr)
Definition: z3++.h:3476
Z3_func_interp_get_entry
Z3_func_entry Z3_API Z3_func_interp_get_entry(Z3_context c, Z3_func_interp f, unsigned i)
Return a "point" of the given function interpretation. It represents the value of f in a particular p...
z3::array
Definition: z3++.h:394
z3::config::~config
~config()
Definition: z3++.h:112
z3::context::recdef
void recdef(func_decl, expr_vector const &args, expr const &body)
Definition: z3++.h:3162
Z3_mk_eq
Z3_ast Z3_API Z3_mk_eq(Z3_context c, Z3_ast l, Z3_ast r)
Create an AST node representing l = r.
Z3_simplify_get_param_descrs
Z3_param_descrs Z3_API Z3_simplify_get_param_descrs(Z3_context c)
Return the parameter description set for the simplify procedure.
Z3_stats_size
unsigned Z3_API Z3_stats_size(Z3_context c, Z3_stats s)
Return the number of statistical data in s.
z3::expr::is_seq
bool is_seq() const
Return true if this is a sequence expression.
Definition: z3++.h:793
Z3_OP_ITE
@ Z3_OP_ITE
Definition: z3_api.h:1013
z3::RTN
@ RTN
Definition: z3++.h:139
Z3_solver_to_dimacs_string
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::tactic::get_param_descrs
param_descrs get_param_descrs()
Definition: z3++.h:2701
z3::context::enable_exceptions
bool enable_exceptions() const
Definition: z3++.h:207
z3::object::object
object(context &c)
Definition: z3++.h:416
Z3_mk_fpa_gt
Z3_ast Z3_API Z3_mk_fpa_gt(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point greater than.
z3::sqrt
expr sqrt(expr const &a, expr const &rm)
Definition: z3++.h:1748
Z3_get_string
Z3_string Z3_API Z3_get_string(Z3_context c, Z3_ast s)
Retrieve the string constant stored in s.
z3::operator<
expr operator<(expr const &a, expr const &b)
Definition: z3++.h:1643
Z3_add_const_interp
void Z3_API Z3_add_const_interp(Z3_context c, Z3_model m, Z3_func_decl f, Z3_ast a)
Add a constant interpretation.
z3::func_decl::id
unsigned id() const
retrieve unique identifier for func_decl.
Definition: z3++.h:709
Z3_solver_get_param_descrs
Z3_param_descrs Z3_API Z3_solver_get_param_descrs(Z3_context c, Z3_solver s)
Return the parameter description set for the given solver object.
z3::probe::operator!
friend probe operator!(probe const &p)
Definition: z3++.h:2823
z3::context::fpa_sort
sort fpa_sort()
Return a FloatingPoint sort with given precision bitwidth (16, 32, 64 or 128).
Z3_mk_set_complement
Z3_ast Z3_API Z3_mk_set_complement(Z3_context c, Z3_ast arg)
Take the complement of a set.
Z3_params_dec_ref
void Z3_API Z3_params_dec_ref(Z3_context c, Z3_params p)
Decrement the reference counter of the given parameter set.
Z3_mk_fpa_sub
Z3_ast Z3_API Z3_mk_fpa_sub(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point subtraction.
Z3_mk_fpa_neg
Z3_ast Z3_API Z3_mk_fpa_neg(Z3_context c, Z3_ast t)
Floating-point negation.
z3::model::translate
Definition: z3++.h:2242
Z3_get_denominator
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.
z3::solver::add
void add(expr const &e)
Definition: z3++.h:2388
Z3_tactic_using_params
Z3_tactic Z3_API Z3_tactic_using_params(Z3_context c, Z3_tactic t, Z3_params p)
Return a tactic that applies t using the given set of parameters.
z3::solver::solver
solver(context &c, simple)
Definition: z3++.h:2365
z3::func_interp::~func_interp
~func_interp()
Definition: z3++.h:2213
z3::solver
Definition: z3++.h:2355
Z3_mk_exists_const
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.
Z3_mk_bvsge
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::shl
expr shl(expr const &a, expr const &b)
shift left operator for bitvectors
Definition: z3++.h:1872
z3::expr::get_escaped_string
std::string get_escaped_string() const
for a string value expression return an escaped or unescaped string value.
Definition: z3++.h:1026
z3::ast_vector_tpl::ast_vector_tpl
ast_vector_tpl(context &c, ast_vector_tpl const &src)
Definition: z3++.h:532
z3::func_entry::value
expr value() const
Definition: z3++.h:2199
Z3_mk_seq_last_index
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::user_propagator_base::fresh
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::object::m_ctx
context * m_ctx
Definition: z3++.h:414
z3::fixedpoint::register_relation
void register_relation(func_decl &p)
Definition: z3++.h:2960
Z3_mk_bvadd
Z3_ast Z3_API Z3_mk_bvadd(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement addition.
z3::optimize::handle::h
unsigned h() const
Definition: z3++.h:2835
Z3_stats_to_string
Z3_string Z3_API Z3_stats_to_string(Z3_context c, Z3_stats s)
Convert a statistics into a string.
z3::expr::is_xor
bool is_xor() const
Definition: z3++.h:1152
z3::ast::m_ast
Z3_ast m_ast
Definition: z3++.h:498
z3::expr::is_int
bool is_int() const
Return true if this is an integer expression.
Definition: z3++.h:765
z3::user_propagator_base::eq
void eq(eq_eh_t &f)
Definition: z3++.h:3686
Z3_is_quantifier_exists
bool Z3_API Z3_is_quantifier_exists(Z3_context c, Z3_ast a)
Determine if ast is an existential quantifier.
Z3_ast_vector_to_string
Z3_string Z3_API Z3_ast_vector_to_string(Z3_context c, Z3_ast_vector v)
Convert AST vector into a string.
z3::fixedpoint::add_rule
void add_rule(expr &rule, symbol const &name)
Definition: z3++.h:2940
z3::set_param
void set_param(char const *param, char const *value)
Definition: z3++.h:76
z3::solver::from_file
void from_file(char const *file)
Definition: z3++.h:2402
Z3_ast_vector_dec_ref
void Z3_API Z3_ast_vector_dec_ref(Z3_context c, Z3_ast_vector v)
Decrement the reference counter of the given AST vector.
z3::func_decl::decl_kind
Z3_decl_kind decl_kind() const
Definition: z3++.h:715
z3::context::string_val
expr string_val(char const *s)
Definition: z3++.h:3213
z3::param_descrs::~param_descrs
~param_descrs()
Definition: z3++.h:458
z3::expr::operator[]
expr operator[](expr_vector const &index) const
Definition: z3++.h:1355
z3::set_del
expr set_del(expr const &s, expr const &e)
Definition: z3++.h:3413
z3::empty_set
expr empty_set(sort const &s)
Definition: z3++.h:3401
Z3_optimize_get_lower
Z3_ast Z3_API Z3_optimize_get_lower(Z3_context c, Z3_optimize o, unsigned idx)
Retrieve lower bound value or approximation for the i'th optimization objective.
z3::optimize::maximize
handle maximize(expr const &e)
Definition: z3++.h:2885
z3::tactic::operator&
friend tactic operator&(tactic const &t1, tactic const &t2)
Definition: z3++.h:2704
Z3_get_domain
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::params
Definition: z3++.h:470
z3::expr::is_finite_domain
bool is_finite_domain() const
Return true if this is a Finite-domain expression.
Definition: z3++.h:807
z3::fixedpoint::get_param_descrs
param_descrs get_param_descrs()
Definition: z3++.h:2965
z3::ast_vector
ast_vector_tpl< ast > ast_vector
Definition: z3++.h:70
Z3_mk_bvneg
Z3_ast Z3_API Z3_mk_bvneg(Z3_context c, Z3_ast t1)
Standard two's complement unary minus.
z3::pble
expr pble(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2065
z3::ugt
expr ugt(expr const &a, expr const &b)
unsigned greater than operator for bitvectors.
Definition: z3++.h:1838
Z3_mk_str_to_int
Z3_ast Z3_API Z3_mk_str_to_int(Z3_context c, Z3_ast s)
Convert string to integer.
Z3_goal_dec_ref
void Z3_API Z3_goal_dec_ref(Z3_context c, Z3_goal g)
Decrement the reference counter of the given goal.
z3::exception::operator<<
friend std::ostream & operator<<(std::ostream &out, exception const &e)
Definition: z3++.h:93
Z3_tactic_apply
Z3_apply_result Z3_API Z3_tactic_apply(Z3_context c, Z3_tactic t, Z3_goal g)
Apply tactic t to the goal g.
z3::symbol::operator=
symbol & operator=(symbol const &s)
Definition: z3++.h:429
z3::probe::operator>=
friend probe operator>=(probe const &p1, probe const &p2)
Definition: z3++.h:2797
z3::sort::is_datatype
bool is_datatype() const
Return true if this sort is a Datatype sort.
Definition: z3++.h:648
Z3_get_numerator
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.
z3::func_decl::func_decl
func_decl(func_decl const &s)
Definition: z3++.h:702
Z3_mk_repeat
Z3_ast Z3_API Z3_mk_repeat(Z3_context c, unsigned i, Z3_ast t1)
Repeat the given bit-vector up length i.
z3::solver::cube_iterator
Definition: z3++.h:2494
z3::solver::cube_iterator::operator++
cube_iterator & operator++()
Definition: z3++.h:2527
z3::nor
expr nor(expr const &a, expr const &b)
Definition: z3++.h:1700
z3::sort
A Z3 sort (aka type). Every expression (i.e., formula or term) in Z3 has a sort.
Definition: z3++.h:596
z3::solver::~solver
~solver()
Definition: z3++.h:2370
z3::context::bool_val
expr bool_val(bool b)
Definition: z3++.h:3183
z3::RTP
@ RTP
Definition: z3++.h:138
Z3_optimize_get_upper
Z3_ast Z3_API Z3_optimize_get_upper(Z3_context c, Z3_optimize o, unsigned idx)
Retrieve upper bound value or approximation for the i'th optimization objective.
z3::sort::fpa_sbits
unsigned fpa_sbits() const
Definition: z3++.h:679
z3::operator&&
expr operator&&(expr const &a, expr const &b)
Definition: z3++.h:1439
z3::expr::algebraic_poly
expr_vector algebraic_poly() const
Return coefficients for p of an algebraic number (root-obj p i)
Definition: z3++.h:899
z3::expr::mk_or
friend expr mk_or(expr_vector const &args)
Definition: z3++.h:2167
Z3_mk_func_decl
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::func_entry::func_entry
func_entry(context &c, Z3_func_entry e)
Definition: z3++.h:2188
Z3_get_ast_id
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....
z3::to_sort
sort to_sort(context &c, Z3_sort s)
Definition: z3++.h:1793
Z3_probe_inc_ref
void Z3_API Z3_probe_inc_ref(Z3_context c, Z3_probe p)
Increment the reference counter of the given probe.
z3::operator>
expr operator>(expr const &a, expr const &b)
Definition: z3++.h:1665
z3::context::set
void set(char const *param, char const *value)
Update global parameter param with string value.
Definition: z3++.h:212
Z3_goal_is_decided_unsat
bool Z3_API Z3_goal_is_decided_unsat(Z3_context c, Z3_goal g)
Return true if the goal contains false, and it is precise or the product of an over approximation.
Z3_solver_get_trail
Z3_ast_vector Z3_API Z3_solver_get_trail(Z3_context c, Z3_solver s)
Return the trail modulo model conversion, in order of decision level The decision level can be retrie...
Z3_param_descrs_inc_ref
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_mk_re_range
Z3_ast Z3_API Z3_mk_re_range(Z3_context c, Z3_ast lo, Z3_ast hi)
Create the range regular expression over two sequences of length 1.
z3::solver::lower
expr lower(expr const &e)
Definition: z3++.h:2405
z3::func_decl::operator()
expr operator()() const
Definition: z3++.h:3239
z3::min
expr min(expr const &a, expr const &b)
Definition: z3++.h:1702
z3::ast_vector_tpl::iterator::operator==
bool operator==(iterator const &other) const
Definition: z3++.h:570
Z3_solver_dec_ref
void Z3_API Z3_solver_dec_ref(Z3_context c, Z3_solver s)
Decrement the reference counter of the given solver.
Z3_sort_kind
Z3_sort_kind
The different kinds of Z3 types (See Z3_get_sort_kind).
Definition: z3_api.h:148
Z3_mk_ite
Z3_ast Z3_API Z3_mk_ite(Z3_context c, Z3_ast t1, Z3_ast t2, Z3_ast t3)
Create an AST node representing an if-then-else: ite(t1, t2, t3).
Z3_mk_extract
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,...
z3::goal::goal
goal(context &c, bool models=true, bool unsat_cores=false, bool proofs=false)
Definition: z3++.h:2588
z3::expr::implies
friend expr implies(expr const &a, expr const &b)
Definition: z3++.h:1387
z3::stats::~stats
~stats()
Definition: z3++.h:2327
z3::optimize::from_file
void from_file(char const *filename)
Definition: z3++.h:2926
Z3_ast_vector_inc_ref
void Z3_API Z3_ast_vector_inc_ref(Z3_context c, Z3_ast_vector v)
Increment the reference counter of the given AST vector.
Z3_is_algebraic_number
bool Z3_API Z3_is_algebraic_number(Z3_context c, Z3_ast a)
Return true if the given AST is a real algebraic number.
z3::unsat
@ unsat
Definition: z3++.h:132
z3::expr::is_numeral
bool is_numeral() const
Return true if this expression is a numeral. Specialized functions also return representations for th...
Definition: z3++.h:818
Z3_get_numeral_uint64
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....
z3::unknown
@ unknown
Definition: z3++.h:132
z3::ast_vector_tpl::~ast_vector_tpl
~ast_vector_tpl()
Definition: z3++.h:534
Z3_INT_SYMBOL
@ Z3_INT_SYMBOL
Definition: z3_api.h:115
Z3_mk_seq_in_re
Z3_ast Z3_API Z3_mk_seq_in_re(Z3_context c, Z3_ast seq, Z3_ast re)
Check if seq is in the language generated by the regular expression re.
z3::mod
expr mod(expr const &a, expr const &b)
Definition: z3++.h:1399
Z3_OP_EQ
@ Z3_OP_EQ
Definition: z3_api.h:1011
z3::func_decl_vector
ast_vector_tpl< func_decl > func_decl_vector
Definition: z3++.h:74
Z3_mk_set_difference
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::func_interp::add_entry
void add_entry(expr_vector const &args, expr &value)
Definition: z3++.h:2225
Z3_mk_bvule
Z3_ast Z3_API Z3_mk_bvule(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned less than or equal to.
z3::ast::hash
unsigned hash() const
Definition: z3++.h:508
z3::expr::is_eq
bool is_eq() const
Definition: z3++.h:1154
Z3_func_interp_inc_ref
void Z3_API Z3_func_interp_inc_ref(Z3_context c, Z3_func_interp f)
Increment the reference counter of the given Z3_func_interp object.
z3::context::bv_sort
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:2998
z3::func_decl::range
sort range() const
Definition: z3++.h:713
z3::empty
expr empty(sort const &s)
Definition: z3++.h:3453
z3::goal::precision
Z3_goal_prec precision() const
Definition: z3++.h:2604
z3::param_descrs::param_descrs
param_descrs(param_descrs const &o)
Definition: z3++.h:450
z3::cast_ast< expr >::operator()
expr operator()(context &c, Z3_ast a)
Definition: z3++.h:1955
z3::tactic::repeat
friend tactic repeat(tactic const &t, unsigned max)
Definition: z3++.h:2718
z3::expr::is_distinct
bool is_distinct() const
Definition: z3++.h:1156
Z3_model_get_const_interp
Z3_ast Z3_API Z3_model_get_const_interp(Z3_context c, Z3_model m, Z3_func_decl a)
Return the interpretation (i.e., assignment) of constant a in the model m. Return NULL,...
z3::tactic::par_or
friend tactic par_or(unsigned n, tactic const *tactics)
Definition: z3++.h:2734
Z3_mk_bool_sort
Z3_sort Z3_API Z3_mk_bool_sort(Z3_context c)
Create the Boolean type.
Z3_optimize_check
Z3_lbool Z3_API Z3_optimize_check(Z3_context c, Z3_optimize o, unsigned num_assumptions, Z3_ast const assumptions[])
Check consistency and produce optimal values.
z3::context::recfun
func_decl recfun(symbol const &name, unsigned arity, sort const *domain, sort const &range)
Definition: z3++.h:3137
z3::goal::inconsistent
bool inconsistent() const
Definition: z3++.h:2605
z3::apply_result::apply_result
apply_result(apply_result const &s)
Definition: z3++.h:2648
z3::fixedpoint::add_fact
void add_fact(func_decl &f, unsigned *args)
Definition: z3++.h:2941
z3::to_expr
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:1784
Z3_VAR_AST
@ Z3_VAR_AST
Definition: z3_api.h:181
z3::operator<<
std::ostream & operator<<(std::ostream &out, exception const &e)
Definition: z3++.h:93
Z3_mk_fpa_numeral_float
Z3_ast Z3_API Z3_mk_fpa_numeral_float(Z3_context c, float v, Z3_sort ty)
Create a numeral of FloatingPoint sort from a float.
z3::expr::xnor
friend expr xnor(expr const &a, expr const &b)
Definition: z3++.h:1701
z3::optimize::unsat_core
expr_vector unsat_core() const
Definition: z3++.h:2910
z3::fma
expr fma(expr const &a, expr const &b, expr const &c, expr const &rm)
Definition: z3++.h:1757
z3::optimize
Definition: z3++.h:2827
Z3_tactic_cond
Z3_tactic Z3_API Z3_tactic_cond(Z3_context c, Z3_probe p, Z3_tactic t1, Z3_tactic t2)
Return a tactic that applies t1 to a given goal if the probe p evaluates to true, and t2 if p evaluat...
z3::ast_vector_tpl::pop_back
void pop_back()
Definition: z3++.h:541
Z3_func_interp_dec_ref
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.
z3::bvsub_no_overflow
expr bvsub_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:1910
Z3_mk_lstring
Z3_ast Z3_API Z3_mk_lstring(Z3_context c, unsigned len, Z3_string s)
Create a string constant out of the string that is passed in It takes the length of the string as wel...
z3::func_decl::operator=
func_decl & operator=(func_decl const &s)
Definition: z3++.h:704
Z3_mk_int
Z3_ast Z3_API Z3_mk_int(Z3_context c, int v, Z3_sort ty)
Create a numeral of an int, bit-vector, or finite-domain sort.
z3::fixedpoint::get_num_levels
unsigned get_num_levels(func_decl &p)
Definition: z3++.h:2952
Z3_mk_power
Z3_ast Z3_API Z3_mk_power(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 ^ arg2.
z3::solver::cube_generator::cube_generator
cube_generator(solver &s)
Definition: z3++.h:2556
Z3_mk_fpa_div
Z3_ast Z3_API Z3_mk_fpa_div(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point division.
Z3_fixedpoint_get_statistics
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_vector_set
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.
z3::solver::add
void add(expr const &e, char const *p)
Definition: z3++.h:2394
Z3_mk_fpa_numeral_double
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_goal_to_string
Z3_string Z3_API Z3_goal_to_string(Z3_context c, Z3_goal g)
Convert a goal into a string.
Z3_fixedpoint_register_relation
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...
z3::config::set
void set(char const *param, bool value)
Set global parameter param with Boolean value.
Definition: z3++.h:121
z3::func_decl
Function declaration (aka function definition). It is the signature of interpreted and uninterpreted ...
Definition: z3++.h:698
z3::probe::operator>
friend probe operator>(probe const &p1, probe const &p2)
Definition: z3++.h:2807
z3::operator<=
expr operator<=(expr const &a, expr const &b)
Definition: z3++.h:1618
Z3_mk_div
Z3_ast Z3_API Z3_mk_div(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 div arg2.
Z3_goal_inc_ref
void Z3_API Z3_goal_inc_ref(Z3_context c, Z3_goal g)
Increment the reference counter of the given goal.
z3::solver::operator<<
friend std::ostream & operator<<(std::ostream &out, solver const &s)
Definition: z3++.h:2579
z3::params::set
void set(char const *k, char const *s)
Definition: z3++.h:488
z3::context::fpa_val
expr fpa_val(double n)
Definition: z3++.h:3209
Z3_REAL_SORT
@ Z3_REAL_SORT
Definition: z3_api.h:152
z3::expr::operator>=
friend expr operator>=(expr const &a, expr const &b)
Definition: z3++.h:1537
z3::symbol::kind
Z3_symbol_kind kind() const
Definition: z3++.h:431
Z3_tactic_repeat
Z3_tactic Z3_API Z3_tactic_repeat(Z3_context c, Z3_tactic t, unsigned max)
Return a tactic that keeps applying t until the goal is not modified anymore or the maximum number of...
z3::solver::non_units
expr_vector non_units() const
Definition: z3++.h:2447
z3::goal::as_expr
expr as_expr() const
Definition: z3++.h:2622
z3::goal::convert_model
model convert_model(model const &m) const
Definition: z3++.h:2611
z3::expr::bvmul_no_overflow
friend expr bvmul_no_overflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:1922
Z3_optimize_assert
void Z3_API Z3_optimize_assert(Z3_context c, Z3_optimize o, Z3_ast a)
Assert hard constraint to the optimization context.
z3::goal::depth
unsigned depth() const
Definition: z3++.h:2606
z3::context::real_val
expr real_val(int n, int d)
Definition: z3++.h:3191
Z3_mk_lt
Z3_ast Z3_API Z3_mk_lt(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than.
Z3_get_decl_num_parameters
unsigned Z3_API Z3_get_decl_num_parameters(Z3_context c, Z3_func_decl d)
Return the number of parameters associated with a declaration.
Z3_optimize_from_file
void Z3_API Z3_optimize_from_file(Z3_context c, Z3_optimize o, Z3_string s)
Parse an SMT-LIB2 file with assertions, soft constraints and optimization objectives....
z3::solver::check
check_result check(expr_vector const &assumptions)
Definition: z3++.h:2426
z3::func_decl::transitive_closure
func_decl transitive_closure(func_decl const &)
Definition: z3++.h:717
z3::mk_and
expr mk_and(expr_vector const &args)
Definition: z3++.h:2173
z3::solver::solver
solver(context &c)
Definition: z3++.h:2364
z3::expr::range
friend expr range(expr const &lo, expr const &hi)
Definition: z3++.h:3518
Z3_mk_const
Z3_ast Z3_API Z3_mk_const(Z3_context c, Z3_symbol s, Z3_sort ty)
Declare and create a constant.
z3::expr::extract
expr extract(expr const &offset, expr const &length) const
sequence and regular expression operations.
Definition: z3++.h:1280
z3::expr::is_false
bool is_false() const
Definition: z3++.h:1148
z3::zext
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:1893
Z3_stats_dec_ref
void Z3_API Z3_stats_dec_ref(Z3_context c, Z3_stats s)
Decrement the reference counter of the given statistics object.
z3::goal::goal
goal(context &c, Z3_goal s)
Definition: z3++.h:2589
z3::expr::contains
expr contains(expr const &s)
Definition: z3++.h:1295
Z3_model_get_num_funcs
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::apply_result
Definition: z3++.h:2640
z3::expr::bvsub_no_underflow
friend expr bvsub_no_underflow(expr const &a, expr const &b, bool is_signed)
Definition: z3++.h:1913
z3::bvsdiv_no_overflow
expr bvsdiv_no_overflow(expr const &a, expr const &b)
Definition: z3++.h:1916
z3::set_add
expr set_add(expr const &s, expr const &e)
Definition: z3++.h:3409
Z3_FLOATING_POINT_SORT
@ Z3_FLOATING_POINT_SORT
Definition: z3_api.h:158
Z3_NUMERAL_AST
@ Z3_NUMERAL_AST
Definition: z3_api.h:179
z3::func_entry::num_args
unsigned num_args() const
Definition: z3++.h:2200
z3::model::operator=
model & operator=(model const &s)
Definition: z3++.h:2249
z3::expr::expr
expr(context &c)
Definition: z3++.h:748
Z3_mk_bv_sort
Z3_sort Z3_API Z3_mk_bv_sort(Z3_context c, unsigned sz)
Create a bit-vector type of the given size.
z3::func_entry::arg
expr arg(unsigned i) const
Definition: z3++.h:2201
z3::tactic::operator|
friend tactic operator|(tactic const &t1, tactic const &t2)
Definition: z3++.h:2711
Z3_mk_fixedpoint
Z3_fixedpoint Z3_API Z3_mk_fixedpoint(Z3_context c)
Create a new fixedpoint context.
Z3_solver_from_string
void Z3_API Z3_solver_from_string(Z3_context c, Z3_solver s, Z3_string file_name)
load solver assertions from a string.
Z3_mk_seq_to_re
Z3_ast Z3_API Z3_mk_seq_to_re(Z3_context c, Z3_ast seq)
Create a regular expression that accepts the sequence seq.
Z3_mk_int_sort
Z3_sort Z3_API Z3_mk_int_sort(Z3_context c)
Create the integer type.
Z3_probe_ge
Z3_probe Z3_API Z3_probe_ge(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when the value returned by p1 is greater than or equal to the...
z3::func_interp
Definition: z3++.h:2204
Z3_mk_enumeration_sort
Z3_sort Z3_API Z3_mk_enumeration_sort(Z3_context c, Z3_symbol name, unsigned n, Z3_symbol const enum_names[], Z3_func_decl enum_consts[], Z3_func_decl enum_testers[])
Create a enumeration sort.
z3::tactic::mk_solver
solver mk_solver() const
Definition: z3++.h:2683
z3::func_interp::num_entries
unsigned num_entries() const
Definition: z3++.h:2223
z3::ule
expr ule(expr const &a, expr const &b)
unsigned less than or equal to operator for bitvectors.
Definition: z3++.h:1820
z3::expr::operator|
friend expr operator|(expr const &a, expr const &b)
Definition: z3++.h:1695
Z3_INT_SORT
@ Z3_INT_SORT
Definition: z3_api.h:151
Z3_solver_get_unsat_core
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...
z3::context::set
void set(char const *param, bool value)
Update global parameter param with Boolean value.
Definition: z3++.h:216
z3::context::check_parser_error
void check_parser_error() const
Definition: z3++.h:194
Z3_mk_bvashr
Z3_ast Z3_API Z3_mk_bvashr(Z3_context c, Z3_ast t1, Z3_ast t2)
Arithmetic shift right.
z3::optimize::add
void add(expr const &e)
Definition: z3++.h:2858
Z3_mk_bvurem
Z3_ast Z3_API Z3_mk_bvurem(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned remainder.
Z3_goal_to_dimacs_string
Z3_string Z3_API Z3_goal_to_dimacs_string(Z3_context c, Z3_goal g, bool include_names)
Convert a goal into a DIMACS formatted string. The goal must be in CNF. You can convert a goal to CNF...
z3::solver::add
void add(expr_vector const &v)
Definition: z3++.h:2397
z3::pbeq
expr pbeq(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2081
z3::solver::set
void set(char const *k, symbol const &v)
Definition: z3++.h:2383
z3::context::tuple_sort
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:3045
Z3_mk_bvsub_no_overflow
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.
Z3_solver_get_units
Z3_ast_vector Z3_API Z3_solver_get_units(Z3_context c, Z3_solver s)
Return the set of units modulo model conversion.
Z3_get_numeral_uint
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_mk_bvsmod
Z3_ast Z3_API Z3_mk_bvsmod(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed remainder (sign follows divisor).
z3::params::set
void set(char const *k, bool b)
Definition: z3++.h:484
Z3_probe_eq
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::operator~
expr operator~(expr const &a)
Definition: z3++.h:1755
Z3_mk_seq_replace
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::context::set_rounding_mode
void set_rounding_mode(rounding_mode rm)
Sets RoundingMode of FloatingPoints.
Definition: z3++.h:3027
z3::expr::atmost
friend expr atmost(expr_vector const &es, unsigned bound)
Definition: z3++.h:2089
z3::sle
expr sle(expr const &a, expr const &b)
signed less than or equal to operator for bitvectors.
Definition: z3++.h:1806
z3::expr::bv2int
friend expr bv2int(expr const &a, bool is_signed)
bit-vector and integer conversions.
Definition: z3++.h:1898
z3::probe::probe
probe(probe const &s)
Definition: z3++.h:2760
z3::expr::operator+
friend expr operator+(expr const &a, expr const &b)
Definition: z3++.h:1483
z3::func_entry::~func_entry
~func_entry()
Definition: z3++.h:2190
Z3_get_arity
unsigned Z3_API Z3_get_arity(Z3_context c, Z3_func_decl d)
Alias for Z3_get_domain_size.
Z3_mk_context_rc
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....
z3::expr::pw
friend expr pw(expr const &a, expr const &b)
Definition: z3++.h:1395
Z3_mk_seq_contains
Z3_ast Z3_API Z3_mk_seq_contains(Z3_context c, Z3_ast container, Z3_ast containee)
Check if container contains containee.
z3::optimize::~optimize
~optimize()
Definition: z3++.h:2856
z3::model::operator<<
friend std::ostream & operator<<(std::ostream &out, model const &m)
Definition: z3++.h:2315
z3::expr::get_numeral_uint
unsigned get_numeral_uint() const
Return uint value of numeral, throw if result cannot fit in machine uint.
Definition: z3++.h:950
z3::sort::bv_size
unsigned bv_size() const
Return the size of this Bit-vector sort.
Definition: z3++.h:675
z3::apply_result::operator=
apply_result & operator=(apply_result const &s)
Definition: z3++.h:2651
Z3_RE_SORT
@ Z3_RE_SORT
Definition: z3_api.h:161
z3::sort::is_finite_domain
bool is_finite_domain() const
Return true if this sort is a Finite domain sort.
Definition: z3++.h:664
Z3_probe_apply
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::expr::is_algebraic
bool is_algebraic() const
Return true if expression is an algebraic number.
Definition: z3++.h:861
z3::sort::sort
sort(context &c, Z3_sort s)
Definition: z3++.h:599
z3::mk_or
expr mk_or(expr_vector const &args)
Definition: z3++.h:2167
z3::array::ptr
T * ptr()
Definition: z3++.h:409
z3::solver::units
expr_vector units() const
Definition: z3++.h:2448
z3::expr::decl
func_decl decl() const
Return the declaration associated with this application. This method assumes the expression is an app...
Definition: z3++.h:1060
Z3_get_numeral_int64
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....
z3::sort::is_int
bool is_int() const
Return true if this sort is the Integer sort.
Definition: z3++.h:628
Z3_ast_vector_get
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.
Z3_mk_as_array
Z3_ast Z3_API Z3_mk_as_array(Z3_context c, Z3_func_decl f)
Create array with the same interpretation as a function. The array satisfies the property (f x) = (se...
z3::re_empty
expr re_empty(sort const &s)
Definition: z3++.h:3497
Z3_mk_ast_vector
Z3_ast_vector Z3_API Z3_mk_ast_vector(Z3_context c)
Return an empty AST vector.
z3::expr::is_datatype
bool is_datatype() const
Return true if this is a Datatype expression.
Definition: z3++.h:785
z3::int2bv
expr int2bv(unsigned n, expr const &a)
Definition: z3++.h:1899
z3::context::enumeration_sort
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:3034
Z3_tactic_get_param_descrs
Z3_param_descrs Z3_API Z3_tactic_get_param_descrs(Z3_context c, Z3_tactic t)
Return the parameter description set for the given tactic object.
Z3_mk_bvadd_no_underflow
Z3_ast Z3_API Z3_mk_bvadd_no_underflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed addition of t1 and t2 does not underflow.
Z3_goal_assert
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::solver::set
void set(char const *k, unsigned v)
Definition: z3++.h:2381
z3::operator*
expr operator*(expr const &a, expr const &b)
Definition: z3++.h:1513
Z3_probe_lt
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::context::real_sort
sort real_sort()
Return the Real sort.
Definition: z3++.h:2997
Z3_mk_seq_empty
Z3_ast Z3_API Z3_mk_seq_empty(Z3_context c, Z3_sort seq)
Create an empty sequence of the sequence sort seq.
Z3_optimize_set_params
void Z3_API Z3_optimize_set_params(Z3_context c, Z3_optimize o, Z3_params p)
Set parameters on optimization context.
Z3_ast_vector_resize
void Z3_API Z3_ast_vector_resize(Z3_context c, Z3_ast_vector v, unsigned n)
Resize the AST vector v.
Z3_solver_get_implied_value
Z3_ast Z3_API Z3_solver_get_implied_value(Z3_context c, Z3_solver s, Z3_ast e)
retrieve implied value for expression, if any is implied by solver at search level....
z3::probe::operator<=
friend probe operator<=(probe const &p1, probe const &p2)
Definition: z3++.h:2792
Z3_mk_params
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_solver_assert_and_track
void Z3_API Z3_solver_assert_and_track(Z3_context c, Z3_solver s, Z3_ast a, Z3_ast p)
Assert a constraint a into the solver, and track it (in the unsat) core using the Boolean constant p.
Z3_mk_probe
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::expr_vector
ast_vector_tpl< expr > expr_vector
Definition: z3++.h:72
Z3_tactic_get_help
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.
z3::optimize::add
handle add(expr const &e, unsigned weight)
Definition: z3++.h:2882
z3::operator/
expr operator/(expr const &a, expr const &b)
Definition: z3++.h:1554
Z3_params_inc_ref
void Z3_API Z3_params_inc_ref(Z3_context c, Z3_params p)
Increment the reference counter of the given parameter set.
Z3_mk_string_sort
Z3_sort Z3_API Z3_mk_string_sort(Z3_context c)
Create a sort for 8 bit strings.
Z3_mk_select_n
Z3_ast Z3_API Z3_mk_select_n(Z3_context c, Z3_ast a, unsigned n, Z3_ast const *idxs)
n-ary Array read. The argument a is the array and idxs are the indices of the array that gets read.
z3::sum
expr sum(expr_vector const &args)
Definition: z3++.h:2105
z3::sort::is_seq
bool is_seq() const
Return true if this sort is a Sequence sort.
Definition: z3++.h:656
z3::solver::proof
expr proof() const
Definition: z3++.h:2460
Z3_mk_tuple_sort
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.
Z3_probe_not
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::bvneg_no_overflow
expr bvneg_no_overflow(expr const &a)
Definition: z3++.h:1919
z3::linear_order
func_decl linear_order(sort const &a, unsigned index)
Definition: z3++.h:1935
z3::expr::concat
friend expr concat(expr const &a, expr const &b)
Definition: z3++.h:2123
Z3_fixedpoint_get_assertions
Z3_ast_vector Z3_API Z3_fixedpoint_get_assertions(Z3_context c, Z3_fixedpoint f)
Retrieve set of background assertions from fixedpoint context.
Z3_del_config
void Z3_API Z3_del_config(Z3_config c)
Delete the given configuration object.
z3::user_propagator_base::conflict
void conflict(unsigned num_fixed, unsigned const *fixed)
Definition: z3++.h:3725
Z3_apply_result_get_subgoal
Z3_goal Z3_API Z3_apply_result_get_subgoal(Z3_context c, Z3_apply_result r, unsigned i)
Return one of the subgoals in the Z3_apply_result object returned by Z3_tactic_apply.
Z3_is_lambda
bool Z3_API Z3_is_lambda(Z3_context c, Z3_ast a)
Determine if ast is a lambda expression.
z3::solver::check
check_result check()
Definition: z3++.h:2415
z3::expr::is_real
bool is_real() const
Return true if this is a real expression.
Definition: z3++.h:769
Z3_mk_array_sort
Z3_sort Z3_API Z3_mk_array_sort(Z3_context c, Z3_sort domain, Z3_sort range)
Create an array type.
Z3_mk_bvsle
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_mk_int2bv
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.
Z3_solver_propagate_final
void Z3_API Z3_solver_propagate_final(Z3_context c, Z3_solver s, Z3_final_eh final_eh)
register a callback on final check. This provides freedom to the propagator to delay actions or imple...
Z3_solver_get_statistics
Z3_stats Z3_API Z3_solver_get_statistics(Z3_context c, Z3_solver s)
Return statistics for the given solver.
Z3_is_seq_sort
bool Z3_API Z3_is_seq_sort(Z3_context c, Z3_sort s)
Check if s is a sequence sort.
Z3_get_bv_sort_size
unsigned Z3_API Z3_get_bv_sort_size(Z3_context c, Z3_sort t)
Return the size of the given bit-vector sort.
z3::context::parse_file
expr_vector parse_file(char const *file)
Definition: z3++.h:3535
z3::expr::bvadd_no_underflow
friend expr bvadd_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:1907
Z3_fixedpoint_to_string
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_get_numeral_decimal_string
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_mk_false
Z3_ast Z3_API Z3_mk_false(Z3_context c)
Create an AST node representing false.
z3::smod
expr smod(expr const &a, expr const &b)
signed modulus operator for bitvectors
Definition: z3++.h:1858
Z3_get_numeral_int
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....
Z3_get_array_sort_range
Z3_sort Z3_API Z3_get_array_sort_range(Z3_context c, Z3_sort t)
Return the range of the given array sort.
z3::params::set
void set(char const *k, double n)
Definition: z3++.h:486
z3::fixedpoint::fixedpoint
fixedpoint(context &c)
Definition: z3++.h:2935
z3::operator|
expr operator|(expr const &a, expr const &b)
Definition: z3++.h:1695
z3::goal::~goal
~goal()
Definition: z3++.h:2591
z3::context::~context
~context()
Definition: z3++.h:181
z3::max
expr max(expr const &a, expr const &b)
Definition: z3++.h:1717
z3::expr::fpa_rounding_mode
sort fpa_rounding_mode()
Return a RoundingMode sort.
Definition: z3++.h:1046
Z3_model_inc_ref
void Z3_API Z3_model_inc_ref(Z3_context c, Z3_model m)
Increment the reference counter of the given model.
z3::expr::operator!=
friend expr operator!=(expr const &a, expr const &b)
Definition: z3++.h:1473
z3::symbol::symbol
symbol(context &c, Z3_symbol s)
Definition: z3++.h:427
z3::user_propagator_base::push
virtual void push()=0
Z3_parse_smtlib2_string
Z3_ast_vector Z3_API Z3_parse_smtlib2_string(Z3_context c, Z3_string str, unsigned num_sorts, Z3_symbol const sort_names[], Z3_sort const sorts[], unsigned num_decls, Z3_symbol const decl_names[], Z3_func_decl const decls[])
Parse the given string using the SMT-LIB2 parser.
Z3_mk_atleast
Z3_ast Z3_API Z3_mk_atleast(Z3_context c, unsigned num_args, Z3_ast const args[], unsigned k)
Pseudo-Boolean relations.
Z3_mk_bvnand
Z3_ast Z3_API Z3_mk_bvnand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nand.
Z3_solver_set_params
void Z3_API Z3_solver_set_params(Z3_context c, Z3_solver s, Z3_params p)
Set the given solver using the given parameters.
Z3_solver_get_non_units
Z3_ast_vector Z3_API Z3_solver_get_non_units(Z3_context c, Z3_solver s)
Return the set of non units in the solver state.
z3::sort::is_arith
bool is_arith() const
Return true if this sort is the Integer or Real sort.
Definition: z3++.h:636
Z3_mk_bvsdiv
Z3_ast Z3_API Z3_mk_bvsdiv(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed division.
z3::expr::rotate_right
expr rotate_right(unsigned i)
Definition: z3++.h:1259
z3::context::real_const
expr real_const(char const *name)
Definition: z3++.h:3176
z3::context::uninterpreted_sort
sort uninterpreted_sort(char const *name)
create an uninterpreted sort with the name given by the string or symbol.
Definition: z3++.h:3058
Z3_mk_unsigned_int64
Z3_ast Z3_API Z3_mk_unsigned_int64(Z3_context c, uint64_t v, Z3_sort ty)
Create a numeral of a int, bit-vector, or finite-domain sort.
Z3_get_range
Z3_sort Z3_API Z3_get_range(Z3_context c, Z3_func_decl d)
Return the range of the given declaration.
Z3_solver_cube
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::array::resize
void resize(unsigned sz)
Definition: z3++.h:404
z3::forall
expr forall(expr const &x, expr const &b)
Definition: z3++.h:1992
z3::expr::get_decimal_string
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:874
Z3_get_app_arg
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.
z3::rem
expr rem(expr const &a, expr const &b)
Definition: z3++.h:1415
z3::expr::bvadd_no_overflow
friend expr bvadd_no_overflow(expr const &a, expr const &b, bool is_signed)
bit-vector overflow/underflow checks
Definition: z3++.h:1904
z3::model::model
model(model const &s)
Definition: z3++.h:2245
z3::func_decl::name
symbol name() const
Definition: z3++.h:714
z3::expr::get_string
std::string get_string() const
Definition: z3++.h:1033
z3::sort::sort
sort(sort const &s)
Definition: z3++.h:601
Z3_mk_optimize
Z3_optimize Z3_API Z3_mk_optimize(Z3_context c)
Create a new optimize context.
Z3_apply_result_dec_ref
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_model_to_string
Z3_string Z3_API Z3_model_to_string(Z3_context c, Z3_model m)
Convert the given model into a string.
z3::ast_vector_tpl::ast_vector_tpl
ast_vector_tpl(context &c, Z3_ast_vector v)
Definition: z3++.h:530
Z3_symbol_kind
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:114
z3::distinct
expr distinct(expr_vector const &args)
Definition: z3++.h:2114
z3::tactic::help
std::string help() const
Definition: z3++.h:2693
z3::expr::itos
expr itos() const
Definition: z3++.h:1323
z3::solver::solver
solver(context &c, solver const &src, translate)
Definition: z3++.h:2368
Z3_solver_assert
void Z3_API Z3_solver_assert(Z3_context c, Z3_solver s, Z3_ast a)
Assert a constraint into the solver.
Z3_mk_set_member
Z3_ast Z3_API Z3_mk_set_member(Z3_context c, Z3_ast elem, Z3_ast set)
Check for set membership.
z3::expr::is_numeral
bool is_numeral(double &d) const
Definition: z3++.h:825
z3::prefixof
expr prefixof(expr const &a, expr const &b)
Definition: z3++.h:3464
z3::expr::operator/
friend expr operator/(expr const &a, expr const &b)
Definition: z3++.h:1554
z3::expr::extract
expr extract(unsigned hi, unsigned lo) const
Definition: z3++.h:1266
Z3_func_entry_get_arg
Z3_ast Z3_API Z3_func_entry_get_arg(Z3_context c, Z3_func_entry e, unsigned i)
Return an argument of a Z3_func_entry object.
z3::operator-
expr operator-(expr const &a)
Definition: z3++.h:1576
z3::when
tactic when(probe const &p, tactic const &t)
Definition: z3++.h:2979
z3::func_decl::func_decl
func_decl(context &c, Z3_func_decl n)
Definition: z3++.h:701
Z3_tactic_par_or
Z3_tactic Z3_API Z3_tactic_par_or(Z3_context c, unsigned num, Z3_tactic const ts[])
Return a tactic that applies the given tactics in parallel.
Z3_fixedpoint_get_param_descrs
Z3_param_descrs Z3_API Z3_fixedpoint_get_param_descrs(Z3_context c, Z3_fixedpoint f)
Return the parameter description set for the given fixedpoint object.
z3::func_interp::func_interp
func_interp(func_interp const &s)
Definition: z3++.h:2212
z3::user_propagator_base::propagate
void propagate(unsigned num_fixed, unsigned const *fixed, unsigned num_eqs, unsigned const *lhs, unsigned const *rhs, expr const &conseq)
Definition: z3++.h:3738
z3::ast_vector_tpl
Definition: z3++.h:525
z3::check_context
void check_context(object const &a, object const &b)
Definition: z3++.h:422
Z3_mk_fpa_lt
Z3_ast Z3_API Z3_mk_fpa_lt(Z3_context c, Z3_ast t1, Z3_ast t2)
Floating-point less than.
z3::bvadd_no_underflow
expr bvadd_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:1907
z3::scoped_context::~scoped_context
~scoped_context()
Definition: z3++.h:388
z3::array::ptr
T const * ptr() const
Definition: z3++.h:408
z3::solver::cube_generator::set_cutoff
void set_cutoff(unsigned c)
Definition: z3++.h:2572
z3::object::check_context
friend void check_context(object const &a, object const &b)
Definition: z3++.h:422
Z3_fixedpoint_get_reason_unknown
Z3_string Z3_API Z3_fixedpoint_get_reason_unknown(Z3_context c, Z3_fixedpoint d)
Retrieve a string that describes the last status returned by Z3_fixedpoint_query.
z3::probe::operator<
friend probe operator<(probe const &p1, probe const &p2)
Definition: z3++.h:2802
Z3_mk_bvult
Z3_ast Z3_API Z3_mk_bvult(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned less than.
Z3_simplify
Z3_ast Z3_API Z3_simplify(Z3_context c, Z3_ast a)
Interface to simplifier.
Z3_OP_OR
@ Z3_OP_OR
Definition: z3_api.h:1015
z3::model::~model
~model()
Definition: z3++.h:2247
z3::scoped_context::operator()
context & operator()()
Definition: z3++.h:389
Z3_model_get_func_decl
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::expr::operator^
friend expr operator^(expr const &a, expr const &b)
Definition: z3++.h:1691
z3::concat
expr concat(expr const &a, expr const &b)
Definition: z3++.h:2123
z3::expr::mk_and
friend expr mk_and(expr_vector const &args)
Definition: z3++.h:2173
Z3_PRINT_SMTLIB2_COMPLIANT
@ Z3_PRINT_SMTLIB2_COMPLIANT
Definition: z3_api.h:1342
z3::param_descrs::documentation
std::string documentation(symbol const &s)
Definition: z3++.h:464
z3::func_interp::func_interp
func_interp(context &c, Z3_func_interp e)
Definition: z3++.h:2211
z3::probe::operator&&
friend probe operator&&(probe const &p1, probe const &p2)
Definition: z3++.h:2817
z3::expr::mod
friend expr mod(expr const &a, expr const &b)
Definition: z3++.h:1399
z3::tree_order
func_decl tree_order(sort const &a, unsigned index)
Definition: z3++.h:1944
Z3_solver_translate
Z3_solver Z3_API Z3_solver_translate(Z3_context source, Z3_solver s, Z3_context target)
Copy a solver s from the context source to the context target.
z3::fixedpoint::update_rule
void update_rule(expr &rule, symbol const &name)
Definition: z3++.h:2951
z3::atmost
expr atmost(expr_vector const &es, unsigned bound)
Definition: z3++.h:2089
z3::user_propagator_base
Definition: z3++.h:3599
Z3_func_entry_dec_ref
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::solver::trail
expr_vector trail() const
Definition: z3++.h:2449
z3::solver::set
void set(char const *k, bool v)
Definition: z3++.h:2380
Z3_mk_re_union
Z3_ast Z3_API Z3_mk_re_union(Z3_context c, unsigned n, Z3_ast const args[])
Create the union of the regular languages.
Z3_mk_bvudiv
Z3_ast Z3_API Z3_mk_bvudiv(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned division.
z3::ast_vector_tpl::operator=
ast_vector_tpl & operator=(ast_vector_tpl const &s)
Definition: z3++.h:543
z3::expr::is_re
bool is_re() const
Return true if this is a regular expression.
Definition: z3++.h:797
z3::fixedpoint::to_string
std::string to_string(expr_vector const &queries)
Definition: z3++.h:2967
z3::fixedpoint::~fixedpoint
~fixedpoint()
Definition: z3++.h:2936
Z3_L_FALSE
@ Z3_L_FALSE
Definition: z3_api.h:101
Z3_optimize_push
void Z3_API Z3_optimize_push(Z3_context c, Z3_optimize d)
Create a backtracking point.
z3::tactic::~tactic
~tactic()
Definition: z3++.h:2674
z3::expr::is_bv
bool is_bv() const
Return true if this is a Bit-vector expression.
Definition: z3++.h:777
Z3_mk_re_sort
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::exception::what
char const * what() const
Definition: z3++.h:90
Z3_mk_bvsub
Z3_ast Z3_API Z3_mk_bvsub(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement subtraction.
z3::expr::expr
expr(context &c, Z3_ast n)
Definition: z3++.h:749
Z3_probe_gt
Z3_probe Z3_API Z3_probe_gt(Z3_context x, Z3_probe p1, Z3_probe p2)
Return a probe that evaluates to "true" when the value returned by p1 is greater than the value retur...
z3::solver::set
void set(params const &p)
Definition: z3++.h:2379
Z3_BOOL_SORT
@ Z3_BOOL_SORT
Definition: z3_api.h:150
z3::context::fpa_rounding_mode
sort fpa_rounding_mode()
Return a RoundingMode sort.
Definition: z3++.h:3016
z3::stats::is_double
bool is_double(unsigned i) const
Definition: z3++.h:2339
z3::eq
bool eq(ast const &a, ast const &b)
Definition: z3++.h:522
Z3_mk_sign_ext
Z3_ast Z3_API Z3_mk_sign_ext(Z3_context c, unsigned i, Z3_ast t1)
Sign-extend of the given bit-vector to the (signed) equivalent bit-vector of size m+i,...
z3::func_entry
Definition: z3++.h:2181
z3::expr::is_exists
bool is_exists() const
Return true if this expression is an existential quantifier.
Definition: z3++.h:848
z3::cast_ast
Definition: z3++.h:69
Z3_mk_tree_order
Z3_func_decl Z3_API Z3_mk_tree_order(Z3_context c, Z3_sort a, unsigned id)
create a tree ordering relation over signature a identified using index id.
z3::probe
Definition: z3++.h:2750
Z3_get_error_code
Z3_error_code Z3_API Z3_get_error_code(Z3_context c)
Return the error code for the last API call.
Z3_mk_seq_sort
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::fixedpoint::query
check_result query(expr &q)
Definition: z3++.h:2942
z3
Z3 C++ namespace.
Definition: z3++.h:48
Z3_solver_propagate_register
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...
Z3_stats_is_double
bool Z3_API Z3_stats_is_double(Z3_context c, Z3_stats s, unsigned idx)
Return true if the given statistical data is a double.
z3::solver::statistics
stats statistics() const
Definition: z3++.h:2444
z3::user_propagator_base::add
unsigned add(expr const &e)
tracks e by a unique identifier that is returned by the call.
Definition: z3++.h:3720
z3::expr::is_array
bool is_array() const
Return true if this is a Array expression.
Definition: z3++.h:781
Z3_mk_pble
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.
z3::fixedpoint::assertions
expr_vector assertions() const
Definition: z3++.h:2961
Z3_mk_bvand
Z3_ast Z3_API Z3_mk_bvand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise and.
Z3_solver_get_implied_upper
Z3_ast Z3_API Z3_solver_get_implied_upper(Z3_context c, Z3_solver s, Z3_ast e)
retrieve implied upper bound value for arithmetic expression. If an upper bound is implied at search ...
Z3_mk_solver
Z3_solver Z3_API Z3_mk_solver(Z3_context c)
Create a new solver. This solver is a "combined solver" (see combined_solver module) that internally ...
z3::ast_vector_tpl::iterator::operator->
T * operator->() const
Definition: z3++.h:584
Z3_fpa_get_ebits
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.
Z3_param_descrs_get_kind
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.
z3::expr::operator||
friend expr operator||(expr const &a, expr const &b)
Return an expression representing a or b.
Definition: z3++.h:1451
z3::apply_result::operator<<
friend std::ostream & operator<<(std::ostream &out, apply_result const &r)
Definition: z3++.h:2662
z3::optimize::handle::handle
handle(unsigned h)
Definition: z3++.h:2834
z3::implies
expr implies(expr const &a, expr const &b)
Definition: z3++.h:1387
z3::expr::int2bv
friend expr int2bv(unsigned n, expr const &a)
Definition: z3++.h:1899
Z3_substitute
Z3_ast Z3_API Z3_substitute(Z3_context c, Z3_ast a, unsigned num_exprs, Z3_ast const from[], Z3_ast const to[])
Substitute every occurrence of from[i] in a with to[i], for i smaller than num_exprs....
Z3_mk_simple_solver
Z3_solver Z3_API Z3_mk_simple_solver(Z3_context c)
Create a new incremental solver.
Z3_mk_bvxnor
Z3_ast Z3_API Z3_mk_bvxnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise xnor.
Z3_get_bool_value
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.
z3::object::object
object(object const &s)
Definition: z3++.h:417
z3::sort::is_real
bool is_real() const
Return true if this sort is the Real sort.
Definition: z3++.h:632
Z3_get_algebraic_number_lower
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_set_error_handler
void Z3_API Z3_set_error_handler(Z3_context c, Z3_error_handler h)
Register a Z3 error handler.
z3::expr::nth
expr nth(expr const &index) const
Definition: z3++.h:1307
z3::ast_vector_tpl::iterator::operator!=
bool operator!=(iterator const &other) const
Definition: z3++.h:573
Z3_mk_unsigned_int
Z3_ast Z3_API Z3_mk_unsigned_int(Z3_context c, unsigned v, Z3_sort ty)
Create a numeral of a int, bit-vector, or finite-domain sort.
Z3_mk_bvsub_no_underflow
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_mk_fpa_max
Z3_ast Z3_API Z3_mk_fpa_max(Z3_context c, Z3_ast t1, Z3_ast t2)
Maximum of floating-point numbers.
z3::nand
expr nand(expr const &a, expr const &b)
Definition: z3++.h:1699
z3::rounding_mode
rounding_mode
Definition: z3++.h:135
Z3_get_array_sort_domain
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,...
z3::store
expr store(expr const &a, expr const &i, expr const &v)
Definition: z3++.h:3360
z3::ast::ast
ast(context &c)
Definition: z3++.h:500
z3::ast_vector_tpl::iterator
Definition: z3++.h:562
z3::function
func_decl function(std::string const &name, sort_vector const &domain, sort const &range)
Definition: z3++.h:3326
Z3_mk_store
Z3_ast Z3_API Z3_mk_store(Z3_context c, Z3_ast a, Z3_ast i, Z3_ast v)
Array update.
z3::symbol::symbol
symbol(symbol const &s)
Definition: z3++.h:428
z3::func_entry::func_entry
func_entry(func_entry const &s)
Definition: z3++.h:2189
Z3_get_sort_name
Z3_symbol Z3_API Z3_get_sort_name(Z3_context c, Z3_sort d)
Return the sort name as a symbol.
Z3_stats_inc_ref
void Z3_API Z3_stats_inc_ref(Z3_context c, Z3_stats s)
Increment the reference counter of the given statistics object.
z3::probe::apply
double apply(goal const &g) const
Definition: z3++.h:2770
z3::sort::is_bool
bool is_bool() const
Return true if this sort is the Boolean sort.
Definition: z3++.h:624
Z3_solver_from_file
void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name)
load solver assertions from a file.
z3::model::num_consts
unsigned num_consts() const
Definition: z3++.h:2267
z3::expr::algebraic_upper
expr algebraic_upper(unsigned precision) const
Definition: z3++.h:889
z3::probe::operator==
friend probe operator==(probe const &p1, probe const &p2)
Definition: z3++.h:2812
z3::model::eval
expr eval(expr const &n, bool model_completion=false) const
Definition: z3++.h:2257
Z3_SORT_AST
@ Z3_SORT_AST
Definition: z3_api.h:183
z3::context
A Context manages all other Z3 objects, global configuration options, etc.
Definition: z3++.h:155
z3::model::add_func_interp
func_interp add_func_interp(func_decl &f, expr &else_val)
Definition: z3++.h:2300
z3::stats
Definition: z3++.h:2317
z3::atleast
expr atleast(expr_vector const &es, unsigned bound)
Definition: z3++.h:2097
Z3_model_get_num_consts
unsigned Z3_API Z3_model_get_num_consts(Z3_context c, Z3_model m)
Return the number of constants assigned by the given model.
z3::ast_vector_tpl::set
ast_vector_tpl & set(unsigned idx, ast &a)
Definition: z3++.h:550
z3::expr::simplify
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:1366
z3::to_check_result
check_result to_check_result(Z3_lbool l)
Definition: z3++.h:143
z3::ast_vector_tpl::operator[]
T operator[](int i) const
Definition: z3++.h:537
z3::expr::operator=
expr & operator=(expr const &n)
Definition: z3++.h:751
z3::config::set
void set(char const *param, char const *value)
Set global parameter param with string value.
Definition: z3++.h:117
Z3_mk_rotate_right
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.
Z3_get_symbol_int
int Z3_API Z3_get_symbol_int(Z3_context c, Z3_symbol s)
Return the symbol int value.
z3::ast_vector_tpl::iterator::set
void set(T &arg)
Definition: z3++.h:580
z3::partial_order
func_decl partial_order(sort const &a, unsigned index)
Definition: z3++.h:1938
Z3_mk_not
Z3_ast Z3_API Z3_mk_not(Z3_context c, Z3_ast a)
Create an AST node representing not(a).
z3::expr::operator[]
expr operator[](expr const &index) const
Definition: z3++.h:1347
z3::with
tactic with(tactic const &t, params const &p)
Definition: z3++.h:2724
z3::array::operator[]
T & operator[](int i)
Definition: z3++.h:406
Z3_mk_fpa_mul
Z3_ast Z3_API Z3_mk_fpa_mul(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point multiplication.
MK_EXPR2
#define MK_EXPR2(_fn, _arg1, _arg2)
Definition: z3++.h:3391
z3::sort::id
unsigned id() const
retrieve unique identifier for func_decl.
Definition: z3++.h:607
z3::func_decl::arity
unsigned arity() const
Definition: z3++.h:711
z3::to_real
expr to_real(expr const &a)
Definition: z3++.h:3300
z3::context::num_val
expr num_val(int n, sort const &s)
Definition: z3++.h:3216
Z3_get_decl_name
Z3_symbol Z3_API Z3_get_decl_name(Z3_context c, Z3_func_decl d)
Return the constant declaration name as a symbol.
z3::object
Definition: z3++.h:412
z3::sort::array_range
sort array_range() const
Return the range of this Array sort.
Definition: z3++.h:691
z3::stats::operator=
stats & operator=(stats const &s)
Definition: z3++.h:2329
z3::tactic::par_and_then
friend tactic par_and_then(tactic const &t1, tactic const &t2)
Definition: z3++.h:2743
z3::fixedpoint::add_cover
void add_cover(int level, func_decl &p, expr &property)
Definition: z3++.h:2958
Z3_mk_real
Z3_ast Z3_API Z3_mk_real(Z3_context c, int num, int den)
Create a real from a fraction.
z3::solver::cube_iterator::operator*
expr_vector const & operator*() const
Definition: z3++.h:2539
Z3_mk_set_add
Z3_ast Z3_API Z3_mk_set_add(Z3_context c, Z3_ast set, Z3_ast elem)
Add an element to a set.
Z3_solver_propagate_fixed
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::param_descrs::kind
Z3_param_kind kind(symbol const &s)
Definition: z3++.h:463
z3::operator&
expr operator&(expr const &a, expr const &b)
Definition: z3++.h:1687
z3::expr::substitute
expr substitute(expr_vector const &src, expr_vector const &dst)
Apply substitution. Replace src expressions by dst.
Definition: z3++.h:3575
Z3_mk_seq_index
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::model::size
unsigned size() const
Definition: z3++.h:2271
Z3_mk_const_array
Z3_ast Z3_API Z3_mk_const_array(Z3_context c, Z3_sort domain, Z3_ast v)
Create the constant array.
Z3_get_decl_kind
Z3_decl_kind Z3_API Z3_get_decl_kind(Z3_context c, Z3_func_decl d)
Return declaration kind corresponding to declaration.
z3::fixedpoint::reason_unknown
std::string reason_unknown()
Definition: z3++.h:2950
Z3_params_set_symbol
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.
Z3_substitute_vars
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::model::has_interp
bool has_interp(func_decl f) const
Definition: z3++.h:2295
z3::to_func_decl
func_decl to_func_decl(context &c, Z3_func_decl f)
Definition: z3++.h:1798
Z3_mk_int2real
Z3_ast Z3_API Z3_mk_int2real(Z3_context c, Z3_ast t1)
Coerce an integer to a real.
Z3_apply_result_inc_ref
void Z3_API Z3_apply_result_inc_ref(Z3_context c, Z3_apply_result r)
Increment the reference counter of the given Z3_apply_result object.
z3::func_interp::else_value
expr else_value() const
Definition: z3++.h:2222
Z3_mk_re_intersect
Z3_ast Z3_API Z3_mk_re_intersect(Z3_context c, unsigned n, Z3_ast const args[])
Create the intersection of the regular languages.
z3::expr::is_lambda
bool is_lambda() const
Return true if this expression is a lambda expression.
Definition: z3++.h:852
Z3_mk_fpa_add
Z3_ast Z3_API Z3_mk_fpa_add(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2)
Floating-point addition.
z3::array::size
unsigned size() const
Definition: z3++.h:405
z3::cond
tactic cond(probe const &p, tactic const &t1, tactic const &t2)
Definition: z3++.h:2985
z3::expr::is_numeral_i64
bool is_numeral_i64(int64_t &i) const
Definition: z3++.h:819
z3::context::context
context()
Definition: z3++.h:179
z3::exception::msg
char const * msg() const
Definition: z3++.h:89
z3::optimize::handle
Definition: z3++.h:2831
Z3_mk_bvxor
Z3_ast Z3_API Z3_mk_bvxor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise exclusive-or.
z3::set_intersect
expr set_intersect(expr const &a, expr const &b)
Definition: z3++.h:3425
z3::user_propagator_base::pop
virtual void pop(unsigned num_scopes)=0
z3::context::bool_const
expr bool_const(char const *name)
Definition: z3++.h:3174
z3::solver::cubes
cube_generator cubes(expr_vector &vars)
Definition: z3++.h:2576
z3::solver::trail
expr_vector trail(array< unsigned > &levels) const
Definition: z3++.h:2450
z3::stats::is_uint
bool is_uint(unsigned i) const
Definition: z3++.h:2338
z3::user_propagator_base::propagate
void propagate(unsigned num_fixed, unsigned const *fixed, expr const &conseq)
Definition: z3++.h:3732
z3::expr::operator-
friend expr operator-(expr const &a)
Definition: z3++.h:1576
z3::const_array
expr const_array(sort const &d, expr const &v)
Definition: z3++.h:3397
Z3_mk_fpa_abs
Z3_ast Z3_API Z3_mk_fpa_abs(Z3_context c, Z3_ast t)
Floating-point absolute value.
z3::model::get_func_interp
func_interp get_func_interp(func_decl f) const
Definition: z3++.h:2286
MK_EXPR1
#define MK_EXPR1(_fn, _arg)
Definition: z3++.h:3386
z3::expr::distinct
friend expr distinct(expr_vector const &args)
Definition: z3++.h:2114
Z3_fixedpoint_get_num_levels
unsigned Z3_API Z3_fixedpoint_get_num_levels(Z3_context c, Z3_fixedpoint d, Z3_func_decl pred)
Query the PDR engine for the maximal levels properties are known about predicate.
z3::sat
@ sat
Definition: z3++.h:132
Z3_mk_is_int
Z3_ast Z3_API Z3_mk_is_int(Z3_context c, Z3_ast t1)
Check if a real number is an integer.
z3::tactic::tactic
tactic(context &c, Z3_tactic s)
Definition: z3++.h:2672
Z3_get_func_decl_id
unsigned Z3_API Z3_get_func_decl_id(Z3_context c, Z3_func_decl f)
Return a unique identifier for f.
Z3_ast_kind
Z3_ast_kind
The different kinds of Z3 AST (abstract syntax trees). That is, terms, formulas and types.
Definition: z3_api.h:178
Z3_func_interp_get_num_entries
unsigned Z3_API Z3_func_interp_get_num_entries(Z3_context c, Z3_func_interp f)
Return the number of entries in the given function interpretation.
z3::stats::stats
stats(context &c, Z3_stats e)
Definition: z3++.h:2325
z3::operator>=
expr operator>=(expr const &a, expr const &b)
Definition: z3++.h:1537
z3::expr::operator*
friend expr operator*(expr const &a, expr const &b)
Definition: z3++.h:1513
Z3_global_param_set
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.
z3::expr::bvmul_no_underflow
friend expr bvmul_no_underflow(expr const &a, expr const &b)
Definition: z3++.h:1925
z3::solver::get_param_descrs
param_descrs get_param_descrs()
Definition: z3++.h:2485
z3::expr::operator<=
friend expr operator<=(expr const &a, expr const &b)
Definition: z3++.h:1618
z3::ast_vector_tpl::iterator::iterator
iterator(ast_vector_tpl const *v, unsigned i)
Definition: z3++.h:566
z3::fixedpoint::get_answer
expr get_answer()
Definition: z3++.h:2949
Z3_mk_bvsdiv_no_overflow
Z3_ast Z3_API Z3_mk_bvsdiv_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed division of t1 and t2 does not overflow.
Z3_mk_bvuge
Z3_ast Z3_API Z3_mk_bvuge(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than or equal to.
z3::func_interp::set_else
void set_else(expr &value)
Definition: z3++.h:2229
Z3_mk_array_sort_n
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_get_numeral_double
double Z3_API Z3_get_numeral_double(Z3_context c, Z3_ast a)
Return numeral as a double.
z3::context::context
context(config &c)
Definition: z3++.h:180
z3::solver::cube_iterator::operator->
expr_vector const * operator->() const
Definition: z3++.h:2538
z3::expr::min
friend expr min(expr const &a, expr const &b)
Definition: z3++.h:1702
Z3_get_sort
Z3_sort Z3_API Z3_get_sort(Z3_context c, Z3_ast a)
Return the sort of an AST node.
z3::context::bool_sort
sort bool_sort()
Return the Boolean sort.
Definition: z3++.h:2995
z3::solver::get_model
model get_model() const
Definition: z3++.h:2437
z3::optimize::minimize
handle minimize(expr const &e)
Definition: z3++.h:2888
z3::solver::simple
Definition: z3++.h:2362
z3::expr::length
expr length() const
Definition: z3++.h:1313
z3::par_or
tactic par_or(unsigned n, tactic const *tactics)
Definition: z3++.h:2734
Z3_goal_convert_model
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,...
z3::solver::push
void push()
Definition: z3++.h:2385
z3::params::operator=
params & operator=(params const &s)
Definition: z3++.h:477
z3::symbol::operator<<
friend std::ostream & operator<<(std::ostream &out, symbol const &s)
Definition: z3++.h:437
z3::sort::array_domain
sort array_domain() const
Return the domain of this Array sort.
Definition: z3++.h:685
z3::param_descrs::name
symbol name(unsigned i)
Definition: z3++.h:462
z3::expr::denominator
expr denominator() const
Definition: z3++.h:1007
z3::indexof
expr indexof(expr const &s, expr const &substr, expr const &offset)
Definition: z3++.h:3470
z3::expr::is_well_sorted
bool is_well_sorted() const
Return true if this expression is well sorted (aka type correct).
Definition: z3++.h:866
Z3_get_quantifier_body
Z3_ast Z3_API Z3_get_quantifier_body(Z3_context c, Z3_ast a)
Return body of quantifier.
Z3_mk_seq_at
Z3_ast Z3_API Z3_mk_seq_at(Z3_context c, Z3_ast s, Z3_ast index)
Retrieve from s the unit sequence positioned at position index. The sequence is empty if the index is...
Z3_mk_atmost
Z3_ast Z3_API Z3_mk_atmost(Z3_context c, unsigned num_args, Z3_ast const args[], unsigned k)
Pseudo-Boolean relations.
z3::config::set
void set(char const *param, int value)
Set global parameter param with integer value.
Definition: z3++.h:125
Z3_mk_bvsrem
Z3_ast Z3_API Z3_mk_bvsrem(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed remainder (sign follows dividend).
Z3_SEQ_SORT
@ Z3_SEQ_SORT
Definition: z3_api.h:160
Z3_fixedpoint_add_fact
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.
Z3_mk_uninterpreted_sort
Z3_sort Z3_API Z3_mk_uninterpreted_sort(Z3_context c, Z3_symbol s)
Create a free (uninterpreted) type using the given name (symbol).
z3::tactic::tactic
tactic(context &c, char const *name)
Definition: z3++.h:2671
z3::star
expr star(expr const &re)
Definition: z3++.h:3494
z3::RTZ
@ RTZ
Definition: z3++.h:140
z3::full_set
expr full_set(sort const &s)
Definition: z3++.h:3405
z3::stats::uint_value
unsigned uint_value(unsigned i) const
Definition: z3++.h:2340
Z3_mk_mod
Z3_ast Z3_API Z3_mk_mod(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 mod arg2.
Z3_stats_get_key
Z3_string Z3_API Z3_stats_get_key(Z3_context c, Z3_stats s, unsigned idx)
Return the key (a string) for a particular statistical data.
z3::fixedpoint::help
std::string help() const
Definition: z3++.h:2964
Z3_fixedpoint_add_cover
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...
z3::object::check_error
Z3_error_code check_error() const
Definition: z3++.h:419
Z3_optimize_get_unsat_core
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::set_union
expr set_union(expr const &a, expr const &b)
Definition: z3++.h:3417
z3::solver::consequences
check_result consequences(expr_vector &assumptions, expr_vector &vars, expr_vector &conseq)
Definition: z3++.h:2438
Z3_optimize_get_model
Z3_model Z3_API Z3_optimize_get_model(Z3_context c, Z3_optimize o)
Retrieve the model for the last Z3_optimize_check.
z3::repeat
tactic repeat(tactic const &t, unsigned max=UINT_MAX)
Definition: z3++.h:2718
z3::optimize::push
void push()
Definition: z3++.h:2891
z3::expr::is_implies
bool is_implies() const
Definition: z3++.h:1153
z3::ast_vector_tpl::begin
iterator begin() const
Definition: z3++.h:587
Z3_mk_lambda_const
Z3_ast Z3_API Z3_mk_lambda_const(Z3_context c, unsigned num_bound, Z3_app const bound[], Z3_ast body)
Create a lambda expression using a list of constants that form the set of bound variables.
Z3_mk_int64
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::context::check_error
Z3_error_code check_error() const
Auxiliary method used to check for API usage errors.
Definition: z3++.h:187
z3::fixedpoint::from_string
void from_string(char const *s)
Definition: z3++.h:2938
Z3_tactic_and_then
Z3_tactic Z3_API Z3_tactic_and_then(Z3_context c, Z3_tactic t1, Z3_tactic t2)
Return a tactic that applies t1 to a given goal and t2 to every subgoal produced by t1.
z3::model
Definition: z3++.h:2235
Z3_decl_kind
Z3_decl_kind
The different kinds of interpreted function kinds.
Definition: z3_api.h:1007
z3::expr::is_fpa
bool is_fpa() const
Return true if this is a FloatingPoint expression. .
Definition: z3++.h:811
z3::ast::eq
friend bool eq(ast const &a, ast const &b)
Return true if the ASTs are structurally identical.
Definition: z3++.h:522
z3::set_subset
expr set_subset(expr const &a, expr const &b)
Definition: z3++.h:3445
Z3_error_code
Z3_error_code
Z3 error codes (See Z3_get_error_code).
Definition: z3_api.h:1364
z3::solver::set
void set(char const *k, double v)
Definition: z3++.h:2382
Z3_func_entry_get_num_args
unsigned Z3_API Z3_func_entry_get_num_args(Z3_context c, Z3_func_entry e)
Return the number of arguments in a Z3_func_entry object.
z3::re_complement
expr re_complement(expr const &a)
Definition: z3++.h:3515
z3::re_full
expr re_full(sort const &s)
Definition: z3++.h:3502
z3::optimize::add_soft
handle add_soft(expr const &e, unsigned weight)
Definition: z3++.h:2873
Z3_tactic_or_else
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_mk_set_subset
Z3_ast Z3_API Z3_mk_set_subset(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Check for subsetness of sets.
Z3_solver_get_consequences
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_DATATYPE_SORT
@ Z3_DATATYPE_SORT
Definition: z3_api.h:155
z3::piecewise_linear_order
func_decl piecewise_linear_order(sort const &a, unsigned index)
Definition: z3++.h:1941
Z3_mk_le
Z3_ast Z3_API Z3_mk_le(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than or equal to.
z3::optimize::statistics
stats statistics() const
Definition: z3++.h:2924
z3::apply_result::apply_result
apply_result(context &c, Z3_apply_result s)
Definition: z3++.h:2647
Z3_mk_bvsgt
Z3_ast Z3_API Z3_mk_bvsgt(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed greater than.
Z3_mk_bvlshr
Z3_ast Z3_API Z3_mk_bvlshr(Z3_context c, Z3_ast t1, Z3_ast t2)
Logical shift right.
Z3_mk_pbge
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::ast_vector_tpl::empty
bool empty() const
Definition: z3++.h:542
Z3_mk_sub
Z3_ast Z3_API Z3_mk_sub(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] - ... - args[num_args - 1].
z3::param_descrs
Definition: z3++.h:446
z3::solver::cube_generator::begin
cube_iterator begin()
Definition: z3++.h:2570
z3::model::num_funcs
unsigned num_funcs() const
Definition: z3++.h:2268
Z3_mk_real_sort
Z3_sort Z3_API Z3_mk_real_sort(Z3_context c)
Create the real type.
Z3_get_symbol_string
Z3_string Z3_API Z3_get_symbol_string(Z3_context c, Z3_symbol s)
Return the symbol name.
z3::expr::is_true
bool is_true() const
Definition: z3++.h:1147
Z3_benchmark_to_smtlib_string
Z3_string Z3_API Z3_benchmark_to_smtlib_string(Z3_context c, Z3_string name, Z3_string logic, Z3_string status, Z3_string attributes, unsigned num_assumptions, Z3_ast const assumptions[], Z3_ast formula)
Convert the given benchmark into SMT-LIB formatted string.
z3::expr::is_bool
bool is_bool() const
Return true if this is a Boolean expression.
Definition: z3++.h:761
z3::re_intersect
expr re_intersect(expr_vector const &args)
Definition: z3++.h:3507
Z3_mk_re_empty
Z3_ast Z3_API Z3_mk_re_empty(Z3_context c, Z3_sort re)
Create an empty regular expression of sort re.
z3::solver::unsat_core
expr_vector unsat_core() const
Definition: z3++.h:2445
z3::object::ctx
context & ctx() const
Definition: z3++.h:418
z3::sort::sort
sort(context &c)
Definition: z3++.h:598
z3::param_descrs::to_string
std::string to_string() const
Definition: z3++.h:465
z3::optimize::help
std::string help() const
Definition: z3++.h:2928
z3::expr::body
expr body() const
Return the 'body' of this quantifier.
Definition: z3++.h:1082
z3::user_propagator_base::fixed
void fixed(fixed_eh_t &f)
register callbacks. Callbacks can only be registered with user_propagators that were created using a ...
Definition: z3++.h:3680
z3::func_interp::entry
func_entry entry(unsigned i) const
Definition: z3++.h:2224
Z3_func_entry_get_value
Z3_ast Z3_API Z3_func_entry_get_value(Z3_context c, Z3_func_entry e)
Return the value of this point.
Z3_fixedpoint_get_rules
Z3_ast_vector Z3_API Z3_fixedpoint_get_rules(Z3_context c, Z3_fixedpoint f)
Retrieve set of rules from fixedpoint context.
Z3_mk_seq_nth
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...
z3::expr::atleast
friend expr atleast(expr_vector const &es, unsigned bound)
Definition: z3++.h:2097
z3::expr::repeat
expr repeat(unsigned i)
Definition: z3++.h:1260
Z3_QUANTIFIER_AST
@ Z3_QUANTIFIER_AST
Definition: z3_api.h:182
z3::pbge
expr pbge(expr_vector const &es, int const *coeffs, int bound)
Definition: z3++.h:2073
z3::probe::probe
probe(context &c, double val)
Definition: z3++.h:2758
z3::context::parse_string
expr_vector parse_string(char const *s)
parsing
Definition: z3++.h:3529
z3::expr::bool_value
Z3_lbool bool_value() const
Definition: z3++.h:995
z3::goal::num_exprs
unsigned num_exprs() const
Definition: z3++.h:2608
z3::func_entry::operator=
func_entry & operator=(func_entry const &s)
Definition: z3++.h:2192
z3::fixedpoint
Definition: z3++.h:2932
Z3_goal_inconsistent
bool Z3_API Z3_goal_inconsistent(Z3_context c, Z3_goal g)
Return true if the given goal contains the formula false.
Z3_solver_get_model
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_tactic_when
Z3_tactic Z3_API Z3_tactic_when(Z3_context c, Z3_probe p, Z3_tactic t)
Return a tactic that applies t to a given goal is the probe p evaluates to true. If p evaluates to fa...
Z3_OP_NOT
@ Z3_OP_NOT
Definition: z3_api.h:1018
z3::expr::is_and
bool is_and() const
Definition: z3++.h:1150
z3::expr::loop
expr loop(unsigned lo)
create a looping regular expression.
Definition: z3++.h:1333
z3::operator==
expr operator==(expr const &a, expr const &b)
Definition: z3++.h:1464
z3::context::bv_val
expr bv_val(int n, unsigned sz)
Definition: z3++.h:3198
Z3_mk_re_concat
Z3_ast Z3_API Z3_mk_re_concat(Z3_context c, unsigned n, Z3_ast const args[])
Create the concatenation of the regular languages.
z3::goal::dimacs
std::string dimacs(bool include_names=true) const
Definition: z3++.h:2635
z3::in_re
expr in_re(expr const &s, expr const &re)
Definition: z3++.h:3485
z3::expr::expr
expr(expr const &n)
Definition: z3++.h:750
z3::srem
expr srem(expr const &a, expr const &b)
signed remainder operator for bitvectors
Definition: z3++.h:1851
Z3_optimize_get_help
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_mk_mul
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::model::get_const_interp
expr get_const_interp(func_decl c) const
Definition: z3++.h:2280
Z3_mk_seq_extract
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_optimize_minimize
unsigned Z3_API Z3_optimize_minimize(Z3_context c, Z3_optimize o, Z3_ast t)
Add a minimization constraint.
z3::expr::is_or
bool is_or() const
Definition: z3++.h:1151
Z3_solver_inc_ref
void Z3_API Z3_solver_inc_ref(Z3_context c, Z3_solver s)
Increment the reference counter of the given solver.
z3::operator+
expr operator+(expr const &a, expr const &b)
Definition: z3++.h:1483
Z3_fixedpoint_get_cover_delta
Z3_ast Z3_API Z3_fixedpoint_get_cover_delta(Z3_context c, Z3_fixedpoint d, int level, Z3_func_decl pred)
z3::expr::is_app
bool is_app() const
Return true if this expression is an application.
Definition: z3++.h:831
z3::RNA
@ RNA
Definition: z3++.h:136
z3::ite
expr ite(expr const &c, expr const &t, expr const &e)
Create the if-then-else expression ite(c, t, e)
Definition: z3++.h:1771
z3::ast_vector_tpl::iterator::operator++
iterator & operator++()
Definition: z3++.h:576
z3::solver::cube_generator::cube_generator
cube_generator(solver &s, expr_vector &vars)
Definition: z3++.h:2563
Z3_mk_transitive_closure
Z3_func_decl Z3_API Z3_mk_transitive_closure(Z3_context c, Z3_func_decl f)
create transitive closure of binary relation.
z3::param_descrs::operator=
param_descrs & operator=(param_descrs const &o)
Definition: z3++.h:451
Z3_mk_int_symbol
Z3_symbol Z3_API Z3_mk_int_symbol(Z3_context c, int i)
Create a Z3 symbol using an integer.
z3::expr::is_arith
bool is_arith() const
Return true if this is an integer or real expression.
Definition: z3++.h:773
z3::expr::is_string_value
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:1019
z3::RNE
@ RNE
Definition: z3++.h:137
z3::expr::is_numeral_u64
bool is_numeral_u64(uint64_t &i) const
Definition: z3++.h:820
Z3_fixedpoint_add_rule
void Z3_API Z3_fixedpoint_add_rule(Z3_context c, Z3_fixedpoint d, Z3_ast rule, Z3_symbol name)
Add a universal Horn clause as a named rule. The horn_rule should be of the form:
Z3_optimize_inc_ref
void Z3_API Z3_optimize_inc_ref(Z3_context c, Z3_optimize d)
Increment the reference counter of the given optimize context.
Z3_param_descrs_get_documentation
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::expr::get_sort
sort get_sort() const
Return the sort of this expression.
Definition: z3++.h:756
z3::expr::get_numeral_int64
int64_t get_numeral_int64() const
Return int64_t value of numeral, throw if result cannot fit in int64_t.
Definition: z3++.h:967
Z3_mk_bvor
Z3_ast Z3_API Z3_mk_bvor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise or.
Z3_mk_partial_order
Z3_func_decl Z3_API Z3_mk_partial_order(Z3_context c, Z3_sort a, unsigned id)
create a partial ordering relation over signature a and index id.
z3::context::int_symbol
symbol int_symbol(int n)
Create a Z3 symbol based on the given integer.
Definition: z3++.h:2993
z3::slt
expr slt(expr const &a, expr const &b)
signed less than operator for bitvectors.
Definition: z3++.h:1812
Z3_STRING_SYMBOL
@ Z3_STRING_SYMBOL
Definition: z3_api.h:116
z3::goal::is_decided_sat
bool is_decided_sat() const
Definition: z3++.h:2609
Z3_mk_piecewise_linear_order
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::probe::operator=
probe & operator=(probe const &s)
Definition: z3++.h:2763