3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-07 19:51:22 +00:00

bug fixes

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2024-10-13 19:23:05 -07:00
parent 04824786be
commit f136d46fb4
5 changed files with 70 additions and 8 deletions

View file

@ -41,7 +41,7 @@ namespace sls {
sls_params sp(ctx.get_params()); sls_params sp(ctx.get_params());
m_incremental_mode = sp.euf_incremental(); m_incremental_mode = sp.euf_incremental();
m_incremental = 1 == m_incremental_mode; m_incremental = 1 == m_incremental_mode;
IF_VERBOSE(2, verbose_stream() << "sls.euf: incremental " << m_incremental << "\n"); IF_VERBOSE(2, verbose_stream() << "sls.euf: incremental " << m_incremental_mode << "\n");
} }
void euf_plugin::start_propagation() { void euf_plugin::start_propagation() {
@ -126,7 +126,6 @@ namespace sls {
flit = l; flit = l;
} }
if (flit == sat::null_literal) if (flit == sat::null_literal)
return; return;
do { do {
@ -170,6 +169,7 @@ namespace sls {
g.new_diseq(g.find(e), to_ptr(lit)); g.new_diseq(g.find(e), to_ptr(lit));
else else
g.merge(g.find(x), g.find(y), to_ptr(lit)); g.merge(g.find(x), g.find(y), to_ptr(lit));
g.merge(g.find(e), g.find(m.mk_bool_val(!lit.sign())), to_ptr(lit));
} }
else if (!lit.sign() && m.is_distinct(e)) { else if (!lit.sign() && m.is_distinct(e)) {
auto n = to_app(e)->get_num_args(); auto n = to_app(e)->get_num_args();
@ -187,6 +187,8 @@ namespace sls {
} }
} }
} }
// else if (m.is_bool(e) && is_app(e) && to_app(e)->get_family_id() == basic_family_id)
// ;
else { else {
auto a = g.find(e); auto a = g.find(e);
auto b = g.find(m.mk_bool_val(!lit.sign())); auto b = g.find(m.mk_bool_val(!lit.sign()));
@ -340,9 +342,54 @@ namespace sls {
m_values.insert(t); m_values.insert(t);
} }
} }
//validate_model();
return true; return true;
} }
void euf_plugin::validate_model() {
auto& g = *m_g;
for (auto const& c : ctx.clauses()) {
for (auto lit : c) {
euf::enode* a, * b;
auto e = ctx.atom(lit.var());
if (!e)
continue;
if (!ctx.is_relevant(e))
continue;
if (!ctx.is_true(lit))
continue;
if (m.is_distinct(e))
continue;
auto r = g.find(e)->get_root();
if (m.is_eq(e)) {
a = g.find(to_app(e)->get_arg(0));
b = g.find(to_app(e)->get_arg(1));
}
if (lit.sign() && m.is_eq(e)) {
if (a->get_root() == b->get_root()) {
IF_VERBOSE(0, verbose_stream() << "not disequal " << lit << " " << mk_pp(e, m) << "\n");
ctx.display(verbose_stream());
UNREACHABLE();
}
}
else if (!lit.sign() && m.is_eq(e)) {
if (a->get_root() != b->get_root()) {
IF_VERBOSE(0, verbose_stream() << "not equal " << lit << " " << mk_pp(e, m) << "\n");
//UNREACHABLE();
}
}
else if (to_app(e)->get_family_id() != basic_family_id && lit.sign() && r != g.find(m.mk_false())->get_root()) {
IF_VERBOSE(0, verbose_stream() << "not alse " << lit << " " << mk_pp(e, m) << "\n");
//UNREACHABLE();
}
else if (to_app(e)->get_family_id() != basic_family_id && !lit.sign() && r != g.find(m.mk_true())->get_root()) {
IF_VERBOSE(0, verbose_stream() << "not true " << lit << " " << mk_pp(e, m) << "\n");
//UNREACHABLE();
}
}
}
}
bool euf_plugin::propagate() { bool euf_plugin::propagate() {
bool new_constraint = false; bool new_constraint = false;
for (auto & [f, ts] : m_app) { for (auto & [f, ts] : m_app) {
@ -401,7 +448,6 @@ namespace sls {
} }
} }
return new_constraint; return new_constraint;
} }

View file

@ -64,6 +64,8 @@ namespace sls {
size_t* to_ptr(sat::literal l) { return reinterpret_cast<size_t*>((size_t)(l.index() << 4)); }; size_t* to_ptr(sat::literal l) { return reinterpret_cast<size_t*>((size_t)(l.index() << 4)); };
sat::literal to_literal(size_t* p) { return sat::to_literal(static_cast<unsigned>(reinterpret_cast<size_t>(p) >> 4)); }; sat::literal to_literal(size_t* p) { return sat::to_literal(static_cast<unsigned>(reinterpret_cast<size_t>(p) >> 4)); };
void validate_model();
public: public:
euf_plugin(context& c); euf_plugin(context& c);
~euf_plugin() override; ~euf_plugin() override;

View file

@ -39,7 +39,7 @@ namespace sls {
} }
~solver_ctx() override { ~solver_ctx() override {
m.limit().pop_child(); m.limit().pop_child(&m_ddfw.rlimit());
} }
void init_search() override {} void init_search() override {}

View file

@ -92,6 +92,19 @@ void reslimit::pop_child() {
m_children.pop_back(); m_children.pop_back();
} }
void reslimit::pop_child(reslimit* r) {
lock_guard lock(*g_rlimit_mux);
for (unsigned i = 0; i < m_children.size(); ++i) {
if (m_children[i] == r) {
m_count += r->m_count;
r->m_count = 0;
m_children.erase(m_children.begin() + i);
return;
}
}
}
void reslimit::cancel() { void reslimit::cancel() {
lock_guard lock(*g_rlimit_mux); lock_guard lock(*g_rlimit_mux);
set_cancel(m_cancel+1); set_cancel(m_cancel+1);

View file

@ -45,6 +45,7 @@ public:
void pop(); void pop();
void push_child(reslimit* r); void push_child(reslimit* r);
void pop_child(); void pop_child();
void pop_child(reslimit* r);
bool inc(); bool inc();
bool inc(unsigned offset); bool inc(unsigned offset);