Fix to quantifier rewritting not being idempotent. See bug 441.
authorTim King <taking@cs.nyu.edu>
Sat, 10 Nov 2012 23:55:34 +0000 (23:55 +0000)
committerTim King <taking@cs.nyu.edu>
Sat, 10 Nov 2012 23:55:34 +0000 (23:55 +0000)
src/theory/quantifiers/quantifiers_rewriter.cpp

index 063875235f3c876255b1cd2bf8cdd222e75b3418..d25e516febc4ab9f00f68d73ddc84eb1319a687e 100644 (file)
@@ -224,8 +224,12 @@ RewriteResponse QuantifiersRewriter::postRewrite(TNode in) {
         InstConstantAttribute ica;
         n.setAttribute(ica,in.getAttribute(InstConstantAttribute()) );
       }
+
+      // This is required if substitute in computePrenex() is used.
+      return RewriteResponse(REWRITE_AGAIN_FULL, n );
+    }else{
+      return RewriteResponse(REWRITE_DONE, n );
     }
-    return RewriteResponse(REWRITE_DONE, n );
   }
   return RewriteResponse(REWRITE_DONE, in);
 }
@@ -493,6 +497,7 @@ Node QuantifiersRewriter::computePrenex( Node body, std::vector< Node >& args, b
       }
       Node newBody = body[1];
       newBody = newBody.substitute( terms.begin(), terms.end(), subs.begin(), subs.end() );
+      Debug("quantifiers-substitute-debug") << "Did substitute have an effect" << (body[1] != newBody) << body[1] << " became " << newBody << endl;
       return newBody;
     }else{
       return body;