Move methods from term util to quantifiers registry (#5916)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Wed, 17 Feb 2021 19:34:54 +0000 (13:34 -0600)
committerGitHub <noreply@github.com>
Wed, 17 Feb 2021 19:34:54 +0000 (13:34 -0600)
Towards eliminating dependencies on quantifiers engine, and eliminating the TermUtil class.

Note that QuantifiersModule had to be moved to its own file to avoid circular include dependencies.

51 files changed:
src/CMakeLists.txt
src/preprocessing/passes/quantifier_macros.cpp
src/theory/quantifiers/cegqi/inst_strategy_cegqi.cpp
src/theory/quantifiers/cegqi/inst_strategy_cegqi.h
src/theory/quantifiers/conjecture_generator.h
src/theory/quantifiers/ematching/ho_trigger.cpp
src/theory/quantifiers/ematching/ho_trigger.h
src/theory/quantifiers/ematching/inst_match_generator_multi.cpp
src/theory/quantifiers/ematching/inst_strategy.cpp
src/theory/quantifiers/ematching/inst_strategy.h
src/theory/quantifiers/ematching/inst_strategy_e_matching.cpp
src/theory/quantifiers/ematching/inst_strategy_e_matching.h
src/theory/quantifiers/ematching/inst_strategy_e_matching_user.cpp
src/theory/quantifiers/ematching/inst_strategy_e_matching_user.h
src/theory/quantifiers/ematching/instantiation_engine.cpp
src/theory/quantifiers/ematching/instantiation_engine.h
src/theory/quantifiers/ematching/trigger.cpp
src/theory/quantifiers/ematching/trigger.h
src/theory/quantifiers/extended_rewrite.cpp
src/theory/quantifiers/first_order_model.cpp
src/theory/quantifiers/first_order_model.h
src/theory/quantifiers/fmf/bounded_integers.cpp
src/theory/quantifiers/fmf/bounded_integers.h
src/theory/quantifiers/fmf/model_engine.cpp
src/theory/quantifiers/fmf/model_engine.h
src/theory/quantifiers/inst_match.cpp
src/theory/quantifiers/inst_strategy_enumerative.h
src/theory/quantifiers/instantiate.cpp
src/theory/quantifiers/instantiate.h
src/theory/quantifiers/quant_conflict_find.cpp
src/theory/quantifiers/quant_conflict_find.h
src/theory/quantifiers/quant_module.cpp [new file with mode: 0644]
src/theory/quantifiers/quant_module.h [new file with mode: 0644]
src/theory/quantifiers/quant_split.h
src/theory/quantifiers/quant_util.cpp
src/theory/quantifiers/quant_util.h
src/theory/quantifiers/quantifiers_modules.cpp
src/theory/quantifiers/quantifiers_registry.cpp
src/theory/quantifiers/quantifiers_registry.h
src/theory/quantifiers/relevant_domain.cpp
src/theory/quantifiers/relevant_domain.h
src/theory/quantifiers/single_inv_partition.cpp
src/theory/quantifiers/skolemize.h
src/theory/quantifiers/sygus/synth_engine.h
src/theory/quantifiers/sygus_inst.h
src/theory/quantifiers/term_database.cpp
src/theory/quantifiers/term_database.h
src/theory/quantifiers/term_util.cpp
src/theory/quantifiers/term_util.h
src/theory/quantifiers_engine.cpp
src/theory/quantifiers_engine.h

index 12e3f24b396b45f76f1b98fd8700eee511006219..654ccb40cc42085b7f619713235ad4b74c261746 100644 (file)
@@ -726,6 +726,8 @@ libcvc4_add_sources(
   theory/quantifiers/quant_split.h
   theory/quantifiers/quant_util.cpp
   theory/quantifiers/quant_util.h
+  theory/quantifiers/quant_module.cpp
+  theory/quantifiers/quant_module.h
   theory/quantifiers/quantifiers_attributes.cpp
   theory/quantifiers/quantifiers_attributes.h
   theory/quantifiers/quantifiers_inference_manager.cpp
index 69b6658548e9b52a4b17d780310782bdbe4df749..eef0326b6895a27a7ef0bd7df5f5cfd5855776ab 100644 (file)
@@ -24,8 +24,8 @@
 #include "smt/smt_engine_scope.h"
 #include "theory/arith/arith_msum.h"
 #include "theory/quantifiers/ematching/pattern_term_selector.h"
+#include "theory/quantifiers/quantifiers_registry.h"
 #include "theory/quantifiers/term_database.h"
-#include "theory/quantifiers/term_util.h"
 #include "theory/quantifiers_engine.h"
 #include "theory/rewriter.h"
 
@@ -196,8 +196,8 @@ bool QuantifierMacros::isGroundUfTerm(Node q, Node n)
 {
   Node icn = d_preprocContext->getTheoryEngine()
                  ->getQuantifiersEngine()
-                 ->getTermUtil()
-                 ->substituteBoundVariablesToInstConstants(n, q);
+                 ->getQuantifiersRegistry()
+                 .substituteBoundVariablesToInstConstants(n, q);
   Trace("macros-debug2") << "Get free variables in " << icn << std::endl;
   std::vector< Node > var;
   quantifiers::TermUtil::computeInstConstContainsForQuant(q, icn, var);
index c37054fdd4e6b327ba544d4b2d76ea29eee2e760..e4881b1123d84b8925d810644241326e0f3e810d 100644 (file)
@@ -103,7 +103,7 @@ bool InstStrategyCegqi::registerCbqiLemma(Node q)
     //add cbqi lemma
     //get the counterexample literal
     Node ceLit = getCounterexampleLiteral(q);
-    Node ceBody = d_quantEngine->getTermUtil()->getInstConstantBody( q );
+    Node ceBody = d_qreg.getInstConstantBody(q);
     if( !ceBody.isNull() ){
       //add counterexample lemma
       Node lem = NodeManager::currentNM()->mkNode( OR, ceLit.negate(), ceBody.negate() );
@@ -369,19 +369,18 @@ void InstStrategyCegqi::registerCounterexampleLemma(Node q, Node lem)
   // must register with the instantiator
   // must explicitly remove ITEs so that we record dependencies
   std::vector<Node> ce_vars;
-  TermUtil* tutil = d_quantEngine->getTermUtil();
-  for (unsigned i = 0, nics = tutil->getNumInstantiationConstants(q); i < nics;
+  for (size_t i = 0, nics = d_qreg.getNumInstantiationConstants(q); i < nics;
        i++)
   {
-    ce_vars.push_back(tutil->getInstantiationConstant(q, i));
+    ce_vars.push_back(d_qreg.getInstantiationConstant(q, i));
   }
   // send the lemma
-  d_quantEngine->getOutputChannel().lemma(lem);
+  d_qim.lemma(lem, InferenceId::UNKNOWN);
   // get the preprocessed form of the lemma we just sent
   std::vector<Node> skolems;
   std::vector<Node> skAsserts;
-  Node ppLem = d_quantEngine->getValuation().getPreprocessedTerm(
-      lem, skAsserts, skolems);
+  Node ppLem =
+      d_qstate.getValuation().getPreprocessedTerm(lem, skAsserts, skolems);
   std::vector<Node> lemp{ppLem};
   lemp.insert(lemp.end(), skAsserts.begin(), skAsserts.end());
   ppLem = NodeManager::currentNM()->mkAnd(lemp);
index 7d39efc6b6c3c8f1c7612d219b5ff81056f6c24e..18c71e77e9e51b37041dcf2d49ec24129163428a 100644 (file)
@@ -24,7 +24,7 @@
 #include "theory/quantifiers/cegqi/nested_qe.h"
 #include "theory/quantifiers/cegqi/vts_term_cache.h"
 #include "theory/quantifiers/instantiate.h"
-#include "theory/quantifiers/quant_util.h"
+#include "theory/quantifiers/quant_module.h"
 #include "util/statistics_registry.h"
 
 namespace CVC4 {
index 644461da267cd746517288244e67968eaff6845f..9a9492d0088a62e54747aec7ccaeaf513c699092 100644 (file)
@@ -20,7 +20,7 @@
 #include "context/cdhashmap.h"
 #include "expr/node_trie.h"
 #include "expr/term_canonize.h"
-#include "theory/quantifiers/quant_util.h"
+#include "theory/quantifiers/quant_module.h"
 #include "theory/type_enumerator.h"
 
 namespace CVC4 {
index 0ab2988d286b5256af2c0faf2624d00854a35c7f..4c606a273e951eb8dcdd72892c4f3a87914b433e 100644 (file)
@@ -17,7 +17,6 @@
 #include "theory/quantifiers/ematching/ho_trigger.h"
 #include "theory/quantifiers/instantiate.h"
 #include "theory/quantifiers/term_database.h"
-#include "theory/quantifiers/term_util.h"
 #include "theory/quantifiers_engine.h"
 #include "theory/uf/theory_uf_rewriter.h"
 #include "util/hash.h"
@@ -31,10 +30,11 @@ namespace inst {
 HigherOrderTrigger::HigherOrderTrigger(
     QuantifiersEngine* qe,
     quantifiers::QuantifiersInferenceManager& qim,
+    quantifiers::QuantifiersRegistry& qr,
     Node q,
     std::vector<Node>& nodes,
     std::map<Node, std::vector<Node> >& ho_apps)
-    : Trigger(qe, qim, q, nodes), d_ho_var_apps(ho_apps)
+    : Trigger(qe, qim, qr, q, nodes), d_ho_var_apps(ho_apps)
 {
   NodeManager* nm = NodeManager::currentNM();
   // process the higher-order variable applications
@@ -201,11 +201,10 @@ bool HigherOrderTrigger::sendInstantiation(InstMatch& m)
     // get substitution corresponding to m
     std::vector<TNode> vars;
     std::vector<TNode> subs;
-    quantifiers::TermUtil* tutil = d_quantEngine->getTermUtil();
     for (unsigned i = 0, size = d_quant[0].getNumChildren(); i < size; i++)
     {
       subs.push_back(m.d_vals[i]);
-      vars.push_back(tutil->getInstantiationConstant(d_quant, i));
+      vars.push_back(d_qreg.getInstantiationConstant(d_quant, i));
     }
 
     Trace("ho-unif-debug") << "Run higher-order unification..." << std::endl;
index e424f69d11d5cbc35da804a1e6de9b678862d30b..af7020bfcdc9254283b05f88894fa980480b3524 100644 (file)
@@ -94,6 +94,7 @@ class HigherOrderTrigger : public Trigger
  private:
   HigherOrderTrigger(QuantifiersEngine* qe,
                      quantifiers::QuantifiersInferenceManager& qim,
+                     quantifiers::QuantifiersRegistry& qr,
                      Node q,
                      std::vector<Node>& nodes,
                      std::map<Node, std::vector<Node> >& ho_apps);
index a0114ba80316e95b2e6031aea03a5cc3f4a6acd7..4f393bc4fc836e457f47c33bc876c17c601ae2b4 100644 (file)
@@ -238,8 +238,6 @@ void InstMatchGeneratorMulti::processNewInstantiations(QuantifiersEngine* qe,
   if (trieIndex < iio->d_order.size())
   {
     size_t curr_index = iio->d_order[trieIndex];
-    // Node curr_ic = qe->getTermUtil()->getInstantiationConstant( d_quant,
-    // curr_index );
     Node n = m.get(curr_index);
     if (n.isNull())
     {
index fc85703c04f51288402787641ccb34a1a758e857..fe771b4e79dcc2775553cac3bd06d56ea2ef9fe7 100644 (file)
@@ -22,8 +22,9 @@ namespace quantifiers {
 
 InstStrategy::InstStrategy(QuantifiersEngine* qe,
                            QuantifiersState& qs,
-                           QuantifiersInferenceManager& qim)
-    : d_quantEngine(qe), d_qstate(qs), d_qim(qim)
+                           QuantifiersInferenceManager& qim,
+                           QuantifiersRegistry& qr)
+    : d_quantEngine(qe), d_qstate(qs), d_qim(qim), d_qreg(qr)
 {
 }
 InstStrategy::~InstStrategy() {}
index b9d0aa7454dccaa611a464bf01e4eee58a599d2b..1455ce0c5745839e6715b904d0b7f8be7fd9fe44 100644 (file)
@@ -31,6 +31,7 @@ namespace quantifiers {
 
 class QuantifiersState;
 class QuantifiersInferenceManager;
+class QuantifiersRegistry;
 
 /** A status response to process */
 enum class InstStrategyStatus
@@ -49,7 +50,8 @@ class InstStrategy
  public:
   InstStrategy(QuantifiersEngine* qe,
                QuantifiersState& qs,
-               QuantifiersInferenceManager& qim);
+               QuantifiersInferenceManager& qim,
+               QuantifiersRegistry& qr);
   virtual ~InstStrategy();
   /** presolve */
   virtual void presolve();
@@ -72,6 +74,8 @@ class InstStrategy
   QuantifiersState& d_qstate;
   /** The quantifiers inference manager object */
   QuantifiersInferenceManager& d_qim;
+  /** The quantifiers registry */
+  QuantifiersRegistry& d_qreg;
 }; /* class InstStrategy */
 
 }  // namespace quantifiers
index 90d8de1282534e9543369a1fd81248e507c5367a..2a1e38c3c1833899278fabbdb7da044f088d12b8 100644 (file)
@@ -62,8 +62,9 @@ InstStrategyAutoGenTriggers::InstStrategyAutoGenTriggers(
     QuantifiersEngine* qe,
     QuantifiersState& qs,
     QuantifiersInferenceManager& qim,
-    QuantRelevance* qr)
-    : InstStrategy(qe, qs, qim), d_quant_rel(qr)
+    QuantifiersRegistry& qr,
+    QuantRelevance* qrlv)
+    : InstStrategy(qe, qs, qim, qr), d_quant_rel(qrlv)
 {
   //how to select trigger terms
   d_tr_strategy = options::triggerSelMode();
@@ -283,6 +284,7 @@ void InstStrategyAutoGenTriggers::generateTriggers( Node f ){
     {
       tr = Trigger::mkTrigger(d_quantEngine,
                               d_qim,
+                              d_qreg,
                               f,
                               patTerms[0],
                               false,
@@ -320,6 +322,7 @@ void InstStrategyAutoGenTriggers::generateTriggers( Node f ){
       // will possibly want to get an old trigger
       tr = Trigger::mkTrigger(d_quantEngine,
                               d_qim,
+                              d_qreg,
                               f,
                               patTerms,
                               false,
@@ -362,6 +365,7 @@ void InstStrategyAutoGenTriggers::generateTriggers( Node f ){
           d_single_trigger_gen[patTerms[index]] = true;
           Trigger* tr2 = Trigger::mkTrigger(d_quantEngine,
                                             d_qim,
+                                            d_qreg,
                                             f,
                                             patTerms[index],
                                             false,
@@ -390,7 +394,6 @@ bool InstStrategyAutoGenTriggers::generatePatternTerms(Node f)
   bool ntrivTriggers = options::relationalTriggers();
   std::vector<Node> patTermsF;
   std::map<Node, inst::TriggerTermInfo> tinfo;
-  TermUtil* tu = d_quantEngine->getTermUtil();
   NodeManager* nm = NodeManager::currentNM();
   // well-defined function: can assume LHS is only pattern
   if (options::quantFunWellDefined())
@@ -398,7 +401,7 @@ bool InstStrategyAutoGenTriggers::generatePatternTerms(Node f)
     Node hd = QuantAttributes::getFunDefHead(f);
     if (!hd.isNull())
     {
-      hd = tu->substituteBoundVariablesToInstConstants(hd, f);
+      hd = d_qreg.substituteBoundVariablesToInstConstants(hd, f);
       patTermsF.push_back(hd);
       tinfo[hd].init(f, hd);
     }
@@ -406,7 +409,7 @@ bool InstStrategyAutoGenTriggers::generatePatternTerms(Node f)
   // otherwise, use algorithm for collecting pattern terms
   if (patTermsF.empty())
   {
-    Node bd = tu->getInstConstantBody(f);
+    Node bd = d_qreg.getInstConstantBody(f);
     PatternTermSelector pts(f, d_tr_strategy, d_user_no_gen[f], true);
     pts.collect(bd, patTermsF, tinfo);
     if (ntrivTriggers)
@@ -486,7 +489,7 @@ bool InstStrategyAutoGenTriggers::generatePatternTerms(Node f)
       std::vector<Node> vcs[2];
       for (size_t i = 0, nchild = f[0].getNumChildren(); i < nchild; i++)
       {
-        Node ic = tu->getInstantiationConstant(f, i);
+        Node ic = d_qreg.getInstantiationConstant(f, i);
         vcs[vcMap.find(ic) == vcMap.end() ? 0 : 1].push_back(f[0][i]);
       }
       for (size_t i = 0; i < 2; i++)
@@ -621,8 +624,7 @@ void InstStrategyAutoGenTriggers::addTrigger( inst::Trigger * tr, Node q ) {
     NodeManager* nm = NodeManager::currentNM();
     // partial trigger : generate implication to mark user pattern
     Node pat =
-        d_quantEngine->getTermUtil()->substituteInstConstantsToBoundVariables(
-            tr->getInstPattern(), q);
+        d_qreg.substituteInstConstantsToBoundVariables(tr->getInstPattern(), q);
     Node ipl = nm->mkNode(INST_PATTERN_LIST, pat);
     Node qq = nm->mkNode(FORALL,
                          d_vc_partition[1][q],
index 81b40f067810e767ff4dbcc4600ffb40cf0d29b8..6170d30671f447e8f9252764d2d38108387df3a3 100644 (file)
@@ -88,7 +88,8 @@ class InstStrategyAutoGenTriggers : public InstStrategy
   InstStrategyAutoGenTriggers(QuantifiersEngine* qe,
                               QuantifiersState& qs,
                               QuantifiersInferenceManager& qim,
-                              QuantRelevance* qr);
+                              QuantifiersRegistry& qr,
+                              QuantRelevance* qrlv);
   ~InstStrategyAutoGenTriggers() {}
 
   /** get auto-generated trigger */
index cf6405b38dae93dc5ff321affb08127cfe37d5a5..ca2f1bdc50802a21df763d95d798acdbc77994f9 100644 (file)
@@ -27,8 +27,9 @@ namespace quantifiers {
 InstStrategyUserPatterns::InstStrategyUserPatterns(
     QuantifiersEngine* ie,
     QuantifiersState& qs,
-    QuantifiersInferenceManager& qim)
-    : InstStrategy(ie, qs, qim)
+    QuantifiersInferenceManager& qim,
+    QuantifiersRegistry& qr)
+    : InstStrategy(ie, qs, qim, qr)
 {
 }
 InstStrategyUserPatterns::~InstStrategyUserPatterns() {}
@@ -105,8 +106,13 @@ InstStrategyStatus InstStrategyUserPatterns::process(Node q,
     std::vector<std::vector<Node> >& ugw = d_user_gen_wait[q];
     for (size_t i = 0, usize = ugw.size(); i < usize; i++)
     {
-      Trigger* t = Trigger::mkTrigger(
-          d_quantEngine, d_qim, q, ugw[i], true, Trigger::TR_RETURN_NULL);
+      Trigger* t = Trigger::mkTrigger(d_quantEngine,
+                                      d_qim,
+                                      d_qreg,
+                                      q,
+                                      ugw[i],
+                                      true,
+                                      Trigger::TR_RETURN_NULL);
       if (t)
       {
         d_user_gen[q].push_back(t);
@@ -165,7 +171,7 @@ void InstStrategyUserPatterns::addUserPattern(Node q, Node pat)
     return;
   }
   Trigger* t = Trigger::mkTrigger(
-      d_quantEngine, d_qim, q, nodes, true, Trigger::TR_MAKE_NEW);
+      d_quantEngine, d_qim, d_qreg, q, nodes, true, Trigger::TR_MAKE_NEW);
   if (t)
   {
     d_user_gen[q].push_back(t);
index 996adc444ad38e8f54e2f5895388b470c0f0c5fe..1cad77fef877bd89f22c6b0ad2ed538520d14d6e 100644 (file)
@@ -36,7 +36,8 @@ class InstStrategyUserPatterns : public InstStrategy
  public:
   InstStrategyUserPatterns(QuantifiersEngine* qe,
                            QuantifiersState& qs,
-                           QuantifiersInferenceManager& qim);
+                           QuantifiersInferenceManager& qim,
+                           QuantifiersRegistry& qr);
   ~InstStrategyUserPatterns();
   /** add pattern */
   void addUserPattern(Node q, Node pat);
index 50d91a1e1b479f4a54de7d2907371304983107c5..3e344f7fb234686f1a7862fa752b25c8e00d628b 100644 (file)
@@ -53,13 +53,13 @@ InstantiationEngine::InstantiationEngine(QuantifiersEngine* qe,
     // user-provided patterns
     if (options::userPatternsQuant() != options::UserPatMode::IGNORE)
     {
-      d_isup.reset(new InstStrategyUserPatterns(d_quantEngine, qs, qim));
+      d_isup.reset(new InstStrategyUserPatterns(d_quantEngine, qs, qim, qr));
       d_instStrategies.push_back(d_isup.get());
     }
 
     // auto-generated patterns
     d_i_ag.reset(new InstStrategyAutoGenTriggers(
-        d_quantEngine, qs, qim, d_quant_rel.get()));
+        d_quantEngine, qs, qim, qr, d_quant_rel.get()));
     d_instStrategies.push_back(d_i_ag.get());
   }
 }
@@ -228,9 +228,7 @@ void InstantiationEngine::registerQuantifier(Node q)
   // take into account user patterns
   if (q.getNumChildren() == 3)
   {
-    Node subsPat =
-        d_quantEngine->getTermUtil()->substituteBoundVariablesToInstConstants(
-            q[2], q);
+    Node subsPat = d_qreg.substituteBoundVariablesToInstConstants(q[2], q);
     // add patterns
     for (const Node& p : subsPat)
     {
index 016784152ab7db16d84797767fd35cbad9505e77..e272779331d827e01f7ee3f2a7498804cdc473c7 100644 (file)
@@ -20,8 +20,8 @@
 #include <vector>
 
 #include "theory/quantifiers/ematching/inst_strategy.h"
+#include "theory/quantifiers/quant_module.h"
 #include "theory/quantifiers/quant_relevance.h"
-#include "theory/quantifiers/quant_util.h"
 
 namespace CVC4 {
 namespace theory {
index 3bc5ded16f4724515b909f56b20ca05663f65983..ac43d3bc94b198dd3b3e02cb94aaad68d225cbab 100644 (file)
@@ -36,9 +36,10 @@ namespace inst {
 /** trigger class constructor */
 Trigger::Trigger(QuantifiersEngine* qe,
                  quantifiers::QuantifiersInferenceManager& qim,
+                 quantifiers::QuantifiersRegistry& qr,
                  Node q,
                  std::vector<Node>& nodes)
-    : d_quantEngine(qe), d_qim(qim), d_quant(q)
+    : d_quantEngine(qe), d_qim(qim), d_qreg(qr), d_quant(q)
 {
   // We must ensure that the ground subterms of the trigger have been
   // preprocessed.
@@ -233,6 +234,7 @@ bool Trigger::mkTriggerTerms(Node q,
 
 Trigger* Trigger::mkTrigger(QuantifiersEngine* qe,
                             quantifiers::QuantifiersInferenceManager& qim,
+                            quantifiers::QuantifiersRegistry& qr,
                             Node f,
                             std::vector<Node>& nodes,
                             bool keepAll,
@@ -273,11 +275,11 @@ Trigger* Trigger::mkTrigger(QuantifiersEngine* qe,
   Trigger* t;
   if (!ho_apps.empty())
   {
-    t = new HigherOrderTrigger(qe, qim, f, trNodes, ho_apps);
+    t = new HigherOrderTrigger(qe, qim, qr, f, trNodes, ho_apps);
   }
   else
   {
-    t = new Trigger(qe, qim, f, trNodes);
+    t = new Trigger(qe, qim, qr, f, trNodes);
   }
 
   qe->getTriggerDatabase()->addTrigger( trNodes, t );
@@ -286,6 +288,7 @@ Trigger* Trigger::mkTrigger(QuantifiersEngine* qe,
 
 Trigger* Trigger::mkTrigger(QuantifiersEngine* qe,
                             quantifiers::QuantifiersInferenceManager& qim,
+                            quantifiers::QuantifiersRegistry& qr,
                             Node f,
                             Node n,
                             bool keepAll,
@@ -294,7 +297,7 @@ Trigger* Trigger::mkTrigger(QuantifiersEngine* qe,
 {
   std::vector< Node > nodes;
   nodes.push_back( n );
-  return mkTrigger(qe, qim, f, nodes, keepAll, trOption, useNVars);
+  return mkTrigger(qe, qim, qr, f, nodes, keepAll, trOption, useNVars);
 }
 
 int Trigger::getActiveScore() {
index e2ce61bd1092b3d250a93bc04b2c1e86acb87698..21888ff8fa82b40543a379b09fca053f01c4ce86 100644 (file)
@@ -31,6 +31,7 @@ class QuantifiersEngine;
 
 namespace quantifiers {
 class QuantifiersInferenceManager;
+class QuantifiersRegistry;
 }
 
 namespace inst {
@@ -163,6 +164,7 @@ class Trigger {
   };
   static Trigger* mkTrigger(QuantifiersEngine* qe,
                             quantifiers::QuantifiersInferenceManager& qim,
+                            quantifiers::QuantifiersRegistry& qr,
                             Node q,
                             std::vector<Node>& nodes,
                             bool keepAll = true,
@@ -171,6 +173,7 @@ class Trigger {
   /** single trigger version that calls the above function */
   static Trigger* mkTrigger(QuantifiersEngine* qe,
                             quantifiers::QuantifiersInferenceManager& qim,
+                            quantifiers::QuantifiersRegistry& qr,
                             Node q,
                             Node n,
                             bool keepAll = true,
@@ -194,6 +197,7 @@ class Trigger {
   /** trigger constructor, intentionally protected (use Trigger::mkTrigger). */
   Trigger(QuantifiersEngine* ie,
           quantifiers::QuantifiersInferenceManager& qim,
+          quantifiers::QuantifiersRegistry& qr,
           Node q,
           std::vector<Node>& nodes);
   /** add an instantiation (called by InstMatchGenerator)
@@ -243,6 +247,8 @@ class Trigger {
   QuantifiersEngine* d_quantEngine;
   /** Reference to the quantifiers inference manager */
   quantifiers::QuantifiersInferenceManager& d_qim;
+  /** The quantifiers registry */
+  quantifiers::QuantifiersRegistry& d_qreg;
   /** The quantified formula this trigger is for. */
   Node d_quant;
   /** match generator
index 37a3396e24a5f5ea49a5686429782c9c4f43f04f..7b5bd92b8be649525bd65d7ff3e5d327cd1b9fe9 100644 (file)
@@ -20,6 +20,7 @@
 #include "theory/quantifiers/term_util.h"
 #include "theory/rewriter.h"
 #include "theory/strings/sequences_rewriter.h"
+#include "theory/theory.h"
 
 using namespace CVC4::kind;
 using namespace std;
index db977c53d89dc1ec7441417d2c1139217545a2df..593ec98f92cf2c8a594f2338252cef75447ee45d 100644 (file)
@@ -35,9 +35,11 @@ namespace quantifiers {
 
 FirstOrderModel::FirstOrderModel(QuantifiersEngine* qe,
                                  QuantifiersState& qs,
+                                 QuantifiersRegistry& qr,
                                  std::string name)
     : TheoryModel(qs.getSatContext(), name, true),
       d_qe(qe),
+      d_qreg(qr),
       d_forall_asserts(qs.getSatContext()),
       d_forallRlvComputed(false)
 {
@@ -301,8 +303,7 @@ Node FirstOrderModel::getModelBasis(Node q, Node n)
       d_model_basis_terms[q].push_back(getModelBasisTerm(q[0][j].getType()));
     }
   }
-  Node gn = d_qe->getTermUtil()->substituteInstConstants(
-      n, q, d_model_basis_terms[q]);
+  Node gn = d_qreg.substituteInstConstants(n, q, d_model_basis_terms[q]);
   return gn;
 }
 
@@ -337,8 +338,9 @@ unsigned FirstOrderModel::getModelBasisArg(Node n)
 
 FirstOrderModelFmc::FirstOrderModelFmc(QuantifiersEngine* qe,
                                        QuantifiersState& qs,
+                                       QuantifiersRegistry& qr,
                                        std::string name)
-    : FirstOrderModel(qe, qs, name)
+    : FirstOrderModel(qe, qs, qr, name)
 {
 }
 
index e4236a95dfa9365749adde2656b70fdb9f7ffd01..ebc68ca537772c8dd401992669122cb7574e116e 100644 (file)
@@ -19,7 +19,6 @@
 
 #include "context/cdlist.h"
 #include "expr/attribute.h"
-#include "theory/quantifiers/quantifiers_state.h"
 #include "theory/theory_model.h"
 #include "theory/uf/theory_uf_model.h"
 
@@ -43,6 +42,8 @@ typedef expr::Attribute<ModelBasisArgAttributeId, uint64_t>
 namespace quantifiers {
 
 class TermDb;
+class QuantifiersState;
+class QuantifiersRegistry;
 
 namespace fmcheck {
   class FirstOrderModelFmc;
@@ -57,6 +58,7 @@ class FirstOrderModel : public TheoryModel
  public:
   FirstOrderModel(QuantifiersEngine* qe,
                   QuantifiersState& qs,
+                  QuantifiersRegistry& qr,
                   std::string name);
 
   virtual fmcheck::FirstOrderModelFmc* asFirstOrderModelFmc() { return nullptr; }
@@ -134,6 +136,8 @@ class FirstOrderModel : public TheoryModel
  protected:
   /** quant engine */
   QuantifiersEngine* d_qe;
+  /** The quantifiers registry */
+  QuantifiersRegistry& d_qreg;
   /** list of quantifiers asserted in the current context */
   context::CDList<Node> d_forall_asserts;
   /** 
@@ -203,6 +207,7 @@ class FirstOrderModelFmc : public FirstOrderModel
  public:
   FirstOrderModelFmc(QuantifiersEngine* qe,
                      QuantifiersState& qs,
+                     QuantifiersRegistry& qr,
                      std::string name);
   ~FirstOrderModelFmc() override;
   FirstOrderModelFmc* asFirstOrderModelFmc() override { return this; }
index 5a0407f1f88095b841cff83c4256d6e91b53ae5a..3ade304e80cdaf79c64ac7cdda687d3758831d3e 100644 (file)
@@ -546,7 +546,7 @@ void BoundedIntegers::getBoundVarIndices(Node q,
   {
     for (const Node& v : it->second)
     {
-      indices.push_back(d_quantEngine->getTermUtil()->getVariableNum(q, v));
+      indices.push_back(TermUtil::getVariableNum(q, v));
     }
   }
 }
index 74ff8a19ba7cfedd362ffb60b63686b84f04a9c5..dce515d0dd90766d6fc50fd0c6ae0b5b84b8930c 100644 (file)
@@ -18,7 +18,7 @@
 #ifndef CVC4__BOUNDED_INTEGERS_H
 #define CVC4__BOUNDED_INTEGERS_H
 
-#include "theory/quantifiers/quant_util.h"
+#include "theory/quantifiers/quant_module.h"
 
 #include "context/cdhashmap.h"
 #include "context/context.h"
index 428c435df29f2a7c6706dce827c5312c7cd925ce..1c0a74013330e00dc5d3a80e208507dc5dc9e0bc 100644 (file)
@@ -21,7 +21,6 @@
 #include "theory/quantifiers/quant_rep_bound_ext.h"
 #include "theory/quantifiers/quantifiers_attributes.h"
 #include "theory/quantifiers/term_database.h"
-#include "theory/quantifiers/term_util.h"
 #include "theory/quantifiers_engine.h"
 
 using namespace std;
@@ -268,7 +267,8 @@ void ModelEngine::exhaustiveInstantiate( Node f, int effort ){
     if( Trace.isOn("fmf-exh-inst-debug") ){
       Trace("fmf-exh-inst-debug") << "   Instantiation Constants: ";
       for( size_t i=0; i<f[0].getNumChildren(); i++ ){
-        Trace("fmf-exh-inst-debug") << d_quantEngine->getTermUtil()->getInstantiationConstant( f, i ) << " ";
+        Trace("fmf-exh-inst-debug")
+            << d_qreg.getInstantiationConstant(f, i) << " ";
       }
       Trace("fmf-exh-inst-debug") << std::endl;
     }
index 1cb780dd05794618270018f57ec9fd4a7d32f0c1..b3006cad165368a9f262392e9cd51f2fc1a651be 100644 (file)
@@ -18,7 +18,7 @@
 #define CVC4__THEORY__QUANTIFIERS__MODEL_ENGINE_H
 
 #include "theory/quantifiers/fmf/model_builder.h"
-#include "theory/quantifiers/quant_util.h"
+#include "theory/quantifiers/quant_module.h"
 #include "theory/theory_model.h"
 
 namespace CVC4 {
index 5d6779406b2ed11a3dedd8171a4d487690e64dff..96e8a40bedeb94cfa4e938e3bf4ec0cc8ff3bfdd 100644 (file)
@@ -15,7 +15,6 @@
 #include "theory/quantifiers/inst_match.h"
 
 #include "theory/quantifiers/instantiate.h"
-#include "theory/quantifiers/quant_util.h"
 #include "theory/quantifiers/term_database.h"
 #include "theory/quantifiers_engine.h"
 
index 35c43d740f6b81cef5440c57640ecd652f55f703..1c606998af81460cbad6b3a9b092a2b72f416cdc 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "context/context.h"
 #include "context/context_mm.h"
-#include "theory/quantifiers/quant_util.h"
+#include "theory/quantifiers/quant_module.h"
 #include "theory/quantifiers/relevant_domain.h"
 
 namespace CVC4 {
index b4fed5b1310f320a9e3a8ab9f0843101033e1e37..729dd61005dea4dc988cd3ec618081f5c576bc05 100644 (file)
@@ -39,13 +39,14 @@ namespace quantifiers {
 Instantiate::Instantiate(QuantifiersEngine* qe,
                          QuantifiersState& qs,
                          QuantifiersInferenceManager& qim,
+                         QuantifiersRegistry& qr,
                          ProofNodeManager* pnm)
     : d_qe(qe),
       d_qstate(qs),
       d_qim(qim),
+      d_qreg(qr),
       d_pnm(pnm),
       d_term_db(nullptr),
-      d_term_util(nullptr),
       d_total_inst_debug(qs.getUserContext()),
       d_c_inst_match_trie_dom(qs.getUserContext()),
       d_pfInst(pnm ? new CDProof(pnm) : nullptr)
@@ -75,7 +76,6 @@ bool Instantiate::reset(Theory::Effort e)
     d_recorded_inst.clear();
   }
   d_term_db = d_qe->getTermDatabase();
-  d_term_util = d_qe->getTermUtil();
   return true;
 }
 
@@ -111,7 +111,6 @@ bool Instantiate::addInstantiation(
   Assert(!d_qstate.isInConflict());
   Assert(terms.size() == q[0].getNumChildren());
   Assert(d_term_db != nullptr);
-  Assert(d_term_util != nullptr);
   Trace("inst-add-debug") << "For quantified formula " << q
                           << ", add instantiation: " << std::endl;
   for (unsigned i = 0, size = terms.size(); i < size; i++)
@@ -167,7 +166,7 @@ bool Instantiate::addInstantiation(
                         << terms[i] << std::endl;
           bad_inst = true;
         }
-        else if (expr::hasSubterm(terms[i], d_term_util->d_inst_constants[q]))
+        else if (expr::hasSubterm(terms[i], d_qreg.d_inst_constants[q]))
         {
           Trace("inst") << "***& inst contains inst constants : " << terms[i]
                         << std::endl;
@@ -250,10 +249,9 @@ bool Instantiate::addInstantiation(
 
   // construct the instantiation
   Trace("inst-add-debug") << "Constructing instantiation..." << std::endl;
-  Assert(d_term_util->d_vars[q].size() == terms.size());
+  Assert(d_qreg.d_vars[q].size() == terms.size());
   // get the instantiation
-  Node body =
-      getInstantiation(q, d_term_util->d_vars[q], terms, doVts, pfTmp.get());
+  Node body = getInstantiation(q, d_qreg.d_vars[q], terms, doVts, pfTmp.get());
   Node orig_body = body;
   // now preprocess, storing the trust node for the rewrite
   TrustNode tpBody = quantifiers::QuantifiersRewriter::preprocess(body, true);
@@ -466,15 +464,15 @@ Node Instantiate::getInstantiation(Node q,
 
 Node Instantiate::getInstantiation(Node q, InstMatch& m, bool doVts)
 {
-  Assert(d_term_util->d_vars.find(q) != d_term_util->d_vars.end());
+  Assert(d_qreg.d_vars.find(q) != d_qreg.d_vars.end());
   Assert(m.d_vals.size() == q[0].getNumChildren());
-  return getInstantiation(q, d_term_util->d_vars[q], m.d_vals, doVts);
+  return getInstantiation(q, d_qreg.d_vars[q], m.d_vals, doVts);
 }
 
 Node Instantiate::getInstantiation(Node q, std::vector<Node>& terms, bool doVts)
 {
-  Assert(d_term_util->d_vars.find(q) != d_term_util->d_vars.end());
-  return getInstantiation(q, d_term_util->d_vars[q], terms, doVts);
+  Assert(d_qreg.d_vars.find(q) != d_qreg.d_vars.end());
+  return getInstantiation(q, d_qreg.d_vars[q], terms, doVts);
 }
 
 bool Instantiate::recordInstantiationInternal(Node q,
index aad1762c54463a092f2185a871dcd93fddcf6fc8..4188311ec32dd50699ef99de0ec0737017db57ee 100644 (file)
@@ -33,7 +33,9 @@ class QuantifiersEngine;
 namespace quantifiers {
 
 class TermDb;
-class TermUtil;
+class QuantifiersState;
+class QuantifiersInferenceManager;
+class QuantifiersRegistry;
 
 /** Instantiation rewriter
  *
@@ -91,6 +93,7 @@ class Instantiate : public QuantifiersUtil
   Instantiate(QuantifiersEngine* qe,
               QuantifiersState& qs,
               QuantifiersInferenceManager& qim,
+              QuantifiersRegistry& qr,
               ProofNodeManager* pnm = nullptr);
   ~Instantiate();
 
@@ -293,12 +296,12 @@ class Instantiate : public QuantifiersUtil
   QuantifiersState& d_qstate;
   /** Reference to the quantifiers inference manager */
   QuantifiersInferenceManager& d_qim;
+  /** The quantifiers registry */
+  QuantifiersRegistry& d_qreg;
   /** pointer to the proof node manager */
   ProofNodeManager* d_pnm;
   /** cache of term database for quantifiers engine */
   TermDb* d_term_db;
-  /** cache of term util for quantifiers engine */
-  TermUtil* d_term_util;
   /** instantiation rewriter classes */
   std::vector<InstantiationRewriter*> d_instRewrite;
 
index 0829ccd9ca9c2ae37e07323a5809efd791bd90e2..f89f9f0ea4cc23febbf9d94cfa9aadc9bcfc31bd 100644 (file)
@@ -628,8 +628,8 @@ bool QuantInfo::isTConstraintSpurious(QuantConflictFind* p,
     //check constraints
     for( std::map< Node, bool >::iterator it = d_tconstraints.begin(); it != d_tconstraints.end(); ++it ){
       //apply substitution to the tconstraint
-      Node cons =
-          p->getTermUtil()->substituteBoundVariables(it->first, d_q, terms);
+      Node cons = p->getQuantifiersRegistry().substituteBoundVariables(
+          it->first, d_q, terms);
       cons = it->second ? cons : cons.negate();
       if (!entailmentTest(p, cons, p->atConflictEffort())) {
         return true;
index 086d492f43c9a096b0cfe27e58d6134fa9ed7589..aea03984c5959ccaa5bf4dd1a6bfbf46377cd0fd 100644 (file)
@@ -23,7 +23,7 @@
 #include "context/cdhashmap.h"
 #include "context/cdlist.h"
 #include "expr/node_trie.h"
-#include "theory/quantifiers/quant_util.h"
+#include "theory/quantifiers/quant_module.h"
 
 namespace CVC4 {
 namespace theory {
diff --git a/src/theory/quantifiers/quant_module.cpp b/src/theory/quantifiers/quant_module.cpp
new file mode 100644 (file)
index 0000000..1d2da7e
--- /dev/null
@@ -0,0 +1,92 @@
+/*********************                                                        */
+/*! \file quant_module.cpp
+ ** \verbatim
+ ** Top contributors (to current version):
+ **   Andrew Reynolds, Morgan Deters
+ ** This file is part of the CVC4 project.
+ ** Copyright (c) 2009-2020 by the authors listed in the file AUTHORS
+ ** in the top-level source directory and their institutional affiliations.
+ ** All rights reserved.  See the file COPYING in the top-level source
+ ** directory for licensing information.\endverbatim
+ **
+ ** \brief Implementation of quantifier module
+ **/
+
+#include "theory/quantifiers/quant_module.h"
+#include "theory/quantifiers/inst_match.h"
+#include "theory/quantifiers/term_database.h"
+#include "theory/quantifiers/term_util.h"
+#include "theory/quantifiers_engine.h"
+
+using namespace CVC4::kind;
+
+namespace CVC4 {
+namespace theory {
+
+QuantifiersModule::QuantifiersModule(
+    quantifiers::QuantifiersState& qs,
+    quantifiers::QuantifiersInferenceManager& qim,
+    quantifiers::QuantifiersRegistry& qr,
+    QuantifiersEngine* qe)
+    : d_quantEngine(qe), d_qstate(qs), d_qim(qim), d_qreg(qr)
+{
+}
+
+QuantifiersModule::QEffort QuantifiersModule::needsModel(Theory::Effort e)
+{
+  return QEFFORT_NONE;
+}
+
+eq::EqualityEngine* QuantifiersModule::getEqualityEngine() const
+{
+  return d_qstate.getEqualityEngine();
+}
+
+bool QuantifiersModule::areEqual(TNode n1, TNode n2) const
+{
+  return d_qstate.areEqual(n1, n2);
+}
+
+bool QuantifiersModule::areDisequal(TNode n1, TNode n2) const
+{
+  return d_qstate.areDisequal(n1, n2);
+}
+
+TNode QuantifiersModule::getRepresentative(TNode n) const
+{
+  return d_qstate.getRepresentative(n);
+}
+
+QuantifiersEngine* QuantifiersModule::getQuantifiersEngine() const
+{
+  return d_quantEngine;
+}
+
+quantifiers::TermDb* QuantifiersModule::getTermDatabase() const
+{
+  return d_quantEngine->getTermDatabase();
+}
+
+quantifiers::TermUtil* QuantifiersModule::getTermUtil() const
+{
+  return d_quantEngine->getTermUtil();
+}
+
+quantifiers::QuantifiersState& QuantifiersModule::getState()
+{
+  return d_qstate;
+}
+
+quantifiers::QuantifiersInferenceManager&
+QuantifiersModule::getInferenceManager()
+{
+  return d_qim;
+}
+
+quantifiers::QuantifiersRegistry& QuantifiersModule::getQuantifiersRegistry()
+{
+  return d_qreg;
+}
+
+}  // namespace theory
+} /* namespace CVC4 */
diff --git a/src/theory/quantifiers/quant_module.h b/src/theory/quantifiers/quant_module.h
new file mode 100644 (file)
index 0000000..4d04814
--- /dev/null
@@ -0,0 +1,186 @@
+/*********************                                                        */
+/*! \file quant_module.h
+ ** \verbatim
+ ** Top contributors (to current version):
+ **   Andrew Reynolds, Morgan Deters, Mathias Preiner
+ ** This file is part of the CVC4 project.
+ ** Copyright (c) 2009-2020 by the authors listed in the file AUTHORS
+ ** in the top-level source directory and their institutional affiliations.
+ ** All rights reserved.  See the file COPYING in the top-level source
+ ** directory for licensing information.\endverbatim
+ **
+ ** \brief quantifier module
+ **/
+
+#include "cvc4_private.h"
+
+#ifndef CVC4__THEORY__QUANT_MODULE_H
+#define CVC4__THEORY__QUANT_MODULE_H
+
+#include <iostream>
+#include <map>
+#include <vector>
+
+#include "theory/quantifiers/quantifiers_inference_manager.h"
+#include "theory/quantifiers/quantifiers_registry.h"
+#include "theory/quantifiers/quantifiers_state.h"
+#include "theory/theory.h"
+#include "theory/uf/equality_engine.h"
+
+namespace CVC4 {
+namespace theory {
+
+class QuantifiersEngine;
+
+namespace quantifiers {
+class TermDb;
+class TermUtil;
+}  // namespace quantifiers
+
+/** QuantifiersModule class
+ *
+ * This is the virtual class for defining subsolvers of the quantifiers theory.
+ * It has a similar interface to a Theory object.
+ */
+class QuantifiersModule
+{
+ public:
+  /** effort levels for quantifiers modules check */
+  enum QEffort
+  {
+    // conflict effort, for conflict-based instantiation
+    QEFFORT_CONFLICT,
+    // standard effort, for heuristic instantiation
+    QEFFORT_STANDARD,
+    // model effort, for model-based instantiation
+    QEFFORT_MODEL,
+    // last call effort, for last resort techniques
+    QEFFORT_LAST_CALL,
+    // none
+    QEFFORT_NONE,
+  };
+
+ public:
+  QuantifiersModule(quantifiers::QuantifiersState& qs,
+                    quantifiers::QuantifiersInferenceManager& qim,
+                    quantifiers::QuantifiersRegistry& qr,
+                    QuantifiersEngine* qe);
+  virtual ~QuantifiersModule() {}
+  /** Presolve.
+   *
+   * Called at the beginning of check-sat call.
+   */
+  virtual void presolve() {}
+  /** Needs check.
+   *
+   * Returns true if this module wishes a call to be made
+   * to check(e) during QuantifiersEngine::check(e).
+   */
+  virtual bool needsCheck(Theory::Effort e)
+  {
+    return e >= Theory::EFFORT_LAST_CALL;
+  }
+  /** Needs model.
+   *
+   * Whether this module needs a model built during a
+   * call to QuantifiersEngine::check(e)
+   * It returns one of QEFFORT_* from quantifiers_engine.h,
+   * which specifies the quantifiers effort in which it requires the model to
+   * be built.
+   */
+  virtual QEffort needsModel(Theory::Effort e);
+  /** Reset.
+   *
+   * Called at the beginning of QuantifiersEngine::check(e).
+   */
+  virtual void reset_round(Theory::Effort e) {}
+  /** Check.
+   *
+   *   Called during QuantifiersEngine::check(e) depending
+   *   if needsCheck(e) returns true.
+   */
+  virtual void check(Theory::Effort e, QEffort quant_e) = 0;
+  /** Check complete?
+   *
+   * Returns false if the module's reasoning was globally incomplete
+   * (e.g. "sat" must be replaced with "incomplete").
+   *
+   * This is called just before the quantifiers engine will return
+   * with no lemmas added during a LAST_CALL effort check.
+   */
+  virtual bool checkComplete() { return true; }
+  /** Check was complete for quantified formula q
+   *
+   * If for each quantified formula q, some module returns true for
+   * checkCompleteFor( q ),
+   * and no lemmas are added by the quantifiers theory, then we may answer
+   * "sat", unless
+   * we are incomplete for other reasons.
+   */
+  virtual bool checkCompleteFor(Node q) { return false; }
+  /** Check ownership
+   *
+   * Called once for new quantified formulas that are registered by the
+   * quantifiers theory. The primary purpose of this function is to establish
+   * if this module is the owner of quantified formula q.
+   */
+  virtual void checkOwnership(Node q) {}
+  /** Register quantifier
+   *
+   * Called once for new quantified formulas q that are pre-registered by the
+   * quantifiers theory, after internal ownership of quantified formulas is
+   * finalized. This does context-independent initialization of this module
+   * for quantified formula q.
+   */
+  virtual void registerQuantifier(Node q) {}
+  /** Pre-register quantifier
+   *
+   * Called once for new quantified formulas that are
+   * pre-registered by the quantifiers theory, after
+   * internal ownership of quantified formulas is finalized.
+   */
+  virtual void preRegisterQuantifier(Node q) {}
+  /** Assert node.
+   *
+   * Called when a quantified formula q is asserted to the quantifiers theory
+   */
+  virtual void assertNode(Node q) {}
+  /** Identify this module (for debugging, dynamic configuration, etc..) */
+  virtual std::string identify() const = 0;
+  //----------------------------general queries
+  /** get currently used the equality engine */
+  eq::EqualityEngine* getEqualityEngine() const;
+  /** are n1 and n2 equal in the current used equality engine? */
+  bool areEqual(TNode n1, TNode n2) const;
+  /** are n1 and n2 disequal in the current used equality engine? */
+  bool areDisequal(TNode n1, TNode n2) const;
+  /** get the representative of n in the current used equality engine */
+  TNode getRepresentative(TNode n) const;
+  /** get quantifiers engine that owns this module */
+  QuantifiersEngine* getQuantifiersEngine() const;
+  /** get currently used term database */
+  quantifiers::TermDb* getTermDatabase() const;
+  /** get currently used term utility object */
+  quantifiers::TermUtil* getTermUtil() const;
+  /** get the quantifiers state */
+  quantifiers::QuantifiersState& getState();
+  /** get the quantifiers inference manager */
+  quantifiers::QuantifiersInferenceManager& getInferenceManager();
+  /** get the quantifiers registry */
+  quantifiers::QuantifiersRegistry& getQuantifiersRegistry();
+  //----------------------------end general queries
+ protected:
+  /** pointer to the quantifiers engine that owns this module */
+  QuantifiersEngine* d_quantEngine;
+  /** The state of the quantifiers engine */
+  quantifiers::QuantifiersState& d_qstate;
+  /** The quantifiers inference manager */
+  quantifiers::QuantifiersInferenceManager& d_qim;
+  /** The quantifiers registry */
+  quantifiers::QuantifiersRegistry& d_qreg;
+}; /* class QuantifiersModule */
+
+}  // namespace theory
+}  // namespace CVC4
+
+#endif /* CVC4__THEORY__QUANT_UTIL_H */
index 8fb9b4eb6924c7edea6eaddcca7957ad8bc13601..a51575f937d431f986bf1a16dbeff96341c38527 100644 (file)
@@ -18,7 +18,7 @@
 #define CVC4__THEORY__QUANT_SPLIT_H
 
 #include "context/cdo.h"
-#include "theory/quantifiers/quant_util.h"
+#include "theory/quantifiers/quant_module.h"
 
 namespace CVC4 {
 namespace theory {
index db643d96bb0c7367d630fdcffab39aac253b6c4d..7516ea529e736fca898d65d8b7730e8c34e1090c 100644 (file)
  **/
 
 #include "theory/quantifiers/quant_util.h"
-#include "theory/quantifiers/inst_match.h"
-#include "theory/quantifiers/term_database.h"
+
 #include "theory/quantifiers/term_util.h"
-#include "theory/quantifiers_engine.h"
 
 using namespace CVC4::kind;
 
 namespace CVC4 {
 namespace theory {
 
-QuantifiersModule::QuantifiersModule(
-    quantifiers::QuantifiersState& qs,
-    quantifiers::QuantifiersInferenceManager& qim,
-    quantifiers::QuantifiersRegistry& qr,
-    QuantifiersEngine* qe)
-    : d_quantEngine(qe), d_qstate(qs), d_qim(qim), d_qreg(qr)
-{
-}
-
-QuantifiersModule::QEffort QuantifiersModule::needsModel(Theory::Effort e)
-{
-  return QEFFORT_NONE;
-}
-
-eq::EqualityEngine* QuantifiersModule::getEqualityEngine() const
-{
-  return d_qstate.getEqualityEngine();
-}
-
-bool QuantifiersModule::areEqual(TNode n1, TNode n2) const
-{
-  return d_qstate.areEqual(n1, n2);
-}
-
-bool QuantifiersModule::areDisequal(TNode n1, TNode n2) const
-{
-  return d_qstate.areDisequal(n1, n2);
-}
-
-TNode QuantifiersModule::getRepresentative(TNode n) const
-{
-  return d_qstate.getRepresentative(n);
-}
-
-QuantifiersEngine* QuantifiersModule::getQuantifiersEngine() const
-{
-  return d_quantEngine;
-}
-
-quantifiers::TermDb* QuantifiersModule::getTermDatabase() const
-{
-  return d_quantEngine->getTermDatabase();
-}
-
-quantifiers::TermUtil* QuantifiersModule::getTermUtil() const
-{
-  return d_quantEngine->getTermUtil();
-}
-
-quantifiers::QuantifiersState& QuantifiersModule::getState()
-{
-  return d_qstate;
-}
-
-quantifiers::QuantifiersInferenceManager&
-QuantifiersModule::getInferenceManager()
-{
-  return d_qim;
-}
-
 QuantPhaseReq::QuantPhaseReq( Node n, bool computeEq ){
   initialize( n, computeEq );
 }
index 551143e405d3ca97d6f399741c6e11b90268ad06..e0cb11712426c5d9ab4949fb3280c4ae8380beb1 100644 (file)
 #include <map>
 #include <vector>
 
-#include "theory/quantifiers/quantifiers_inference_manager.h"
-#include "theory/quantifiers/quantifiers_registry.h"
-#include "theory/quantifiers/quantifiers_state.h"
+#include "expr/node.h"
 #include "theory/theory.h"
-#include "theory/uf/equality_engine.h"
 
 namespace CVC4 {
 namespace theory {
 
-class QuantifiersEngine;
-
-namespace quantifiers {
-  class TermDb;
-  class TermUtil;
-}
-
-/** QuantifiersModule class
-*
-* This is the virtual class for defining subsolvers of the quantifiers theory.
-* It has a similar interface to a Theory object.
-*/
-class QuantifiersModule {
- public:
-  /** effort levels for quantifiers modules check */
-  enum QEffort
-  {
-    // conflict effort, for conflict-based instantiation
-    QEFFORT_CONFLICT,
-    // standard effort, for heuristic instantiation
-    QEFFORT_STANDARD,
-    // model effort, for model-based instantiation
-    QEFFORT_MODEL,
-    // last call effort, for last resort techniques
-    QEFFORT_LAST_CALL,
-    // none
-    QEFFORT_NONE,
-  };
-
- public:
-  QuantifiersModule(quantifiers::QuantifiersState& qs,
-                    quantifiers::QuantifiersInferenceManager& qim,
-                    quantifiers::QuantifiersRegistry& qr,
-                    QuantifiersEngine* qe);
-  virtual ~QuantifiersModule(){}
-  /** Presolve.
-   *
-   * Called at the beginning of check-sat call.
-   */
-  virtual void presolve() {}
-  /** Needs check.
-   *
-   * Returns true if this module wishes a call to be made
-   * to check(e) during QuantifiersEngine::check(e).
-   */
-  virtual bool needsCheck( Theory::Effort e ) { return e>=Theory::EFFORT_LAST_CALL; }
-  /** Needs model.
-   *
-   * Whether this module needs a model built during a
-   * call to QuantifiersEngine::check(e)
-   * It returns one of QEFFORT_* from quantifiers_engine.h,
-   * which specifies the quantifiers effort in which it requires the model to
-   * be built.
-   */
-  virtual QEffort needsModel(Theory::Effort e);
-  /** Reset.
-   *
-   * Called at the beginning of QuantifiersEngine::check(e).
-   */
-  virtual void reset_round( Theory::Effort e ){}
-  /** Check.
-   *
-   *   Called during QuantifiersEngine::check(e) depending
-   *   if needsCheck(e) returns true.
-   */
-  virtual void check(Theory::Effort e, QEffort quant_e) = 0;
-  /** Check complete?
-   *
-   * Returns false if the module's reasoning was globally incomplete
-   * (e.g. "sat" must be replaced with "incomplete").
-   *
-   * This is called just before the quantifiers engine will return
-   * with no lemmas added during a LAST_CALL effort check.
-   */
-  virtual bool checkComplete() { return true; }
-  /** Check was complete for quantified formula q
-   *
-   * If for each quantified formula q, some module returns true for
-   * checkCompleteFor( q ),
-   * and no lemmas are added by the quantifiers theory, then we may answer
-   * "sat", unless
-   * we are incomplete for other reasons.
-   */
-  virtual bool checkCompleteFor( Node q ) { return false; }
-  /** Check ownership
-   *
-   * Called once for new quantified formulas that are registered by the
-   * quantifiers theory. The primary purpose of this function is to establish
-   * if this module is the owner of quantified formula q.
-   */
-  virtual void checkOwnership(Node q) {}
-  /** Register quantifier
-   *
-   * Called once for new quantified formulas q that are pre-registered by the
-   * quantifiers theory, after internal ownership of quantified formulas is
-   * finalized. This does context-independent initialization of this module
-   * for quantified formula q.
-   */
-  virtual void registerQuantifier(Node q) {}
-  /** Pre-register quantifier
-   *
-   * Called once for new quantified formulas that are
-   * pre-registered by the quantifiers theory, after
-   * internal ownership of quantified formulas is finalized.
-   */
-  virtual void preRegisterQuantifier(Node q) {}
-  /** Assert node.
-   *
-   * Called when a quantified formula q is asserted to the quantifiers theory
-   */
-  virtual void assertNode(Node q) {}
-  /** Identify this module (for debugging, dynamic configuration, etc..) */
-  virtual std::string identify() const = 0;
-  //----------------------------general queries
-  /** get currently used the equality engine */
-  eq::EqualityEngine* getEqualityEngine() const;
-  /** are n1 and n2 equal in the current used equality engine? */
-  bool areEqual(TNode n1, TNode n2) const;
-  /** are n1 and n2 disequal in the current used equality engine? */
-  bool areDisequal(TNode n1, TNode n2) const;
-  /** get the representative of n in the current used equality engine */
-  TNode getRepresentative(TNode n) const;
-  /** get quantifiers engine that owns this module */
-  QuantifiersEngine* getQuantifiersEngine() const;
-  /** get currently used term database */
-  quantifiers::TermDb* getTermDatabase() const;
-  /** get currently used term utility object */
-  quantifiers::TermUtil* getTermUtil() const;
-  /** get the quantifiers state */
-  quantifiers::QuantifiersState& getState();
-  /** get the quantifiers inference manager */
-  quantifiers::QuantifiersInferenceManager& getInferenceManager();
-  //----------------------------end general queries
- protected:
-  /** pointer to the quantifiers engine that owns this module */
-  QuantifiersEngine* d_quantEngine;
-  /** The state of the quantifiers engine */
-  quantifiers::QuantifiersState& d_qstate;
-  /** The quantifiers inference manager */
-  quantifiers::QuantifiersInferenceManager& d_qim;
-  /** The quantifiers registry */
-  quantifiers::QuantifiersRegistry& d_qreg;
-};/* class QuantifiersModule */
-
 /** Quantifiers utility
-*
-* This is a lightweight version of a quantifiers module that does not implement
-* methods
-* for checking satisfiability.
-*/
+ *
+ * This is a lightweight version of a quantifiers module that does not implement
+ * methods for checking satisfiability.
+ */
 class QuantifiersUtil {
 public:
   QuantifiersUtil(){}
index f1a05f401d50834a2697269f96c8a28c54624ad0..74f553800550f0f880cc25ac555e5bcc2c2ab0c7 100644 (file)
@@ -93,7 +93,7 @@ void QuantifiersModules::initialize(QuantifiersEngine* qe,
   // full saturation : instantiate from relevant domain, then arbitrary terms
   if (options::fullSaturateQuant() || options::fullSaturateInterleave())
   {
-    d_rel_dom.reset(new RelevantDomain(qe));
+    d_rel_dom.reset(new RelevantDomain(qe, qr));
     d_fs.reset(new InstStrategyEnum(qe, qs, qim, qr, d_rel_dom.get()));
     modules.push_back(d_fs.get());
   }
index 1633382c825a5969183d620ade8c1dcce7e19ebc..e6d4c75fec71847fe940a11377b86250285a985b 100644 (file)
 
 #include "theory/quantifiers/quantifiers_registry.h"
 
-#include "theory/quantifiers/quant_util.h"
+#include "theory/quantifiers/quant_module.h"
+#include "theory/quantifiers/term_util.h"
 
 namespace CVC4 {
 namespace theory {
 namespace quantifiers {
 
+void QuantifiersRegistry::registerQuantifier(Node q)
+{
+  if (d_inst_constants.find(q) != d_inst_constants.end())
+  {
+    return;
+  }
+  NodeManager* nm = NodeManager::currentNM();
+  Debug("quantifiers-engine")
+      << "Instantiation constants for " << q << " : " << std::endl;
+  for (size_t i = 0, nvars = q[0].getNumChildren(); i < nvars; i++)
+  {
+    d_vars[q].push_back(q[0][i]);
+    // make instantiation constants
+    Node ic = nm->mkInstConstant(q[0][i].getType());
+    d_inst_constants_map[ic] = q;
+    d_inst_constants[q].push_back(ic);
+    Debug("quantifiers-engine") << "  " << ic << std::endl;
+    // set the var number attribute
+    InstVarNumAttribute ivna;
+    ic.setAttribute(ivna, i);
+    InstConstantAttribute ica;
+    ic.setAttribute(ica, q);
+  }
+}
+
+bool QuantifiersRegistry::reset(Theory::Effort e) { return true; }
+
+std::string QuantifiersRegistry::identify() const
+{
+  return "QuantifiersRegistry";
+}
+
 QuantifiersModule* QuantifiersRegistry::getOwner(Node q) const
 {
   std::map<Node, QuantifiersModule*>::const_iterator it = d_owner.find(q);
@@ -60,6 +93,82 @@ bool QuantifiersRegistry::hasOwnership(Node q, QuantifiersModule* m) const
   return mo == m || mo == nullptr;
 }
 
+Node QuantifiersRegistry::getInstantiationConstant(Node q, size_t i) const
+{
+  std::map<Node, std::vector<Node> >::const_iterator it =
+      d_inst_constants.find(q);
+  if (it != d_inst_constants.end())
+  {
+    return it->second[i];
+  }
+  return Node::null();
+}
+
+size_t QuantifiersRegistry::getNumInstantiationConstants(Node q) const
+{
+  std::map<Node, std::vector<Node> >::const_iterator it =
+      d_inst_constants.find(q);
+  if (it != d_inst_constants.end())
+  {
+    return it->second.size();
+  }
+  return 0;
+}
+
+Node QuantifiersRegistry::getInstConstantBody(Node q)
+{
+  std::map<Node, Node>::const_iterator it = d_inst_const_body.find(q);
+  if (it == d_inst_const_body.end())
+  {
+    Node n = substituteBoundVariablesToInstConstants(q[1], q);
+    d_inst_const_body[q] = n;
+    return n;
+  }
+  return it->second;
+}
+
+Node QuantifiersRegistry::substituteBoundVariablesToInstConstants(Node n,
+                                                                  Node q)
+{
+  registerQuantifier(q);
+  return n.substitute(d_vars[q].begin(),
+                      d_vars[q].end(),
+                      d_inst_constants[q].begin(),
+                      d_inst_constants[q].end());
+}
+
+Node QuantifiersRegistry::substituteInstConstantsToBoundVariables(Node n,
+                                                                  Node q)
+{
+  registerQuantifier(q);
+  return n.substitute(d_inst_constants[q].begin(),
+                      d_inst_constants[q].end(),
+                      d_vars[q].begin(),
+                      d_vars[q].end());
+}
+
+Node QuantifiersRegistry::substituteBoundVariables(Node n,
+                                                   Node q,
+                                                   std::vector<Node>& terms)
+{
+  registerQuantifier(q);
+  Assert(d_vars[q].size() == terms.size());
+  return n.substitute(
+      d_vars[q].begin(), d_vars[q].end(), terms.begin(), terms.end());
+}
+
+Node QuantifiersRegistry::substituteInstConstants(Node n,
+                                                  Node q,
+                                                  std::vector<Node>& terms)
+{
+  registerQuantifier(q);
+  Assert(d_inst_constants[q].size() == terms.size());
+  return n.substitute(d_inst_constants[q].begin(),
+                      d_inst_constants[q].end(),
+                      terms.begin(),
+                      terms.end());
+}
+
 }  // namespace quantifiers
 }  // namespace theory
 }  // namespace CVC4
index 59db1dfe2dbd0d50dd8f83c25349a28ac07edbf1..b89a2c01b3a0436d199232ecfa2d39ba6b8d2d42 100644 (file)
@@ -18,6 +18,7 @@
 #define CVC4__THEORY__QUANTIFIERS__QUANTIFIERS_REGISTRY_H
 
 #include "expr/node.h"
+#include "theory/quantifiers/quant_util.h"
 
 namespace CVC4 {
 namespace theory {
@@ -26,15 +27,29 @@ class QuantifiersModule;
 
 namespace quantifiers {
 
+class Instantiate;
+
 /**
  * The quantifiers registry, which manages basic information about which
- * quantifiers modules have ownership of quantified formulas.
+ * quantifiers modules have ownership of quantified formulas, and manages
+ * the allocation of instantiation constants per quantified formula.
  */
-class QuantifiersRegistry
+class QuantifiersRegistry : public QuantifiersUtil
 {
+  friend class Instantiate;
+
  public:
   QuantifiersRegistry() {}
   ~QuantifiersRegistry() {}
+  /**
+   * Register quantifier, which allocates the instantiation constants for q.
+   */
+  void registerQuantifier(Node q) override;
+  /** reset */
+  bool reset(Theory::Effort e) override;
+  /** identify */
+  std::string identify() const override;
+  //----------------------------- ownership
   /** get the owner of quantified formula q */
   QuantifiersModule* getOwner(Node q) const;
   /**
@@ -47,7 +62,28 @@ class QuantifiersRegistry
    * Return true if module q has no owner registered or if its registered owner is m.
    */
   bool hasOwnership(Node q, QuantifiersModule* m) const;
-
+  //----------------------------- end ownership
+  //----------------------------- instantiation constants
+  /** get the i^th instantiation constant of q */
+  Node getInstantiationConstant(Node q, size_t i) const;
+  /** get number of instantiation constants for q */
+  size_t getNumInstantiationConstants(Node q) const;
+  /** get the ce body q[e/x] */
+  Node getInstConstantBody(Node q);
+  /** returns node n with bound vars of q replaced by instantiation constants of
+     q node n : is the future pattern node q : is the quantifier containing
+     which bind the variable return a pattern where the variable are replaced by
+     variable for instantiation.
+   */
+  Node substituteBoundVariablesToInstConstants(Node n, Node q);
+  /** substitute { instantiation constants of q -> bound variables of q } in n
+   */
+  Node substituteInstConstantsToBoundVariables(Node n, Node q);
+  /** substitute { variables of q -> terms } in n */
+  Node substituteBoundVariables(Node n, Node q, std::vector<Node>& terms);
+  /** substitute { instantiation constants of q -> terms } in n */
+  Node substituteInstConstants(Node n, Node q, std::vector<Node>& terms);
+  //----------------------------- end instantiation constants
  private:
   /**
    * Maps quantified formulas to the module that owns them, if any module has
@@ -60,6 +96,14 @@ class QuantifiersRegistry
    * precendence.
    */
   std::map<Node, int32_t> d_owner_priority;
+  /** map from universal quantifiers to the list of variables */
+  std::map<Node, std::vector<Node> > d_vars;
+  /** map from universal quantifiers to their inst constant body */
+  std::map<Node, Node> d_inst_const_body;
+  /** instantiation constants to universal quantifiers */
+  std::map<Node, Node> d_inst_constants_map;
+  /** map from universal quantifiers to the list of instantiation constants */
+  std::map<Node, std::vector<Node> > d_inst_constants;
 };
 
 }  // namespace quantifiers
index 1743cafe50161485332eadb8e58878fb0bce371f..3cef2884fa7d10f688a7c1e9567acb18e66bbcd5 100644 (file)
@@ -69,10 +69,10 @@ void RelevantDomain::RDomain::removeRedundantTerms(QuantifiersState& qs)
   }
 }
 
-
-
-RelevantDomain::RelevantDomain( QuantifiersEngine* qe ) : d_qe( qe ){
-   d_is_computed = false;
+RelevantDomain::RelevantDomain(QuantifiersEngine* qe, QuantifiersRegistry& qr)
+    : d_qe(qe), d_qreg(qr)
+{
+  d_is_computed = false;
 }
 
 RelevantDomain::~RelevantDomain() {
@@ -111,7 +111,7 @@ void RelevantDomain::compute(){
     FirstOrderModel* fm = d_qe->getModel();
     for( unsigned i=0; i<fm->getNumAssertedQuantifiers(); i++ ){
       Node q = fm->getAssertedQuantifier( i );
-      Node icf = d_qe->getTermUtil()->getInstConstantBody( q );
+      Node icf = d_qreg.getInstConstantBody(q);
       Trace("rel-dom-debug") << "compute relevant domain for " << icf << std::endl;
       computeRelevantDomain( q, icf, true, true );
     }
@@ -204,12 +204,13 @@ void RelevantDomain::computeRelevantDomain( Node q, Node n, bool hasPol, bool po
 
 void RelevantDomain::computeRelevantDomainOpCh( RDomain * rf, Node n ) {
   if( n.getKind()==INST_CONSTANT ){
-    Node q = d_qe->getTermUtil()->getInstConstAttr( n );
+    Node q = TermUtil::getInstConstAttr(n);
     //merge the RDomains
     unsigned id = n.getAttribute(InstVarNumAttribute());
     Assert(q[0][id].getType() == n.getType());
     Trace("rel-dom-debug") << n << " is variable # " << id << " for " << q;
-    Trace("rel-dom-debug") << " with body : " << d_qe->getTermUtil()->getInstConstantBody( q ) << std::endl;
+    Trace("rel-dom-debug") << " with body : " << d_qreg.getInstConstantBody(q)
+                           << std::endl;
     RDomain * rq = getRDomain( q, id );
     if( rf!=rq ){
       rq->merge( rf );
@@ -226,12 +227,11 @@ void RelevantDomain::computeRelevantDomainLit( Node q, bool hasPol, bool pol, No
     d_rel_dom_lit[hasPol][pol][n].d_merge = false;
     int varCount = 0;
     int varCh = -1;
-    TermUtil* tu = d_qe->getTermUtil();
     for( unsigned i=0; i<n.getNumChildren(); i++ ){
       if( n[i].getKind()==INST_CONSTANT ){
         // must get the quantified formula this belongs to, which may be
         // different from q
-        Node qi = tu->getInstConstAttr(n[i]);
+        Node qi = TermUtil::getInstConstAttr(n[i]);
         unsigned id = n[i].getAttribute(InstVarNumAttribute());
         d_rel_dom_lit[hasPol][pol][n].d_rd[i] = getRDomain(qi, id, false);
         varCount++;
@@ -262,7 +262,7 @@ void RelevantDomain::computeRelevantDomainLit( Node q, bool hasPol, bool pol, No
             bool hasNonVar = false;
             for( std::map< Node, Node >::iterator it = msum.begin(); it != msum.end(); ++it ){
               if (!it->first.isNull() && it->first.getKind() == INST_CONSTANT
-                  && tu->getInstConstAttr(it->first) == q)
+                  && TermUtil::getInstConstAttr(it->first) == q)
               {
                 if( var.isNull() ){
                   var = it->first;
index 36364191cba08fffeff218bc42696186c04550d0..68ffbefe52a6c8edb1142f20080e7d4409e826b8 100644 (file)
@@ -24,6 +24,8 @@ namespace CVC4 {
 namespace theory {
 namespace quantifiers {
 
+class QuantifiersRegistry;
+
 /** Relevant Domain
  *
  * This class computes the relevant domain of
@@ -40,7 +42,7 @@ namespace quantifiers {
 class RelevantDomain : public QuantifiersUtil
 {
  public:
-  RelevantDomain(QuantifiersEngine* qe);
+  RelevantDomain(QuantifiersEngine* qe, QuantifiersRegistry& qr);
   virtual ~RelevantDomain();
   /** Reset. */
   bool reset(Theory::Effort e) override;
@@ -117,6 +119,8 @@ class RelevantDomain : public QuantifiersUtil
   std::map< RDomain *, int > d_ri_map;
   /** Quantifiers engine associated with this utility. */
   QuantifiersEngine* d_qe;
+  /** The quantifiers registry */
+  QuantifiersRegistry& d_qreg;
   /** have we computed the relevant domain on this full effort check? */
   bool d_is_computed;
   /** relevant domain literal
index c329d924b51c8cdda49ebba6a01aaaeaf9e09e85..f1307f1425cc6ee454cbb6302d2e437277f41ad3 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "expr/node_algorithm.h"
 #include "theory/quantifiers/term_util.h"
+#include "theory/rewriter.h"
 
 using namespace CVC4;
 using namespace CVC4::kind;
index b28854baf1a73b5cdb3e4b7ad66de1dea90eb591..c959758a0a2ec03da8af4d07e74d4fd4a0970482 100644 (file)
@@ -23,7 +23,7 @@
 #include "context/cdhashmap.h"
 #include "expr/node.h"
 #include "expr/type_node.h"
-#include "theory/quantifiers/quant_util.h"
+#include "theory/eager_proof_generator.h"
 #include "theory/trust_node.h"
 
 namespace CVC4 {
@@ -31,8 +31,13 @@ namespace CVC4 {
 class DTypeConstructor;
 
 namespace theory {
+
+class QuantifiersEngine;
+
 namespace quantifiers {
 
+class QuantifiersState;
+
 /** Skolemization utility
  *
  * This class constructs Skolemization lemmas.
index 4cb73d450591e1e747b7fc376ba4818e4a4a7a68..0e0068c7bd5aac089db4700924f07b16304ea1b9 100644 (file)
@@ -19,7 +19,7 @@
 #define CVC4__THEORY__QUANTIFIERS__SYNTH_ENGINE_H
 
 #include "context/cdhashmap.h"
-#include "theory/quantifiers/quant_util.h"
+#include "theory/quantifiers/quant_module.h"
 #include "theory/quantifiers/sygus/sygus_qe_preproc.h"
 #include "theory/quantifiers/sygus/sygus_stats.h"
 #include "theory/quantifiers/sygus/synth_conjecture.h"
index 123ec1f5e13a154f3fbd3f616a9036fb099de200..3116f35e60a96f120fa6b06f707f003f2dd79fb5 100644 (file)
@@ -21,7 +21,7 @@
 #include <unordered_set>
 
 #include "context/cdhashset.h"
-#include "theory/quantifiers/quant_util.h"
+#include "theory/quantifiers/quant_module.h"
 
 namespace CVC4 {
 namespace theory {
index 61a62a820ffd32d028a8f0a027271f0b319337a5..28eb715a3a9b2f88ac2f44c75a10b587781377c7 100644 (file)
@@ -36,10 +36,12 @@ namespace quantifiers {
 
 TermDb::TermDb(QuantifiersState& qs,
                QuantifiersInferenceManager& qim,
+               QuantifiersRegistry& qr,
                QuantifiersEngine* qe)
     : d_quantEngine(qe),
       d_qstate(qs),
       d_qim(qim),
+      d_qreg(qr),
       d_termsContext(),
       d_termsContextUse(options::termDbCd() ? qs.getSatContext()
                                             : &d_termsContext),
@@ -65,10 +67,10 @@ TermDb::~TermDb(){
 }
 
 void TermDb::registerQuantifier( Node q ) {
-  Assert(q[0].getNumChildren()
-         == d_quantEngine->getTermUtil()->getNumInstantiationConstants(q));
-  for( unsigned i=0; i<q[0].getNumChildren(); i++ ){
-    Node ic = d_quantEngine->getTermUtil()->getInstantiationConstant( q, i );
+  Assert(q[0].getNumChildren() == d_qreg.getNumInstantiationConstants(q));
+  for (size_t i = 0, nvars = q[0].getNumChildren(); i < nvars; i++)
+  {
+    Node ic = d_qreg.getInstantiationConstant(q, i);
     setTermInactive( ic );
   }
 }
@@ -688,10 +690,10 @@ Node TermDb::evaluateTerm2(TNode n,
         {
           if (ret.getKind() == EQUAL || ret.getKind() == GEQ)
           {
-            TheoryEngine* te = d_quantEngine->getTheoryEngine();
+            Valuation& val = d_qstate.getValuation();
             for (unsigned j = 0; j < 2; j++)
             {
-              std::pair<bool, Node> et = te->entailmentCheck(
+              std::pair<bool, Node> et = val.entailmentCheck(
                   options::TheoryOfMode::THEORY_OF_TYPE_BASED,
                   j == 0 ? ret : ret.negate());
               if (et.first)
index b2f964a3a2f0f92912f427b8938405086178d42e..89d77e169d35bac3d906d50ff9d73fd87c7e8b33 100644 (file)
@@ -33,8 +33,9 @@ class QuantifiersEngine;
 
 namespace quantifiers {
 
-class ConjectureGenerator;
-class TermGenEnv;
+class QuantifiersState;
+class QuantifiersInferenceManager;
+class QuantifiersRegistry;
 
 /** Context-dependent list of nodes */
 class DbList
@@ -76,6 +77,7 @@ class TermDb : public QuantifiersUtil {
  public:
   TermDb(QuantifiersState& qs,
          QuantifiersInferenceManager& qim,
+         QuantifiersRegistry& qr,
          QuantifiersEngine* qe);
   ~TermDb();
   /** presolve (called once per user check-sat) */
@@ -295,6 +297,8 @@ class TermDb : public QuantifiersUtil {
   QuantifiersState& d_qstate;
   /** The quantifiers inference manager */
   QuantifiersInferenceManager& d_qim;
+  /** The quantifiers registry */
+  QuantifiersRegistry& d_qreg;
   /** A context for the data structures below, when not context-dependent */
   context::Context d_termsContext;
   /** The context we are using for the data structures below */
index b0a067630580390ebda3bff1b0139bc3420a7146..97a731fb9f8f0cc1b2515696f02bef671e785793 100644 (file)
@@ -47,24 +47,11 @@ TermUtil::~TermUtil(){
 
 }
 
-void TermUtil::registerQuantifier( Node q ){
-  if( d_inst_constants.find( q )==d_inst_constants.end() ){
-    Debug("quantifiers-engine") << "Instantiation constants for " << q << " : " << std::endl;
-    for( unsigned i=0; i<q[0].getNumChildren(); i++ ){
-      d_vars[q].push_back( q[0][i] );
-      d_var_num[q][q[0][i]] = i;
-      //make instantiation constants
-      Node ic = NodeManager::currentNM()->mkInstConstant( q[0][i].getType() );
-      d_inst_constants_map[ic] = q;
-      d_inst_constants[ q ].push_back( ic );
-      Debug("quantifiers-engine") << "  " << ic << std::endl;
-      //set the var number attribute
-      InstVarNumAttribute ivna;
-      ic.setAttribute( ivna, i );
-      InstConstantAttribute ica;
-      ic.setAttribute( ica, q );
-    }
-  }
+size_t TermUtil::getVariableNum(Node q, Node v)
+{
+  Node::iterator it = std::find(q[0].begin(), q[0].end(), v);
+  Assert(it != q[0].end());
+  return it - q[0].begin();
 }
 
 Node TermUtil::getRemoveQuantifiers2( Node n, std::map< Node, Node >& visited ) {
@@ -168,68 +155,6 @@ Node TermUtil::getQuantSimplify( Node n ) {
   return getRemoveQuantifiers(q);
 }
 
-/** get the i^th instantiation constant of q */
-Node TermUtil::getInstantiationConstant( Node q, int i ) const {
-  std::map< Node, std::vector< Node > >::const_iterator it = d_inst_constants.find( q );
-  if( it!=d_inst_constants.end() ){
-    return it->second[i];
-  }else{
-    return Node::null();
-  }
-}
-
-/** get number of instantiation constants for q */
-unsigned TermUtil::getNumInstantiationConstants( Node q ) const {
-  std::map< Node, std::vector< Node > >::const_iterator it = d_inst_constants.find( q );
-  if( it!=d_inst_constants.end() ){
-    return it->second.size();
-  }else{
-    return 0;
-  }
-}
-
-Node TermUtil::getInstConstantBody( Node q ){
-  std::map< Node, Node >::iterator it = d_inst_const_body.find( q );
-  if( it==d_inst_const_body.end() ){
-    Node n = substituteBoundVariablesToInstConstants(q[1], q);
-    d_inst_const_body[ q ] = n;
-    return n;
-  }else{
-    return it->second;
-  }
-}
-
-Node TermUtil::substituteBoundVariablesToInstConstants(Node n, Node q)
-{
-  registerQuantifier( q );
-  return n.substitute( d_vars[q].begin(), d_vars[q].end(), d_inst_constants[q].begin(), d_inst_constants[q].end() );
-}
-
-Node TermUtil::substituteInstConstantsToBoundVariables(Node n, Node q)
-{
-  registerQuantifier( q );
-  return n.substitute( d_inst_constants[q].begin(), d_inst_constants[q].end(), d_vars[q].begin(), d_vars[q].end() );
-}
-
-Node TermUtil::substituteBoundVariables(Node n,
-                                        Node q,
-                                        std::vector<Node>& terms)
-{
-  registerQuantifier(q);
-  Assert(d_vars[q].size() == terms.size());
-  return n.substitute( d_vars[q].begin(), d_vars[q].end(), terms.begin(), terms.end() );
-}
-
-Node TermUtil::substituteInstConstants(Node n, Node q, std::vector<Node>& terms)
-{
-  registerQuantifier(q);
-  Assert(d_inst_constants[q].size() == terms.size());
-  return n.substitute(d_inst_constants[q].begin(),
-                      d_inst_constants[q].end(),
-                      terms.begin(),
-                      terms.end());
-}
-
 void TermUtil::computeInstConstContains(Node n, std::vector<Node>& ics)
 {
   computeVarContainsInternal(n, INST_CONSTANT, ics);
index 4033c888ff6a70e2da450ca259becb603c8e30cf..e9e3c7e982554699b7916d4e28b60daa5309267e 100644 (file)
@@ -21,7 +21,6 @@
 #include <unordered_set>
 
 #include "expr/attribute.h"
-#include "theory/quantifiers/quant_util.h"
 #include "theory/type_enumerator.h"
 
 namespace CVC4 {
@@ -61,15 +60,10 @@ namespace inst{
 namespace quantifiers {
 
 class TermDatabase;
-class Instantiate;
 
 // TODO : #1216 split this class, most of the functions in this class should be dispersed to where they are used.
-class TermUtil : public QuantifiersUtil
+class TermUtil
 {
-  // TODO : remove these
-  friend class ::CVC4::theory::QuantifiersEngine;
-  friend class Instantiate;
-
  public:
   TermUtil();
   ~TermUtil();
@@ -80,46 +74,10 @@ class TermUtil : public QuantifiersUtil
   Node d_zero;
   Node d_one;
 
-  /** reset */
-  bool reset(Theory::Effort e) override { return true; }
-  /** register quantifier */
-  void registerQuantifier(Node q) override;
-  /** identify */
-  std::string identify() const override { return "TermUtil"; }
   // for inst constant
- private:
-  /** map from universal quantifiers to the list of variables */
-  std::map< Node, std::vector< Node > > d_vars;
-  std::map< Node, std::map< Node, unsigned > > d_var_num;
-  /** map from universal quantifiers to their inst constant body */
-  std::map< Node, Node > d_inst_const_body;
-  /** instantiation constants to universal quantifiers */
-  std::map< Node, Node > d_inst_constants_map;
-public:
-  /** map from universal quantifiers to the list of instantiation constants */
-  std::map< Node, std::vector< Node > > d_inst_constants;
-  /** get variable number */
-  unsigned getVariableNum( Node q, Node v ) { return d_var_num[q][v]; }
-  /** get the i^th instantiation constant of q */
-  Node getInstantiationConstant( Node q, int i ) const;
-  /** get number of instantiation constants for q */
-  unsigned getNumInstantiationConstants( Node q ) const;
-  /** get the ce body q[e/x] */
-  Node getInstConstantBody( Node q );
-  /** returns node n with bound vars of q replaced by instantiation constants of q
-      node n : is the future pattern
-      node q : is the quantifier containing which bind the variable
-      return a pattern where the variable are replaced by variable for
-      instantiation.
-   */
-  Node substituteBoundVariablesToInstConstants(Node n, Node q);
-  /** substitute { instantiation constants of q -> bound variables of q } in n
-   */
-  Node substituteInstConstantsToBoundVariables(Node n, Node q);
-  /** substitute { variables of q -> terms } in n */
-  Node substituteBoundVariables(Node n, Node q, std::vector<Node>& terms);
-  /** substitute { instantiation constants of q -> terms } in n */
-  Node substituteInstConstants(Node n, Node q, std::vector<Node>& terms);
+ public:
+  /** Get the index of BOUND_VARIABLE v in quantifier q */
+  static size_t getVariableNum(Node q, Node v);
 
   static Node getInstConstAttr( Node n );
   static bool hasInstConstAttr( Node n );
index e85d6f2ffd09609aa5891746c67f8c5dee34acc1..9c56c1ba566fa6b4fe3928688f0788c8c9370cf1 100644 (file)
@@ -45,11 +45,12 @@ QuantifiersEngine::QuantifiersEngine(
       d_model(nullptr),
       d_builder(nullptr),
       d_term_util(new quantifiers::TermUtil),
-      d_term_db(new quantifiers::TermDb(qstate, qim, this)),
+      d_term_db(new quantifiers::TermDb(qstate, qim, d_qreg, this)),
       d_eq_query(nullptr),
       d_sygus_tdb(nullptr),
       d_quant_attr(new quantifiers::QuantAttributes),
-      d_instantiate(new quantifiers::Instantiate(this, qstate, qim, pnm)),
+      d_instantiate(
+          new quantifiers::Instantiate(this, qstate, qim, d_qreg, pnm)),
       d_skolemize(new quantifiers::Skolemize(this, qstate, pnm)),
       d_term_enum(new quantifiers::TermEnumeration),
       d_quants_prereg(qstate.getUserContext()),
@@ -59,8 +60,8 @@ QuantifiersEngine::QuantifiersEngine(
       d_presolve_cache(qstate.getUserContext())
 {
   //---- utilities
-  // term util must come before the other utilities
-  d_util.push_back(d_term_util.get());
+  // quantifiers registry must come before the other utilities
+  d_util.push_back(&d_qreg);
   d_util.push_back(d_term_db.get());
 
   if (options::sygus() || options::sygusInst())
@@ -88,17 +89,17 @@ QuantifiersEngine::QuantifiersEngine(
     {
       Trace("quant-engine-debug") << "...make fmc builder." << std::endl;
       d_model.reset(new quantifiers::fmcheck::FirstOrderModelFmc(
-          this, qstate, "FirstOrderModelFmc"));
+          this, qstate, d_qreg, "FirstOrderModelFmc"));
       d_builder.reset(new quantifiers::fmcheck::FullModelChecker(this, qstate));
     }else{
       Trace("quant-engine-debug") << "...make default model builder." << std::endl;
-      d_model.reset(
-          new quantifiers::FirstOrderModel(this, qstate, "FirstOrderModel"));
+      d_model.reset(new quantifiers::FirstOrderModel(
+          this, qstate, d_qreg, "FirstOrderModel"));
       d_builder.reset(new quantifiers::QModelBuilder(this, qstate));
     }
   }else{
-    d_model.reset(
-        new quantifiers::FirstOrderModel(this, qstate, "FirstOrderModel"));
+    d_model.reset(new quantifiers::FirstOrderModel(
+        this, qstate, d_qreg, "FirstOrderModel"));
   }
   d_eq_query.reset(new quantifiers::EqualityQueryQuantifiersEngine(
       qstate, d_term_db.get(), d_model.get()));
@@ -142,6 +143,12 @@ QuantifiersEngine::getInferenceManager()
 {
   return d_qim;
 }
+
+quantifiers::QuantifiersRegistry& QuantifiersEngine::getQuantifiersRegistry()
+{
+  return d_qreg;
+}
+
 quantifiers::QModelBuilder* QuantifiersEngine::getModelBuilder() const
 {
   return d_builder.get();
@@ -737,7 +744,7 @@ void QuantifiersEngine::assertQuantifier( Node f, bool pol ){
   {
     mdl->assertNode(f);
   }
-  addTermToDatabase(d_term_util->getInstConstantBody(f), true);
+  addTermToDatabase(d_qreg.getInstConstantBody(f), true);
 }
 
 void QuantifiersEngine::addTermToDatabase(Node n, bool withinQuant)
index 99e4ad5ccec70f84c83385bf96a9ea2d45ba106f..2fbf6b70fc30238c47bcc9f2533e2793d84a7e15 100644 (file)
@@ -28,6 +28,7 @@
 #include "theory/quantifiers/first_order_model.h"
 #include "theory/quantifiers/fmf/model_builder.h"
 #include "theory/quantifiers/instantiate.h"
+#include "theory/quantifiers/quant_module.h"
 #include "theory/quantifiers/quant_util.h"
 #include "theory/quantifiers/quantifiers_attributes.h"
 #include "theory/quantifiers/quantifiers_inference_manager.h"
@@ -77,6 +78,8 @@ class QuantifiersEngine {
   quantifiers::QuantifiersState& getState();
   /** The quantifiers inference manager */
   quantifiers::QuantifiersInferenceManager& getInferenceManager();
+  /** The quantifiers registry */
+  quantifiers::QuantifiersRegistry& getQuantifiersRegistry();
   //---------------------- end external interface
   //---------------------- utilities
   /** get the model builder */