diff options
author | Morgan Deters <mdeters@gmail.com> | 2012-04-11 16:31:03 +0000 |
---|---|---|
committer | Morgan Deters <mdeters@gmail.com> | 2012-04-11 16:31:03 +0000 |
commit | d01d291be3213368985f28d0072905c4f033d5ff (patch) | |
tree | 8524a2b6a00c012221ecca9266c3ab9fb11989ed /src/theory/uf/theory_uf.cpp | |
parent | 889853e225687dfef36b15ca1dccf74682e0fd66 (diff) |
merge from arrays-clark branch
Diffstat (limited to 'src/theory/uf/theory_uf.cpp')
-rw-r--r-- | src/theory/uf/theory_uf.cpp | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/src/theory/uf/theory_uf.cpp b/src/theory/uf/theory_uf.cpp index 4ac81bc74..f53918683 100644 --- a/src/theory/uf/theory_uf.cpp +++ b/src/theory/uf/theory_uf.cpp @@ -96,11 +96,11 @@ void TheoryUF::check(Effort level) { d_equalityEngine.addEquality(fact[0], fact[1], fact); break; case kind::APPLY_UF: - d_equalityEngine.addEquality(fact, d_true, fact); + d_equalityEngine.addPredicate(fact, true, fact); break; case kind::NOT: if (fact[0].getKind() == kind::APPLY_UF) { - d_equalityEngine.addEquality(fact[0], d_false, fact); + d_equalityEngine.addPredicate(fact[0], false, fact); } else { // Assert the dis-equality d_equalityEngine.addDisequality(fact[0][0], fact[0][1], fact); @@ -132,24 +132,21 @@ void TheoryUF::propagate(Effort level) { TNode literal = d_literalsToPropagate[d_literalsToPropagateIndex]; Debug("uf") << "TheoryUF::propagate(): propagating " << literal << std::endl; bool satValue; - if (!d_valuation.hasSatValue(literal, satValue)) { + Node normalized = Rewriter::rewrite(literal); + if (!d_valuation.hasSatValue(normalized, satValue) || satValue) { d_out->propagate(literal); } else { - if (!satValue) { - Debug("uf") << "TheoryUF::propagate(): in conflict" << std::endl; - Node negatedLiteral; - std::vector<TNode> assumptions; - if (literal != d_false) { - negatedLiteral = literal.getKind() == kind::NOT ? (Node) literal[0] : literal.notNode(); - assumptions.push_back(negatedLiteral); - } - explain(literal, assumptions); - d_conflictNode = mkAnd(assumptions); - d_conflict = true; - break; - } else { - Debug("uf") << "TheoryUF::propagate(): already asserted" << std::endl; + Debug("uf") << "TheoryUF::propagate(): in conflict, normalized = " << normalized << std::endl; + Node negatedLiteral; + std::vector<TNode> assumptions; + if (normalized != d_false) { + negatedLiteral = normalized.getKind() == kind::NOT ? (Node) normalized[0] : normalized.notNode(); + assumptions.push_back(negatedLiteral); } + explain(literal, assumptions); + d_conflictNode = mkAnd(assumptions); + d_conflict = true; + break; } } } @@ -196,20 +193,18 @@ bool TheoryUF::propagate(TNode literal) { } // See if the literal has been asserted already + Node normalized = Rewriter::rewrite(literal); bool satValue = false; - bool isAsserted = literal == d_false || d_valuation.hasSatValue(literal, satValue); + bool isAsserted = normalized == d_false || d_valuation.hasSatValue(normalized, satValue); // If asserted, we're done or in conflict if (isAsserted) { - if (satValue) { - Debug("uf") << "TheoryUF::propagate(" << literal << ") => already known" << std::endl; - return true; - } else { - Debug("uf") << "TheoryUF::propagate(" << literal << ") => conflict" << std::endl; + if (!satValue) { + Debug("uf") << "TheoryUF::propagate(" << literal << ", normalized = " << normalized << ") => conflict" << std::endl; std::vector<TNode> assumptions; Node negatedLiteral; - if (literal != d_false) { - negatedLiteral = literal.getKind() == kind::NOT ? (Node) literal[0] : literal.notNode(); + if (normalized != d_false) { + negatedLiteral = normalized.getKind() == kind::NOT ? (Node) normalized[0] : normalized.notNode(); assumptions.push_back(negatedLiteral); } explain(literal, assumptions); @@ -217,6 +212,8 @@ bool TheoryUF::propagate(TNode literal) { d_conflict = true; return false; } + // Propagate even if already known in SAT - could be a new equation between shared terms + // (terms that weren't shared when the literal was asserted!) } // Nothing, just enqueue it for propagation and mark it as asserted already |