Eliminate last static calls to rewriter from smt layer (#7355)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Wed, 20 Oct 2021 21:07:09 +0000 (16:07 -0500)
committerGitHub <noreply@github.com>
Wed, 20 Oct 2021 21:07:09 +0000 (21:07 +0000)
13 files changed:
src/proof/proof_node_manager.cpp
src/proof/proof_node_manager.h
src/smt/check_models.cpp
src/smt/check_models.h
src/smt/model_blocker.cpp
src/smt/model_blocker.h
src/smt/preprocessor.cpp
src/smt/proof_manager.cpp
src/smt/proof_post_processor.cpp
src/smt/solver_engine.cpp
src/smt/sygus_solver.cpp
src/smt/witness_form.cpp
src/smt/witness_form.h

index a3ef944e080e3f1bd5f0cf431ec6987eb2b40f6b..8b4b332a16fc5afed4b8b7f0df2143569f6317e2 100644 (file)
@@ -28,7 +28,8 @@ using namespace cvc5::kind;
 
 namespace cvc5 {
 
-ProofNodeManager::ProofNodeManager(ProofChecker* pc) : d_checker(pc)
+ProofNodeManager::ProofNodeManager(theory::Rewriter* rr, ProofChecker* pc)
+    : d_rewriter(rr), d_checker(pc)
 {
   d_true = NodeManager::currentNM()->mkConst(true);
   // we always allocate a proof checker, regardless of the proof checking mode
@@ -160,14 +161,14 @@ std::shared_ptr<ProofNode> ProofNodeManager::mkScope(
         computedAcr = true;
         for (const Node& acc : ac)
         {
-          Node accr = theory::Rewriter::rewrite(acc);
+          Node accr = d_rewriter->rewrite(acc);
           if (accr != acc)
           {
             acr[accr] = acc;
           }
         }
       }
-      Node ar = theory::Rewriter::rewrite(a);
+      Node ar = d_rewriter->rewrite(a);
       std::unordered_map<Node, Node>::iterator itr = acr.find(ar);
       if (itr != acr.end())
       {
index 928aabb7678de49b156b3b545f27d897aeccb5ab..533f6d173982a908a4c6d834ac66fcc5c8f828a6 100644 (file)
@@ -28,6 +28,10 @@ namespace cvc5 {
 class ProofChecker;
 class ProofNode;
 
+namespace theory {
+class Rewriter;
+}
+
 /**
  * A manager for proof node objects. This is a trusted interface for creating
  * and updating ProofNode objects.
@@ -54,7 +58,7 @@ class ProofNode;
 class ProofNodeManager
 {
  public:
-  ProofNodeManager(ProofChecker* pc = nullptr);
+  ProofNodeManager(theory::Rewriter* rr, ProofChecker* pc = nullptr);
   ~ProofNodeManager() {}
   /**
    * This constructs a ProofNode with the given arguments. The expected
@@ -184,6 +188,8 @@ class ProofNodeManager
   static ProofNode* cancelDoubleSymm(ProofNode* pn);
 
  private:
+  /** The rewriter */
+  theory::Rewriter* d_rewriter;
   /** The (optional) proof checker */
   ProofChecker* d_checker;
   /** the true node */
index f148d101866a8e1e18feba6cbda8cbf16efff884..36d1074299c42680313f8cb8ace571770d0be567 100644 (file)
@@ -31,8 +31,7 @@ using namespace cvc5::theory;
 namespace cvc5 {
 namespace smt {
 
-CheckModels::CheckModels(Env& e) : d_env(e) {}
-CheckModels::~CheckModels() {}
+CheckModels::CheckModels(Env& e) : EnvObj(e) {}
 
 void CheckModels::checkModel(TheoryModel* m,
                              const context::CDList<Node>& al,
@@ -71,7 +70,7 @@ void CheckModels::checkModel(TheoryModel* m,
     Notice() << "SolverEngine::checkModel(): -- substitutes to " << n
              << std::endl;
 
-    n = Rewriter::rewrite(n);
+    n = rewrite(n);
     Notice() << "SolverEngine::checkModel(): -- rewrites to " << n << std::endl;
 
     // We look up the value before simplifying. If n contains quantifiers,
index d785b53d5fef60cfb5293ff2f5ebcac14dba82de..2b3447010930dea2339e89e125dc7ebabc979d6a 100644 (file)
 
 #include "context/cdlist.h"
 #include "expr/node.h"
+#include "smt/env_obj.h"
 
 namespace cvc5 {
 
-class Env;
-
 namespace theory {
 class TheoryModel;
 }
@@ -34,11 +33,10 @@ namespace smt {
 /**
  * This utility is responsible for checking the current model.
  */
-class CheckModels
+class CheckModels : protected EnvObj
 {
  public:
   CheckModels(Env& e);
-  ~CheckModels();
   /**
    * Check model m against the current set of input assertions al.
    *
@@ -48,10 +46,6 @@ class CheckModels
   void checkModel(theory::TheoryModel* m,
                   const context::CDList<Node>& al,
                   bool hardFailure);
-
- private:
-  /** Reference to the environment */
-  Env& d_env;
 };
 
 }  // namespace smt
index cbc38833153dba89b428bfa5cc555de7863f69f9..e8c1ff07fdcc0a2c52f1a284761dd45366266d76 100644 (file)
@@ -25,6 +25,8 @@ using namespace cvc5::kind;
 
 namespace cvc5 {
 
+ModelBlocker::ModelBlocker(Env& e) : EnvObj(e) {}
+
 Node ModelBlocker::getModelBlocker(const std::vector<Node>& assertions,
                                    theory::TheoryModel* m,
                                    options::BlockModelsMode mode,
index 42219e2201771b360c1918cdd9f10df61467f2c0..5e41de6a3f562d5430b1e7d0123bc4bfc471d67f 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "expr/node.h"
 #include "options/smt_options.h"
+#include "smt/env_obj.h"
 
 namespace cvc5 {
 
@@ -32,9 +33,10 @@ class TheoryModel;
 /**
  * A utility for blocking the current model.
  */
-class ModelBlocker
+class ModelBlocker : protected EnvObj
 {
  public:
+  ModelBlocker(Env& e);
   /** get model blocker
    *
    * This returns a disjunction of literals ~L1 V ... V ~Ln with the following
@@ -63,7 +65,7 @@ class ModelBlocker
    * our input. In other words, we do not return ~(x < 0) V ~(w < 0) since the
    * left disjunct is always false.
    */
-  static Node getModelBlocker(
+  Node getModelBlocker(
       const std::vector<Node>& assertions,
       theory::TheoryModel* m,
       options::BlockModelsMode mode,
index 4b16b93910ea487ad5f5f207f29fa0ac326613c1..3aed58b30f5b1f9959df29bb36272d04472d4f19 100644 (file)
@@ -150,7 +150,7 @@ Node Preprocessor::simplify(const Node& node)
     d_env.getPrinter().toStreamCmdSimplify(d_env.getDumpOut(), node);
   }
   Node ret = expandDefinitions(node);
-  ret = theory::Rewriter::rewrite(ret);
+  ret = rewrite(ret);
   return ret;
 }
 
index 2e08ab2dfba528284419673a302d2c1ba0ee74eb..4b42910758b33e5e4c9cba59291da2201d96a8b7 100644 (file)
@@ -41,7 +41,7 @@ PfManager::PfManager(Env& env)
       d_pchecker(new ProofChecker(
           options().proof.proofCheck == options::ProofCheckMode::EAGER,
           options().proof.proofPedantic)),
-      d_pnm(new ProofNodeManager(d_pchecker.get())),
+      d_pnm(new ProofNodeManager(env.getRewriter(), d_pchecker.get())),
       d_pppg(new PreprocessProofGenerator(
           d_pnm.get(), env.getUserContext(), "smt::PreprocessProofGenerator")),
       d_pfpp(nullptr),
index a547c43625ea9a4ab9e9c8ccc5eafa3072e28eb0..04a36c1c0f69afd41789e3d296b5e441be69e28e 100644 (file)
@@ -42,7 +42,7 @@ ProofPostprocessCallback::ProofPostprocessCallback(Env& env,
     : d_env(env),
       d_pnm(env.getProofNodeManager()),
       d_pppg(pppg),
-      d_wfpm(env.getProofNodeManager()),
+      d_wfpm(env),
       d_updateScopedAssumptions(updateScopedAssumptions)
 {
   d_true = NodeManager::currentNM()->mkConst(true);
index e928dcade1c7868ef90d316909df1ad993f9fbac..fc6ec391563aa632975f7bb9d14c3afe0fd64c80 100644 (file)
@@ -1081,7 +1081,7 @@ Node SolverEngine::getValue(const Node& ex) const
   // AJR : necessary?
   if (!n.getType().isFunction())
   {
-    n = Rewriter::rewrite(n);
+    n = d_env->getRewriter()->rewrite(n);
   }
 
   Trace("smt") << "--- getting value of " << n << endl;
@@ -1224,7 +1224,8 @@ Result SolverEngine::blockModel()
 
   // get expanded assertions
   std::vector<Node> eassertsProc = getExpandedAssertions();
-  Node eblocker = ModelBlocker::getModelBlocker(
+  ModelBlocker mb(*d_env.get());
+  Node eblocker = mb.getModelBlocker(
       eassertsProc, m, d_env->getOptions().smt.blockModelsMode);
   Trace("smt") << "Block formula: " << eblocker << std::endl;
   return assertFormula(eblocker);
@@ -1247,7 +1248,8 @@ Result SolverEngine::blockModelValues(const std::vector<Node>& exprs)
   // get expanded assertions
   std::vector<Node> eassertsProc = getExpandedAssertions();
   // we always do block model values mode here
-  Node eblocker = ModelBlocker::getModelBlocker(
+  ModelBlocker mb(*d_env.get());
+  Node eblocker = mb.getModelBlocker(
       eassertsProc, m, options::BlockModelsMode::VALUES, exprs);
   return assertFormula(eblocker);
 }
index 2a1d4e6c6636c14509b90901c22ba9176a91bfd6..5db9804c6985e7ee42293a47ad07f252d4f159de 100644 (file)
@@ -377,7 +377,7 @@ void SygusSolver::checkSynthSolution(Assertions& as)
       // problem are rewritten to true. If this is not the case, then the
       // assertions module of the subsolver will complain about assertions
       // with free variables.
-      Node ar = theory::Rewriter::rewrite(a);
+      Node ar = rewrite(a);
       solChecker->assertFormula(ar);
     }
     Result r = solChecker->checkSat();
index 8e998b9cf6b55219212e97a6db6ca7be000db133..16d297495bd1afb451790a1dfe0b5245323f6fd1 100644 (file)
 #include "smt/witness_form.h"
 
 #include "expr/skolem_manager.h"
+#include "smt/env.h"
 #include "theory/rewriter.h"
 
 namespace cvc5 {
 namespace smt {
 
-WitnessFormGenerator::WitnessFormGenerator(ProofNodeManager* pnm)
-    : d_tcpg(pnm,
+WitnessFormGenerator::WitnessFormGenerator(Env& env)
+    : d_rewriter(env.getRewriter()),
+      d_tcpg(env.getProofNodeManager(),
              nullptr,
              TConvPolicy::FIXPOINT,
              TConvCachePolicy::NEVER,
              "WfGenerator::TConvProofGenerator",
              nullptr,
              true),
-      d_wintroPf(pnm, nullptr, nullptr, "WfGenerator::LazyCDProof"),
-      d_pskPf(pnm, nullptr, "WfGenerator::PurifySkolemProof")
+      d_wintroPf(env.getProofNodeManager(),
+                 nullptr,
+                 nullptr,
+                 "WfGenerator::LazyCDProof"),
+      d_pskPf(
+          env.getProofNodeManager(), nullptr, "WfGenerator::PurifySkolemProof")
 {
 }
 
@@ -114,12 +120,12 @@ Node WitnessFormGenerator::convertToWitnessForm(Node t)
 
 bool WitnessFormGenerator::requiresWitnessFormTransform(Node t, Node s) const
 {
-  return theory::Rewriter::rewrite(t) != theory::Rewriter::rewrite(s);
+  return d_rewriter->rewrite(t) != d_rewriter->rewrite(s);
 }
 
 bool WitnessFormGenerator::requiresWitnessFormIntro(Node t) const
 {
-  Node tr = theory::Rewriter::rewrite(t);
+  Node tr = d_rewriter->rewrite(t);
   return !tr.isConst() || !tr.getConst<bool>();
 }
 
index 8522d41f0b2f12106a65b99fa7b2ee481de19bb8..06d60c1edfdc6b59d609ca9ecf190c6f002be6c5 100644 (file)
 #include "proof/proof_generator.h"
 
 namespace cvc5 {
+
+class Env;
+
+namespace theory {
+class Rewriter;
+}
+
 namespace smt {
 
 /**
@@ -37,7 +44,7 @@ namespace smt {
 class WitnessFormGenerator : public ProofGenerator
 {
  public:
-  WitnessFormGenerator(ProofNodeManager* pnm);
+  WitnessFormGenerator(Env& env);
   ~WitnessFormGenerator() {}
   /**
    * Get proof for, which expects an equality of the form t = toWitness(t).
@@ -85,6 +92,8 @@ class WitnessFormGenerator : public ProofGenerator
    * Return a proof generator that can prove the given axiom exists.
    */
   ProofGenerator* convertExistsInternal(Node exists);
+  /** The rewriter we are using */
+  theory::Rewriter* d_rewriter;
   /** The term conversion proof generator */
   TConvProofGenerator d_tcpg;
   /** The nodes we have already added rewrite steps for in d_tcpg */