mirror of
https://github.com/Z3Prover/z3
synced 2025-06-04 13:21:22 +00:00
fix #6748
destructive equality resolution uses an occurs check function that is only safe for quantifier-free formulas. In the special case where a bound variable is Boolean and occurs on a side of an equality the other side cannot have a quantifier.
This commit is contained in:
parent
57e92b2a59
commit
06a8987314
2 changed files with 3 additions and 3 deletions
|
@ -176,9 +176,9 @@ void der::reduce1(quantifier * q, expr_ref & r, proof_ref & pr) {
|
||||||
var * v = nullptr;
|
var * v = nullptr;
|
||||||
expr_ref t(m);
|
expr_ref t(m);
|
||||||
|
|
||||||
if (is_forall(q) && is_var_diseq(e, num_decls, v, t) && !occurs(v, t))
|
if (is_forall(q) && is_var_diseq(e, num_decls, v, t) && !has_quantifiers(t) && !occurs(v, t))
|
||||||
r = m.mk_false();
|
r = m.mk_false();
|
||||||
else if (is_exists(q) && is_var_eq(e, num_decls, v, t) && !occurs(v, t))
|
else if (is_exists(q) && is_var_eq(e, num_decls, v, t) && !has_quantifiers(t) && !occurs(v, t))
|
||||||
r = m.mk_true();
|
r = m.mk_true();
|
||||||
else {
|
else {
|
||||||
expr_ref_vector literals(m);
|
expr_ref_vector literals(m);
|
||||||
|
|
|
@ -635,7 +635,7 @@ namespace smt {
|
||||||
literal_vector lits;
|
literal_vector lits;
|
||||||
const_cast<conflict_resolution&>(*m_conflict_resolution).justification2literals(j.get_justification(), lits);
|
const_cast<conflict_resolution&>(*m_conflict_resolution).justification2literals(j.get_justification(), lits);
|
||||||
out << "justification " << j.get_justification()->get_from_theory() << ": ";
|
out << "justification " << j.get_justification()->get_from_theory() << ": ";
|
||||||
// display_literals_smt2(out, lits);
|
display_literals_smt2(out, lits);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue