Z3
Data Structures | Public Member Functions
user_propagator_base Class Referenceabstract

Public Member Functions

 user_propagator_base (context &c)
 
 user_propagator_base (solver *s)
 
virtual void push ()=0
 
virtual void pop (unsigned num_scopes)=0
 
virtual ~user_propagator_base ()
 
contextctx ()
 
virtual user_propagator_basefresh (context &ctx)=0
 user_propagators created using fresh() are created during search and their lifetimes are restricted to search time. They should be garbage collected by the propagator used to invoke fresh(). The life-time of the Z3_context object can only be assumed valid during callbacks, such as fixed(), which contains expressions based on the context. More...
 
void register_fixed (fixed_eh_t &f)
 register callbacks. Callbacks can only be registered with user_propagators that were created using a solver. More...
 
void register_fixed ()
 
void register_eq (eq_eh_t &f)
 
void register_eq ()
 
void register_final (final_eh_t &f)
 register a callback on final-check. During the final check stage, all propagations have been processed. This is an opportunity for the user-propagator to delay some analysis that could be expensive to perform incrementally. It is also an opportunity for the propagator to implement branch and bound optimization. More...
 
void register_final ()
 
void register_created (created_eh_t &c)
 
void register_created ()
 
void register_decide (decide_eh_t &c)
 
void register_decide ()
 
void register_on_binding ()
 
virtual void fixed (expr const &, expr const &)
 
virtual void eq (expr const &, expr const &)
 
virtual void final ()
 
virtual void created (expr const &)
 
virtual void decide (expr const &, unsigned, bool)
 
virtual bool on_binding (expr const &, expr const &)
 
bool next_split (expr const &e, unsigned idx, Z3_lbool phase)
 
void add (expr const &e)
 tracks e by a unique identifier that is returned by the call. More...
 
void conflict (expr_vector const &fixed)
 
void conflict (expr_vector const &fixed, expr_vector const &lhs, expr_vector const &rhs)
 
bool propagate (expr_vector const &fixed, expr const &conseq)
 
bool propagate (expr_vector const &fixed, expr_vector const &lhs, expr_vector const &rhs, expr const &conseq)
 

Detailed Description

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

Constructor & Destructor Documentation

user_propagator_base ( context c)
inline

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

4610 : s(nullptr), c(&c) {}
user_propagator_base ( solver s)
inline

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

4612  : s(s), c(nullptr) {
4613  Z3_solver_propagate_init(ctx(), *s, this, push_eh, pop_eh, fresh_eh);
4614  }
context & ctx()
Definition: z3++.h:4626
void Z3_API Z3_solver_propagate_init(Z3_context c, Z3_solver s, void *user_context, Z3_push_eh push_eh, Z3_pop_eh pop_eh, Z3_fresh_eh fresh_eh)
register a user-propagator with the solver.
virtual ~user_propagator_base ( )
inlinevirtual

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

4619  {
4620  for (auto& subcontext : subcontexts) {
4621  subcontext->detach(); // detach first; the subcontexts will be freed internally!
4622  delete subcontext;
4623  }
4624  }

Member Function Documentation

void add ( expr const &  e)
inline

tracks e by a unique identifier that is returned by the call.

If the fixed() callback is registered and if e is a Boolean or Bit-vector, the fixed() callback gets invoked when e is bound to a value. If the eq() callback is registered, then equalities between registered expressions are reported. A consumer can use the propagate or conflict functions to invoke propagations or conflicts as a consequence of these callbacks. These functions take a list of identifiers for registered expressions that have been fixed. The list of identifiers must correspond to already fixed values. Similarly, a list of propagated equalities can be supplied. These must correspond to equalities that have been registered during a callback.

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

4773  {
4774  if (cb)
4776  else if (s)
4778  else
4779  assert(false);
4780  }
void Z3_API Z3_solver_propagate_register_cb(Z3_context c, Z3_solver_callback cb, Z3_ast e)
register an expression to propagate on with the solver. Only expressions of type Bool and type Bit-Ve...
void Z3_API Z3_solver_propagate_register(Z3_context c, Z3_solver s, Z3_ast e)
register an expression to propagate on with the solver. Only expressions of type Bool and type Bit-Ve...
context & ctx()
Definition: z3++.h:4626
void conflict ( expr_vector const &  fixed)
inline

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

4782  {
4783  assert(cb);
4784  expr conseq = ctx().bool_val(false);
4785  array<Z3_ast> _fixed(fixed);
4786  Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
4787  }
context & ctx()
Definition: z3++.h:4626
expr bool_val(bool b)
Definition: z3++.h:3985
bool Z3_API Z3_solver_propagate_consequence(Z3_context c, Z3_solver_callback cb, unsigned num_fixed, Z3_ast const *fixed, unsigned num_eqs, Z3_ast const *eq_lhs, Z3_ast const *eq_rhs, Z3_ast conseq)
propagate a consequence based on fixed values and equalities. A client may invoke it during the propa...
virtual void fixed(expr const &, expr const &)
Definition: z3++.h:4742
void conflict ( expr_vector const &  fixed,
expr_vector const &  lhs,
expr_vector const &  rhs 
)
inline

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

4789  {
4790  assert(cb);
4791  assert(lhs.size() == rhs.size());
4792  expr conseq = ctx().bool_val(false);
4793  array<Z3_ast> _fixed(fixed);
4794  array<Z3_ast> _lhs(lhs);
4795  array<Z3_ast> _rhs(rhs);
4796  Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
4797  }
context & ctx()
Definition: z3++.h:4626
expr bool_val(bool b)
Definition: z3++.h:3985
bool Z3_API Z3_solver_propagate_consequence(Z3_context c, Z3_solver_callback cb, unsigned num_fixed, Z3_ast const *fixed, unsigned num_eqs, Z3_ast const *eq_lhs, Z3_ast const *eq_rhs, Z3_ast conseq)
propagate a consequence based on fixed values and equalities. A client may invoke it during the propa...
virtual void fixed(expr const &, expr const &)
Definition: z3++.h:4742
virtual void created ( expr const &  )
inlinevirtual

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

Referenced by user_propagator_base::register_created().

4748 {}
context& ctx ( )
inline
virtual void decide ( expr const &  ,
unsigned  ,
bool   
)
inlinevirtual

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

Referenced by user_propagator_base::register_decide().

4750 {}
virtual void eq ( expr const &  ,
expr const &   
)
inlinevirtual

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

Referenced by user_propagator_base::register_eq().

4744 { }
virtual void final ( )
inlinevirtual

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

4746 { }
virtual void fixed ( expr const &  ,
expr const &   
)
inlinevirtual

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

Referenced by user_propagator_base::register_fixed().

4742 { }
virtual user_propagator_base* fresh ( context ctx)
pure virtual

user_propagators created using fresh() are created during search and their lifetimes are restricted to search time. They should be garbage collected by the propagator used to invoke fresh(). The life-time of the Z3_context object can only be assumed valid during callbacks, such as fixed(), which contains expressions based on the context.

bool next_split ( expr const &  e,
unsigned  idx,
Z3_lbool  phase 
)
inline

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

4754  {
4755  assert(cb);
4756  return Z3_solver_next_split(ctx(), cb, e, idx, phase);
4757  }
context & ctx()
Definition: z3++.h:4626
bool Z3_API Z3_solver_next_split(Z3_context c, Z3_solver_callback cb, Z3_ast t, unsigned idx, Z3_lbool phase)
virtual bool on_binding ( expr const &  ,
expr const &   
)
inlinevirtual

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

Referenced by user_propagator_base::register_on_binding().

4752 { return true; }
virtual void pop ( unsigned  num_scopes)
pure virtual
bool propagate ( expr_vector const &  fixed,
expr const &  conseq 
)
inline

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

4799  {
4800  assert(cb);
4801  assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
4802  array<Z3_ast> _fixed(fixed);
4803  return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
4804  }
context & ctx()
Definition: z3++.h:4626
bool Z3_API Z3_solver_propagate_consequence(Z3_context c, Z3_solver_callback cb, unsigned num_fixed, Z3_ast const *fixed, unsigned num_eqs, Z3_ast const *eq_lhs, Z3_ast const *eq_rhs, Z3_ast conseq)
propagate a consequence based on fixed values and equalities. A client may invoke it during the propa...
virtual void fixed(expr const &, expr const &)
Definition: z3++.h:4742
bool propagate ( expr_vector const &  fixed,
expr_vector const &  lhs,
expr_vector const &  rhs,
expr const &  conseq 
)
inline

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

4808  {
4809  assert(cb);
4810  assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
4811  assert(lhs.size() == rhs.size());
4812  array<Z3_ast> _fixed(fixed);
4813  array<Z3_ast> _lhs(lhs);
4814  array<Z3_ast> _rhs(rhs);
4815 
4816  return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
4817  }
context & ctx()
Definition: z3++.h:4626
bool Z3_API Z3_solver_propagate_consequence(Z3_context c, Z3_solver_callback cb, unsigned num_fixed, Z3_ast const *fixed, unsigned num_eqs, Z3_ast const *eq_lhs, Z3_ast const *eq_rhs, Z3_ast conseq)
propagate a consequence based on fixed values and equalities. A client may invoke it during the propa...
virtual void fixed(expr const &, expr const &)
Definition: z3++.h:4742
virtual void push ( )
pure virtual
void register_created ( created_eh_t &  c)
inline

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

4702  {
4703  m_created_eh = c;
4704  if (s) {
4705  Z3_solver_propagate_created(ctx(), *s, created_eh);
4706  }
4707  }
void Z3_API Z3_solver_propagate_created(Z3_context c, Z3_solver s, Z3_created_eh created_eh)
register a callback when a new expression with a registered function is used by the solver The regist...
context & ctx()
Definition: z3++.h:4626
void register_created ( )
inline

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

4709  {
4710  m_created_eh = [this](expr const& e) {
4711  created(e);
4712  };
4713  if (s) {
4714  Z3_solver_propagate_created(ctx(), *s, created_eh);
4715  }
4716  }
void Z3_API Z3_solver_propagate_created(Z3_context c, Z3_solver s, Z3_created_eh created_eh)
register a callback when a new expression with a registered function is used by the solver The regist...
virtual void created(expr const &)
Definition: z3++.h:4748
context & ctx()
Definition: z3++.h:4626
void register_decide ( decide_eh_t &  c)
inline

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

4718  {
4719  m_decide_eh = c;
4720  if (s) {
4721  Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4722  }
4723  }
void Z3_API Z3_solver_propagate_decide(Z3_context c, Z3_solver s, Z3_decide_eh decide_eh)
register a callback when the solver decides to split on a registered expression. The callback may cha...
context & ctx()
Definition: z3++.h:4626
void register_decide ( )
inline

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

4725  {
4726  m_decide_eh = [this](expr val, unsigned bit, bool is_pos) {
4727  decide(val, bit, is_pos);
4728  };
4729  if (s) {
4730  Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4731  }
4732  }
void Z3_API Z3_solver_propagate_decide(Z3_context c, Z3_solver s, Z3_decide_eh decide_eh)
register a callback when the solver decides to split on a registered expression. The callback may cha...
virtual void decide(expr const &, unsigned, bool)
Definition: z3++.h:4750
context & ctx()
Definition: z3++.h:4626
void register_eq ( eq_eh_t &  f)
inline

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

4662  {
4663  m_eq_eh = f;
4664  if (s) {
4665  Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4666  }
4667  }
context & ctx()
Definition: z3++.h:4626
void Z3_API Z3_solver_propagate_eq(Z3_context c, Z3_solver s, Z3_eq_eh eq_eh)
register a callback on expression equalities.
void register_eq ( )
inline

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

4669  {
4670  m_eq_eh = [this](expr const& x, expr const& y) {
4671  eq(x, y);
4672  };
4673  if (s) {
4674  Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4675  }
4676  }
virtual void eq(expr const &, expr const &)
Definition: z3++.h:4744
context & ctx()
Definition: z3++.h:4626
void Z3_API Z3_solver_propagate_eq(Z3_context c, Z3_solver s, Z3_eq_eh eq_eh)
register a callback on expression equalities.
void register_final ( final_eh_t &  f)
inline

register a callback on final-check. During the final check stage, all propagations have been processed. This is an opportunity for the user-propagator to delay some analysis that could be expensive to perform incrementally. It is also an opportunity for the propagator to implement branch and bound optimization.

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

4686  {
4687  m_final_eh = f;
4688  if (s) {
4689  Z3_solver_propagate_final(ctx(), *s, final_eh);
4690  }
4691  }
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...
context & ctx()
Definition: z3++.h:4626
void register_final ( )
inline

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

4693  {
4694  m_final_eh = [this]() {
4695  final();
4696  };
4697  if (s) {
4698  Z3_solver_propagate_final(ctx(), *s, final_eh);
4699  }
4700  }
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...
context & ctx()
Definition: z3++.h:4626
void register_fixed ( fixed_eh_t &  f)
inline

register callbacks. Callbacks can only be registered with user_propagators that were created using a solver.

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

4646  {
4647  m_fixed_eh = f;
4648  if (s) {
4649  Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4650  }
4651  }
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 ...
context & ctx()
Definition: z3++.h:4626
void register_fixed ( )
inline

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

4653  {
4654  m_fixed_eh = [this](expr const &id, expr const &e) {
4655  fixed(id, e);
4656  };
4657  if (s) {
4658  Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4659  }
4660  }
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 ...
context & ctx()
Definition: z3++.h:4626
virtual void fixed(expr const &, expr const &)
Definition: z3++.h:4742
void register_on_binding ( )
inline

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

4734  {
4735  m_on_binding_eh = [this](expr const& q, expr const& inst) {
4736  return on_binding(q, inst);
4737  };
4738  if (s)
4739  Z3_solver_propagate_on_binding(ctx(), *s, on_binding_eh);
4740  }
void Z3_API Z3_solver_propagate_on_binding(Z3_context c, Z3_solver s, Z3_on_binding_eh on_binding_eh)
register a callback when the solver instantiates a quantifier. If the callback returns false...
virtual bool on_binding(expr const &, expr const &)
Definition: z3++.h:4752
context & ctx()
Definition: z3++.h:4626