mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 04:03:39 +00:00
better equality solving pre-processing with bv
This commit is contained in:
parent
d980ac9a05
commit
13c098f4b2
|
@ -92,7 +92,6 @@ namespace euf {
|
||||||
if (!bv.is_bv_add(x))
|
if (!bv.is_bv_add(x))
|
||||||
return;
|
return;
|
||||||
expr_ref term(m);
|
expr_ref term(m);
|
||||||
unsigned i = 0;
|
|
||||||
auto mk_term = [&](unsigned i) {
|
auto mk_term = [&](unsigned i) {
|
||||||
term = y;
|
term = y;
|
||||||
unsigned j = 0;
|
unsigned j = 0;
|
||||||
|
@ -102,17 +101,40 @@ namespace euf {
|
||||||
++j;
|
++j;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
expr* u = nullptr, *z = nullptr;
|
||||||
|
rational r;
|
||||||
|
unsigned i = 0;
|
||||||
for (expr* arg : *to_app(x)) {
|
for (expr* arg : *to_app(x)) {
|
||||||
if (is_uninterp_const(arg)) {
|
if (is_uninterp_const(arg)) {
|
||||||
mk_term(i);
|
mk_term(i);
|
||||||
eqs.push_back(dependent_eq(orig, to_app(arg), term, d));
|
eqs.push_back(dependent_eq(orig, to_app(arg), term, d));
|
||||||
}
|
}
|
||||||
|
else if (bv.is_bv_mul(arg, u, z) && bv.is_numeral(u, r) && is_uninterp_const(z) && r.is_odd()) {
|
||||||
|
mk_term(i);
|
||||||
|
unsigned sz = bv.get_bv_size(z);
|
||||||
|
rational inv_r;
|
||||||
|
VERIFY(r.mult_inverse(sz, inv_r));
|
||||||
|
term = bv.mk_bv_mul(bv.mk_numeral(inv_r, sz), term);
|
||||||
|
eqs.push_back(dependent_eq(orig, to_app(z), term, d));
|
||||||
|
}
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void solve_mul(expr* orig, expr* x, expr* y, expr_dependency* d, dep_eq_vector& eqs) {
|
||||||
|
expr* u = nullptr, *z = nullptr;
|
||||||
|
rational r, inv_r;
|
||||||
|
if (bv.is_bv_mul(x, u, z) && bv.is_numeral(u, r) && is_uninterp_const(z) && r.is_odd()) {
|
||||||
|
unsigned sz = bv.get_bv_size(z);
|
||||||
|
VERIFY(r.mult_inverse(sz, inv_r));
|
||||||
|
auto term = expr_ref(bv.mk_bv_mul(bv.mk_numeral(inv_r, sz), y), m);
|
||||||
|
eqs.push_back(dependent_eq(orig, to_app(z), term, d));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void solve_eq(expr* orig, expr* x, expr* y, expr_dependency* d, dep_eq_vector& eqs) {
|
void solve_eq(expr* orig, expr* x, expr* y, expr_dependency* d, dep_eq_vector& eqs) {
|
||||||
solve_add(orig, x, y, d, eqs);
|
solve_add(orig, x, y, d, eqs);
|
||||||
|
solve_mul(orig, x, y, d, eqs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -132,12 +154,9 @@ namespace euf {
|
||||||
}
|
}
|
||||||
|
|
||||||
void pre_process(dependent_expr_state& fmls) override {
|
void pre_process(dependent_expr_state& fmls) override {
|
||||||
if (!m_enabled)
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void updt_params(params_ref const& p) override {
|
void updt_params(params_ref const& p) override {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue