mirror of
https://github.com/Z3Prover/z3
synced 2025-06-07 06:33:23 +00:00
fixing repair
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
6b0a10637c
commit
7699ce56db
3 changed files with 17 additions and 7 deletions
|
@ -39,13 +39,19 @@ namespace sls {
|
||||||
return expr_ref(bv.mk_numeral(val.get_value(), e->get_sort()), m);
|
return expr_ref(bv.mk_numeral(val.get_value(), e->get_sort()), m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool bv_plugin::is_bv_predicate(expr* e) {
|
||||||
|
return e && is_app(e) && to_app(e)->get_family_id() == bv.get_family_id();
|
||||||
|
}
|
||||||
|
|
||||||
void bv_plugin::propagate_literal(sat::literal lit) {
|
void bv_plugin::propagate_literal(sat::literal lit) {
|
||||||
SASSERT(ctx.is_true(lit));
|
SASSERT(ctx.is_true(lit));
|
||||||
auto a = ctx.atom(lit.var());
|
auto e = ctx.atom(lit.var());
|
||||||
if (!a || !is_app(a))
|
if (!is_bv_predicate(e))
|
||||||
return;
|
return;
|
||||||
if (!m_eval.eval_is_correct(to_app(a)))
|
auto a = to_app(e);
|
||||||
ctx.new_value_eh(a);
|
|
||||||
|
if (!m_eval.eval_is_correct(a))
|
||||||
|
ctx.new_value_eh(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bv_plugin::propagate() {
|
bool bv_plugin::propagate() {
|
||||||
|
@ -145,10 +151,11 @@ namespace sls {
|
||||||
|
|
||||||
void bv_plugin::repair_literal(sat::literal lit) {
|
void bv_plugin::repair_literal(sat::literal lit) {
|
||||||
SASSERT(ctx.is_true(lit));
|
SASSERT(ctx.is_true(lit));
|
||||||
auto a = ctx.atom(lit.var());
|
auto e = ctx.atom(lit.var());
|
||||||
if (!a || !is_app(a))
|
if (!is_bv_predicate(e))
|
||||||
return;
|
return;
|
||||||
if (!m_eval.eval_is_correct(to_app(a)))
|
auto a = to_app(e);
|
||||||
|
if (!m_eval.eval_is_correct(a))
|
||||||
ctx.flip(lit.var());
|
ctx.flip(lit.var());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ namespace sls {
|
||||||
std::ostream& trace_repair(bool down, expr* e);
|
std::ostream& trace_repair(bool down, expr* e);
|
||||||
void trace();
|
void trace();
|
||||||
bool can_propagate();
|
bool can_propagate();
|
||||||
|
bool is_bv_predicate(expr* e);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bv_plugin(context& ctx);
|
bv_plugin(context& ctx);
|
||||||
|
|
|
@ -401,6 +401,7 @@ namespace sls {
|
||||||
auto is_visited = [&](expr* e) {
|
auto is_visited = [&](expr* e) {
|
||||||
return nullptr != m_allterms.get(e->get_id(), nullptr);
|
return nullptr != m_allterms.get(e->get_id(), nullptr);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto visit = [&](expr* e) {
|
auto visit = [&](expr* e) {
|
||||||
m_allterms.setx(e->get_id(), e);
|
m_allterms.setx(e->get_id(), e);
|
||||||
};
|
};
|
||||||
|
@ -451,6 +452,7 @@ namespace sls {
|
||||||
|
|
||||||
m_repair_down.reserve(e->get_id() + 1);
|
m_repair_down.reserve(e->get_id() + 1);
|
||||||
m_repair_up.reserve(e->get_id() + 1);
|
m_repair_up.reserve(e->get_id() + 1);
|
||||||
|
SASSERT(e == term(e->get_id()));
|
||||||
if (!m_repair_down.contains(e->get_id()))
|
if (!m_repair_down.contains(e->get_id()))
|
||||||
m_repair_down.insert(e->get_id());
|
m_repair_down.insert(e->get_id());
|
||||||
for (auto p : parents(e)) {
|
for (auto p : parents(e)) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue