mirror of
https://github.com/Z3Prover/z3
synced 2025-06-03 21:01:22 +00:00
fixes to occurs check
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
5864fcba6b
commit
aa2292d5c4
3 changed files with 25 additions and 23 deletions
|
@ -572,8 +572,8 @@ namespace sat {
|
||||||
transfer_weight(from_idx, to_idx, w);
|
transfer_weight(from_idx, to_idx, w);
|
||||||
}
|
}
|
||||||
//verbose_stream() << m_shifts << " " << m_flips << " " << shifted << "\n";
|
//verbose_stream() << m_shifts << " " << m_flips << " " << shifted << "\n";
|
||||||
if (!shifted)
|
if (!shifted && m_restart_next > m_flips)
|
||||||
m_reinit_next = m_flips;
|
m_restart_next = m_flips + (m_restart_next - m_flips) / 2;
|
||||||
// DEBUG_CODE(invariant(););
|
// DEBUG_CODE(invariant(););
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,10 +96,10 @@ namespace sls {
|
||||||
expr* t = nullptr, *z = nullptr;
|
expr* t = nullptr, *z = nullptr;
|
||||||
for (auto s : ctx.subterms()) {
|
for (auto s : ctx.subterms()) {
|
||||||
if (dt.is_accessor(s, t) && dt.is_recursive(t) && dt.is_recursive(s))
|
if (dt.is_accessor(s, t) && dt.is_recursive(t) && dt.is_recursive(s))
|
||||||
add_edge(s, t, sat::null_literal);
|
add_edge(s, t, m.mk_app(dt.get_constructor_is(dt.get_accessor_constructor(to_app(s)->get_decl())), t));
|
||||||
if (dt.is_constructor(s) && dt.is_recursive(s)) {
|
if (dt.is_constructor(s) && dt.is_recursive(s)) {
|
||||||
for (auto arg : *to_app(s))
|
for (auto arg : *to_app(s))
|
||||||
add_edge(arg, s, sat::null_literal);
|
add_edge(arg, s, nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expr* x = nullptr, *y = nullptr;
|
expr* x = nullptr, *y = nullptr;
|
||||||
|
@ -114,27 +114,27 @@ namespace sls {
|
||||||
sat::literal lp(v, false), ln(v, true);
|
sat::literal lp(v, false), ln(v, true);
|
||||||
if (dt.is_accessor(x, z) && dt.is_recursive(z)) {
|
if (dt.is_accessor(x, z) && dt.is_recursive(z)) {
|
||||||
if (ctx.is_unit(lp))
|
if (ctx.is_unit(lp))
|
||||||
add_edge(y, z, sat::null_literal);
|
add_edge(y, z, nullptr);
|
||||||
else if (ctx.is_unit(ln))
|
else if (ctx.is_unit(ln))
|
||||||
;
|
;
|
||||||
else
|
else
|
||||||
add_edge(y, z, lp);
|
add_edge(y, z, e);
|
||||||
}
|
}
|
||||||
if (dt.is_accessor(y, z) && dt.is_recursive(z)) {
|
if (dt.is_accessor(y, z) && dt.is_recursive(z)) {
|
||||||
if (ctx.is_unit(lp))
|
if (ctx.is_unit(lp))
|
||||||
add_edge(x, z, sat::null_literal);
|
add_edge(x, z, m.mk_app(dt.get_constructor_is(dt.get_accessor_constructor(to_app(y)->get_decl())), z));
|
||||||
else if (ctx.is_unit(ln))
|
else if (ctx.is_unit(ln))
|
||||||
;
|
;
|
||||||
else
|
else
|
||||||
add_edge(x, z, lp);
|
add_edge(x, z, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
add_path_axioms();
|
add_path_axioms();
|
||||||
}
|
}
|
||||||
|
|
||||||
void datatype_plugin::add_edge(expr* child, expr* parent, sat::literal lit) {
|
void datatype_plugin::add_edge(expr* child, expr* parent, expr* cond) {
|
||||||
TRACE("dt", tout << mk_bounded_pp(child, m) << " <- " << mk_bounded_pp(parent, m) << " " << lit << "\n");
|
m_parents.insert_if_not_there(child, vector<parent_t>()).push_back({parent, expr_ref(cond, m)});
|
||||||
m_parents.insert_if_not_there(child, svector<parent_t>()).push_back({parent, lit});
|
TRACE("dt", tout << mk_bounded_pp(child, m) << " <- " << mk_bounded_pp(parent, m) << " " << mk_bounded_pp(cond, m) << "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void datatype_plugin::add_path_axioms() {
|
void datatype_plugin::add_path_axioms() {
|
||||||
|
@ -148,21 +148,21 @@ namespace sls {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void datatype_plugin::add_path_axioms(ptr_vector<expr>& children, sat::literal_vector& lits, svector<parent_t> const& parents) {
|
void datatype_plugin::add_path_axioms(ptr_vector<expr>& children, sat::literal_vector& lits, vector<parent_t> const& parents) {
|
||||||
for (auto const& [parent, lit] : parents) {
|
for (auto const& [parent, cond] : parents) {
|
||||||
if (lit != sat::null_literal)
|
if (cond)
|
||||||
lits.push_back(~lit);
|
lits.push_back(~ctx.mk_literal(cond));
|
||||||
if (children.contains(parent)) {
|
if (children.contains(parent)) {
|
||||||
// only assert loop clauses for proper loops
|
// only assert loop clauses for proper loops
|
||||||
if (parent == children[0])
|
if (parent == children[0])
|
||||||
ctx.add_clause(lits);
|
ctx.add_clause(lits);
|
||||||
if (lit != sat::null_literal)
|
if (cond)
|
||||||
lits.pop_back();
|
lits.pop_back();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (children[0]->get_sort() == parent->get_sort()) {
|
if (children[0]->get_sort() == parent->get_sort()) {
|
||||||
lits.push_back(~ctx.mk_literal(m.mk_eq(children[0], parent)));
|
lits.push_back(~ctx.mk_literal(m.mk_eq(children[0], parent)));
|
||||||
TRACE("dt", tout << lits << "\n");
|
TRACE("dt", for (auto lit : lits) tout << (lit.sign() ? "~": "") << mk_pp(ctx.atom(lit.var()), m) << "\n";);
|
||||||
ctx.add_clause(lits);
|
ctx.add_clause(lits);
|
||||||
lits.pop_back();
|
lits.pop_back();
|
||||||
}
|
}
|
||||||
|
@ -173,7 +173,7 @@ namespace sls {
|
||||||
add_path_axioms(children, lits, parents2);
|
add_path_axioms(children, lits, parents2);
|
||||||
children.pop_back();
|
children.pop_back();
|
||||||
}
|
}
|
||||||
if (lit != sat::null_literal)
|
if (cond)
|
||||||
lits.pop_back();
|
lits.pop_back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -414,6 +414,7 @@ namespace sls {
|
||||||
}
|
}
|
||||||
IF_VERBOSE(1, verbose_stream() << "cycle\n"; for (auto e : diseqs) verbose_stream() << mk_pp(e, m) << "\n";);
|
IF_VERBOSE(1, verbose_stream() << "cycle\n"; for (auto e : diseqs) verbose_stream() << mk_pp(e, m) << "\n";);
|
||||||
ctx.add_constraint(m.mk_or(diseqs));
|
ctx.add_constraint(m.mk_or(diseqs));
|
||||||
|
++m_stats.m_num_occurs;
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto n : g->nodes()) {
|
for (auto n : g->nodes()) {
|
||||||
|
@ -516,6 +517,7 @@ namespace sls {
|
||||||
|
|
||||||
void datatype_plugin::collect_statistics(statistics& st) const {
|
void datatype_plugin::collect_statistics(statistics& st) const {
|
||||||
st.update("sls-dt-axioms", m_axioms.size());
|
st.update("sls-dt-axioms", m_axioms.size());
|
||||||
|
st.update("sls-dt-occurs-conflicts", m_stats.m_num_occurs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void datatype_plugin::reset_statistics() {}
|
void datatype_plugin::reset_statistics() {}
|
||||||
|
|
|
@ -26,17 +26,17 @@ namespace sls {
|
||||||
|
|
||||||
class datatype_plugin : public plugin {
|
class datatype_plugin : public plugin {
|
||||||
struct stats {
|
struct stats {
|
||||||
unsigned m_num_axioms = 0;
|
unsigned m_num_occurs = 0;
|
||||||
void reset() { memset(this, 0, sizeof(*this)); }
|
void reset() { memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
struct parent_t {
|
struct parent_t {
|
||||||
expr* parent;
|
expr* parent;
|
||||||
sat::literal lit;
|
expr_ref condition;
|
||||||
};
|
};
|
||||||
euf_plugin& euf;
|
euf_plugin& euf;
|
||||||
scoped_ptr<euf::egraph>& g;
|
scoped_ptr<euf::egraph>& g;
|
||||||
obj_map<sort, ptr_vector<expr>> m_dts;
|
obj_map<sort, ptr_vector<expr>> m_dts;
|
||||||
obj_map<expr, svector<parent_t>> m_parents;
|
obj_map<expr, vector<parent_t>> m_parents;
|
||||||
|
|
||||||
mutable datatype_util dt;
|
mutable datatype_util dt;
|
||||||
expr_ref_vector m_axioms, m_values;
|
expr_ref_vector m_axioms, m_values;
|
||||||
|
@ -44,9 +44,9 @@ namespace sls {
|
||||||
stats m_stats;
|
stats m_stats;
|
||||||
|
|
||||||
void collect_path_axioms();
|
void collect_path_axioms();
|
||||||
void add_edge(expr* child, expr* parent, sat::literal lit);
|
void add_edge(expr* child, expr* parent, expr* cond);
|
||||||
void add_path_axioms();
|
void add_path_axioms();
|
||||||
void add_path_axioms(ptr_vector<expr>& children, sat::literal_vector& lits, svector<parent_t> const& parents);
|
void add_path_axioms(ptr_vector<expr>& children, sat::literal_vector& lits, vector<parent_t> const& parents);
|
||||||
void add_axioms();
|
void add_axioms();
|
||||||
|
|
||||||
void init_values();
|
void init_values();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue