3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-31 08:23:17 +00:00

polysat fixes

1. ensure that force_push is invoked before polysat updates state.
2. extract conflicts based on dependencies of both new literal that was conflicting with existing literal that had its value assigned based on dependencies.
This commit is contained in:
Nikolaj Bjorner 2023-03-06 17:35:39 -08:00
parent be0d0d5b9b
commit 6c00d40513
6 changed files with 34 additions and 2 deletions

View file

@ -167,6 +167,7 @@ namespace polysat {
void conflict::reset() {
m_literals.reset();
m_vars.reset();
m_dep_literal = sat::null_literal;
m_var_occurrences.reset();
m_vars_occurring.reset();
m_lemmas.reset();
@ -184,16 +185,21 @@ namespace polysat {
return contains(lit) || contains(~lit);
}
void conflict::init_at_base_level(dependency dep) {
void conflict::init_at_base_level(dependency dep, sat::literal lit) {
SASSERT(empty());
SASSERT(s.at_base_level());
m_level = s.m_level;
m_dep = dep;
m_dep_literal = lit;
SASSERT(!empty());
// TODO: logger().begin_conflict???
// TODO: check uses of logger().begin_conflict(). sometimes we call it before adding constraints, sometimes after...
}
void conflict::init_at_base_level(dependency dep) {
init_at_base_level(dep, sat::null_literal);
}
void conflict::init(signed_constraint c) {
LOG("Conflict: constraint " << lit_pp(s, c));
SASSERT(empty());
@ -585,6 +591,9 @@ namespace polysat {
}
}
if (m_dep_literal != sat::null_literal)
enqueue_lit(m_dep_literal);
for (unsigned d : deps)
out_deps.push_back(dependency(d));
if (!m_dep.is_null() && !deps.contains(m_dep.val()))