Fix bug 421, again, and add a second, independent test case for the same
authorMorgan Deters <mdeters@gmail.com>
Thu, 11 Oct 2012 21:17:12 +0000 (21:17 +0000)
committerMorgan Deters <mdeters@gmail.com>
Thu, 11 Oct 2012 21:17:12 +0000 (21:17 +0000)
with --check-models (which caused the same bug, for a different reason,
due to some unintended interaction between the checkModel() function and
the UserContext, which rolled back the Model object.  (Groan...)

(this commit was certified error- and warning-free by the test-and-commit script.)

src/smt/smt_engine.cpp
test/regress/regress0/Makefile.am
test/regress/regress0/bug421b.smt2 [new file with mode: 0644]

index 84f8c4f9526264fececcf2459fe634611bcf8620..fa619c653ed53a01bc1791bcf37f188cd5f2b541 100644 (file)
@@ -390,7 +390,21 @@ public:
     throw(TypeCheckingException);
 
   /**
-   * pre-skolemize quantifiers
+   * Simplify node "in" by expanding definitions and applying any
+   * substitutions learned from preprocessing.
+   */
+  Node simplify(TNode in) {
+    // Substitute out any abstract values in ex.
+    // Expand definitions.
+    hash_map<Node, Node, NodeHashFunction> cache;
+    Node n = expandDefinitions(in, cache).toExpr();
+    // Make sure we've done all preprocessing, etc.
+    Assert(d_assertionsToCheck.size() == 0 && d_assertionsToPreprocess.size() == 0);
+    return applySubstitutions(n).toExpr();
+  }
+
+  /**
+   * Pre-skolemize quantifiers.
    */
   Node preSkolemizeQuantifiers(Node n, bool polarity, std::vector<Node>& fvs);
 
@@ -2094,18 +2108,14 @@ Expr SmtEngine::simplify(const Expr& ex) throw(TypeCheckingException) {
     Dump("benchmark") << SimplifyCommand(ex);
   }
 
-  // Substitute out any abstract values in ex.
   Expr e = d_private->substituteAbstractValues(Node::fromExpr(ex)).toExpr();
   if( options::typeChecking() ) {
     e.getType(true);// ensure expr is type-checked at this point
   }
-  // Expand definitions.
-  hash_map<Node, Node, NodeHashFunction> cache;
-  e = d_private->expandDefinitions(Node::fromExpr(e), cache).toExpr();
-  // Make sure we've done simple preprocessing, unit detection, etc.
-  Trace("smt") << "SmtEngine::check(): processing assertions" << endl;
+
+  // Make sure all preprocessing is done
   d_private->processAssertions();
-  return d_private->applySubstitutions(e).toExpr();
+  return d_private->simplify(Node::fromExpr(e)).toExpr();
 }
 
 Expr SmtEngine::expandDefinitions(const Expr& ex) throw(TypeCheckingException) {
@@ -2424,7 +2434,7 @@ void SmtEngine::checkModel(bool hardFailure) {
     Notice() << "SmtEngine::checkModel(): -- substitutes to " << n << endl;
 
     // Simplify the result.
-    n = Node::fromExpr(simplify(n.toExpr()));
+    n = d_private->simplify(n);
     Notice() << "SmtEngine::checkModel(): -- simplifies to  " << n << endl;
 
     TheoryId thy = Theory::theoryOf(n);
index de1c8eca593273110c14252108e130b1862c9d9c..4a4f02d91b5b2e96e157f9ac7ccf4478ee686b7f 100644 (file)
@@ -132,7 +132,8 @@ BUG_TESTS = \
        bug382.smt2 \
        bug383.smt2 \
        bug398.smt2 \
-       bug421.smt2
+       bug421.smt2 \
+       bug421b.smt2
 
 TESTS =        $(SMT_TESTS) $(SMT2_TESTS) $(CVC_TESTS) $(TPTP_TESTS) $(BUG_TESTS)
 
diff --git a/test/regress/regress0/bug421b.smt2 b/test/regress/regress0/bug421b.smt2
new file mode 100644 (file)
index 0000000..a47efb6
--- /dev/null
@@ -0,0 +1,15 @@
+; same as bug421.smt2 but adds --check-models on command line:
+; this actually caused the same bug for a different reason, so
+; we check them both independently in regressions
+;
+; COMMAND-LINE: --incremental --abstract-values --check-models
+; EXPECT: sat
+; EXPECT: ((a @1) (b @2))
+; EXIT: 10
+(set-logic QF_AUFLIA)
+(set-option :produce-models true)
+(declare-fun a () (Array Int Int))
+(declare-fun b () (Array Int Int))
+(assert (not (= a b)))
+(check-sat)
+(get-value (a b))