mirror of
https://github.com/Z3Prover/z3
synced 2025-07-03 11:25:40 +00:00
#5429 again
This commit is contained in:
parent
50f5cafb50
commit
924ea6ab31
3 changed files with 9 additions and 10 deletions
|
@ -34,7 +34,8 @@ namespace euf {
|
||||||
|
|
||||||
sat::literal solver::mk_literal(expr* e) {
|
sat::literal solver::mk_literal(expr* e) {
|
||||||
expr_ref _e(e, m);
|
expr_ref _e(e, m);
|
||||||
return internalize(e, false, false, m_is_redundant);
|
bool is_not = m.is_not(e, e);
|
||||||
|
return internalize(e, is_not, false, m_is_redundant);
|
||||||
}
|
}
|
||||||
|
|
||||||
sat::literal solver::internalize(expr* e, bool sign, bool root, bool redundant) {
|
sat::literal solver::internalize(expr* e, bool sign, bool root, bool redundant) {
|
||||||
|
@ -129,8 +130,7 @@ namespace euf {
|
||||||
sat::literal solver::attach_lit(literal lit, expr* e) {
|
sat::literal solver::attach_lit(literal lit, expr* e) {
|
||||||
sat::bool_var v = lit.var();
|
sat::bool_var v = lit.var();
|
||||||
s().set_external(v);
|
s().set_external(v);
|
||||||
s().set_eliminated(v, false);
|
s().set_eliminated(v, false);
|
||||||
|
|
||||||
|
|
||||||
if (lit.sign()) {
|
if (lit.sign()) {
|
||||||
v = si.add_bool_var(e);
|
v = si.add_bool_var(e);
|
||||||
|
|
|
@ -236,7 +236,7 @@ namespace euf {
|
||||||
sat::bool_var v = get_egraph().explain_diseq(m_explain, a, b);
|
sat::bool_var v = get_egraph().explain_diseq(m_explain, a, b);
|
||||||
SASSERT(v == sat::null_bool_var || s().value(v) == l_false);
|
SASSERT(v == sat::null_bool_var || s().value(v) == l_false);
|
||||||
if (v != sat::null_bool_var)
|
if (v != sat::null_bool_var)
|
||||||
m_explain.push_back(to_ptr(sat::literal(v, false)));
|
m_explain.push_back(to_ptr(sat::literal(v, true)));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool solver::propagate(enode* a, enode* b, ext_justification_idx idx) {
|
bool solver::propagate(enode* a, enode* b, ext_justification_idx idx) {
|
||||||
|
@ -286,13 +286,14 @@ namespace euf {
|
||||||
|
|
||||||
void solver::asserted(literal l) {
|
void solver::asserted(literal l) {
|
||||||
expr* e = m_bool_var2expr.get(l.var(), nullptr);
|
expr* e = m_bool_var2expr.get(l.var(), nullptr);
|
||||||
TRACE("euf", tout << "asserted: " << l << "@" << s().scope_lvl() << " := " << mk_bounded_pp(e, m) << "\n";);
|
TRACE("euf", tout << "asserted: " << l << "@" << s().scope_lvl() << " := " << mk_bounded_pp(e, m) << "\n";);
|
||||||
if (!e)
|
if (!e)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
euf::enode* n = m_egraph.find(e);
|
euf::enode* n = m_egraph.find(e);
|
||||||
if (!n)
|
if (!n)
|
||||||
return;
|
return;
|
||||||
bool sign = l.sign();
|
bool sign = l.sign();
|
||||||
m_egraph.set_value(n, sign ? l_false : l_true);
|
m_egraph.set_value(n, sign ? l_false : l_true);
|
||||||
for (auto th : enode_th_vars(n))
|
for (auto th : enode_th_vars(n))
|
||||||
m_id2solver[th.get_id()]->asserted(l);
|
m_id2solver[th.get_id()]->asserted(l);
|
||||||
|
|
|
@ -290,14 +290,12 @@ struct goal2sat::imp : public sat::sat_internalizer {
|
||||||
if (v == sat::null_bool_var) {
|
if (v == sat::null_bool_var) {
|
||||||
if (m.is_true(t)) {
|
if (m.is_true(t)) {
|
||||||
sat::literal tt = sat::literal(add_var(false, m.mk_true()), false);
|
sat::literal tt = sat::literal(add_var(false, m.mk_true()), false);
|
||||||
mk_clause(tt);
|
mk_root_clause(tt);
|
||||||
add_dual_root(1, &tt);
|
|
||||||
l = sign ? ~tt : tt;
|
l = sign ? ~tt : tt;
|
||||||
}
|
}
|
||||||
else if (m.is_false(t)) {
|
else if (m.is_false(t)) {
|
||||||
sat::literal tt = sat::literal(add_var(false, m.mk_false()), true);
|
sat::literal tt = sat::literal(add_var(false, m.mk_false()), true);
|
||||||
mk_clause(tt);
|
mk_root_clause(tt);
|
||||||
add_dual_root(1, &tt);
|
|
||||||
l = sign ? tt : ~tt;
|
l = sign ? tt : ~tt;
|
||||||
}
|
}
|
||||||
else if (m_euf) {
|
else if (m_euf) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue