3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-12 12:08:18 +00:00
This commit is contained in:
Nikolaj Bjorner 2022-11-24 22:46:35 +07:00
parent b0247d8201
commit eb812e47be
2 changed files with 22 additions and 24 deletions

View file

@ -32,11 +32,8 @@ public:
void reset_mark(ast * n) { n->reset_mark_so(); } void reset_mark(ast * n) { n->reset_mark_so(); }
void mark(ast * n) { if (is_marked(n)) return; n->mark_so(true); m_to_unmark.push_back(n); } void mark(ast * n) { if (is_marked(n)) return; n->mark_so(true); m_to_unmark.push_back(n); }
void reset() { void reset() {
ptr_buffer<ast>::iterator it = m_to_unmark.begin(); for (auto* t : m_to_unmark)
ptr_buffer<ast>::iterator end = m_to_unmark.end(); reset_mark(t);
for (; it != end; ++it) {
reset_mark(*it);
}
m_to_unmark.reset(); m_to_unmark.reset();
} }
void mark(ast * n, bool flag) { if (flag) mark(n); else reset_mark(n); } void mark(ast * n, bool flag) { if (flag) mark(n); else reset_mark(n); }

View file

@ -36,7 +36,7 @@ void propagate_values::reduce() {
shared_occs shared(m, true); shared_occs shared(m, true);
expr_substitution subst(m, true, false); expr_substitution subst(m, true, false);
expr* x, * y; expr* x, * y;
expr_ref_buffer args(m);
auto add_shared = [&]() { auto add_shared = [&]() {
shared_occs_mark visited; shared_occs_mark visited;
shared.reset(); shared.reset();
@ -50,15 +50,16 @@ void propagate_values::reduce() {
subst.insert(x, m.mk_false(), dep); subst.insert(x, m.mk_false(), dep);
else if (shared.is_shared(f)) else if (shared.is_shared(f))
subst.insert(f, m.mk_true(), dep); subst.insert(f, m.mk_true(), dep);
if (m.is_eq(f, x, y) && m.is_value(x) && shared.is_shared(y)) if (m.is_eq(f, x, y)) {
subst.insert(y, x, dep); if (m.is_value(x) && shared.is_shared(y))
else if (m.is_eq(f, x, y) && m.is_value(y) && shared.is_shared(x)) subst.insert(y, x, dep);
subst.insert(x, y, dep); else if (m.is_value(y) && shared.is_shared(x))
subst.insert(x, y, dep);
}
}; };
auto process_fml = [&](unsigned i) { auto process_fml = [&](unsigned i) {
expr* f = m_fmls[i].fml(); auto [f, dep] = m_fmls[i]();
expr_dependency* dep = m_fmls[i].dep();
expr_ref fml(m); expr_ref fml(m);
proof_ref pr(m); proof_ref pr(m);
m_rewriter(f, fml, pr); m_rewriter(f, fml, pr);
@ -70,24 +71,23 @@ void propagate_values::reduce() {
m_rewriter.reset_used_dependencies(); m_rewriter.reset_used_dependencies();
add_sub(m_fmls[i]); add_sub(m_fmls[i]);
}; };
auto init_sub = [&]() {
add_shared();
subst.reset();
m_rewriter.reset();
m_rewriter.set_substitution(&subst);
for (unsigned i = 0; i < m_qhead; ++i)
add_sub(m_fmls[i]);
};
unsigned rw = m_stats.m_num_rewrites + 1; unsigned rw = m_stats.m_num_rewrites + 1;
for (unsigned r = 0; r < m_max_rounds && rw != m_stats.m_num_rewrites; ++r) { for (unsigned r = 0; r < m_max_rounds && rw != m_stats.m_num_rewrites; ++r) {
rw = m_stats.m_num_rewrites; rw = m_stats.m_num_rewrites;
add_shared(); init_sub();
subst.reset();
m_rewriter.reset();
m_rewriter.set_substitution(&subst);
for (unsigned i = 0; i < m_qhead; ++i)
add_sub(m_fmls[i]);
for (unsigned i = m_qhead; i < m_fmls.size() && !m_fmls.inconsistent(); ++i) for (unsigned i = m_qhead; i < m_fmls.size() && !m_fmls.inconsistent(); ++i)
process_fml(i); process_fml(i);
add_shared(); init_sub();
subst.reset();
m_rewriter.reset();
m_rewriter.set_substitution(&subst);
for (unsigned i = 0; i < m_qhead; ++i)
add_sub(m_fmls[i]);
for (unsigned i = m_fmls.size(); i-- > m_qhead && !m_fmls.inconsistent();) for (unsigned i = m_fmls.size(); i-- > m_qhead && !m_fmls.inconsistent();)
process_fml(i); process_fml(i);
if (subst.empty()) if (subst.empty())
@ -107,6 +107,7 @@ void propagate_values::collect_statistics(statistics& st) const {
void propagate_values::updt_params(params_ref const& p) { void propagate_values::updt_params(params_ref const& p) {
tactic_params tp(p); tactic_params tp(p);
m_max_rounds = p.get_uint("max_rounds", tp.propagate_values_max_rounds()); m_max_rounds = p.get_uint("max_rounds", tp.propagate_values_max_rounds());
m_rewriter.updt_params(p);
} }
void propagate_values::collect_param_descrs(param_descrs& r) { void propagate_values::collect_param_descrs(param_descrs& r) {