Eliminate more static uses of rewrite (#8040)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Thu, 3 Feb 2022 19:19:31 +0000 (13:19 -0600)
committerGitHub <noreply@github.com>
Thu, 3 Feb 2022 19:19:31 +0000 (11:19 -0800)
20 files changed:
src/expr/subs.cpp
src/expr/subs.h
src/theory/quantifiers/cegqi/nested_qe.cpp
src/theory/quantifiers/ematching/im_generator.cpp
src/theory/quantifiers/ematching/im_generator.h
src/theory/quantifiers/ematching/inst_match_generator.cpp
src/theory/quantifiers/ematching/inst_match_generator.h
src/theory/quantifiers/ematching/inst_match_generator_multi.cpp
src/theory/quantifiers/ematching/inst_match_generator_multi.h
src/theory/quantifiers/ematching/inst_match_generator_multi_linear.cpp
src/theory/quantifiers/ematching/inst_match_generator_multi_linear.h
src/theory/quantifiers/ematching/inst_match_generator_simple.cpp
src/theory/quantifiers/ematching/inst_match_generator_simple.h
src/theory/quantifiers/ematching/pattern_term_selector.cpp
src/theory/quantifiers/ematching/relational_match_generator.cpp
src/theory/quantifiers/ematching/relational_match_generator.h
src/theory/quantifiers/ematching/trigger.cpp
src/theory/quantifiers/ematching/var_match_generator.cpp
src/theory/quantifiers/ematching/var_match_generator.h
src/theory/quantifiers/sygus/ce_guided_single_inv.cpp

index f08cf18c1b7d2dcec5c2eb9c5ef20f792d418e7d..d01fa08438d6e5ebe5c3b551d2156ad92b12aac1 100644 (file)
@@ -18,7 +18,6 @@
 #include <sstream>
 
 #include "expr/skolem_manager.h"
-#include "theory/rewriter.h"
 
 namespace cvc5 {
 
@@ -98,7 +97,7 @@ void Subs::append(Subs& s)
   add(s.d_vars, s.d_subs);
 }
 
-Node Subs::apply(Node n, bool doRewrite) const
+Node Subs::apply(Node n) const
 {
   if (d_vars.empty())
   {
@@ -106,13 +105,9 @@ Node Subs::apply(Node n, bool doRewrite) const
   }
   Node ns =
       n.substitute(d_vars.begin(), d_vars.end(), d_subs.begin(), d_subs.end());
-  if (doRewrite)
-  {
-    ns = theory::Rewriter::rewrite(ns);
-  }
   return ns;
 }
-Node Subs::rapply(Node n, bool doRewrite) const
+Node Subs::rapply(Node n) const
 {
   if (d_vars.empty())
   {
@@ -120,14 +115,10 @@ Node Subs::rapply(Node n, bool doRewrite) const
   }
   Node ns =
       n.substitute(d_subs.begin(), d_subs.end(), d_vars.begin(), d_vars.end());
-  if (doRewrite)
-  {
-    ns = theory::Rewriter::rewrite(ns);
-  }
   return ns;
 }
 
-void Subs::applyToRange(Subs& s, bool doRewrite) const
+void Subs::applyToRange(Subs& s) const
 {
   if (d_vars.empty())
   {
@@ -135,11 +126,11 @@ void Subs::applyToRange(Subs& s, bool doRewrite) const
   }
   for (size_t i = 0, ns = s.d_subs.size(); i < ns; i++)
   {
-    s.d_subs[i] = apply(s.d_subs[i], doRewrite);
+    s.d_subs[i] = apply(s.d_subs[i]);
   }
 }
 
-void Subs::rapplyToRange(Subs& s, bool doRewrite) const
+void Subs::rapplyToRange(Subs& s) const
 {
   if (d_vars.empty())
   {
@@ -147,7 +138,7 @@ void Subs::rapplyToRange(Subs& s, bool doRewrite) const
   }
   for (size_t i = 0, ns = s.d_subs.size(); i < ns; i++)
   {
-    s.d_subs[i] = rapply(s.d_subs[i], doRewrite);
+    s.d_subs[i] = rapply(s.d_subs[i]);
   }
 }
 
index 245c6d77a3eb131f849edd1f3aa370ebb330b093..fb68c9fce6aceff9383a2e7d1ca516d2b2cd4c87 100644 (file)
@@ -58,13 +58,13 @@ class Subs
   /** Append the substitution s to this */
   void append(Subs& s);
   /** Return the result of this substitution on n */
-  Node apply(Node n, bool doRewrite = false) const;
+  Node apply(Node n) const;
   /** Return the result of the reverse of this substitution on n */
-  Node rapply(Node n, bool doRewrite = false) const;
+  Node rapply(Node n) const;
   /** Apply this substitution to all nodes in the range of s */
-  void applyToRange(Subs& s, bool doRewrite = false) const;
+  void applyToRange(Subs& s) const;
   /** Apply the reverse of this substitution to all nodes in the range of s */
-  void rapplyToRange(Subs& s, bool doRewrite = false) const;
+  void rapplyToRange(Subs& s) const;
   /** Get equality (= v s) where v -> s is the i^th position in the vectors */
   Node getEquality(size_t i) const;
   /** Convert substitution to map */
index fddcb0712560b0394eb3595eca11df9d900dde1b..1b6ba44f2d1c87bb9af1f70d1df08c706ae1b141 100644 (file)
@@ -19,6 +19,7 @@
 #include "expr/node_algorithm.h"
 #include "expr/subs.h"
 #include "smt/env.h"
+#include "theory/rewriter.h"
 #include "theory/smt_engine_subsolver.h"
 
 namespace cvc5 {
@@ -119,7 +120,8 @@ Node NestedQe::doNestedQe(Env& env, Node q, bool keepTopLevel)
   Node qeBody = sk.apply(q[1]);
   qeBody = snqe.apply(qeBody);
   // undo the skolemization
-  qeBody = sk.rapply(qeBody, true);
+  qeBody = sk.rapply(qeBody);
+  qeBody = env.getRewriter()->rewrite(qeBody);
   // reconstruct the body
   std::vector<Node> qargs;
   qargs.push_back(q[0]);
index b6df036448dfa51e78dd5408713fc4a847325db8..c933f592fc7631cfdb097736d11e72955dccd4fd 100644 (file)
@@ -24,8 +24,11 @@ namespace theory {
 namespace quantifiers {
 namespace inst {
 
-IMGenerator::IMGenerator(Trigger* tparent)
-    : d_tparent(tparent), d_qstate(tparent->d_qstate), d_treg(tparent->d_treg)
+IMGenerator::IMGenerator(Env& env, Trigger* tparent)
+    : EnvObj(env),
+      d_tparent(tparent),
+      d_qstate(tparent->d_qstate),
+      d_treg(tparent->d_treg)
 {
 }
 
index 12126b31bb84b01eece8e797de27a9671e865da4..8f26e552acee199c5f1322bf857f55e483852a89 100644 (file)
@@ -19,7 +19,9 @@
 #define CVC5__THEORY__QUANTIFIERS__IM_GENERATOR_H
 
 #include <map>
+
 #include "expr/node.h"
+#include "smt/env_obj.h"
 #include "theory/inference_id.h"
 #include "theory/quantifiers/inst_match.h"
 
@@ -51,69 +53,70 @@ class Trigger;
  * point in which instantiate lemmas are enqueued to be sent on the output
  * channel.
  */
-class IMGenerator {
-public:
- IMGenerator(Trigger* tparent);
- virtual ~IMGenerator() {}
- /** Reset instantiation round.
-  *
-  * Called once at beginning of an instantiation round.
-  */
- virtual void resetInstantiationRound() {}
- /** Reset.
-  *
-  * eqc is the equivalence class to search in (any if eqc=null).
-  * Returns true if this generator can produce instantiations, and false
-  * otherwise. An example of when it returns false is if it can be determined
-  * that no appropriate matchable terms occur based on eqc.
-  */
- virtual bool reset(Node eqc) { return true; }
- /** Get the next match.
-  *
-  * Must call reset( eqc ) before this function. This constructs an
-  * instantiation, which it populates in data structure m,
-  * based on the current context using the implemented matching algorithm.
-  *
-  * q is the quantified formula we are adding instantiations for
-  * m is the InstMatch object we are generating
-  *
-  * Returns a value >0 if an instantiation was successfully generated
-  */
- virtual int getNextMatch(Node q, InstMatch& m) { return 0; }
- /** add instantiations
-  *
-  * This adds all available instantiations for q based on the current context
-  * using the implemented matching algorithm. It typically is implemented as a
-  * fixed point of getNextMatch above.
-  *
-  * It returns the number of instantiations added using calls to
-  * Instantiate::addInstantiation(...).
-  */
- virtual uint64_t addInstantiations(Node q) { return 0; }
- /** get active score
-  *
-  * A heuristic value indicating how active this generator is.
-  */
- virtual int getActiveScore() { return 0; }
+class IMGenerator : protected EnvObj
+{
+ public:
+  IMGenerator(Env& env, Trigger* tparent);
+  virtual ~IMGenerator() {}
+  /** Reset instantiation round.
+   *
+   * Called once at beginning of an instantiation round.
+   */
+  virtual void resetInstantiationRound() {}
+  /** Reset.
+   *
+   * eqc is the equivalence class to search in (any if eqc=null).
+   * Returns true if this generator can produce instantiations, and false
+   * otherwise. An example of when it returns false is if it can be determined
+   * that no appropriate matchable terms occur based on eqc.
+   */
+  virtual bool reset(Node eqc) { return true; }
+  /** Get the next match.
+   *
+   * Must call reset( eqc ) before this function. This constructs an
+   * instantiation, which it populates in data structure m,
+   * based on the current context using the implemented matching algorithm.
+   *
+   * q is the quantified formula we are adding instantiations for
+   * m is the InstMatch object we are generating
+   *
+   * Returns a value >0 if an instantiation was successfully generated
+   */
+  virtual int getNextMatch(Node q, InstMatch& m) { return 0; }
+  /** add instantiations
+   *
+   * This adds all available instantiations for q based on the current context
+   * using the implemented matching algorithm. It typically is implemented as a
+   * fixed point of getNextMatch above.
+   *
+   * It returns the number of instantiations added using calls to
+   * Instantiate::addInstantiation(...).
+   */
+  virtual uint64_t addInstantiations(Node q) { return 0; }
+  /** get active score
+   *
+   * A heuristic value indicating how active this generator is.
+   */
+  virtual int getActiveScore() { return 0; }
 
-protected:
- /** send instantiation
-  *
-  * This method sends instantiation, specified by m, to the parent trigger
-  * object, which will in turn make a call to
-  * Instantiate::addInstantiation(...). This method returns true if a
-  * call to Instantiate::addInstantiation(...) was successfully made,
-  * indicating that an instantiation was enqueued in the quantifier engine's
-  * lemma cache.
-  */
- bool sendInstantiation(InstMatch& m, InferenceId id);
- /** The parent trigger that owns this */
- Trigger* d_tparent;
- /** Reference to the state of the quantifiers engine */
- QuantifiersState& d_qstate;
- /** Reference to the term registry */
- TermRegistry& d_treg;
-};/* class IMGenerator */
+ protected:
 /** send instantiation
+   *
+   * This method sends instantiation, specified by m, to the parent trigger
+   * object, which will in turn make a call to
+   * Instantiate::addInstantiation(...). This method returns true if a
+   * call to Instantiate::addInstantiation(...) was successfully made,
+   * indicating that an instantiation was enqueued in the quantifier engine's
+   * lemma cache.
+   */
 bool sendInstantiation(InstMatch& m, InferenceId id);
 /** The parent trigger that owns this */
 Trigger* d_tparent;
 /** Reference to the state of the quantifiers engine */
 QuantifiersState& d_qstate;
 /** Reference to the term registry */
 TermRegistry& d_treg;
+}; /* class IMGenerator */
 
 }  // namespace inst
 }
index 51a36518b746cb4f45fe8c3f7856bfb108ed12e1..1adf50ddddb38b6ce76522657ed37a105525f7d7 100644 (file)
@@ -30,6 +30,7 @@
 #include "theory/quantifiers/term_database.h"
 #include "theory/quantifiers/term_registry.h"
 #include "theory/quantifiers/term_util.h"
+#include "theory/rewriter.h"
 #include "util/rational.h"
 
 using namespace cvc5::kind;
@@ -39,8 +40,8 @@ namespace theory {
 namespace quantifiers {
 namespace inst {
 
-InstMatchGenerator::InstMatchGenerator(Trigger* tparent, Node pat)
-    : IMGenerator(tparent)
+InstMatchGenerator::InstMatchGenerator(Env& env, Trigger* tparent, Node pat)
+    : IMGenerator(env, tparent)
 {
   d_cg = nullptr;
   d_needsReset = true;
@@ -184,7 +185,8 @@ void InstMatchGenerator::initialize(Node q,
         }
         else
         {
-          InstMatchGenerator* cimg = getInstMatchGenerator(d_tparent, q, pat);
+          InstMatchGenerator* cimg =
+              getInstMatchGenerator(d_env, d_tparent, q, pat);
           if (cimg)
           {
             d_children.push_back(cimg);
@@ -576,22 +578,23 @@ uint64_t InstMatchGenerator::addInstantiations(Node f)
   return addedLemmas;
 }
 
-InstMatchGenerator* InstMatchGenerator::mkInstMatchGenerator(Trigger* tparent,
+InstMatchGenerator* InstMatchGenerator::mkInstMatchGenerator(Env& env,
+                                                             Trigger* tparent,
                                                              Node q,
                                                              Node pat)
 {
   std::vector< Node > pats;
   pats.push_back( pat );
   std::map< Node, InstMatchGenerator * > pat_map_init;
-  return mkInstMatchGenerator(tparent, q, pats, pat_map_init);
+  return mkInstMatchGenerator(env, tparent, q, pats, pat_map_init);
 }
 
 InstMatchGenerator* InstMatchGenerator::mkInstMatchGeneratorMulti(
-    Trigger* tparent, Node q, std::vector<Node>& pats)
+    Env& env, Trigger* tparent, Node q, std::vector<Node>& pats)
 {
   Assert(pats.size() > 1);
   InstMatchGeneratorMultiLinear* imgm =
-      new InstMatchGeneratorMultiLinear(tparent, q, pats);
+      new InstMatchGeneratorMultiLinear(env, tparent, q, pats);
   std::vector< InstMatchGenerator* > gens;
   imgm->initialize(q, gens);
   Assert(gens.size() == pats.size());
@@ -603,11 +606,12 @@ InstMatchGenerator* InstMatchGenerator::mkInstMatchGeneratorMulti(
     patsn.push_back( pn );
     pat_map_init[pn] = g;
   }
-  imgm->d_next = mkInstMatchGenerator(tparent, q, patsn, pat_map_init);
+  imgm->d_next = mkInstMatchGenerator(env, tparent, q, patsn, pat_map_init);
   return imgm;
 }
 
 InstMatchGenerator* InstMatchGenerator::mkInstMatchGenerator(
+    Env& env,
     Trigger* tparent,
     Node q,
     std::vector<Node>& pats,
@@ -622,7 +626,7 @@ InstMatchGenerator* InstMatchGenerator::mkInstMatchGenerator(
     InstMatchGenerator* init;
     std::map< Node, InstMatchGenerator * >::iterator iti = pat_map_init.find( pats[pCounter] );
     if( iti==pat_map_init.end() ){
-      init = getInstMatchGenerator(tparent, q, pats[pCounter]);
+      init = getInstMatchGenerator(env, tparent, q, pats[pCounter]);
     }else{
       init = iti->second;
     }
@@ -645,7 +649,8 @@ InstMatchGenerator* InstMatchGenerator::mkInstMatchGenerator(
   return oinit;
 }
 
-InstMatchGenerator* InstMatchGenerator::getInstMatchGenerator(Trigger* tparent,
+InstMatchGenerator* InstMatchGenerator::getInstMatchGenerator(Env& env,
+                                                              Trigger* tparent,
                                                               Node q,
                                                               Node n)
 {
@@ -670,8 +675,9 @@ InstMatchGenerator* InstMatchGenerator::getInstMatchGenerator(Trigger* tparent,
     if (!x.isNull())
     {
       Node s = PatternTermSelector::getInversion(n, x);
+      s = env.getRewriter()->rewrite(s);
       VarMatchGeneratorTermSubs* vmg =
-          new VarMatchGeneratorTermSubs(tparent, x, s);
+          new VarMatchGeneratorTermSubs(env, tparent, x, s);
       Trace("var-trigger") << "Term substitution trigger : " << n
                            << ", var = " << x << ", subs = " << s << std::endl;
       return vmg;
@@ -685,9 +691,9 @@ InstMatchGenerator* InstMatchGenerator::getInstMatchGenerator(Trigger* tparent,
   if (TriggerTermInfo::isUsableRelationTrigger(n, hasPol, pol, lit))
   {
     Trace("relational-trigger") << "...yes, for literal " << lit << std::endl;
-    return new RelationalMatchGenerator(tparent, lit, hasPol, pol);
+    return new RelationalMatchGenerator(env, tparent, lit, hasPol, pol);
   }
-  return new InstMatchGenerator(tparent, n);
+  return new InstMatchGenerator(env, tparent, n);
 }
 
 }  // namespace inst
index 6847512925ecd2ebe4a69eb17636d72ca0d64c0d..75c8435ee3f4e2ba89133ec2b8cba067b9d2ff73 100644 (file)
@@ -149,7 +149,8 @@ class InstMatchGenerator : public IMGenerator {
   void setIndependent() { d_independent_gen = true; }
   //-------------------------------construction of inst match generators
   /** mkInstMatchGenerator for single triggers, calls the method below */
-  static InstMatchGenerator* mkInstMatchGenerator(Trigger* tparent,
+  static InstMatchGenerator* mkInstMatchGenerator(Env& env,
+                                                  Trigger* tparent,
                                                   Node q,
                                                   Node pat);
   /** mkInstMatchGenerator for the multi trigger case
@@ -159,7 +160,8 @@ class InstMatchGenerator : public IMGenerator {
   * InstMatchGenerators corresponding to each unique subterm of pats with
   * free variables.
   */
-  static InstMatchGenerator* mkInstMatchGeneratorMulti(Trigger* tparent,
+  static InstMatchGenerator* mkInstMatchGeneratorMulti(Env& env,
+                                                       Trigger* tparent,
                                                        Node q,
                                                        std::vector<Node>& pats);
   /** mkInstMatchGenerator
@@ -176,6 +178,7 @@ class InstMatchGenerator : public IMGenerator {
   * It calls initialize(...) for all InstMatchGenerators generated by this call.
   */
   static InstMatchGenerator* mkInstMatchGenerator(
+      Env& env,
       Trigger* tparent,
       Node q,
       std::vector<Node>& pats,
@@ -188,7 +191,7 @@ class InstMatchGenerator : public IMGenerator {
   * These are intentionally private, and are called during linked list
   * construction in mkInstMatchGenerator.
   */
-  InstMatchGenerator(Trigger* tparent, Node pat);
+  InstMatchGenerator(Env& env, Trigger* tparent, Node pat);
   /** The pattern we are producing matches for.
    *
   * This term and d_match_pattern can be different since this
@@ -319,7 +322,8 @@ class InstMatchGenerator : public IMGenerator {
    * appropriate matching algorithm for n within q
    * within a linked list of InstMatchGenerators.
    */
-  static InstMatchGenerator* getInstMatchGenerator(Trigger* tparent,
+  static InstMatchGenerator* getInstMatchGenerator(Env& env,
+                                                   Trigger* tparent,
                                                    Node q,
                                                    Node n);
 };/* class InstMatchGenerator */
index 4d8280c83d9d112b82e2d291ad9abb6e023917e0..10d296db05d9856e068a55b2d17a27c187f6fcd5 100644 (file)
@@ -26,10 +26,11 @@ namespace theory {
 namespace quantifiers {
 namespace inst {
 
-InstMatchGeneratorMulti::InstMatchGeneratorMulti(Trigger* tparent,
+InstMatchGeneratorMulti::InstMatchGeneratorMulti(Env& env,
+                                                 Trigger* tparent,
                                                  Node q,
                                                  std::vector<Node>& pats)
-    : IMGenerator(tparent), d_quant(q)
+    : IMGenerator(env, tparent), d_quant(q)
 {
   Trace("multi-trigger-cache")
       << "Making smart multi-trigger for " << q << std::endl;
@@ -57,7 +58,7 @@ InstMatchGeneratorMulti::InstMatchGeneratorMulti(Trigger* tparent,
     Node n = pats[i];
     // make the match generator
     InstMatchGenerator* img =
-        InstMatchGenerator::mkInstMatchGenerator(tparent, q, n);
+        InstMatchGenerator::mkInstMatchGenerator(env, tparent, q, n);
     img->setActiveAdd(false);
     d_children.push_back(img);
     // compute unique/shared variables
index c3549f8705d26476da4b2cf29ba513fca0056494..d8ebdee3f591f839af33a7a6cbb39e5338dbb5e5 100644 (file)
@@ -40,7 +40,10 @@ class InstMatchGeneratorMulti : public IMGenerator
 {
  public:
   /** constructors */
-  InstMatchGeneratorMulti(Trigger* tparent, Node q, std::vector<Node>& pats);
+  InstMatchGeneratorMulti(Env& env,
+                          Trigger* tparent,
+                          Node q,
+                          std::vector<Node>& pats);
   /** destructor */
   ~InstMatchGeneratorMulti() override;
 
index 0b19361d5dee6ea9b4a3e887c75c9e7f3b7c8fa9..1b9443dc65560460db0a2618fadd041f8709acf8 100644 (file)
@@ -26,8 +26,8 @@ namespace quantifiers {
 namespace inst {
 
 InstMatchGeneratorMultiLinear::InstMatchGeneratorMultiLinear(
-    Trigger* tparent, Node q, std::vector<Node>& pats)
-    : InstMatchGenerator(tparent, Node::null())
+    Env& env, Trigger* tparent, Node q, std::vector<Node>& pats)
+    : InstMatchGenerator(env, tparent, Node::null())
 {
   // order patterns to maximize eager matching failures
   std::map<Node, std::vector<Node> > var_contains;
@@ -102,7 +102,7 @@ InstMatchGeneratorMultiLinear::InstMatchGeneratorMultiLinear(
   {
     Node po = pats_ordered[i];
     Trace("multi-trigger-linear") << "...make for " << po << std::endl;
-    InstMatchGenerator* cimg = getInstMatchGenerator(tparent, q, po);
+    InstMatchGenerator* cimg = getInstMatchGenerator(env, tparent, q, po);
     Assert(cimg != nullptr);
     d_children.push_back(cimg);
     // this could be improved
index afe43a604b591a7370866648f51e1c8bff1d86a4..cb3476ab73850255a2f90823aa41d200620946ee 100644 (file)
@@ -78,7 +78,8 @@ class InstMatchGeneratorMultiLinear : public InstMatchGenerator
   /** reset the children of this generator */
   int resetChildren();
   /** constructor */
-  InstMatchGeneratorMultiLinear(Trigger* tparent,
+  InstMatchGeneratorMultiLinear(Env& env,
+                                Trigger* tparent,
                                 Node q,
                                 std::vector<Node>& pats);
 };
index a64f268cae3ee5d5368483e6084fe4cd8fa33bb6..10dcfe1298a5535a4d031be05bbc6023543576c5 100644 (file)
@@ -29,10 +29,11 @@ namespace theory {
 namespace quantifiers {
 namespace inst {
 
-InstMatchGeneratorSimple::InstMatchGeneratorSimple(Trigger* tparent,
+InstMatchGeneratorSimple::InstMatchGeneratorSimple(Env& env,
+                                                   Trigger* tparent,
                                                    Node q,
                                                    Node pat)
-    : IMGenerator(tparent), d_quant(q), d_match_pattern(pat)
+    : IMGenerator(env, tparent), d_quant(q), d_match_pattern(pat)
 {
   if (d_match_pattern.getKind() == NOT)
   {
index 8078087c87176fa5151f8a809f54bd4a6c7c510d..2d26919ac4a076efa668c23c66a175b82f0b23ba 100644 (file)
@@ -47,7 +47,7 @@ class InstMatchGeneratorSimple : public IMGenerator
 {
  public:
   /** constructors */
-  InstMatchGeneratorSimple(Trigger* tparent, Node q, Node pat);
+  InstMatchGeneratorSimple(Env& env, Trigger* tparent, Node q, Node pat);
 
   /** Reset instantiation round. */
   void resetInstantiationRound() override;
index 77ab468687d91859afc668376be3acb4f769d6a2..405f1fd696960d79034e576143c0ea66bf8b0352 100644 (file)
@@ -694,7 +694,6 @@ Node PatternTermSelector::getInversion(Node n, Node x)
             x = nm->mkNode(MULT, x, coeff);
           }
         }
-        x = Rewriter::rewrite(x);
       }
       else
       {
index 8c467489dd11091c6d7501e35b1d69a02e32e9b2..db523683cd7efd92e09b09119dccd3b2a46af076 100644 (file)
@@ -25,11 +25,9 @@ namespace theory {
 namespace quantifiers {
 namespace inst {
 
-RelationalMatchGenerator::RelationalMatchGenerator(Trigger* tparent,
-                                                   Node rtrigger,
-                                                   bool hasPol,
-                                                   bool pol)
-    : InstMatchGenerator(tparent, Node::null()),
+RelationalMatchGenerator::RelationalMatchGenerator(
+    Env& env, Trigger* tparent, Node rtrigger, bool hasPol, bool pol)
+    : InstMatchGenerator(env, tparent, Node::null()),
       d_vindex(-1),
       d_hasPol(hasPol),
       d_pol(pol),
index eead2876a55a6a094b7b968bdba9b7233e397c37..4aec7ae873aeb3ed4faa8ef468a0142e99c6b571 100644 (file)
@@ -55,10 +55,8 @@ class RelationalMatchGenerator : public InstMatchGenerator
    * @param hasPol Whether the trigger has an entailed polarity
    * @param pol The entailed polarity of the relational trigger.
    */
-  RelationalMatchGenerator(Trigger* tparent,
-                           Node rtrigger,
-                           bool hasPol,
-                           bool pol);
+  RelationalMatchGenerator(
+      Env& env, Trigger* tparent, Node rtrigger, bool hasPol, bool pol);
 
   /** Reset */
   bool reset(Node eqc) override;
index e267b470d026ce1a2b53b806b1ad9e09209d3069..1a79465646a23f452c034fd9e6bcfaac223218b4 100644 (file)
@@ -88,20 +88,21 @@ Trigger::Trigger(Env& env,
   if( d_nodes.size()==1 ){
     if (TriggerTermInfo::isSimpleTrigger(d_nodes[0]))
     {
-      d_mg = new InstMatchGeneratorSimple(this, q, d_nodes[0]);
+      d_mg = new InstMatchGeneratorSimple(env, this, q, d_nodes[0]);
       ++(stats.d_triggers);
     }else{
-      d_mg = InstMatchGenerator::mkInstMatchGenerator(this, q, d_nodes[0]);
+      d_mg = InstMatchGenerator::mkInstMatchGenerator(env, this, q, d_nodes[0]);
       ++(stats.d_simple_triggers);
     }
   }else{
     if (options().quantifiers.multiTriggerCache)
     {
-      d_mg = new InstMatchGeneratorMulti(this, q, d_nodes);
+      d_mg = new InstMatchGeneratorMulti(env, this, q, d_nodes);
     }
     else
     {
-      d_mg = InstMatchGenerator::mkInstMatchGeneratorMulti(this, q, d_nodes);
+      d_mg =
+          InstMatchGenerator::mkInstMatchGeneratorMulti(env, this, q, d_nodes);
     }
     if (Trace.isOn("multi-trigger"))
     {
index c03bf696080361a8ab14d3b06f485d9e4a8ba833..9ad52a1daaac23130a365a2329711eda07cb3eed 100644 (file)
@@ -24,10 +24,11 @@ namespace theory {
 namespace quantifiers {
 namespace inst {
 
-VarMatchGeneratorTermSubs::VarMatchGeneratorTermSubs(Trigger* tparent,
+VarMatchGeneratorTermSubs::VarMatchGeneratorTermSubs(Env& env,
+                                                     Trigger* tparent,
                                                      Node var,
                                                      Node subs)
-    : InstMatchGenerator(tparent, Node::null()),
+    : InstMatchGenerator(env, tparent, Node::null()),
       d_var(var),
       d_subs(subs),
       d_rm_prev(false)
@@ -51,7 +52,7 @@ int VarMatchGeneratorTermSubs::getNextMatch(Node q, InstMatch& m)
                                   << d_var << " in " << d_subs << std::endl;
     TNode tvar = d_var;
     Node s = d_subs.substitute(tvar, d_eq_class);
-    s = Rewriter::rewrite(s);
+    s = rewrite(s);
     Trace("var-trigger-matching")
         << "...got " << s << ", " << s.getKind() << std::endl;
     d_eq_class = Node::null();
index e664ac1dbb2fabc1c9880e500b24ab71b9bd5e5a..4cdb4e620038090c1e4afcdb4c908bd20220bb91 100644 (file)
@@ -32,7 +32,7 @@ namespace inst {
 class VarMatchGeneratorTermSubs : public InstMatchGenerator
 {
  public:
-  VarMatchGeneratorTermSubs(Trigger* tparent, Node var, Node subs);
+  VarMatchGeneratorTermSubs(Env& env, Trigger* tparent, Node var, Node subs);
 
   /** Reset */
   bool reset(Node eqc) override;
index 10e70d76a2b5b4a2e11367186234b80fa10ea8b3..127edac52849a2ecb9d4f185f862437bd7e66457 100644 (file)
@@ -431,7 +431,12 @@ void CegSingleInv::setSolution()
   if (!d_solvedf.empty())
   {
     // replace the final solution into the solved functions
-    finalSol.applyToRange(d_solvedf, true);
+    finalSol.applyToRange(d_solvedf);
+    // rewrite the solution
+    for (Node& n : d_solvedf.d_subs)
+    {
+      n = rewrite(n);
+    }
   }
 }