mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 01:25:31 +00:00
fixes and more porting seq_eq_solver to self-contained module
This commit is contained in:
parent
847724fb21
commit
38737db802
21 changed files with 354 additions and 230 deletions
|
@ -1029,7 +1029,7 @@ namespace sat {
|
|||
return false;
|
||||
} while (m_qhead < m_trail.size());
|
||||
|
||||
if (m_ext)
|
||||
if (m_ext && !is_probing())
|
||||
m_ext->unit_propagate();
|
||||
}
|
||||
if (m_inconsistent)
|
||||
|
|
|
@ -626,12 +626,16 @@ namespace arith {
|
|||
ctx.get_rewriter()(value);
|
||||
}
|
||||
else {
|
||||
UNREACHABLE();
|
||||
value = mdl.get_fresh_value(o->get_sort());
|
||||
}
|
||||
mdl.register_value(value);
|
||||
values.set(n->get_root_id(), value);
|
||||
}
|
||||
|
||||
void solver::add_dep(euf::enode* n, top_sort<euf::enode>& dep) {
|
||||
bool solver::add_dep(euf::enode* n, top_sort<euf::enode>& dep) {
|
||||
theory_var v = n->get_th_var(get_id());
|
||||
if (v == euf::null_theory_var && !a.is_arith_expr(n->get_expr()))
|
||||
return false;
|
||||
expr* e = n->get_expr();
|
||||
if (a.is_arith_expr(e) && to_app(e)->get_num_args() > 0) {
|
||||
for (auto* arg : euf::enode_args(n))
|
||||
|
@ -640,6 +644,7 @@ namespace arith {
|
|||
else {
|
||||
dep.insert(n, nullptr);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void solver::push_core() {
|
||||
|
|
|
@ -429,7 +429,7 @@ namespace arith {
|
|||
void init_model() override;
|
||||
void finalize_model(model& mdl) override { DEBUG_CODE(dbg_finalize_model(mdl);); }
|
||||
void add_value(euf::enode* n, model& mdl, expr_ref_vector& values) override;
|
||||
void add_dep(euf::enode* n, top_sort<euf::enode>& dep) override;
|
||||
bool add_dep(euf::enode* n, top_sort<euf::enode>& dep) override;
|
||||
sat::literal internalize(expr* e, bool sign, bool root, bool learned) override;
|
||||
void internalize(expr* e, bool redundant) override;
|
||||
void eq_internalized(euf::enode* n) override;
|
||||
|
|
|
@ -22,10 +22,10 @@ Author:
|
|||
namespace array {
|
||||
|
||||
|
||||
void solver::add_dep(euf::enode* n, top_sort<euf::enode>& dep) {
|
||||
bool solver::add_dep(euf::enode* n, top_sort<euf::enode>& dep) {
|
||||
if (!a.is_array(n->get_expr())) {
|
||||
dep.insert(n, nullptr);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
for (euf::enode* p : euf::enode_parents(n)) {
|
||||
if (a.is_default(p->get_expr())) {
|
||||
|
@ -41,6 +41,7 @@ namespace array {
|
|||
for (euf::enode* k : euf::enode_class(n))
|
||||
if (a.is_const(k->get_expr()))
|
||||
dep.add(n, k->get_arg(0));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -207,7 +207,7 @@ namespace array {
|
|||
void new_diseq_eh(euf::th_eq const& eq) override;
|
||||
bool unit_propagate() override;
|
||||
void add_value(euf::enode* n, model& mdl, expr_ref_vector& values) override;
|
||||
void add_dep(euf::enode* n, top_sort<euf::enode>& dep) override;
|
||||
bool add_dep(euf::enode* n, top_sort<euf::enode>& dep) override;
|
||||
sat::literal internalize(expr* e, bool sign, bool root, bool learned) override;
|
||||
void internalize(expr* e, bool redundant) override;
|
||||
euf::theory_var mk_var(euf::enode* n) override;
|
||||
|
|
|
@ -703,15 +703,16 @@ namespace dt {
|
|||
values.set(n->get_root_id(), m.mk_app(c_decl, m_args));
|
||||
}
|
||||
|
||||
void solver::add_dep(euf::enode* n, top_sort<euf::enode>& dep) {
|
||||
bool solver::add_dep(euf::enode* n, top_sort<euf::enode>& dep) {
|
||||
theory_var v = n->get_th_var(get_id());
|
||||
if (!is_datatype(n->get_expr()))
|
||||
return;
|
||||
return true;
|
||||
euf::enode* con = m_var_data[m_find.find(v)]->m_constructor;
|
||||
if (con->num_args() == 0)
|
||||
dep.insert(n, nullptr);
|
||||
for (enode* arg : euf::enode_args(con))
|
||||
dep.add(n, arg->get_root());
|
||||
return true;
|
||||
}
|
||||
|
||||
sat::literal solver::internalize(expr* e, bool sign, bool root, bool redundant) {
|
||||
|
|
|
@ -149,7 +149,7 @@ namespace dt {
|
|||
void new_eq_eh(euf::th_eq const& eq) override;
|
||||
bool unit_propagate() override { return false; }
|
||||
void add_value(euf::enode* n, model& mdl, expr_ref_vector& values) override;
|
||||
void add_dep(euf::enode* n, top_sort<euf::enode>& dep) override;
|
||||
bool add_dep(euf::enode* n, top_sort<euf::enode>& dep) override;
|
||||
sat::literal internalize(expr* e, bool sign, bool root, bool redundant) override;
|
||||
void internalize(expr* e, bool redundant) override;
|
||||
euf::theory_var mk_var(euf::enode* n) override;
|
||||
|
|
|
@ -88,18 +88,31 @@ namespace euf {
|
|||
}
|
||||
|
||||
void solver::collect_dependencies(user_sort& us, deps_t& deps) {
|
||||
ptr_buffer<enode> fresh_values;
|
||||
for (enode* n : m_egraph.nodes()) {
|
||||
expr* e = n->get_expr();
|
||||
sort* srt = e->get_sort();
|
||||
auto* mb = sort2solver(srt);
|
||||
if (mb)
|
||||
mb->add_dep(n, deps);
|
||||
else
|
||||
if (!mb)
|
||||
deps.insert(n, nullptr);
|
||||
else if (!mb->add_dep(n, deps))
|
||||
fresh_values.push_back(n);
|
||||
if (n->is_root() && m.is_uninterp(srt) && m.is_value(e))
|
||||
us.register_value(e);
|
||||
}
|
||||
|
||||
// fresh values depend on all non-fresh values of the same sort
|
||||
for (enode* n : fresh_values) {
|
||||
n->mark1();
|
||||
deps.insert(n, nullptr);
|
||||
}
|
||||
for (enode* n : fresh_values)
|
||||
for (enode* r : m_egraph.nodes())
|
||||
if (r->is_root() && r->get_sort() == n->get_sort() && !r->is_marked1())
|
||||
deps.add(n, r);
|
||||
for (enode* n : fresh_values)
|
||||
n->unmark1();
|
||||
|
||||
TRACE("euf",
|
||||
for (auto const& d : deps.deps())
|
||||
if (d.m_value) {
|
||||
|
|
|
@ -318,22 +318,27 @@ namespace fpa {
|
|||
values.set(n->get_root_id(), value);
|
||||
}
|
||||
|
||||
void solver::add_dep(euf::enode* n, top_sort<euf::enode>& dep) {
|
||||
bool solver::add_dep(euf::enode* n, top_sort<euf::enode>& dep) {
|
||||
expr* e = n->get_expr();
|
||||
if (m_fpa_util.is_fp(e)) {
|
||||
SASSERT(n->num_args() == 3);
|
||||
for (enode* arg : euf::enode_args(n))
|
||||
dep.add(n, arg);
|
||||
return true;
|
||||
}
|
||||
else if (m_fpa_util.is_bv2rm(e)) {
|
||||
SASSERT(n->num_args() == 1);
|
||||
dep.add(n, n->get_arg(0));
|
||||
return true;
|
||||
}
|
||||
else if (m_fpa_util.is_rm(e) || m_fpa_util.is_float(e)) {
|
||||
euf::enode* wrapped = expr2enode(m_converter.wrap(e));
|
||||
if (wrapped)
|
||||
dep.add(n, wrapped);
|
||||
return nullptr != wrapped;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
std::ostream& solver::display(std::ostream& out) const {
|
||||
|
|
|
@ -64,7 +64,7 @@ namespace fpa {
|
|||
std::ostream& display_justification(std::ostream& out, sat::ext_justification_idx idx) const override { UNREACHABLE(); return out; }
|
||||
std::ostream& display_constraint(std::ostream& out, sat::ext_constraint_idx idx) const override { UNREACHABLE(); return out; }
|
||||
void add_value(euf::enode* n, model& mdl, expr_ref_vector& values) override;
|
||||
void add_dep(euf::enode* n, top_sort<euf::enode>& dep) override;
|
||||
bool add_dep(euf::enode* n, top_sort<euf::enode>& dep) override;
|
||||
void finalize_model(model& mdl) override;
|
||||
|
||||
bool unit_propagate() override { return false; }
|
||||
|
|
|
@ -79,7 +79,7 @@ namespace euf {
|
|||
/**
|
||||
\brief compute dependencies for node n
|
||||
*/
|
||||
virtual void add_dep(euf::enode* n, top_sort<euf::enode>& dep) { dep.insert(n, nullptr); }
|
||||
virtual bool add_dep(euf::enode* n, top_sort<euf::enode>& dep) { dep.insert(n, nullptr); return true; }
|
||||
|
||||
/**
|
||||
\brief should function be included in model.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue