Z3
 
Loading...
Searching...
No Matches
Data Structures | Public Member Functions
user_propagator_base Class Referenceabstract

#include <z3++.h>

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.
 
void register_fixed (fixed_eh_t &f)
 register callbacks. Callbacks can only be registered with user_propagators that were created using a solver.
 
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.
 
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.
 
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 4458 of file z3++.h.

Constructor & Destructor Documentation

◆ user_propagator_base() [1/2]

user_propagator_base ( context c)
inline

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

4553: s(nullptr), c(&c) {}

◆ user_propagator_base() [2/2]

user_propagator_base ( solver s)
inline

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

4555 : s(s), c(nullptr) {
4556 Z3_solver_propagate_init(ctx(), *s, this, push_eh, pop_eh, fresh_eh);
4557 }
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.

◆ ~user_propagator_base()

virtual ~user_propagator_base ( )
inlinevirtual

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

4562 {
4563 for (auto& subcontext : subcontexts) {
4564 subcontext->detach(); // detach first; the subcontexts will be freed internally!
4565 delete subcontext;
4566 }
4567 }

Member Function Documentation

◆ add()

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 4716 of file z3++.h.

4716 {
4717 if (cb)
4719 else if (s)
4721 else
4722 assert(false);
4723 }
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...

Referenced by Solver::__iadd__().

◆ conflict() [1/2]

void conflict ( expr_vector const fixed)
inline

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

4725 {
4726 assert(cb);
4727 expr conseq = ctx().bool_val(false);
4728 array<Z3_ast> _fixed(fixed);
4729 Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
4730 }
expr bool_val(bool b)
Definition z3++.h:3935
virtual void fixed(expr const &, expr const &)
Definition z3++.h:4685
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 pro...

◆ conflict() [2/2]

void conflict ( expr_vector const fixed,
expr_vector const lhs,
expr_vector const rhs 
)
inline

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

4732 {
4733 assert(cb);
4734 assert(lhs.size() == rhs.size());
4735 expr conseq = ctx().bool_val(false);
4736 array<Z3_ast> _fixed(fixed);
4737 array<Z3_ast> _lhs(lhs);
4738 array<Z3_ast> _rhs(rhs);
4739 Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
4740 }

◆ created()

virtual void created ( expr const )
inlinevirtual

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

4691{}

Referenced by user_propagator_base::register_created().

◆ ctx()

context & ctx ( )
inline

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

4569 {
4570 return c ? *c : s->ctx();
4571 }
context & ctx() const
Definition z3++.h:521

Referenced by ArithRef::__add__(), BitVecRef::__add__(), BitVecRef::__and__(), FuncDeclRef::__call__(), AstMap::__contains__(), AstRef::__copy__(), Goal::__copy__(), AstVector::__copy__(), FuncInterp::__copy__(), ModelRef::__copy__(), AstRef::__deepcopy__(), Datatype::__deepcopy__(), ParamsRef::__deepcopy__(), ParamDescrsRef::__deepcopy__(), Goal::__deepcopy__(), AstVector::__deepcopy__(), AstMap::__deepcopy__(), FuncEntry::__deepcopy__(), FuncInterp::__deepcopy__(), ModelRef::__deepcopy__(), Statistics::__deepcopy__(), Context::__del__(), AstRef::__del__(), ScopedConstructor::__del__(), ScopedConstructorList::__del__(), ParamsRef::__del__(), ParamDescrsRef::__del__(), Goal::__del__(), AstVector::__del__(), AstMap::__del__(), FuncEntry::__del__(), FuncInterp::__del__(), ModelRef::__del__(), Statistics::__del__(), Solver::__del__(), ArithRef::__div__(), BitVecRef::__div__(), ExprRef::__eq__(), ArithRef::__ge__(), BitVecRef::__ge__(), AstVector::__getitem__(), ModelRef::__getitem__(), Statistics::__getitem__(), AstMap::__getitem__(), ArithRef::__gt__(), BitVecRef::__gt__(), BitVecRef::__invert__(), ArithRef::__le__(), BitVecRef::__le__(), AstVector::__len__(), AstMap::__len__(), ModelRef::__len__(), Statistics::__len__(), BitVecRef::__lshift__(), ArithRef::__lt__(), BitVecRef::__lt__(), ArithRef::__mod__(), BitVecRef::__mod__(), BoolRef::__mul__(), ArithRef::__mul__(), BitVecRef::__mul__(), ExprRef::__ne__(), ArithRef::__neg__(), BitVecRef::__neg__(), BitVecRef::__or__(), ArithRef::__pow__(), ArithRef::__radd__(), BitVecRef::__radd__(), BitVecRef::__rand__(), ArithRef::__rdiv__(), BitVecRef::__rdiv__(), ParamsRef::__repr__(), ParamDescrsRef::__repr__(), AstMap::__repr__(), Statistics::__repr__(), BitVecRef::__rlshift__(), ArithRef::__rmod__(), BitVecRef::__rmod__(), ArithRef::__rmul__(), BitVecRef::__rmul__(), BitVecRef::__ror__(), ArithRef::__rpow__(), BitVecRef::__rrshift__(), BitVecRef::__rshift__(), ArithRef::__rsub__(), BitVecRef::__rsub__(), BitVecRef::__rxor__(), AstVector::__setitem__(), AstMap::__setitem__(), ArithRef::__sub__(), BitVecRef::__sub__(), BitVecRef::__xor__(), DatatypeSortRef::accessor(), user_propagator_base::add(), ExprRef::arg(), FuncEntry::arg_value(), FuncInterp::arity(), Goal::as_expr(), Solver::assert_and_track(), Goal::assert_exprs(), Solver::assert_exprs(), QuantifierRef::body(), Solver::check(), user_propagator_base::conflict(), user_propagator_base::conflict(), Goal::convert_model(), AstRef::ctx_ref(), ExprRef::decl(), ModelRef::decls(), ArrayRef::default(), RatNumRef::denominator(), Goal::depth(), Goal::dimacs(), FuncDeclRef::domain(), ArraySortRef::domain_n(), FuncInterp::else_value(), FuncInterp::entry(), AstMap::erase(), ModelRef::eval(), Goal::get(), ParamDescrsRef::get_documentation(), ModelRef::get_interp(), Statistics::get_key_value(), ParamDescrsRef::get_kind(), ParamDescrsRef::get_name(), ModelRef::get_sort(), ModelRef::get_universe(), Goal::inconsistent(), AstMap::keys(), Statistics::keys(), Solver::model(), SortRef::name(), user_propagator_base::next_split(), QuantifierRef::no_pattern(), FuncEntry::num_args(), FuncInterp::num_entries(), Solver::num_scopes(), ModelRef::num_sorts(), FuncDeclRef::params(), QuantifierRef::pattern(), AlgebraicNumRef::poly(), Solver::pop(), Goal::prec(), ModelRef::project(), ModelRef::project_with_witness(), user_propagator_base::propagate(), user_propagator_base::propagate(), Solver::push(), AstVector::push(), QuantifierRef::qid(), FuncDeclRef::range(), ArraySortRef::range(), DatatypeSortRef::recognizer(), Context::ref(), user_propagator_base::register_created(), user_propagator_base::register_created(), user_propagator_base::register_decide(), user_propagator_base::register_decide(), user_propagator_base::register_eq(), user_propagator_base::register_eq(), user_propagator_base::register_final(), user_propagator_base::register_final(), user_propagator_base::register_fixed(), user_propagator_base::register_fixed(), user_propagator_base::register_on_binding(), AstMap::reset(), Solver::reset(), AstVector::resize(), Solver::set(), ParamsRef::set(), Goal::sexpr(), AstVector::sexpr(), ModelRef::sexpr(), ParamDescrsRef::size(), Goal::size(), QuantifierRef::skolem_id(), AstVector::translate(), AstRef::translate(), Goal::translate(), ModelRef::translate(), ExprRef::update(), user_propagator_base::user_propagator_base(), ParamsRef::validate(), FuncEntry::value(), QuantifierRef::var_name(), and QuantifierRef::var_sort().

◆ decide()

virtual void decide ( expr const ,
unsigned  ,
bool   
)
inlinevirtual

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

4693{}

Referenced by user_propagator_base::register_decide().

◆ eq()

virtual void eq ( expr const ,
expr const  
)
inlinevirtual

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

4687{ }

Referenced by AstRef::__eq__(), SortRef::cast(), and user_propagator_base::register_eq().

◆ final()

virtual void final ( )
inlinevirtual

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

4689{ }

◆ fixed()

virtual void fixed ( expr const ,
expr const  
)
inlinevirtual

◆ fresh()

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.

◆ next_split()

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

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

4697 {
4698 assert(cb);
4699 return Z3_solver_next_split(ctx(), cb, e, idx, phase);
4700 }
bool Z3_API Z3_solver_next_split(Z3_context c, Z3_solver_callback cb, Z3_ast t, unsigned idx, Z3_lbool phase)

◆ on_binding()

virtual bool on_binding ( expr const ,
expr const  
)
inlinevirtual

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

4695{ return true; }

Referenced by user_propagator_base::register_on_binding().

◆ pop()

virtual void pop ( unsigned  num_scopes)
pure virtual

Referenced by Solver::__exit__().

◆ propagate() [1/2]

bool propagate ( expr_vector const fixed,
expr const conseq 
)
inline

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

4742 {
4743 assert(cb);
4744 assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
4745 array<Z3_ast> _fixed(fixed);
4746 return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
4747 }

◆ propagate() [2/2]

bool propagate ( expr_vector const fixed,
expr_vector const lhs,
expr_vector const rhs,
expr const conseq 
)
inline

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

4751 {
4752 assert(cb);
4753 assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
4754 assert(lhs.size() == rhs.size());
4755 array<Z3_ast> _fixed(fixed);
4756 array<Z3_ast> _lhs(lhs);
4757 array<Z3_ast> _rhs(rhs);
4758
4759 return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
4760 }

◆ push()

virtual void push ( )
pure virtual

Referenced by Solver::__enter__().

◆ register_created() [1/2]

void register_created ( )
inline

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

4652 {
4653 m_created_eh = [this](expr const& e) {
4654 created(e);
4655 };
4656 if (s) {
4657 Z3_solver_propagate_created(ctx(), *s, created_eh);
4658 }
4659 }
virtual void created(expr const &)
Definition z3++.h:4691
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...

◆ register_created() [2/2]

void register_created ( created_eh_t &  c)
inline

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

4645 {
4646 m_created_eh = c;
4647 if (s) {
4648 Z3_solver_propagate_created(ctx(), *s, created_eh);
4649 }
4650 }

◆ register_decide() [1/2]

void register_decide ( )
inline

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

4668 {
4669 m_decide_eh = [this](expr val, unsigned bit, bool is_pos) {
4670 decide(val, bit, is_pos);
4671 };
4672 if (s) {
4673 Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4674 }
4675 }
virtual void decide(expr const &, unsigned, bool)
Definition z3++.h:4693
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...

◆ register_decide() [2/2]

void register_decide ( decide_eh_t &  c)
inline

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

4661 {
4662 m_decide_eh = c;
4663 if (s) {
4664 Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4665 }
4666 }

◆ register_eq() [1/2]

void register_eq ( )
inline

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

4612 {
4613 m_eq_eh = [this](expr const& x, expr const& y) {
4614 eq(x, y);
4615 };
4616 if (s) {
4617 Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4618 }
4619 }
virtual void eq(expr const &, expr const &)
Definition z3++.h:4687
void Z3_API Z3_solver_propagate_eq(Z3_context c, Z3_solver s, Z3_eq_eh eq_eh)
register a callback on expression equalities.

◆ register_eq() [2/2]

void register_eq ( eq_eh_t &  f)
inline

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

4605 {
4606 m_eq_eh = f;
4607 if (s) {
4608 Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4609 }
4610 }

◆ register_final() [1/2]

void register_final ( )
inline

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

4636 {
4637 m_final_eh = [this]() {
4638 final();
4639 };
4640 if (s) {
4641 Z3_solver_propagate_final(ctx(), *s, final_eh);
4642 }
4643 }
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...

◆ register_final() [2/2]

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 4629 of file z3++.h.

4629 {
4630 m_final_eh = f;
4631 if (s) {
4632 Z3_solver_propagate_final(ctx(), *s, final_eh);
4633 }
4634 }

◆ register_fixed() [1/2]

void register_fixed ( )
inline

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

4596 {
4597 m_fixed_eh = [this](expr const &id, expr const &e) {
4598 fixed(id, e);
4599 };
4600 if (s) {
4601 Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4602 }
4603 }
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 ...

◆ register_fixed() [2/2]

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 4589 of file z3++.h.

4589 {
4590 m_fixed_eh = f;
4591 if (s) {
4592 Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4593 }
4594 }

◆ register_on_binding()

void register_on_binding ( )
inline

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

4677 {
4678 m_on_binding_eh = [this](expr const& q, expr const& inst) {
4679 return on_binding(q, inst);
4680 };
4681 if (s)
4682 Z3_solver_propagate_on_binding(ctx(), *s, on_binding_eh);
4683 }
virtual bool on_binding(expr const &, expr const &)
Definition z3++.h:4695
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,...