mirror of
https://github.com/Z3Prover/z3
synced 2025-06-28 08:58:44 +00:00
handle potential extra nodes from q_solver
This commit is contained in:
parent
c4d0ded7b7
commit
e70f501932
1 changed files with 23 additions and 9 deletions
|
@ -461,6 +461,13 @@ namespace euf {
|
||||||
give_up = true;
|
give_up = true;
|
||||||
|
|
||||||
unsigned num_nodes = m_egraph.num_nodes();
|
unsigned num_nodes = m_egraph.num_nodes();
|
||||||
|
auto apply_solver = [&](th_solver* e) {
|
||||||
|
switch (e->check()) {
|
||||||
|
case sat::check_result::CR_CONTINUE: cont = true; break;
|
||||||
|
case sat::check_result::CR_GIVEUP: give_up = true; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
};
|
||||||
if (merge_shared_bools())
|
if (merge_shared_bools())
|
||||||
cont = true;
|
cont = true;
|
||||||
for (auto* e : m_solvers) {
|
for (auto* e : m_solvers) {
|
||||||
|
@ -468,25 +475,24 @@ namespace euf {
|
||||||
return sat::check_result::CR_GIVEUP;
|
return sat::check_result::CR_GIVEUP;
|
||||||
if (e == m_qsolver)
|
if (e == m_qsolver)
|
||||||
continue;
|
continue;
|
||||||
switch (e->check()) {
|
apply_solver(e);
|
||||||
case sat::check_result::CR_CONTINUE: cont = true; break;
|
|
||||||
case sat::check_result::CR_GIVEUP: give_up = true; break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
if (s().inconsistent())
|
if (s().inconsistent())
|
||||||
return sat::check_result::CR_CONTINUE;
|
return sat::check_result::CR_CONTINUE;
|
||||||
}
|
}
|
||||||
|
if (m_qsolver)
|
||||||
|
apply_solver(m_qsolver);
|
||||||
|
|
||||||
|
if (s().inconsistent())
|
||||||
|
return sat::check_result::CR_CONTINUE;
|
||||||
if (cont)
|
if (cont)
|
||||||
return sat::check_result::CR_CONTINUE;
|
return sat::check_result::CR_CONTINUE;
|
||||||
if (give_up)
|
|
||||||
return sat::check_result::CR_GIVEUP;
|
|
||||||
if (num_nodes < m_egraph.num_nodes()) {
|
if (num_nodes < m_egraph.num_nodes()) {
|
||||||
IF_VERBOSE(1, verbose_stream() << "new nodes created, but not detected\n");
|
IF_VERBOSE(1, verbose_stream() << "new nodes created, but not detected\n");
|
||||||
return sat::check_result::CR_CONTINUE;
|
return sat::check_result::CR_CONTINUE;
|
||||||
}
|
}
|
||||||
if (m_qsolver)
|
|
||||||
return m_qsolver->check();
|
|
||||||
TRACE("after_search", s().display(tout););
|
TRACE("after_search", s().display(tout););
|
||||||
|
if (give_up)
|
||||||
|
return sat::check_result::CR_GIVEUP;
|
||||||
return sat::check_result::CR_DONE;
|
return sat::check_result::CR_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -857,6 +863,14 @@ namespace euf {
|
||||||
};
|
};
|
||||||
r->m_egraph.copy_from(m_egraph, copy_justification);
|
r->m_egraph.copy_from(m_egraph, copy_justification);
|
||||||
r->set_solver(s);
|
r->set_solver(s);
|
||||||
|
for (euf::enode* n : r->m_egraph.nodes()) {
|
||||||
|
auto b = n->bool_var();
|
||||||
|
if (b != sat::null_bool_var) {
|
||||||
|
m_bool_var2expr.setx(b, n->get_expr(), nullptr);
|
||||||
|
SASSERT(r->m.is_bool(n->get_sort()));
|
||||||
|
IF_VERBOSE(0, verbose_stream() << "set bool_var " << r->bpp(n) << "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
for (auto* s_orig : m_id2solver) {
|
for (auto* s_orig : m_id2solver) {
|
||||||
if (s_orig) {
|
if (s_orig) {
|
||||||
auto* s_clone = s_orig->clone(*r);
|
auto* s_clone = s_orig->clone(*r);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue