mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 01:25:31 +00:00
handle non-linear division axioms, consolidate backtracking state in nla_core
this update enables new incremental linear axioms based on division terms. It also consolidates some of the backtracking state in nla_core / emons to use stack traces instead of custom backtracking state.
This commit is contained in:
parent
4ffe3fab05
commit
8e37e2f913
9 changed files with 196 additions and 81 deletions
|
@ -275,6 +275,11 @@ class theory_lra::imp {
|
|||
(void)_s;
|
||||
m_nla->push();
|
||||
}
|
||||
std::function<bool(lpvar)> is_relevant = [&](lpvar v) {
|
||||
theory_var u = lp().local_to_external(v);
|
||||
return ctx().is_relevant(th.get_enode(u));
|
||||
};
|
||||
m_nla->set_relevant(is_relevant);
|
||||
smt_params_helper prms(ctx().get_params());
|
||||
m_nla->settings().run_order = prms.arith_nl_order();
|
||||
m_nla->settings().run_tangents = prms.arith_nl_tangents();
|
||||
|
@ -435,12 +440,14 @@ class theory_lra::imp {
|
|||
app_ref mod(a.mk_mod(n1, n2), m);
|
||||
ctx().internalize(mod, false);
|
||||
if (ctx().relevancy()) ctx().add_relevancy_dependency(n, mod);
|
||||
#if 0
|
||||
// shortcut to create non-linear division axioms.
|
||||
theory_var r = mk_var(n);
|
||||
theory_var x = mk_var(n1);
|
||||
theory_var y = mk_var(n2);
|
||||
m_nla->add_idivision(get_lpvar(n), get_lpvar(n1), get_lpvar(n2));
|
||||
#if 1
|
||||
if (m_nla && !a.is_numeral(n2)) {
|
||||
// shortcut to create non-linear division axioms.
|
||||
theory_var r = mk_var(n);
|
||||
theory_var x = mk_var(n1);
|
||||
theory_var y = mk_var(n2);
|
||||
m_nla->add_idivision(get_lpvar(n), get_lpvar(n1), get_lpvar(n2));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else if (a.is_mod(n, n1, n2)) {
|
||||
|
@ -1801,6 +1808,8 @@ public:
|
|||
for (unsigned j = 0; j < m_idiv_terms.size(); ++j) {
|
||||
unsigned i = (offset + j) % m_idiv_terms.size();
|
||||
expr* n = m_idiv_terms[i];
|
||||
if (!ctx().is_relevant(n))
|
||||
continue;
|
||||
expr* p = nullptr, *q = nullptr;
|
||||
VERIFY(a.is_idiv(n, p, q));
|
||||
theory_var v = internalize_def(to_app(n));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue