mirror of
https://github.com/Z3Prover/z3
synced 2025-07-20 11:22:04 +00:00
parent
dcd4fff284
commit
589db2052a
2 changed files with 18 additions and 5 deletions
|
@ -202,6 +202,14 @@ namespace qe {
|
||||||
display(tout, asms););
|
display(tout, asms););
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void pred_abs::ensure_expr_level(app* v, unsigned lvl) {
|
||||||
|
if (!m_elevel.contains(v)) {
|
||||||
|
max_level ml;
|
||||||
|
if (lvl % 2 == 0) ml.m_ex = lvl; else ml.m_fa = lvl;
|
||||||
|
m_elevel.insert(v, ml);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void pred_abs::set_expr_level(app* v, max_level const& lvl) {
|
void pred_abs::set_expr_level(app* v, max_level const& lvl) {
|
||||||
m_elevel.insert(v, lvl);
|
m_elevel.insert(v, lvl);
|
||||||
}
|
}
|
||||||
|
@ -243,6 +251,7 @@ namespace qe {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_uninterp_const(a) && m.is_bool(a)) {
|
if (is_uninterp_const(a) && m.is_bool(a)) {
|
||||||
|
TRACE("qe", tout << mk_pp(a, m) << "\n";);
|
||||||
l = m_elevel.find(a);
|
l = m_elevel.find(a);
|
||||||
level.merge(l);
|
level.merge(l);
|
||||||
if (!m_pred2lit.contains(a)) {
|
if (!m_pred2lit.contains(a)) {
|
||||||
|
@ -911,16 +920,18 @@ namespace qe {
|
||||||
SASSERT(m_level >= 2);
|
SASSERT(m_level >= 2);
|
||||||
expr_ref fml(m);
|
expr_ref fml(m);
|
||||||
expr_ref_vector defs(m), core_save(m);
|
expr_ref_vector defs(m), core_save(m);
|
||||||
max_level level;
|
|
||||||
model& mdl = *m_model.get();
|
model& mdl = *m_model.get();
|
||||||
SASSERT(validate_core(mdl, core));
|
SASSERT(validate_core(mdl, core));
|
||||||
get_vars(m_level-1);
|
get_vars(m_level-1);
|
||||||
SASSERT(validate_project(mdl, core));
|
SASSERT(validate_project(mdl, core));
|
||||||
m_mbp(force_elim(), m_avars, mdl, core);
|
m_mbp(force_elim(), m_avars, mdl, core);
|
||||||
|
TRACE("qe", tout << "aux vars: " << m_avars << "\n";);
|
||||||
|
for (app* v : m_avars) m_pred_abs.ensure_expr_level(v, m_level-1);
|
||||||
m_free_vars.append(m_avars);
|
m_free_vars.append(m_avars);
|
||||||
fml = negate_core(core);
|
fml = negate_core(core);
|
||||||
unsigned num_scopes = 0;
|
unsigned num_scopes = 0;
|
||||||
|
|
||||||
|
max_level level;
|
||||||
m_pred_abs.abstract_atoms(fml, level, defs);
|
m_pred_abs.abstract_atoms(fml, level, defs);
|
||||||
m_ex.assert_expr(mk_and(defs));
|
m_ex.assert_expr(mk_and(defs));
|
||||||
m_fa.assert_expr(mk_and(defs));
|
m_fa.assert_expr(mk_and(defs));
|
||||||
|
@ -1196,10 +1207,10 @@ namespace qe {
|
||||||
// (core[model(vars)/vars] => proj)
|
// (core[model(vars)/vars] => proj)
|
||||||
expr_ref_vector fmls(m);
|
expr_ref_vector fmls(m);
|
||||||
fmls.append(core.size(), core.c_ptr());
|
fmls.append(core.size(), core.c_ptr());
|
||||||
for (unsigned i = 0; i < m_avars.size(); ++i) {
|
for (expr* v : m_avars) {
|
||||||
expr_ref val(m);
|
expr_ref val(m);
|
||||||
VERIFY(mdl.eval(m_avars[i].get(), val));
|
VERIFY(mdl.eval(v, val));
|
||||||
fmls.push_back(m.mk_eq(m_avars[i].get(), val));
|
fmls.push_back(m.mk_eq(v, val));
|
||||||
}
|
}
|
||||||
fmls.push_back(m.mk_not(mk_and(proj)));
|
fmls.push_back(m.mk_not(mk_and(proj)));
|
||||||
if (!check_fmls(fmls)) {
|
if (!check_fmls(fmls)) {
|
||||||
|
|
|
@ -97,7 +97,9 @@ namespace qe {
|
||||||
void push();
|
void push();
|
||||||
void pop(unsigned num_scopes);
|
void pop(unsigned num_scopes);
|
||||||
void insert(app* a, max_level const& lvl);
|
void insert(app* a, max_level const& lvl);
|
||||||
|
void insert_var(app* v, max_level const& lvl);
|
||||||
void get_assumptions(model* mdl, expr_ref_vector& asms);
|
void get_assumptions(model* mdl, expr_ref_vector& asms);
|
||||||
|
void ensure_expr_level(app* v, unsigned lvl);
|
||||||
void set_expr_level(app* v, max_level const& lvl);
|
void set_expr_level(app* v, max_level const& lvl);
|
||||||
void set_decl_level(func_decl* v, max_level const& lvl);
|
void set_decl_level(func_decl* v, max_level const& lvl);
|
||||||
void abstract_atoms(expr* fml, max_level& level, expr_ref_vector& defs);
|
void abstract_atoms(expr* fml, max_level& level, expr_ref_vector& defs);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue