Z3
Loading...
Searching...
No Matches
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 4739 of file z3++.h.

Constructor & Destructor Documentation

◆ user_propagator_base() [1/2]

user_propagator_base ( context & c)
inline

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

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

Referenced by fresh().

◆ user_propagator_base() [2/2]

user_propagator_base ( solver * s)
inline

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

4836 : s(s), c(nullptr) {
4837 Z3_solver_propagate_init(ctx(), *s, this, push_eh, pop_eh, fresh_eh);
4838 }
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 4843 of file z3++.h.

4843 {
4844 for (auto& subcontext : subcontexts) {
4845 subcontext->detach(); // detach first; the subcontexts will be freed internally!
4846 delete subcontext;
4847 }
4848 }

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

4997 {
4998 if (cb)
4999 Z3_solver_propagate_register_cb(ctx(), cb, e);
5000 else if (s)
5001 Z3_solver_propagate_register(ctx(), *s, e);
5002 else
5003 assert(false);
5004 }
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...

◆ conflict() [1/2]

void conflict ( expr_vector const & fixed)
inline

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

5006 {
5007 assert(cb);
5008 expr conseq = ctx().bool_val(false);
5009 array<Z3_ast> _fixed(fixed);
5010 Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
5011 }
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 5013 of file z3++.h.

5013 {
5014 assert(cb);
5015 assert(lhs.size() == rhs.size());
5016 expr conseq = ctx().bool_val(false);
5017 array<Z3_ast> _fixed(fixed);
5018 array<Z3_ast> _lhs(lhs);
5019 array<Z3_ast> _rhs(rhs);
5020 Z3_solver_propagate_consequence(ctx(), cb, fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
5021 }

◆ created()

virtual void created ( expr const & )
inlinevirtual

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

4972{}

Referenced by register_created().

◆ ctx()

◆ decide()

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

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

4974{}

Referenced by register_decide().

◆ eq()

virtual void eq ( expr const & ,
expr const &  )
inlinevirtual

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

4968{ }

Referenced by register_eq().

◆ final()

virtual void final ( )
inlinevirtual

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

4970{ }

◆ fixed()

virtual void fixed ( expr const & ,
expr const &  )
inlinevirtual

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

4966{ }

Referenced by conflict(), conflict(), propagate(), propagate(), and register_fixed().

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

4978 {
4979 assert(cb);
4980 return Z3_solver_next_split(ctx(), cb, e, idx, phase);
4981 }
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 4976 of file z3++.h.

4976{ return true; }

Referenced by register_on_binding().

◆ pop()

virtual void pop ( unsigned num_scopes)
pure virtual

◆ propagate() [1/2]

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

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

5023 {
5024 assert(cb);
5025 assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
5026 array<Z3_ast> _fixed(fixed);
5027 return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), 0, nullptr, nullptr, conseq);
5028 }

◆ propagate() [2/2]

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

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

5032 {
5033 assert(cb);
5034 assert((Z3_context)conseq.ctx() == (Z3_context)ctx());
5035 assert(lhs.size() == rhs.size());
5036 array<Z3_ast> _fixed(fixed);
5037 array<Z3_ast> _lhs(lhs);
5038 array<Z3_ast> _rhs(rhs);
5039
5040 return Z3_solver_propagate_consequence(ctx(), cb, _fixed.size(), _fixed.ptr(), lhs.size(), _lhs.ptr(), _rhs.ptr(), conseq);
5041 }

◆ push()

virtual void push ( )
pure virtual

◆ register_created() [1/2]

void register_created ( )
inline

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

4933 {
4934 m_created_eh = [this](expr const& e) {
4935 created(e);
4936 };
4937 if (s) {
4938 Z3_solver_propagate_created(ctx(), *s, created_eh);
4939 }
4940 }
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 4926 of file z3++.h.

4926 {
4927 m_created_eh = c;
4928 if (s) {
4929 Z3_solver_propagate_created(ctx(), *s, created_eh);
4930 }
4931 }

◆ register_decide() [1/2]

void register_decide ( )
inline

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

4949 {
4950 m_decide_eh = [this](expr val, unsigned bit, bool is_pos) {
4951 decide(val, bit, is_pos);
4952 };
4953 if (s) {
4954 Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4955 }
4956 }
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 4942 of file z3++.h.

4942 {
4943 m_decide_eh = c;
4944 if (s) {
4945 Z3_solver_propagate_decide(ctx(), *s, decide_eh);
4946 }
4947 }

◆ register_eq() [1/2]

void register_eq ( )
inline

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

4893 {
4894 m_eq_eh = [this](expr const& x, expr const& y) {
4895 eq(x, y);
4896 };
4897 if (s) {
4898 Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4899 }
4900 }
void Z3_API Z3_solver_propagate_eq(Z3_context c, Z3_solver s, Z3_eq_eh eq_eh)
register a callback on expression equalities.
bool eq(AstRef a, AstRef b)
Definition z3py.py:503

◆ register_eq() [2/2]

void register_eq ( eq_eh_t & f)
inline

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

4886 {
4887 m_eq_eh = f;
4888 if (s) {
4889 Z3_solver_propagate_eq(ctx(), *s, eq_eh);
4890 }
4891 }

◆ register_final() [1/2]

void register_final ( )
inline

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

4917 {
4918 m_final_eh = [this]() {
4919 final();
4920 };
4921 if (s) {
4922 Z3_solver_propagate_final(ctx(), *s, final_eh);
4923 }
4924 }
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 4910 of file z3++.h.

4910 {
4911 m_final_eh = f;
4912 if (s) {
4913 Z3_solver_propagate_final(ctx(), *s, final_eh);
4914 }
4915 }

◆ register_fixed() [1/2]

void register_fixed ( )
inline

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

4877 {
4878 m_fixed_eh = [this](expr const &id, expr const &e) {
4879 fixed(id, e);
4880 };
4881 if (s) {
4882 Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4883 }
4884 }
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 4870 of file z3++.h.

4870 {
4871 m_fixed_eh = f;
4872 if (s) {
4873 Z3_solver_propagate_fixed(ctx(), *s, fixed_eh);
4874 }
4875 }

◆ register_on_binding()

void register_on_binding ( )
inline

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

4958 {
4959 m_on_binding_eh = [this](expr const& q, expr const& inst) {
4960 return on_binding(q, inst);
4961 };
4962 if (s)
4963 Z3_solver_propagate_on_binding(ctx(), *s, on_binding_eh);
4964 }
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,...