if (repr.getKind() == kind::CONST_BITVECTOR) {
// must check if it's just the constant
eq::EqClassIterator it(repr, &d_equalityEngine);
- if (!(++it).isFinished()) {
+ if (!(++it).isFinished() || true) {
constants.insert(repr);
constants_in_eq_engine.insert(repr);
}
TNode a = fact[0][1];
TNode b = fact[0][0];
ok = d_inequalityGraph.addInequality(a, b, true, fact);
+ // propagate
+ // if (d_bv->isSharedTerm(a) && d_bv->isSharedTerm(b)) {
+ // Node neq = utils::mkNode(kind::NOT, utils::mkNode(kind::EQUAL, a, b));
+ // d_bv->storePropagation(neq, SUB_INEQUALITY);
+ // d_explanations[neq] = fact;
+ // }
} else if (fact.getKind() == kind::NOT && fact[0].getKind() == kind::BITVECTOR_ULT) {
TNode a = fact[0][1];
TNode b = fact[0][0];
TNode a = fact[0];
TNode b = fact[1];
ok = d_inequalityGraph.addInequality(a, b, true, fact);
+ // propagate
+ // if (d_bv->isSharedTerm(a) && d_bv->isSharedTerm(b)) {
+ // Node neq = utils::mkNode(kind::NOT, utils::mkNode(kind::EQUAL, a, b));
+ // d_bv->storePropagation(neq, SUB_INEQUALITY);
+ // d_explanations[neq] = fact;
+ // }
} else if (fact.getKind() == kind::BITVECTOR_ULE) {
TNode a = fact[0];
TNode b = fact[1];
}
void InequalitySolver::explain(TNode literal, std::vector<TNode>& assumptions) {
- Assert (false);
+ Assert (d_explanations.find(literal) != d_explanations.end());
+ TNode explanation = d_explanations[literal];
+ assumptions.push_back(explanation);
+ Debug("bv-inequality-explain") << "InequalitySolver::explain " << literal << " with " << explanation <<"\n";
}
void InequalitySolver::propagate(Theory::Effort e) {
context::CDHashSet<Node, NodeHashFunction> d_assertionSet;
InequalityGraph d_inequalityGraph;
+ context::CDHashMap<Node, TNode, NodeHashFunction> d_explanations;
context::CDO<bool> d_isComplete;
__gnu_cxx::hash_map<TNode, bool, TNodeHashFunction> d_ineqTermCache;
bool isInequalityOnly(TNode node);
: SubtheorySolver(c, bv),
d_assertionSet(c),
d_inequalityGraph(c),
+ d_explanations(c),
d_isComplete(c, true),
d_ineqTermCache(),
d_statistics()
void addSharedTerm(TNode t);
+ bool isSharedTerm(TNode t) { return d_sharedTermsSet.contains(t); }
+
EqualityStatus getEqualityStatus(TNode a, TNode b);
Node getModelValue(TNode var);