summaryrefslogtreecommitdiff
path: root/src/theory/uf/theory_uf.cpp
diff options
context:
space:
mode:
authorMorgan Deters <mdeters@gmail.com>2012-04-11 16:31:03 +0000
committerMorgan Deters <mdeters@gmail.com>2012-04-11 16:31:03 +0000
commitd01d291be3213368985f28d0072905c4f033d5ff (patch)
tree8524a2b6a00c012221ecca9266c3ab9fb11989ed /src/theory/uf/theory_uf.cpp
parent889853e225687dfef36b15ca1dccf74682e0fd66 (diff)
merge from arrays-clark branch
Diffstat (limited to 'src/theory/uf/theory_uf.cpp')
-rw-r--r--src/theory/uf/theory_uf.cpp47
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
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback