mirror of
https://github.com/Z3Prover/z3
synced 2025-06-20 21:03:39 +00:00
find_op
This commit is contained in:
parent
9f7c9dfb17
commit
9a061d8f4a
2 changed files with 25 additions and 3 deletions
|
@ -417,6 +417,20 @@ namespace polysat {
|
||||||
return -p - 1;
|
return -p - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signed_constraint constraint_manager::find_op(op_constraint::code op, pdd const& p, pdd const& q) const {
|
||||||
|
auto& m = p.manager();
|
||||||
|
unsigned sz = m.power_of_2();
|
||||||
|
|
||||||
|
op_constraint_args const args(op, p, q);
|
||||||
|
auto it = m_dedup.op_constraint_expr.find_iterator(args);
|
||||||
|
if (it == m_dedup.op_constraint_expr.end())
|
||||||
|
return {};
|
||||||
|
pdd r = m.mk_var(it->m_value);
|
||||||
|
|
||||||
|
op_constraint tmp(op, p, q, r); // TODO: this still allocates op_constraint::m_vars
|
||||||
|
return { dedup_find(&tmp), true };
|
||||||
|
}
|
||||||
|
|
||||||
pdd constraint_manager::mk_op_term(op_constraint::code op, pdd const& p, pdd const& q) {
|
pdd constraint_manager::mk_op_term(op_constraint::code op, pdd const& p, pdd const& q) {
|
||||||
auto& m = p.manager();
|
auto& m = p.manager();
|
||||||
unsigned sz = m.power_of_2();
|
unsigned sz = m.power_of_2();
|
||||||
|
@ -516,14 +530,18 @@ namespace polysat {
|
||||||
pdd constraint_manager::bxnor(pdd const& p, pdd const& q) {
|
pdd constraint_manager::bxnor(pdd const& p, pdd const& q) {
|
||||||
return bnot(bxor(p, q));
|
return bnot(bxor(p, q));
|
||||||
}
|
}
|
||||||
|
|
||||||
pdd constraint_manager::pseudo_inv(pdd const& p) {
|
pdd constraint_manager::pseudo_inv(pdd const& p) {
|
||||||
auto& m = p.manager();
|
auto& m = p.manager();
|
||||||
if (p.is_val())
|
if (p.is_val())
|
||||||
return m.mk_val(p.val().pseudo_inverse(m.power_of_2()));
|
return m.mk_val(p.val().pseudo_inverse(m.power_of_2()));
|
||||||
return mk_op_term(op_constraint::code::inv_op, p, m.zero());
|
return mk_op_term(op_constraint::code::inv_op, p, m.zero());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signed_constraint constraint_manager::find_op_pseudo_inv(pdd const& p) const {
|
||||||
|
return find_op(op_constraint::code::inv_op, p, p.manager().zero());
|
||||||
|
}
|
||||||
|
|
||||||
pdd constraint_manager::udiv(pdd const& p, pdd const& q) {
|
pdd constraint_manager::udiv(pdd const& p, pdd const& q) {
|
||||||
return div_rem_op_constraint(p, q).first;
|
return div_rem_op_constraint(p, q).first;
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,7 +107,11 @@ namespace polysat {
|
||||||
|
|
||||||
/** Find constraint p == 0; returns null if it doesn't exist yet */
|
/** Find constraint p == 0; returns null if it doesn't exist yet */
|
||||||
signed_constraint find_eq(pdd const& p) const;
|
signed_constraint find_eq(pdd const& p) const;
|
||||||
signed_constraint find_ule(pdd const& a, pdd const& b) const;
|
/** Find constraint p <= q; returns null if it doesn't exist yet */
|
||||||
|
signed_constraint find_ule(pdd const& p, pdd const& q) const;
|
||||||
|
/** Find op_constraint; returns null if it doesn't exist yet */
|
||||||
|
signed_constraint find_op(op_constraint::code op, pdd const& p, pdd const& q) const;
|
||||||
|
signed_constraint find_op_pseudo_inv(pdd const& p) const;
|
||||||
|
|
||||||
signed_constraint eq(pdd const& p);
|
signed_constraint eq(pdd const& p);
|
||||||
signed_constraint ule(pdd const& a, pdd const& b);
|
signed_constraint ule(pdd const& a, pdd const& b);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue