Change default option to --inst-when=full-last-call (interleave instantiation and...
authorajreynol <andrew.j.reynolds@gmail.com>
Fri, 21 Nov 2014 08:42:07 +0000 (09:42 +0100)
committerajreynol <andrew.j.reynolds@gmail.com>
Fri, 21 Nov 2014 08:42:07 +0000 (09:42 +0100)
src/smt/smt_engine.cpp
src/theory/quantifiers/options
src/theory/quantifiers/options_handlers.h
src/theory/quantifiers/quantifiers_rewriter.cpp
test/regress/regress0/quantifiers/burns4.smt2

index 86b0faaf676546d1f0c17f60f1341fac0e2267e0..74cdee0b793c76a25fdbdc20bd88fc485aa3764d 100644 (file)
@@ -1319,7 +1319,6 @@ void SmtEngine::setDefaults() {
     if( !options::quantConflictFind.wasSetByUser() ){
       options::quantConflictFind.set( false );
     }
-    //for finite model finding
     if( ! options::instWhenMode.wasSetByUser()){
       //instantiate only on last call
       if( options::eMatching() ){
@@ -1327,6 +1326,14 @@ void SmtEngine::setDefaults() {
         options::instWhenMode.set( quantifiers::INST_WHEN_LAST_CALL );
       }
     }
+    if( options::mbqiMode()==quantifiers::MBQI_ABS ){
+      if( !options::preSkolemQuant.wasSetByUser() ){
+        options::preSkolemQuant.set( true );
+      }
+      if( !options::fmfOneInstPerRound.wasSetByUser() ){
+        options::fmfOneInstPerRound.set( true );
+      }
+    }
   }
   
   //implied options...
index dad173ff588a2ac0dd51ed459222dc48992f9af9..a428633cceef3a607ceddbd52ad9106cf89e83fb 100644 (file)
@@ -41,7 +41,7 @@ option simpleIteLiftQuant /--disable-ite-lift-quant bool :default true
 option cnfQuant --cnf-quant bool :default false
  apply CNF conversion to quantified formulas
 # Whether to NNF quantifier bodies
-option nnfQuant --nnf-quant bool :default false
+option nnfQuant --nnf-quant bool :default true
  apply NNF conversion to quantified formulas
 
 option clauseSplit --clause-split bool :default false
@@ -88,7 +88,7 @@ option fmfFunWellDefined --fmf-fun bool :default false
 option registerQuantBodyTerms --register-quant-body-terms bool :default false
  consider ground terms within bodies of quantified formulas for matching
 
-option instWhenMode --inst-when=MODE CVC4::theory::quantifiers::InstWhenMode :default CVC4::theory::quantifiers::INST_WHEN_FULL :read-write :include "theory/quantifiers/modes.h" :handler CVC4::theory::quantifiers::stringToInstWhenMode :handler-include "theory/quantifiers/options_handlers.h" :predicate CVC4::theory::quantifiers::checkInstWhenMode :predicate-include "theory/quantifiers/options_handlers.h"
+option instWhenMode --inst-when=MODE CVC4::theory::quantifiers::InstWhenMode :default CVC4::theory::quantifiers::INST_WHEN_FULL_LAST_CALL :read-write :include "theory/quantifiers/modes.h" :handler CVC4::theory::quantifiers::stringToInstWhenMode :handler-include "theory/quantifiers/options_handlers.h" :predicate CVC4::theory::quantifiers::checkInstWhenMode :predicate-include "theory/quantifiers/options_handlers.h"
  when to apply instantiation
 option instMaxLevel --inst-max-level=N int :read-write :default -1
  maximum inst level of terms used to instantiate quantified formulas with (-1 == no limit, default)
@@ -127,7 +127,7 @@ option finiteModelFind finite-model-find --finite-model-find bool :default false
 
 option mbqiMode --mbqi=MODE CVC4::theory::quantifiers::MbqiMode :read-write :default CVC4::theory::quantifiers::MBQI_FMC :include "theory/quantifiers/modes.h" :handler CVC4::theory::quantifiers::stringToMbqiMode :handler-include "theory/quantifiers/options_handlers.h" :predicate CVC4::theory::quantifiers::checkMbqiMode :predicate-include "theory/quantifiers/options_handlers.h"
  choose mode for model-based quantifier instantiation
-option fmfOneInstPerRound --mbqi-one-inst-per-round bool :default false
+option fmfOneInstPerRound --mbqi-one-inst-per-round bool :read-write :default false
  only add one instantiation per quantifier per round for mbqi
 option fmfOneQuantPerRound --mbqi-one-quant-per-round bool :default false
  only add instantiations for one quantifier per round for mbqi
index 08fcf319df0ca2e2663c81a32da13d538cb09458..e9f85d454b048c43ba71ab8cab819fa345dce707 100644 (file)
@@ -29,17 +29,17 @@ namespace quantifiers {
 static const std::string instWhenHelp = "\
 Modes currently supported by the --inst-when option:\n\
 \n\
-full (default)\n\
+full-last-call (default)\n\
++ Alternate running instantiation rounds at full effort and last\n\
+  call.  In other words, interleave instantiation and theory combination.\n\
+\n\
+full\n\
 + Run instantiation round at full effort, before theory combination.\n\
 \n\
 full-delay \n\
 + Run instantiation round at full effort, before theory combination, after\n\
   all other theories have finished.\n\
 \n\
-full-last-call\n\
-+ Alternate running instantiation rounds at full effort and last\n\
-  call.  In other words, interleave instantiation and theory combination.\n\
-\n\
 last-call\n\
 + Run instantiation at last call effort, after theory combination and\n\
   and theories report sat.\n\
index 0ed175393afdbbb27060af3f5a78866f90ac8350..1e6ec3a02c4d9b4c13532f4c78704a04e8cd3fa2 100644 (file)
@@ -309,11 +309,19 @@ Node QuantifiersRewriter::computeNNF( Node body ){
     }else{
       std::vector< Node > children;
       Kind k = body[0].getKind();
+      
       if( body[0].getKind()==OR || body[0].getKind()==AND ){
+        k = body[0].getKind()==AND ? OR : AND;
         for( int i=0; i<(int)body[0].getNumChildren(); i++ ){
-          children.push_back( computeNNF( body[0][i].notNode() ) );
+          Node nc = computeNNF( body[0][i].notNode() );
+          if( nc.getKind()==k ){
+            for( unsigned j=0; j<nc.getNumChildren(); j++ ){
+              children.push_back( nc[j] );
+            }
+          }else{
+            children.push_back( nc );
+          }
         }
-        k = body[0].getKind()==AND ? OR : AND;
       }else if( body[0].getKind()==IFF ){
         for( int i=0; i<2; i++ ){
           Node nn = i==0 ? body[0][i] : body[0][i].notNode();
@@ -335,10 +343,18 @@ Node QuantifiersRewriter::computeNNF( Node body ){
   }else{
     std::vector< Node > children;
     bool childrenChanged = false;
+    bool isAssoc = body.getKind()==AND || body.getKind()==OR;
     for( int i=0; i<(int)body.getNumChildren(); i++ ){
       Node nc = computeNNF( body[i] );
-      children.push_back( nc );
-      childrenChanged = childrenChanged || nc!=body[i];
+      if( isAssoc && nc.getKind()==body.getKind() ){
+        for( unsigned j=0; j<nc.getNumChildren(); j++ ){
+          children.push_back( nc[j] );
+        }
+        childrenChanged = true;
+      }else{
+        children.push_back( nc );
+        childrenChanged = childrenChanged || nc!=body[i];
+      }
     }
     if( childrenChanged ){
       return NodeManager::currentNM()->mkNode( body.getKind(), children );
index 886d6f5c8bf825cc228ab8e104a1fc8192ff9a9e..72023fd4ff227b17d73bc2719cc6d185f5f881f9 100644 (file)
@@ -1,3 +1,5 @@
+; COMMAND-LINE: --full-saturate-quant
+; EXPECT: unsat
 (set-logic AUFLIA)
 (set-info :source | Burns mutual exclusion protocol. This is a benchmark of the haRVey theorem prover. It was translated to SMT-LIB by Leonardo  de Moura |)
 (set-info :smt-lib-version 2.0)