Bug fix for E-matching select terms, minor fix for bounded integers, bug fix to impro...
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Wed, 27 Nov 2013 01:02:21 +0000 (19:02 -0600)
committerAndrew Reynolds <andrew.j.reynolds@gmail.com>
Wed, 27 Nov 2013 01:02:32 +0000 (19:02 -0600)
src/theory/quantifiers/bounded_integers.cpp
src/theory/quantifiers/inst_match.cpp
src/theory/quantifiers/macros.cpp
src/theory/quantifiers/model_engine.cpp
src/theory/quantifiers/quantifiers_rewriter.cpp
src/theory/quantifiers/quantifiers_rewriter.h
src/theory/quantifiers_engine.cpp

index ab6b35e01586de764a922b957d3f85dad4576ebc..080550a166fd25a15a141f96778c4a6d58215783 100644 (file)
@@ -174,15 +174,15 @@ void BoundedIntegers::processLiteral( Node f, Node lit, bool pol,
               veq = NodeManager::currentNM()->mkNode( GEQ, n1, n2 );
             }
             Trace("bound-int-debug") << "Isolated for " << it->first << " : (" << n1 << " >= " << n2 << ")" << std::endl;
-            Node bv = n1.getKind()==BOUND_VARIABLE ? n1 : n2;
-            if( !isBound( f, bv ) ){
-              if( !hasNonBoundVar( f, n1.getKind()==BOUND_VARIABLE ? n2 : n1 ) ) {
-                Trace("bound-int-debug") << "The bound is relevant." << std::endl;
-                int loru = n1.getKind()==BOUND_VARIABLE ? 0 : 1;
-                d_bounds[loru][f][bv] = (n1.getKind()==BOUND_VARIABLE ? n2 : n1);
-                bound_lit_map[loru][bv] = lit;
-                bound_lit_pol_map[loru][bv] = pol;
-              }
+            Node t = n1==it->first ? n2 : n1;
+            if( !hasNonBoundVar( f, t ) ) {
+              Trace("bound-int-debug") << "The bound is relevant." << std::endl;
+              int loru = n1==it->first ? 0 : 1;
+              d_bounds[loru][f][it->first] = t;
+              bound_lit_map[loru][it->first] = lit;
+              bound_lit_pol_map[loru][it->first] = pol;
+            }else{
+              Trace("bound-int-debug") << "The term " << t << " has non-bound variable." << std::endl;
             }
           }
         }
index d55f72a88a8ef910213224ec47861629fcb51f8a..ebe58776504131b4ce5cf27265cf92b00ecb22f4 100644 (file)
@@ -36,7 +36,10 @@ InstMatch::InstMatch( InstMatch* m ) {
 
 bool InstMatch::setMatch( EqualityQuery* q, TNode v, TNode m, bool & set ){
   std::map< Node, Node >::iterator vn = d_map.find( v );
-  if( vn==d_map.end() || vn->second.isNull() ){
+  if( !m.isNull() && !m.getType().isSubtypeOf( v.getType() ) ){
+    set = false;
+    return false;
+  }else if( vn==d_map.end() || vn->second.isNull() ){
     set = true;
     this->set(v,m);
     Debug("matching-debug") << "Add partial " << v << "->" << m << std::endl;
index 8e1083b7b1041e55765081d4a021ff4ad5255a92..9cd12fbfb0af206450f512109bf9a7ee861a6ff0 100644 (file)
@@ -119,7 +119,7 @@ bool QuantifierMacros::containsBadOp( Node n, Node n_op ){
 }
 
 bool QuantifierMacros::isMacroLiteral( Node n, bool pol ){
-  return pol && n.getKind()==EQUAL;//( n.getKind()==EQUAL || n.getKind()==IFF );
+  return pol && ( n.getKind()==EQUAL || n.getKind()==IFF );
 }
 
 void QuantifierMacros::getMacroCandidates( Node n, std::vector< Node >& candidates ){
index 5ff21bcff13bbb7228d64d19b47342ee786b3e8f..99f5e8df64decf89334e7fd48321e8583cf11cb3 100644 (file)
@@ -125,7 +125,26 @@ void ModelEngine::check( Theory::Effort e ){
 }
 
 void ModelEngine::registerQuantifier( Node f ){
-
+  if( Trace.isOn("fmf-warn") ){
+    bool canHandle = true;
+    for( unsigned i=0; i<f[0].getNumChildren(); i++ ){
+      TypeNode tn = f[0][i].getType();
+      if( !tn.isSort() ){
+        if( !tn.getCardinality().isFinite() ){
+          if( tn.isInteger() ){
+            if( !options::fmfBoundInt() ){
+              canHandle = false;
+            }
+          }else{
+            canHandle = false;
+          }
+        }
+      }
+    }
+    if( !canHandle ){
+      Trace("fmf-warn") << "Warning : Model Engine : may not be able to answer SAT because of formula : " << f << std::endl;
+    }
+  }
 }
 
 void ModelEngine::assertNode( Node f ){
@@ -207,11 +226,9 @@ int ModelEngine::checkModel(){
     }
   }
   //print debug information
-  if( Trace.isOn("model-engine") ){
-    Trace("model-engine") << "Instantiate axioms : " << ( d_builder->d_considerAxioms ? "yes" : "no" ) << std::endl;
-    Trace("model-engine") << "Added Lemmas = " << d_addedLemmas << " / " << d_triedLemmas << " / ";
-    Trace("model-engine") << d_totalLemmas << std::endl;
-  }
+  Trace("model-engine-debug") << "Instantiate axioms : " << ( d_builder->d_considerAxioms ? "yes" : "no" ) << std::endl;
+  Trace("model-engine") << "Added Lemmas = " << d_addedLemmas << " / " << d_triedLemmas << " / ";
+  Trace("model-engine") << d_totalLemmas << std::endl;
   d_statistics.d_exh_inst_lemmas += d_addedLemmas;
   return d_addedLemmas;
 }
index e27897a969d164d237c8e5ace78e9345a51c3d10..ecc3c02bca1d3e864f2391fdea718d47d33b13fd 100644 (file)
@@ -117,16 +117,25 @@ bool QuantifiersRewriter::hasArg( std::vector< Node >& args, Node n ){
 }
 
 void QuantifiersRewriter::setNestedQuantifiers( Node n, Node q ){
-  if( n.getKind()==FORALL || n.getKind()==EXISTS ){
-    Trace("quantifiers-rewrite-debug") << "Set nested quant attribute " << n << std::endl;
-    NestedQuantAttribute nqai;
-    n.setAttribute(nqai,q);
-  }
-  for( int i=0; i<(int)n.getNumChildren(); i++ ){
-    setNestedQuantifiers( n[i], q );
+  std::vector< Node > processed;
+  setNestedQuantifiers2( n, q, processed );
+}
+
+void QuantifiersRewriter::setNestedQuantifiers2( Node n, Node q, std::vector< Node >& processed ) {
+  if( std::find( processed.begin(), processed.end(), n )==processed.end() ){
+    processed.push_back( n );
+    if( n.getKind()==FORALL || n.getKind()==EXISTS ){
+      Trace("quantifiers-rewrite-debug") << "Set nested quant attribute " << n << std::endl;
+      NestedQuantAttribute nqai;
+      n.setAttribute(nqai,q);
+    }
+    for( int i=0; i<(int)n.getNumChildren(); i++ ){
+      setNestedQuantifiers2( n[i], q, processed );
+    }
   }
 }
 
+
 RewriteResponse QuantifiersRewriter::preRewrite(TNode in) {
   Trace("quantifiers-rewrite-debug") << "pre-rewriting " << in << " " << in.hasAttribute(NestedQuantAttribute()) << std::endl;
   if( in.getKind()==kind::EXISTS || in.getKind()==kind::FORALL ){
index be3e333f3a2a5e300b415d0cddf5cb5adfc0ad82..40234904f7f7888a7ee62bb3d6665abbe0959320 100644 (file)
@@ -41,6 +41,7 @@ private:
   static void computeArgs( std::vector< Node >& args, std::vector< Node >& activeArgs, Node n );
   static bool hasArg( std::vector< Node >& args, Node n );
   static void setNestedQuantifiers( Node n, Node q );
+  static void setNestedQuantifiers2( Node n, Node q, std::vector< Node >& processed );
   static Node computeClause( Node n );
 private:
   static Node computeMiniscoping( std::vector< Node >& args, Node body, Node ipl, bool isNested = false );
index 54aa7f726174477693f3c682762dfdfa5ea6e0ef..e9a69bd309dcf1dc80b350c683fda2343eb36bbe 100755 (executable)
@@ -190,6 +190,7 @@ void QuantifiersEngine::check( Theory::Effort e ){
 
 void QuantifiersEngine::registerQuantifier( Node f ){
   if( std::find( d_quants.begin(), d_quants.end(), f )==d_quants.end() ){
+    Trace("quant") << "Register quantifier : " << f << std::endl;
     d_quants.push_back( f );
 
     ++(d_statistics.d_num_quant);