Some incremental bugs for Boolean terms, fixed. Thanks to Pantazis Deligiannis and...
authorMorgan Deters <mdeters@cs.nyu.edu>
Thu, 3 Apr 2014 23:16:39 +0000 (19:16 -0400)
committerMorgan Deters <mdeters@cs.nyu.edu>
Thu, 3 Apr 2014 23:38:21 +0000 (19:38 -0400)
src/smt/boolean_terms.cpp
src/smt/boolean_terms.h
src/smt/smt_engine.cpp
test/regress/regress0/Makefile.am
test/regress/regress0/boolean-terms-kernel1.smt2 [new file with mode: 0644]
test/regress/regress0/boolean-terms-kernel2.smt2 [new file with mode: 0644]

index c1596dddcc617684577427baacf2ebc678b66c6d..4555aac51482879a09877fd6995078a32340b9a8 100644 (file)
@@ -43,8 +43,8 @@ BooleanTermConverter::BooleanTermConverter(SmtEngine& smt) :
   d_tt(),
   d_ffDt(),
   d_ttDt(),
-  d_varCache(),
-  d_termCache(),
+  d_varCache(smt.d_userContext),
+  d_termCache(smt.d_userContext),
   d_typeCache(),
   d_datatypeCache() {
 
@@ -640,7 +640,7 @@ Node BooleanTermConverter::rewriteBooleanTermsRec(TNode top, theory::TheoryId pa
           if(dt != dt2) {
             Assert(d_varCache.find(top) != d_varCache.end(),
                    "constructor `%s' not in cache", top.toString().c_str());
-            result.top() << d_varCache[top];
+            result.top() << d_varCache[top].get();
             worklist.pop();
             goto next_worklist;
           }
@@ -658,7 +658,7 @@ Node BooleanTermConverter::rewriteBooleanTermsRec(TNode top, theory::TheoryId pa
           if(dt != dt2) {
             Assert(d_varCache.find(top) != d_varCache.end(),
                    "tester or selector `%s' not in cache", top.toString().c_str());
-            result.top() << d_varCache[top];
+            result.top() << d_varCache[top].get();
             worklist.pop();
             goto next_worklist;
           } else {
index 89611f5ea8c35633517c1322bb5bc7a82301fe94..b289e346904fa57f577a4893b70b3805f5e1d494 100644 (file)
@@ -36,12 +36,12 @@ typedef expr::Attribute<attr::BooleanTermAttrTag, Node> BooleanTermAttr;
 
 class BooleanTermConverter {
   /** The type of the Boolean term conversion variable cache */
-  typedef std::hash_map<Node, Node, NodeHashFunction> BooleanTermVarCache;
+  typedef context::CDHashMap<Node, Node, NodeHashFunction> BooleanTermVarCache;
 
   /** The type of the Boolean term conversion cache */
-  typedef std::hash_map< std::pair<Node, theory::TheoryId>, Node,
-                         PairHashFunction< Node, bool,
-                                           NodeHashFunction, std::hash<size_t> > > BooleanTermCache;
+  typedef context::CDHashMap< std::pair<Node, theory::TheoryId>, Node,
+                              PairHashFunction< Node, bool,
+                                                NodeHashFunction, std::hash<size_t> > > BooleanTermCache;
   /** The type of the Boolean term conversion type cache */
   typedef std::hash_map< std::pair<TypeNode, bool>, TypeNode,
                          PairHashFunction< TypeNode, bool,
index 328a20c28879dd4b1204fa3f6e48341cb15cb757..7aebb60f6f6586052c52289586a99805213d36e8 100644 (file)
@@ -1877,8 +1877,7 @@ bool SmtEnginePrivate::nonClausalSimplify() {
       d_assertionsToCheck[d_substitutionsIndex] =
         Rewriter::rewrite(Node(substitutionsBuilder));
     }
-  }
-  else {
+  } else {
     // If not in incremental mode, must add substitutions to model
     TheoryModel* m = d_smt.d_theoryEngine->getModel();
     if(m != NULL) {
index 664958e5a23e43a93c0653353714f01234654791..5df8577afeb645b27f9c3170ea45ca6a375b0963 100644 (file)
@@ -47,6 +47,8 @@ SMT_TESTS = \
 # Regression tests for SMT2 inputs
 SMT2_TESTS = \
        arrayinuf_declare.smt2 \
+       boolean-terms-kernel1.smt2 \
+       boolean-terms-kernel2.smt2 \
        chained-equality.smt2 \
        ite2.smt2 \
        ite3.smt2 \
diff --git a/test/regress/regress0/boolean-terms-kernel1.smt2 b/test/regress/regress0/boolean-terms-kernel1.smt2
new file mode 100644 (file)
index 0000000..a999a6a
--- /dev/null
@@ -0,0 +1,13 @@
+; COMMAND-LINE: --incremental
+; EXPECT: sat
+; EXPECT: sat
+(set-logic QF_ABV)
+(declare-fun b () (_ BitVec 32))
+(declare-fun hk () (Array Bool (_ BitVec 32)))
+(push 1)
+(assert (not (= b (select hk true))))
+(check-sat)
+(pop 1)
+(assert (not (= b (_ bv0 32))))
+(assert (= b (select hk true)))
+(check-sat)
diff --git a/test/regress/regress0/boolean-terms-kernel2.smt2 b/test/regress/regress0/boolean-terms-kernel2.smt2
new file mode 100644 (file)
index 0000000..a4e49dd
--- /dev/null
@@ -0,0 +1,19 @@
+; COMMAND-LINE: --incremental
+; EXPECT: unsat
+; EXPECT: sat
+(set-logic QF_ABV)
+(declare-fun b () Bool)
+(declare-fun c () Bool)
+(declare-fun a () (Array Bool (Array (_ BitVec 32) (_ BitVec 32))))
+(declare-fun v2 () (_ BitVec 32))
+(declare-fun r0 () (_ BitVec 32))
+(declare-fun r1 () (_ BitVec 32))
+(declare-fun l () (_ BitVec 32))
+(declare-fun i () (_ BitVec 32))
+(assert c)
+(push 1)
+(assert (not (=> false (not (= i (select (select a true) (bvsub (bvmul (bvsdiv v2 (_ bv2 32)) (bvadd (bvmul (_ bv2 32) l) (_ bv1 32))) (_ bv1 32))))))))
+(check-sat)
+(pop 1)
+(assert (not (=> (= i (select (select a true) (bvsub (bvmul (bvsdiv v2 (_ bv2 32)) (bvadd (bvmul (_ bv2 32) l) (_ bv1 32))) (_ bv1 32)))) (not (= r1 (ite b i r0))))))
+(check-sat)