Make QCF more incremental. Fix bug in QCF handling of ITE formulas, add support...
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Fri, 14 Feb 2014 21:44:21 +0000 (15:44 -0600)
committerAndrew Reynolds <andrew.j.reynolds@gmail.com>
Fri, 14 Feb 2014 21:44:36 +0000 (15:44 -0600)
src/Makefile.am
src/theory/quantifiers/inst_strategy_e_matching.cpp
src/theory/quantifiers/instantiation_engine.cpp
src/theory/quantifiers/modes.h
src/theory/quantifiers/options_handlers.h
src/theory/quantifiers/quant_conflict_find.cpp
src/theory/quantifiers/quant_conflict_find.h
src/theory/quantifiers/trigger.h

index e5e1b93467835e53371b0357c66149cec74ea555..f20fabf6bdb6781bd2010c014753fb4c2639c33b 100644 (file)
@@ -20,7 +20,7 @@ AM_CPPFLAGS = \
 AM_CXXFLAGS = -Wall -Wno-unknown-pragmas -Wno-parentheses $(FLAG_VISIBILITY_HIDDEN)
 
 SUBDIRS = lib options expr util prop/minisat prop/bvminisat . parser compat bindings main
-THEORIES = builtin booleans uf arith bv arrays datatypes quantifiers rewriterules idl strings
+THEORIES = builtin booleans uf arith bv arrays datatypes strings quantifiers rewriterules idl
 
 lib_LTLIBRARIES = libcvc4.la
 
index 5e2353e8a3e1e74acbde5da6fd62c8583550a8ad..63cb22f70a9883c3e2cb9fb94986fdeb07549014 100644 (file)
@@ -168,7 +168,9 @@ int InstStrategyAutoGenTriggers::process( Node f, Theory::Effort effort, int e )
           if( processTrigger && d_processed_trigger[f].find( tr )==d_processed_trigger[f].end() ){
             d_processed_trigger[f][tr] = true;
             //if( tr->isMultiTrigger() )
-              Trace("process-trigger") << "  Process " << (*tr) << "..." << std::endl;
+              Trace("process-trigger") << "  Process ";
+              tr->debugPrint("process-trigger");
+              Trace("process-trigger") << "..." << std::endl;
             InstMatch baseMatch( f );
             int numInst = tr->addInstantiations( baseMatch );
             //if( tr->isMultiTrigger() )
index 41198c1f48f19b89f9708d871f4714c3ef9d5d9a..199d3233c38eee95ec00b3730cba035f30c0a89d 100644 (file)
@@ -173,6 +173,8 @@ bool InstantiationEngine::needsCheck( Theory::Effort e ){
   d_performCheck = false;
   if( options::instWhenMode()==INST_WHEN_FULL ){
     d_performCheck = ( e >= Theory::EFFORT_FULL );
+  }else if( options::instWhenMode()==INST_WHEN_FULL_DELAY ){
+    d_performCheck = ( e >= Theory::EFFORT_FULL ) && !d_quantEngine->getTheoryEngine()->needCheck();
   }else if( options::instWhenMode()==INST_WHEN_FULL_LAST_CALL ){
     d_performCheck = ( ( e==Theory::EFFORT_FULL  && d_ierCounter%2==0 ) || e==Theory::EFFORT_LAST_CALL );
   }else if( options::instWhenMode()==INST_WHEN_LAST_CALL ){
index 75b9eba3e4ff55419145cb6e0a85f66e64386bab..38c9211a3a53d33f6c27f17efaf9d95e765c66c9 100644 (file)
@@ -31,6 +31,8 @@ typedef enum {
   INST_WHEN_PRE_FULL,
   /** Apply instantiation round at full effort or above  */
   INST_WHEN_FULL,
+  /** Apply instantiation round at full effort, after all other theories finish, or above  */
+  INST_WHEN_FULL_DELAY,
   /** Apply instantiation round at full effort half the time, and last call always */
   INST_WHEN_FULL_LAST_CALL,
   /** Apply instantiation round at last call only */
index 15d52cc9655bd7e3589b7aef7918f04be0267e26..eb2c05858b7158b63adf5ef793399ff3724cdfab 100644 (file)
@@ -32,6 +32,10 @@ Modes currently supported by the --inst-when option:\n\
 full (default)\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\
@@ -147,6 +151,8 @@ inline InstWhenMode stringToInstWhenMode(std::string option, std::string optarg,
     return INST_WHEN_PRE_FULL;
   } else if(optarg == "full") {
     return INST_WHEN_FULL;
+  } else if(optarg == "full-delay") {
+    return INST_WHEN_FULL_DELAY;
   } else if(optarg == "full-last-call") {
     return INST_WHEN_FULL_LAST_CALL;
   } else if(optarg == "last-call") {
index 08bd0f1794d4ad684c6dff5d717b15638b72d53b..3120035195291a38bedc0e7afd9a40e32ce81269 100755 (executable)
@@ -95,6 +95,9 @@ void QuantInfo::initialize( Node q, Node qn ) {
         if( !d_var_mg[j]->isValid() ){\r
           d_mg->setInvalid();\r
           break;\r
+        }else{\r
+          std::vector< int > bvars;\r
+          d_var_mg[j]->determineVariableOrder( this, bvars );\r
         }\r
       }\r
     }\r
@@ -120,10 +123,11 @@ void QuantInfo::initialize( Node q, Node qn ) {
 }\r
 \r
 void QuantInfo::registerNode( Node n, bool hasPol, bool pol ) {\r
+  Trace("qcf-qregister-debug2") << "Register : " << n << std::endl;\r
   if( n.getKind()==FORALL ){\r
     registerNode( n[1], hasPol, pol );\r
   }else{\r
-    if( n.getKind()!=OR && n.getKind()!=AND && n.getKind()!=IFF && n.getKind()!=ITE && n.getKind()!=NOT ){\r
+    if( n.getKind()!=OR && n.getKind()!=AND && n.getKind()!=IFF && n.getKind()!=NOT ){\r
       if( quantifiers::TermDb::hasBoundVarAttr( n ) ){\r
         //literals\r
         if( n.getKind()==EQUAL ){\r
@@ -132,6 +136,10 @@ void QuantInfo::registerNode( Node n, bool hasPol, bool pol ) {
           }\r
         }else if( MatchGen::isHandledUfTerm( n ) ){\r
           flatten( n );\r
+        }else if( n.getKind()==ITE && !n[1].getType().isBoolean() ){\r
+          for( unsigned i=1; i<=2; i++ ){\r
+            flatten( n[i] );\r
+          }\r
         }\r
       }\r
     }\r
@@ -151,17 +159,26 @@ void QuantInfo::registerNode( Node n, bool hasPol, bool pol ) {
 }\r
 \r
 void QuantInfo::flatten( Node n ) {\r
+  Trace("qcf-qregister-debug2") << "Flatten : " << n << std::endl;\r
   if( quantifiers::TermDb::hasBoundVarAttr( n ) ){\r
     if( d_var_num.find( n )==d_var_num.end() ){\r
-      //Trace("qcf-qregister") << "    Flatten term " << n[i] << std::endl;\r
+      Trace("qcf-qregister-debug2") << "Add FLATTEN VAR : " << n << std::endl;\r
       d_var_num[n] = d_vars.size();\r
       d_vars.push_back( n );\r
       d_match.push_back( TNode::null() );\r
       d_match_term.push_back( TNode::null() );\r
-      for( unsigned i=0; i<n.getNumChildren(); i++ ){\r
-        flatten( n[i] );\r
+      if( n.getKind()==ITE ){\r
+        registerNode( n, false, false );\r
+      }else{\r
+        for( unsigned i=0; i<n.getNumChildren(); i++ ){\r
+          flatten( n[i] );\r
+        }\r
       }\r
+    }else{\r
+      Trace("qcf-qregister-debug2") << "...already processed" << std::endl;\r
     }\r
+  }else{\r
+    Trace("qcf-qregister-debug2") << "...is ground." << std::endl;\r
   }\r
 }\r
 \r
@@ -599,6 +616,25 @@ MatchGen::MatchGen( QuantInfo * qi, Node n, bool isVar ){
         }\r
         d_qni_size++;\r
       }\r
+    }else if( n.getKind()==ITE ){\r
+      d_type = typ_ite_var;\r
+      d_type_not = false;\r
+      d_n = n;\r
+      d_children.push_back( MatchGen( qi, d_n[0] ) );\r
+      if( d_children[0].isValid() ){\r
+        d_type = typ_ite_var;\r
+        for( unsigned i=1; i<=2; i++ ){\r
+          Node nn = n.eqNode( n[i] );\r
+          d_children.push_back( MatchGen( qi, nn ) );\r
+          d_children[d_children.size()-1].d_qni_bound_except.push_back( 0 );\r
+          if( !d_children[d_children.size()-1].isValid() ){\r
+            setInvalid();\r
+            break;\r
+          }\r
+        }\r
+      }else{\r
+        d_type = typ_invalid;\r
+      }\r
     }else{\r
       //for now, unknown term\r
       d_type = typ_invalid;\r
@@ -618,7 +654,7 @@ MatchGen::MatchGen( QuantInfo * qi, Node n, bool isVar ){
         for( unsigned i=0; i<d_n.getNumChildren(); i++ ){\r
           if( d_n.getKind()!=FORALL || i==1 ){\r
             d_children.push_back( MatchGen( qi, d_n[i] ) );\r
-            if( d_children[d_children.size()-1].d_type==typ_invalid ){\r
+            if( !d_children[d_children.size()-1].isValid() ){\r
               setInvalid();\r
               break;\r
             }\r
@@ -650,6 +686,9 @@ MatchGen::MatchGen( QuantInfo * qi, Node n, bool isVar ){
         if( d_n.getKind()==EQUAL ){\r
           for( unsigned i=0; i<2; i++ ){\r
             if( quantifiers::TermDb::hasBoundVarAttr( d_n[i] ) ){\r
+              if( !qi->isVar( d_n[i] ) ){\r
+                Trace("qcf-qregister-debug")  << "ERROR : not var " << d_n[i] << std::endl;\r
+              }\r
               Assert( qi->isVar( d_n[i] ) );\r
             }else{\r
               d_qni_gterm[i] = d_n[i];\r
@@ -727,9 +766,7 @@ void MatchGen::determineVariableOrder( QuantInfo * qi, std::vector< int >& bvars
     }\r
   }\r
   if( isCom ){\r
-    //first, do those that do not bind any new variables\r
-    //second, do those with common variables\r
-    //last, do those with no common variables\r
+    //children that bind the least number of unbound variables go first\r
     do {\r
       int min_score = -1;\r
       int min_score_index = -1;\r
@@ -881,7 +918,7 @@ void MatchGen::reset( QuantConflictFind * p, bool tgt, QuantInfo * qi ) {
       //if successful and non-redundant, store that we need to cleanup this\r
       if( addc==1 ){\r
         for( unsigned i=0; i<2; i++ ){\r
-          if( vn[i]!=-1 ){\r
+          if( vn[i]!=-1 && std::find( d_qni_bound_except.begin(), d_qni_bound_except.end(), i )==d_qni_bound_except.end() ){\r
             d_qni_bound[vn[i]] = vn[i];\r
           }\r
         }\r
@@ -1032,7 +1069,7 @@ bool MatchGen::getNextMatch( QuantConflictFind * p, QuantInfo * qi ) {
     }\r
     Debug("qcf-match") << "    ...finished matching for " << d_n << ", success = " << success << std::endl;\r
     return success;\r
-  }else if( d_type==typ_formula ){\r
+  }else if( d_type==typ_formula || d_type==typ_ite_var ){\r
     if( d_child_counter!=-1 ){\r
       bool success = false;\r
       while( !success && d_child_counter>=0 ){\r
@@ -1096,7 +1133,7 @@ bool MatchGen::getNextMatch( QuantConflictFind * p, QuantInfo * qi ) {
             int index1 = d_child_counter==4 ? 1 : 0;\r
             if( getChild( index1 )->getNextMatch( p, qi ) ){\r
               d_child_counter++;\r
-              getChild( d_child_counter==5 ? 2 : (d_tgt==(d_child_counter==0) ? 1 : 2) )->reset( p, d_tgt, qi );\r
+              getChild( d_child_counter==5 ? 2 : (d_tgt==(d_child_counter==1) ? 1 : 2) )->reset( p, d_tgt, qi );\r
             }else{\r
               if( d_child_counter==4 ){\r
                 d_child_counter = -1;\r
@@ -1107,7 +1144,7 @@ bool MatchGen::getNextMatch( QuantConflictFind * p, QuantInfo * qi ) {
             }\r
           }\r
           if( d_child_counter%2==1 ){\r
-            int index2 = d_child_counter==5 ? 2 : (d_tgt==(d_child_counter==0) ? 1 : 2);\r
+            int index2 = d_child_counter==5 ? 2 : (d_tgt==(d_child_counter==1) ? 1 : 2);\r
             if( getChild( index2 )->getNextMatch( p, qi ) ){\r
               success = true;\r
             }else{\r
@@ -1261,6 +1298,7 @@ void MatchGen::debugPrintType( const char * c, short typ, bool isTrace ) {
     case typ_pred: Trace(c) << "pred";break;\r
     case typ_formula: Trace(c) << "formula";break;\r
     case typ_var: Trace(c) << "var";break;\r
+    case typ_ite_var: Trace(c) << "ite_var";break;\r
     case typ_top: Trace(c) << "top";break;\r
     }\r
   }else{\r
@@ -1271,6 +1309,7 @@ void MatchGen::debugPrintType( const char * c, short typ, bool isTrace ) {
     case typ_pred: Debug(c) << "pred";break;\r
     case typ_formula: Debug(c) << "formula";break;\r
     case typ_var: Debug(c) << "var";break;\r
+    case typ_ite_var: Debug(c) << "ite_var";break;\r
     case typ_top: Debug(c) << "top";break;\r
     }\r
   }\r
@@ -1419,10 +1458,6 @@ int QuantConflictFind::evaluate( Node n, bool pref, bool hasPref ) {
   return ret;\r
 }\r
 \r
-bool QuantConflictFind::isPropagationSet() {\r
-  return !d_prop_eq[0].isNull();\r
-}\r
-\r
 bool QuantConflictFind::areMatchEqual( TNode n1, TNode n2 ) {\r
   //if( d_effort==QuantConflictFind::effort_mc ){\r
   //  return n1==n2 || !areDisequal( n1, n2 );\r
@@ -1473,6 +1508,7 @@ Node QuantConflictFind::evaluateTerm( Node n ) {
   if( MatchGen::isHandledUfTerm( n ) ){\r
     Node f = MatchGen::getOperator( this, n );\r
     Node nn;\r
+    computeUfTerms( f );\r
     if( getEqualityEngine()->hasTerm( n ) ){\r
       computeArgReps( n );\r
       nn = d_uf_terms[f].existsTerm( n, d_arg_reps[n] );\r
@@ -1491,6 +1527,13 @@ Node QuantConflictFind::evaluateTerm( Node n ) {
       Debug("qcf-eval") << "GT: No term for " << n << " hasTerm = " << getEqualityEngine()->hasTerm( n )  << std::endl;\r
       return n;\r
     }\r
+  }else if( n.getKind()==ITE ){\r
+    int v = evaluate( n[0], false, false );\r
+    if( v==1 ){\r
+      return evaluateTerm( n[1] );\r
+    }else if( v==-1 ){\r
+      return evaluateTerm( n[2] );\r
+    }\r
   }\r
   return getRepresentative( n );\r
 }\r
@@ -1512,6 +1555,7 @@ QuantConflictFind::EqcInfo * QuantConflictFind::getEqcInfo( Node n, bool doCreat
 */\r
 \r
 QcfNodeIndex * QuantConflictFind::getQcfNodeIndex( Node eqc, Node f ) {\r
+  computeUfTerms( f );\r
   std::map< TNode, QcfNodeIndex >::iterator itut = d_eqc_uf_terms.find( f );\r
   if( itut==d_eqc_uf_terms.end() ){\r
     return NULL;\r
@@ -1530,6 +1574,7 @@ QcfNodeIndex * QuantConflictFind::getQcfNodeIndex( Node eqc, Node f ) {
 }\r
 \r
 QcfNodeIndex * QuantConflictFind::getQcfNodeIndex( Node f ) {\r
+  computeUfTerms( f );\r
   std::map< TNode, QcfNodeIndex >::iterator itut = d_uf_terms.find( f );\r
   if( itut!=d_uf_terms.end() ){\r
     return &itut->second;\r
@@ -1630,6 +1675,32 @@ void QuantConflictFind::check( Theory::Effort level ) {
       Trace("qcf-check") << "Compute relevant equalities..." << std::endl;\r
       computeRelevantEqr();\r
 \r
+      //determine order for quantified formulas\r
+      std::vector< Node > qorder;\r
+      std::map< Node, bool > qassert;\r
+      //mark which are asserted\r
+      for( unsigned i=0; i<d_qassert.size(); i++ ){\r
+        qassert[d_qassert[i]] = true;\r
+      }\r
+      //add which ones are specified in the order\r
+      for( unsigned i=0; i<d_quant_order.size(); i++ ){\r
+        Node n = d_quant_order[i];\r
+        if( std::find( qorder.begin(), qorder.end(), n )==qorder.end() && qassert.find( n )!=qassert.end() ){\r
+          qorder.push_back( n );\r
+        }\r
+      }\r
+      d_quant_order.clear();\r
+      d_quant_order.insert( d_quant_order.begin(), qorder.begin(), qorder.end() );\r
+      //add remaining\r
+      for( unsigned i=0; i<d_qassert.size(); i++ ){\r
+        Node n = d_qassert[i];\r
+        if( std::find( qorder.begin(), qorder.end(), n )==qorder.end() ){\r
+          qorder.push_back( n );\r
+        }\r
+      }\r
+\r
+\r
+\r
       if( Trace.isOn("qcf-debug") ){\r
         Trace("qcf-debug") << std::endl;\r
         debugPrint("qcf-debug");\r
@@ -1638,14 +1709,9 @@ void QuantConflictFind::check( Theory::Effort level ) {
       short end_e = options::qcfMode()==QCF_CONFLICT_ONLY ? effort_conflict : options::qcfMode()==QCF_PROP_EQ ? effort_prop_eq : effort_mc;\r
       for( short e = effort_conflict; e<=end_e; e++ ){\r
         d_effort = e;\r
-        if( e == effort_prop_eq ){\r
-          for( unsigned i=0; i<2; i++ ){\r
-            d_prop_eq[i] = Node::null();\r
-          }\r
-        }\r
         Trace("qcf-check") << "Checking quantified formulas at effort " << e << "..." << std::endl;\r
-        for( unsigned j=0; j<d_qassert.size(); j++ ){\r
-          Node q = d_qassert[j];\r
+        for( unsigned j=0; j<qorder.size(); j++ ){\r
+          Node q = qorder[j];\r
           QuantInfo * qi = &d_qinfo[q];\r
           Trace("qcf-check") << "Check quantified formula ";\r
           debugPrintQuant("qcf-check", q);\r
@@ -1694,6 +1760,7 @@ void QuantConflictFind::check( Theory::Effort level ) {
                     Trace("qcf-check") << "   ... Added instantiation" << std::endl;\r
                     ++addedLemmas;\r
                     if( e==effort_conflict ){\r
+                      d_quant_order.insert( d_quant_order.begin(), q );\r
                       d_conflict.set( true );\r
                       ++(d_statistics.d_conflict_inst);\r
                       break;\r
@@ -1759,21 +1826,21 @@ void QuantConflictFind::computeRelevantEqr() {
   d_eqcs.clear();\r
   d_model_basis.clear();\r
   d_arg_reps.clear();\r
-  double clSet = 0;\r
-  if( Trace.isOn("qcf-opt") ){\r
-    clSet = double(clock())/double(CLOCKS_PER_SEC);\r
-  }\r
+  //double clSet = 0;\r
+  //if( Trace.isOn("qcf-opt") ){\r
+  //  clSet = double(clock())/double(CLOCKS_PER_SEC);\r
+  //}\r
 \r
-  long nTermst = 0;\r
-  long nTerms = 0;\r
-  long nEqc = 0;\r
+  //long nTermst = 0;\r
+  //long nTerms = 0;\r
+  //long nEqc = 0;\r
 \r
   //which nodes are irrelevant for disequality matches\r
   std::map< TNode, bool > irrelevant_dnode;\r
   //now, store matches\r
   eq::EqClassesIterator eqcs_i = eq::EqClassesIterator( getEqualityEngine() );\r
   while( !eqcs_i.isFinished() ){\r
-    nEqc++;\r
+    //nEqc++;\r
     Node r = (*eqcs_i);\r
     TypeNode rtn = r.getType();\r
     if( options::qcfMode()==QCF_MC ){\r
@@ -1796,6 +1863,9 @@ void QuantConflictFind::computeRelevantEqr() {
     }else{\r
       d_eqcs[rtn].push_back( r );\r
     }\r
+    //if( r.getType().isInteger() ){\r
+    //  Trace("qcf-mv") << "Model value for eqc(" << r << ") : " << d_quantEngine->getValuation().getModelValue( r ) << std::endl;\r
+    //}\r
     //EqcInfo * eqcir = getEqcInfo( r, false );\r
     //get relevant nodes that we are disequal from\r
     /*\r
@@ -1814,6 +1884,7 @@ void QuantConflictFind::computeRelevantEqr() {
     }\r
     */\r
     //process disequalities\r
+    /*\r
     eq::EqClassIterator eqc_i = eq::EqClassIterator( r, getEqualityEngine() );\r
     while( !eqc_i.isFinished() ){\r
       TNode n = (*eqc_i);\r
@@ -1825,28 +1896,36 @@ void QuantConflictFind::computeRelevantEqr() {
         //    std::cout << n.getKind() << " " << n.getOperator() << " " << n << std::endl;\r
         //  }\r
         //}\r
-\r
-        bool isRedundant;\r
-        std::map< TNode, std::vector< TNode > >::iterator it_na;\r
-        TNode fn;\r
-        if( MatchGen::isHandledUfTerm( n ) ){\r
-          Node f = MatchGen::getOperator( this, n );\r
-          computeArgReps( n );\r
-          it_na = d_arg_reps.find( n );\r
-          Assert( it_na!=d_arg_reps.end() );\r
-          Node nadd = d_eqc_uf_terms[f].d_children[r].addTerm( n, d_arg_reps[n] );\r
-          isRedundant = (nadd!=n);\r
-          d_uf_terms[f].addTerm( n, d_arg_reps[n] );\r
+        if( !quantifiers::TermDb::hasBoundVarAttr( n ) ){    //temporary\r
+\r
+          bool isRedundant;\r
+          std::map< TNode, std::vector< TNode > >::iterator it_na;\r
+          TNode fn;\r
+          if( MatchGen::isHandledUfTerm( n ) ){\r
+            Node f = MatchGen::getOperator( this, n );\r
+            computeArgReps( n );\r
+            it_na = d_arg_reps.find( n );\r
+            Assert( it_na!=d_arg_reps.end() );\r
+            Node nadd = d_eqc_uf_terms[f].d_children[r].addTerm( n, d_arg_reps[n] );\r
+            isRedundant = (nadd!=n);\r
+            d_uf_terms[f].addTerm( n, d_arg_reps[n] );\r
+          }else{\r
+            isRedundant = false;\r
+          }\r
+          nTerms += isRedundant ? 0 : 1;\r
         }else{\r
-          isRedundant = false;\r
+          if( Debug.isOn("qcf-nground") ){\r
+            Debug("qcf-nground") << "Non-ground term in eqc : " << n << std::endl;\r
+            Assert( false );\r
+          }\r
         }\r
-        nTerms += isRedundant ? 0 : 1;\r
       }\r
       ++eqc_i;\r
     }\r
-    //process_eqc[r] = true;\r
+    */\r
     ++eqcs_i;\r
   }\r
+  /*\r
   if( Trace.isOn("qcf-opt") ){\r
     double clSet2 = double(clock())/double(CLOCKS_PER_SEC);\r
     Trace("qcf-opt") << "Compute rel eqc : " << std::endl;\r
@@ -1854,6 +1933,7 @@ void QuantConflictFind::computeRelevantEqr() {
     Trace("qcf-opt") << "   " << nTerms << " / " << nTermst << " terms." << std::endl;\r
     Trace("qcf-opt") << "   Time : " << (clSet2-clSet) << std::endl;\r
   }\r
+  */\r
 }\r
 \r
 void QuantConflictFind::computeArgReps( TNode n ) {\r
@@ -1865,6 +1945,23 @@ void QuantConflictFind::computeArgReps( TNode n ) {
   }\r
 }\r
 \r
+void QuantConflictFind::computeUfTerms( TNode f ) {\r
+  if( d_uf_terms.find( f )==d_uf_terms.end() ){\r
+    d_uf_terms[f].clear();\r
+    unsigned nt = d_quantEngine->getTermDatabase()->d_op_map[f].size();\r
+    for( unsigned i=0; i<nt; i++ ){\r
+      Node n = d_quantEngine->getTermDatabase()->d_op_map[f][i];\r
+      if( !n.getAttribute(NoMatchAttribute()) ){\r
+        Assert( getEqualityEngine()->hasTerm( n ) );\r
+        Node r = getRepresentative( n );\r
+        computeArgReps( n );\r
+        d_eqc_uf_terms[f].d_children[r].addTerm( n, d_arg_reps[n] );\r
+        d_uf_terms[f].addTerm( n, d_arg_reps[n] );\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
 //-------------------------------------------------- debugging\r
 \r
 \r
index 80e56acbd2f8b85d31c24210ba09a7b93f585c46..9b64a312dab4a68dd8055244756eaf47181e981e 100755 (executable)
@@ -61,6 +61,7 @@ private:
   std::map< int, TNode > d_qni_gterm;\r
   std::map< int, TNode > d_qni_gterm_rep;\r
   std::map< int, int > d_qni_bound;\r
+  std::vector< int > d_qni_bound_except;\r
   std::map< int, TNode > d_qni_bound_cons;\r
   std::map< int, int > d_qni_bound_cons_var;\r
   std::map< int, int >::iterator d_binding_it;\r
@@ -81,6 +82,7 @@ public:
     typ_eq,\r
     typ_formula,\r
     typ_var,\r
+    typ_ite_var,\r
     typ_top,\r
   };\r
   void debugPrintType( const char * c, short typ, bool isTrace = false );\r
@@ -156,7 +158,7 @@ private:
   context::Context* d_c;\r
   context::CDO< bool > d_conflict;\r
   bool d_performCheck;\r
-  //void registerAssertion( Node n );\r
+  std::vector< Node > d_quant_order;\r
 private:\r
   std::map< Node, Node > d_op_node;\r
   int d_fid_count;\r
@@ -204,6 +206,8 @@ private:  //for equivalence classes
   std::map< TNode, std::vector< TNode > > d_arg_reps;\r
   //compute arg reps\r
   void computeArgReps( TNode n );\r
+  //compute\r
+  void computeUfTerms( TNode f );\r
 public:\r
   enum {\r
     effort_conflict,\r
@@ -211,10 +215,6 @@ public:
     effort_mc,\r
   };\r
   short d_effort;\r
-  //for effort_prop\r
-  TNode d_prop_eq[2];\r
-  bool d_prop_pol;\r
-  bool isPropagationSet();\r
   bool areMatchEqual( TNode n1, TNode n2 );\r
   bool areMatchDisequal( TNode n1, TNode n2 );\r
 public:\r
index 23cf5f5d0e19b667fad0a04c698c051723b2f200..74fc167644c6452c8728607920a7c6ba2cb1a730 100644 (file)
@@ -48,7 +48,6 @@ public:
 public:
   std::vector< Node > d_nodes;
 public:
-  void debugPrint( const char* c );
   IMGenerator* getGenerator() { return d_mg; }
 public:
   /** reset instantiation round (call this whenever equivalence classes have changed) */
@@ -123,6 +122,14 @@ public:
     out << " )";
     */
   }
+  void debugPrint( const char * c ) {
+    Trace(c) << "TRIGGER( ";
+    for( int i=0; i<(int)d_nodes.size(); i++ ){
+      if( i>0 ){ Trace(c) << ", "; }
+      Trace(c) << d_nodes[i];
+    }
+    Trace(c) << " )";
+  }
 };
 
 inline std::ostream& operator<<(std::ostream& out, const Trigger & tr) {