mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 00:55:31 +00:00
redo purification
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
da0e140e1c
commit
2e684d58d2
5 changed files with 68 additions and 88 deletions
|
@ -325,57 +325,4 @@ namespace mbp {
|
|||
}
|
||||
}
|
||||
|
||||
void project_plugin::purify(euf_inverter& inv, model& mdl, app_ref_vector const& vars, expr_ref_vector& lits) {
|
||||
TRACE("mbp", tout << lits << "\n" << mdl << "\n";);
|
||||
model_evaluator eval(mdl);
|
||||
extract_literals(mdl, vars, lits);
|
||||
if (!m.inc())
|
||||
return;
|
||||
eval.set_expand_array_equalities(true);
|
||||
m_non_ground.reset();
|
||||
m_to_visit.reset();
|
||||
m_visited.reset();
|
||||
m_cache.reset();
|
||||
m_pure_eqs.reset();
|
||||
for (expr* v : vars)
|
||||
m_non_ground.mark(v);
|
||||
for (unsigned i = 0; m.inc() && i < lits.size(); ++i)
|
||||
lits[i] = purify(inv, eval, lits.get(i), lits);
|
||||
lits.append(m_pure_eqs);
|
||||
TRACE("mbp", tout << lits << "\n";);
|
||||
}
|
||||
|
||||
expr* project_plugin::purify(euf_inverter& inv, model_evaluator& eval, expr* e, expr_ref_vector& lits) {
|
||||
mark_non_ground(e);
|
||||
m_to_visit.push_back(e);
|
||||
while (!m_to_visit.empty()) {
|
||||
expr* t = m_to_visit.back();
|
||||
if (m_cache.get(t->get_id(), nullptr))
|
||||
m_to_visit.pop_back();
|
||||
else if (!is_app(t) || !m_non_ground.is_marked(t)) {
|
||||
m_cache.setx(t->get_id(), t);
|
||||
m_to_visit.pop_back();
|
||||
}
|
||||
else
|
||||
purify_app(inv, eval, to_app(t), lits);
|
||||
}
|
||||
return m_cache.get(e->get_id());
|
||||
}
|
||||
|
||||
void project_plugin::purify_app(euf_inverter& inv, model_evaluator& eval, app* t, expr_ref_vector& lits) {
|
||||
if (is_uninterp(t) && t->get_num_args() > 0) {
|
||||
expr_ref t_value = eval(t);
|
||||
expr* s = inv.invert_app(t, t_value);
|
||||
m_cache.setx(t->get_id(), s);
|
||||
if (s != t)
|
||||
m_pure_eqs.push_back(m.mk_eq(t, s));
|
||||
unsigned i = 0;
|
||||
for (expr* arg : *t)
|
||||
inv.invert_arg(t, i++, eval(arg), lits);
|
||||
m_to_visit.pop_back();
|
||||
}
|
||||
else
|
||||
visit_app(t);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -35,17 +35,6 @@ namespace mbp {
|
|||
def(const expr_ref& v, expr_ref& t): var(v), term(t) {}
|
||||
};
|
||||
|
||||
/***
|
||||
* An EUF inverter provides two services:
|
||||
* 1. It inverts an uninterpreted function application f(s1,s2) with 'value' to a ground term evaluating to the same
|
||||
* 2. It adds constraints for arguments to s_i with 'value' to be within the bounds of the model value.
|
||||
*/
|
||||
class euf_inverter {
|
||||
public:
|
||||
virtual expr* invert_app(app* t, expr* value) = 0;
|
||||
virtual void invert_arg(app* t, unsigned i, expr* value, expr_ref_vector& lits) = 0;
|
||||
};
|
||||
|
||||
class project_plugin {
|
||||
ast_manager& m;
|
||||
expr_mark m_visited;
|
||||
|
@ -67,9 +56,6 @@ namespace mbp {
|
|||
|
||||
void mark_non_ground(expr* e);
|
||||
|
||||
expr* purify(euf_inverter& inv, model_evaluator& eval, expr* e, expr_ref_vector& lits);
|
||||
void purify_app(euf_inverter& inv, model_evaluator& eval, app* t, expr_ref_vector& lits);
|
||||
|
||||
public:
|
||||
project_plugin(ast_manager& m) :m(m), m_cache(m), m_args(m), m_pure_eqs(m) {}
|
||||
virtual ~project_plugin() {}
|
||||
|
@ -103,12 +89,6 @@ namespace mbp {
|
|||
*/
|
||||
void extract_literals(model& model, app_ref_vector const& vars, expr_ref_vector& fmls);
|
||||
|
||||
/*
|
||||
* Purify literals into linear inequalities or constraints without arithmetic variables.
|
||||
*/
|
||||
|
||||
void purify(euf_inverter& inv, model& model, app_ref_vector const& vars, expr_ref_vector& fmls);
|
||||
|
||||
static expr_ref pick_equality(ast_manager& m, model& model, expr* t);
|
||||
static void erase(expr_ref_vector& lits, unsigned& i);
|
||||
|
||||
|
@ -125,6 +105,7 @@ namespace mbp {
|
|||
}
|
||||
|
||||
bool is_non_ground(expr* t) const { return m_non_ground.is_marked(t); }
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue