3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-07 09:55:19 +00:00

deal with cancellation in qe for #6500

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2022-12-19 12:40:39 -08:00
parent ecf25a4fe2
commit 603597a22e

View file

@ -1437,13 +1437,12 @@ namespace qe {
res = m_solver.check(); res = m_solver.check();
if (res == l_true && has_uninterpreted(m, m_fml)) if (res == l_true && has_uninterpreted(m, m_fml))
res = l_undef; res = l_undef;
if (res == l_true) { if (res == l_true)
res = final_check();
if (res == l_true)
is_sat = true; is_sat = true;
final_check(); else
}
else {
break; break;
}
} }
if (res == l_undef) { if (res == l_undef) {
free_vars.append(num_vars, vars); free_vars.append(num_vars, vars);
@ -1501,30 +1500,33 @@ namespace qe {
private: private:
void final_check() { lbool final_check() {
model_ref model; model_ref model;
m_solver.get_model(model); m_solver.get_model(model);
if (!model)
return l_undef;
scoped_ptr<model_evaluator> model_eval = alloc(model_evaluator, *model); scoped_ptr<model_evaluator> model_eval = alloc(model_evaluator, *model);
while (true) { while (m.inc()) {
TRACE("qe", model_v2_pp(tout, *model);); TRACE("qe", model_v2_pp(tout, *model););
while (can_propagate_assignment(*model_eval)) { while (can_propagate_assignment(*model_eval))
propagate_assignment(*model_eval); propagate_assignment(*model_eval);
}
VERIFY(CHOOSE_VAR == update_current(*model_eval, true)); VERIFY(CHOOSE_VAR == update_current(*model_eval, true));
SASSERT(m_current->fml()); SASSERT(m_current->fml());
if (l_true != m_solver.check()) { if (l_true != m_solver.check()) {
return; return l_true;
} }
m_solver.get_model(model); m_solver.get_model(model);
model_eval = alloc(model_evaluator, *model); model_eval = alloc(model_evaluator, *model);
search_tree* st = m_current; search_tree* st = m_current;
update_current(*model_eval, false); update_current(*model_eval, false);
if (st == m_current) { if (st == m_current)
break; break;
} }
} if (!m.inc())
pop(*model_eval); return l_undef;
pop(*model_eval);
return l_true;
} }
ast_manager& get_manager() override { return m; } ast_manager& get_manager() override { return m; }