Fix issue with shared but non-preregistered term setup. Thanks Alvise Rabitti for...
authorKshitij Bansal <kshitij@cs.nyu.edu>
Fri, 10 Oct 2014 21:16:17 +0000 (17:16 -0400)
committerKshitij Bansal <kshitij@cs.nyu.edu>
Fri, 10 Oct 2014 21:16:17 +0000 (17:16 -0400)
src/theory/sets/theory_sets_private.cpp
test/regress/regress0/Makefile.am
test/regress/regress0/trim.cvc [new file with mode: 0644]

index 2035c18b0265ccfb83ad7a9ad806214f1b6f94ea..cae6064095bcdd7e313c72a2af3bd9b8e78664af 100644 (file)
@@ -414,6 +414,7 @@ void TheorySetsPrivate::learnLiteral(TNode atom, bool polarity, Node reason) {
 
 void TheorySetsPrivate::addSharedTerm(TNode n) {
   Debug("sets") << "[sets] ThoerySetsPrivate::addSharedTerm( " << n << ")" << std::endl;
+  d_termInfoManager->addTerm(n);
   d_equalityEngine.addTriggerTerm(n, THEORY_SETS);
 }
 
@@ -513,7 +514,7 @@ bool TheorySetsPrivate::checkModel(const SettermElementsMap& settermElementsMap,
   BOOST_FOREACH(TNode element, saved) { Debug("sets-model") << element << ", "; }
   Debug("sets-model") << " }" << std::endl;
 
-  if(S.getNumChildren() == 2) {
+  if(theory::kindToTheoryId(S.getKind()) == THEORY_SETS && S.getNumChildren() == 2) {
 
     Elements cur;
 
index 7500186dd857d2e3c854360da5b0ee9c31bdfcdc..c0ee0f2bb6d3e3d443a14a1d32a23dac0ff43db1 100644 (file)
@@ -107,7 +107,8 @@ CVC_TESTS = \
        wiki.21.cvc \
        simplification_bug3.cvc \
        queries0.cvc \
-       print_lambda.cvc
+       print_lambda.cvc \
+       trim.cvc
 
 # Regression tests for TPTP inputs
 TPTP_TESTS =
diff --git a/test/regress/regress0/trim.cvc b/test/regress/regress0/trim.cvc
new file mode 100644 (file)
index 0000000..8bdbde7
--- /dev/null
@@ -0,0 +1,36 @@
+% COMMAND-LINE: --finite-model-find
+% EXPECT: sat
+DATATYPE
+       myType = A | B
+END;
+%%% structured datatypes
+myTypeSet: TYPE = SET OF myType;
+myTypeGammaSet: TYPE = [# pos: myTypeSet, neg: myTypeSet #];
+delta: TYPE = ARRAY myType OF myTypeGammaSet;
+labels: TYPE = ARRAY myType OF SET OF STRING;
+
+%%% the empty myTypes set
+emptymyTypeSet : SET OF myType;
+ASSERT emptymyTypeSet = {} :: SET OF myType;
+
+d: delta;
+l: labels;
+
+ASSERT (l[A] = {"L","H"});
+ASSERT (l[B] = {"L"});
+
+ic0_i : myTypeSet;
+ic0_c : myTypeSet;
+ASSERT FORALL (r:myType):
+       (r IS_IN ic0_i) => FORALL (r2: myType): (r2 IS_IN d[r].neg) => r2 IS_IN ic0_c;
+ASSERT {A} <= ic0_i;
+ASSERT ((EXISTS (e0 : myType): (e0 IS_IN ic0_i) => (l[A] <= l[e0]))) OR ((ic0_i & ic0_c) <= emptymyTypeSet);
+
+ic1_i : myTypeSet;
+ic1_c : myTypeSet;
+ASSERT FORALL (r:myType):
+       (r IS_IN d[B].pos) => r IS_IN ic1_i;
+ASSERT ((EXISTS (e1 : myType): (e1 IS_IN ic1_i) => (l[B] <= l[e1]))) OR ((ic1_i & ic1_c) <= emptymyTypeSet);
+
+CHECKSAT;
+%COUNTEREXAMPLE;