Preparation for models for co-inductive datatypes. Minor cleanup.
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Mon, 28 Apr 2014 17:28:16 +0000 (12:28 -0500)
committerAndrew Reynolds <andrew.j.reynolds@gmail.com>
Mon, 28 Apr 2014 17:33:56 +0000 (12:33 -0500)
src/theory/datatypes/theory_datatypes.cpp
src/theory/datatypes/theory_datatypes.h
src/theory/quantifiers/inst_match_generator.cpp
src/theory/quantifiers/rewrite_engine.cpp
src/theory/quantifiers_engine.cpp
src/theory/quantifiers_engine.h

index 9316c3fe87e8a63a27657f6e1c19c1104f89ba3c..2715f8e759e5e9eb805c35266da7cd6d93f92b8e 100644 (file)
@@ -675,10 +675,10 @@ void TheoryDatatypes::merge( Node t1, Node t2 ){
                 d_infer.push_back( eq );
                 d_infer_exp.push_back( unifEq );
               }
-            }    
+            }
 /*
             std::vector< Node > rew;
-            if( DatatypesRewriter::checkClash( cons1, cons2, rew ) ){  
+            if( DatatypesRewriter::checkClash( cons1, cons2, rew ) ){
               Assert(false);
             }else{
               for( unsigned i=0; i<rew.size(); i++ ){
@@ -1072,7 +1072,7 @@ void TheoryDatatypes::computeCareGraph(){
                 }
               }
             }
-          } 
+          }
           if (!somePairIsDisequal) {
             for (unsigned c = 0; c < currentPairs.size(); ++ c) {
               Trace("dt-cg-pair") << "Pair : " << currentPairs[c].first << " " << currentPairs[c].second << std::endl;
@@ -1133,6 +1133,7 @@ void TheoryDatatypes::collectModelInfo( TheoryModel* m, bool fullModel ){
   eq::EqClassesIterator eqccs_i = eq::EqClassesIterator( &d_equalityEngine );
   std::vector< Node > cons;
   std::vector< Node > nodes;
+  std::map< Node, Node > eqc_cons;
   while( !eqccs_i.isFinished() ){
     Node eqc = (*eqccs_i);
     //for all equivalence classes that are datatypes
@@ -1140,51 +1141,55 @@ void TheoryDatatypes::collectModelInfo( TheoryModel* m, bool fullModel ){
       EqcInfo* ei = getOrMakeEqcInfo( eqc );
       if( !ei->d_constructor.get().isNull() ){
         cons.push_back( ei->d_constructor.get() );
+        eqc_cons[ eqc ] = ei->d_constructor.get();
       }else{
         nodes.push_back( eqc );
       }
     }
     ++eqccs_i;
   }
+
   unsigned orig_size = nodes.size();
   unsigned index = 0;
   while( index<nodes.size() ){
     Node eqc = nodes[index];
     Node neqc;
+    const Datatype& dt = ((DatatypeType)(eqc.getType()).toType()).getDatatype();
     if( !d_equalityEngine.hasTerm( eqc ) ){
-      Trace("dt-cmi") << "NOTICE : Datatypes: need to assign constructor for " << eqc << std::endl;
-      Trace("dt-cmi") << "   Type : " << eqc.getType() << std::endl;
-      //can assign arbitrary term
-      TypeEnumerator te(eqc.getType());
-      bool success;
-      do{
-        success = true;
-        Assert( !te.isFinished() );
-        neqc = *te;
-        Trace("dt-cmi-debug") << "Try " << neqc << " ... " << std::endl;
-        ++te;
-        //if it is infinite or we are assigning to terms known by datatypes, make sure it is fresh
-        if( eqc.getType().getCardinality().isInfinite() || index<orig_size ){
-          for( unsigned i=0; i<cons.size(); i++ ){
-            //check if it is modulo equality the same
-            if( cons[i].getOperator()==neqc.getOperator() ){
-              bool diff = false;
-              for( unsigned j=0; j<cons[i].getNumChildren(); j++ ){
-                if( !m->areEqual( cons[i][j], neqc[j] ) ){
-                  diff = true;
+      if( !dt.isCodatatype() ){
+        Trace("dt-cmi") << "NOTICE : Datatypes: need to assign constructor for " << eqc << std::endl;
+        Trace("dt-cmi") << "   Type : " << eqc.getType() << std::endl;
+        //can assign arbitrary term
+        TypeEnumerator te(eqc.getType());
+        bool success;
+        do{
+          success = true;
+          Assert( !te.isFinished() );
+          neqc = *te;
+          Trace("dt-cmi-debug") << "Try " << neqc << " ... " << std::endl;
+          ++te;
+          //if it is infinite or we are assigning to terms known by datatypes, make sure it is fresh
+          if( eqc.getType().getCardinality().isInfinite() || index<orig_size ){
+            for( unsigned i=0; i<cons.size(); i++ ){
+              //check if it is modulo equality the same
+              if( cons[i].getOperator()==neqc.getOperator() ){
+                bool diff = false;
+                for( unsigned j=0; j<cons[i].getNumChildren(); j++ ){
+                  if( !m->areEqual( cons[i][j], neqc[j] ) ){
+                    diff = true;
+                    break;
+                  }
+                }
+                if( !diff ){
+                  Trace("dt-cmi-debug") << "...Already equivalent modulo equality to " << cons[i] << std::endl;
+                  success = false;
                   break;
                 }
               }
-              if( !diff ){
-                Trace("dt-cmi-debug") << "...Already equivalent modulo equality to " << cons[i] << std::endl;
-                success = false;
-                break;
-              }
             }
           }
-        }
-      }while( !success );
+        }while( !success );
+      }
     }else{
       Trace("dt-cmi") << "NOTICE : Datatypes: no constructor in equivalence class " << eqc << std::endl;
       Trace("dt-cmi") << "   Type : " << eqc.getType() << std::endl;
@@ -1212,8 +1217,6 @@ void TheoryDatatypes::collectModelInfo( TheoryModel* m, bool fullModel ){
       }
       Trace("dt-cmi") << std::endl;
       */
-
-      const Datatype& dt = ((DatatypeType)(eqc.getType()).toType()).getDatatype();
       for( unsigned r=0; r<2; r++ ){
         if( neqc.isNull() ){
           for( unsigned i=0; i<pcons.size(); i++ ){
@@ -1232,9 +1235,11 @@ void TheoryDatatypes::collectModelInfo( TheoryModel* m, bool fullModel ){
         }
       }
     }
-    Assert( !neqc.isNull() );
-    Trace("dt-cmi") << "Assign : " << neqc << std::endl;
-    m->assertEquality( eqc, neqc, true );
+    if( !neqc.isNull() ){
+      Trace("dt-cmi") << "Assign : " << neqc << std::endl;
+      m->assertEquality( eqc, neqc, true );
+      eqc_cons[ eqc ] = neqc;
+    }
     /*
     for( unsigned kk=0; kk<all_eqc.size(); kk++ ){
       for( unsigned ll=(kk+1); ll<all_eqc.size(); ll++ ){
@@ -1258,9 +1263,44 @@ void TheoryDatatypes::collectModelInfo( TheoryModel* m, bool fullModel ){
     ++index;
   }
 
+  //assign MU for each codatatype eqc
+  std::map< Node, Node > eqc_mu;
+  for( std::map< Node, Node >::iterator it = eqc_cons.begin(); it != eqc_cons.end(); ++it ){
+    Node eqc = it->first;
+    const Datatype& dt = ((DatatypeType)(eqc.getType()).toType()).getDatatype();
+    if( dt.isCodatatype() ){
+      std::map< Node, Node > vmap;
+      Node v = getCodatatypesValue( it->first, eqc_cons, eqc_mu, vmap );
+      Trace("dt-cmi-cod") << "  EQC(" << it->first << "), constructor is " << it->second << ", value is " << v << std::endl;
+    }
+  }
 }
 
 
+Node TheoryDatatypes::getCodatatypesValue( Node n, std::map< Node, Node >& eqc_cons, std::map< Node, Node >& eqc_mu, std::map< Node, Node >& vmap ){
+  std::map< Node, Node >::iterator itv = vmap.find( n );
+  if( itv!=vmap.end() ){
+    return itv->second;
+  }else if( DatatypesRewriter::isTermDatatype( n ) ){
+    Node nv = NodeManager::currentNM()->mkBoundVar( n.getType() );
+    vmap[n] = nv;
+    Trace("dt-cmi-cod-debug") << "    map " << n << " -> " << nv << std::endl;
+    Node nc = eqc_cons[n];
+    Assert( nc.getKind()==APPLY_CONSTRUCTOR );
+    std::vector< Node > children;
+    children.push_back( nc.getOperator() );
+    for( unsigned i=0; i<nc.getNumChildren(); i++ ){
+      Node r = getRepresentative( nc[i] );
+      Node rv = getCodatatypesValue( r, eqc_cons, eqc_mu, vmap );
+      children.push_back( rv );
+    }
+    vmap.erase( n );
+    return NodeManager::currentNM()->mkNode( APPLY_CONSTRUCTOR, children );
+  }else{
+    return n;
+  }
+}
+
 void TheoryDatatypes::collectTerms( Node n ) {
   if( d_collectTermsCache.find( n )==d_collectTermsCache.end() ){
     d_collectTermsCache[n] = true;
@@ -1802,7 +1842,7 @@ bool TheoryDatatypes::checkClashModEq( Node n1, Node n2, std::vector< Node >& ex
     }
   }else if( n1!=n2 ){
     if( n1.isConst() && n2.isConst() ){
-      return true;        
+      return true;
     }else{
       Node eq = NodeManager::currentNM()->mkNode( n1.getType().isBoolean() ? kind::IFF : kind::EQUAL, n1, n2 );
       if( d_equalityEngine.areDisequal( n1, n2, true ) ){
index 1c21c63b411a36ace931690dfbe4d6f2b8c8006c..fe87d4439286f418a262c8bb47773d5eb0edcc58 100644 (file)
@@ -253,6 +253,8 @@ private:
                           std::vector< TNode >& exp,
                           std::map< Node, Node >& cn,
                           std::map< Node, std::map< Node, int > >& dni, int dniLvl, bool mkExp );
+  /** build model */
+  Node getCodatatypesValue( Node n, std::map< Node, Node >& eqc_cons, std::map< Node, Node >& eqc_mu, std::map< Node, Node >& vmap );
   /** collect terms */
   void collectTerms( Node n );
   /** get instantiate cons */
index 13186c7cc73188cb48634b35c88768f800229910..da0a3c4f67039d9fbffe635908d33b9a6589d873 100644 (file)
@@ -155,9 +155,7 @@ bool InstMatchGenerator::getMatch( Node f, Node t, InstMatch& m, QuantifiersEngi
   Trace("matching") << "Matching " << t << " against pattern " << d_match_pattern << " ("
                     << m << ")" << ", " << d_children.size() << ", pattern is " << d_pattern << std::endl;
   Assert( !d_match_pattern.isNull() );
-  if( qe->d_optMatchIgnoreModelBasis && t.getAttribute(ModelBasisAttribute()) ){
-    return true;
-  }else if( d_matchPolicy==MATCH_GEN_INTERNAL_ERROR ){
+  if( d_matchPolicy==MATCH_GEN_INTERNAL_ERROR ){
     return false;
   }else{
     EqualityQuery* q = qe->getEqualityQuery();
@@ -324,9 +322,6 @@ int InstMatchGenerator::addInstantiations( Node f, InstMatch& baseMatch, Quantif
       m.add( baseMatch );
       if( qe->addInstantiation( f, m ) ){
         addedLemmas++;
-        if( qe->d_optInstLimitActive && qe->d_optInstLimit<=0 ){
-          return addedLemmas;
-        }
       }
     }else{
       addedLemmas++;
index 59ba40ca7328306320b3e0dc0e0c13137d8f6668..75f54d7d9baa9899f3938e42731c76a30e94c323 100644 (file)
@@ -39,6 +39,7 @@ struct PrioritySort {
 
 RewriteEngine::RewriteEngine( context::Context* c, QuantifiersEngine* qe ) : QuantifiersModule(qe) {
   d_true = NodeManager::currentNM()->mkConst( true );
+  d_needsSort = true;
 }
 
 double RewriteEngine::getPriority( Node f ) {
index 1837a34f45f8f32707d6bebe41c4c444685263a9..be011cdb6b340f1090e096aea1d0b51e2381942b 100644 (file)
@@ -109,12 +109,6 @@ d_lemmas_produced_c(u){
   }
 
   //options
-  d_optInstCheckDuplicate = true;
-  d_optInstMakeRepresentative = true;
-  d_optInstAddSplits = false;
-  d_optMatchIgnoreModelBasis = false;
-  d_optInstLimitActive = false;
-  d_optInstLimit = 0;
   d_total_inst_count_debug = 0;
 }
 
index e7843ab950d54507d97d7ac44db0a3156a1ded8c..eb9803592e34c419f8f424d98e1902d67b7d6211 100644 (file)
@@ -254,14 +254,6 @@ public:
     ~Statistics();
   };/* class QuantifiersEngine::Statistics */
   Statistics d_statistics;
-public:
-  /** options */
-  bool d_optInstCheckDuplicate;
-  bool d_optInstMakeRepresentative;
-  bool d_optInstAddSplits;
-  bool d_optMatchIgnoreModelBasis;
-  bool d_optInstLimitActive;
-  int d_optInstLimit;
 };/* class QuantifiersEngine */