summaryrefslogtreecommitdiff
path: root/src/theory/arrays
diff options
context:
space:
mode:
authorClark Barrett <barrett@cs.nyu.edu>2014-10-30 03:14:05 -0700
committerClark Barrett <barrett@cs.nyu.edu>2014-10-30 03:14:05 -0700
commit5a285d5247b56b00895774c909f09c8ad1e3889c (patch)
tree3abe837a99859536e47db9cddd9185e66bb9e6c4 /src/theory/arrays
parentb4d9a5bb41d4c5cf8a89de980089981d90b0cc9c (diff)
Be more lazy about generating array lemmas
Diffstat (limited to 'src/theory/arrays')
-rw-r--r--src/theory/arrays/theory_arrays.cpp20
-rw-r--r--src/theory/arrays/theory_arrays.h2
2 files changed, 15 insertions, 7 deletions
diff --git a/src/theory/arrays/theory_arrays.cpp b/src/theory/arrays/theory_arrays.cpp
index e0056e4a9..9a661ab0c 100644
--- a/src/theory/arrays/theory_arrays.cpp
+++ b/src/theory/arrays/theory_arrays.cpp
@@ -455,8 +455,8 @@ void TheoryArrays::preRegisterTermInternal(TNode node)
}
if (node.getType().isArray()) {
- d_equalityEngine.addTriggerTerm(node, THEORY_ARRAY);
d_mayEqualEqualityEngine.addTerm(node);
+ d_equalityEngine.addTriggerTerm(node, THEORY_ARRAY);
}
else {
d_equalityEngine.addTerm(node);
@@ -554,19 +554,19 @@ void TheoryArrays::preRegisterTermInternal(TNode node)
throw LogicException("Array theory solver does not yet support non-constant default values for arrays");
}
d_infoMap.setConstArr(node, node);
- d_equalityEngine.addTriggerTerm(node, THEORY_ARRAY);
d_mayEqualEqualityEngine.addTerm(node);
Assert(d_mayEqualEqualityEngine.getRepresentative(node) == node);
+ d_equalityEngine.addTriggerTerm(node, THEORY_ARRAY);
d_defValues[node] = defaultValue;
break;
}
default:
// Variables etc
if (node.getType().isArray()) {
- d_equalityEngine.addTriggerTerm(node, THEORY_ARRAY);
- Assert(d_equalityEngine.getSize(node) == 1);
// The may equal needs the node
d_mayEqualEqualityEngine.addTerm(node);
+ d_equalityEngine.addTriggerTerm(node, THEORY_ARRAY);
+ Assert(d_equalityEngine.getSize(node) == 1);
}
else {
d_equalityEngine.addTerm(node);
@@ -1113,7 +1113,9 @@ void TheoryArrays::check(Effort e) {
// generate the lemmas on the worklist
Trace("arrays-lem")<<"Arrays::discharging lemmas: "<<d_RowQueue.size()<<"\n";
while (d_RowQueue.size() > 0 && !d_conflict) {
- dischargeLemmas();
+ if (dischargeLemmas()) {
+ break;
+ }
}
}
@@ -2575,8 +2577,9 @@ Node TheoryArrays::getNextDecisionRequest() {
}
-void TheoryArrays::dischargeLemmas()
+bool TheoryArrays::dischargeLemmas()
{
+ bool lemmasAdded = false;
size_t sz = d_RowQueue.size();
for (unsigned count = 0; count < sz; ++count) {
RowLemmaType l = d_RowQueue.front();
@@ -2657,7 +2660,12 @@ void TheoryArrays::dischargeLemmas()
d_RowAlreadyAdded.insert(l);
d_out->lemma(lem);
++d_numRow;
+ lemmasAdded = true;
+ if (options::arraysReduceSharing()) {
+ return true;
+ }
}
+ return lemmasAdded;
}
void TheoryArrays::conflict(TNode a, TNode b) {
diff --git a/src/theory/arrays/theory_arrays.h b/src/theory/arrays/theory_arrays.h
index a22ab2515..371b00b0c 100644
--- a/src/theory/arrays/theory_arrays.h
+++ b/src/theory/arrays/theory_arrays.h
@@ -407,7 +407,7 @@ class TheoryArrays : public Theory {
void checkRowForIndex(TNode i, TNode a);
void checkRowLemmas(TNode a, TNode b);
void queueRowLemma(RowLemmaType lem);
- void dischargeLemmas();
+ bool dischargeLemmas();
std::vector<Node> d_decisions;
bool d_inCheckModel;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback