Move ExprManager::isNAryKind to NodeManager. (#6107)
authorAina Niemetz <aina.niemetz@gmail.com>
Wed, 10 Mar 2021 21:28:58 +0000 (13:28 -0800)
committerGitHub <noreply@github.com>
Wed, 10 Mar 2021 21:28:58 +0000 (21:28 +0000)
This also renames metakind::getLowerBoundForKind and
metakind::getUpperBoundForKind for consistency.

Note that the NodeManager class needs to be reordered to comply to our
style guidelines. This PR does not reorder but introduces a public block
at the top (where the rest of the public interface of the class should
go eventually).

13 files changed:
src/api/cvc4cpp.cpp
src/expr/expr_manager_template.cpp
src/expr/metakind_template.cpp
src/expr/metakind_template.h
src/expr/node_builder.h
src/expr/node_manager.cpp
src/expr/node_manager.h
src/smt_util/nary_builder.cpp
src/theory/quantifiers/extended_rewrite.cpp
src/theory/uf/eq_proof.cpp
src/theory/uf/equality_engine.cpp
test/unit/expr/node_black.cpp
test/unit/expr/node_manager_black.cpp

index 3006eff71f4a148b748e4b55a453441e44e1948e..e27ba3b9140e45f49b82035b03a6a4f586a86443 100644 (file)
@@ -726,7 +726,7 @@ uint32_t minArity(Kind k)
 {
   Assert(isDefinedKind(k));
   Assert(isDefinedIntKind(extToIntKind(k)));
-  uint32_t min = CVC4::kind::metakind::getLowerBoundForKind(extToIntKind(k));
+  uint32_t min = CVC4::kind::metakind::getMinArityForKind(extToIntKind(k));
 
   // At the API level, we treat functions/constructors/selectors/testers as
   // normal terms instead of making them part of the operator
@@ -742,7 +742,7 @@ uint32_t maxArity(Kind k)
 {
   Assert(isDefinedKind(k));
   Assert(isDefinedIntKind(extToIntKind(k)));
-  uint32_t max = CVC4::kind::metakind::getUpperBoundForKind(extToIntKind(k));
+  uint32_t max = CVC4::kind::metakind::getMaxArityForKind(extToIntKind(k));
 
   // At the API level, we treat functions/constructors/selectors/testers as
   // normal terms instead of making them part of the operator
index c4a8871fee92cef1beb03624fa7ea1b52cbf09ac..414d8a61167c062da45ccc375332476c35a02ffb 100644 (file)
@@ -812,11 +812,11 @@ Expr ExprManager::mkChain(Kind kind, const std::vector<Expr>& children)
 }
 
 unsigned ExprManager::minArity(Kind kind) {
-  return metakind::getLowerBoundForKind(kind);
+  return metakind::getMinArityForKind(kind);
 }
 
 unsigned ExprManager::maxArity(Kind kind) {
-  return metakind::getUpperBoundForKind(kind);
+  return metakind::getMaxArityForKind(kind);
 }
 
 bool ExprManager::isNAryKind(Kind fun)
index 96e06156d3ffe6f35cd6093f6111cf634c9b6b4d..6e76c0da384348e1a0f3799267cac3497700ca7b 100644 (file)
@@ -147,7 +147,8 @@ ${metakind_constDeleters}
 // re-enable the strict-aliasing warning
 # pragma GCC diagnostic warning "-Wstrict-aliasing"
 
-unsigned getLowerBoundForKind(::CVC4::Kind k) {
+uint32_t getMinArityForKind(::CVC4::Kind k)
+{
   static const unsigned lbs[] = {
     0, /* NULL_EXPR */
 ${metakind_lbchildren}
@@ -158,7 +159,8 @@ ${metakind_lbchildren}
   return lbs[k];
 }
 
-unsigned getUpperBoundForKind(::CVC4::Kind k) {
+uint32_t getMaxArityForKind(::CVC4::Kind k)
+{
   static const unsigned ubs[] = {
     0, /* NULL_EXPR */
 ${metakind_ubchildren}
@@ -168,8 +170,7 @@ ${metakind_ubchildren}
 
   return ubs[k];
 }
-
-}/* CVC4::metakind namespace */
+}  // namespace metakind
 
 /**
  * Map a kind of the operator to the kind of the enclosing expression. For
index 4e47d423029eb23eb142a74d13fc67b4606a403f..42b7da248e4456d006d833ed121ec4b616245afd 100644 (file)
@@ -187,8 +187,10 @@ struct NodeValueConstPrinter {
  */
 void deleteNodeValueConstant(::CVC4::expr::NodeValue* nv);
 
-unsigned getLowerBoundForKind(::CVC4::Kind k);
-unsigned getUpperBoundForKind(::CVC4::Kind k);
+/** Return the minimum arity of the given kind. */
+uint32_t getMinArityForKind(::CVC4::Kind k);
+/** Return the maximum arity of the given kind. */
+uint32_t getMaxArityForKind(::CVC4::Kind k);
 
 }/* CVC4::kind::metakind namespace */
 
index 2f464066865880b60d2359d11421318d2ff91e42..91b378c5f2b97e4a0a706da385c8a5bafa640d17 100644 (file)
@@ -957,15 +957,15 @@ expr::NodeValue* NodeBuilder<nchild_thresh>::constructNV() {
   // check that there are the right # of children for this kind
   Assert(getMetaKind() != kind::metakind::CONSTANT)
       << "Cannot make Nodes with NodeBuilder that have CONSTANT-kinded kinds";
-  Assert(getNumChildren() >= kind::metakind::getLowerBoundForKind(getKind()))
+  Assert(getNumChildren() >= kind::metakind::getMinArityForKind(getKind()))
       << "Nodes with kind " << getKind() << " must have at least "
-      << kind::metakind::getLowerBoundForKind(getKind())
+      << kind::metakind::getMinArityForKind(getKind())
       << " children (the one under "
          "construction has "
       << getNumChildren() << ")";
-  Assert(getNumChildren() <= kind::metakind::getUpperBoundForKind(getKind()))
+  Assert(getNumChildren() <= kind::metakind::getMaxArityForKind(getKind()))
       << "Nodes with kind " << getKind() << " must have at most "
-      << kind::metakind::getUpperBoundForKind(getKind())
+      << kind::metakind::getMaxArityForKind(getKind())
       << " children (the one under "
          "construction has "
       << getNumChildren() << ")";
@@ -1132,15 +1132,15 @@ expr::NodeValue* NodeBuilder<nchild_thresh>::constructNV() const {
   // check that there are the right # of children for this kind
   Assert(getMetaKind() != kind::metakind::CONSTANT)
       << "Cannot make Nodes with NodeBuilder that have CONSTANT-kinded kinds";
-  Assert(getNumChildren() >= kind::metakind::getLowerBoundForKind(getKind()))
+  Assert(getNumChildren() >= kind::metakind::getMinArityForKind(getKind()))
       << "Nodes with kind " << getKind() << " must have at least "
-      << kind::metakind::getLowerBoundForKind(getKind())
+      << kind::metakind::getMinArityForKind(getKind())
       << " children (the one under "
          "construction has "
       << getNumChildren() << ")";
-  Assert(getNumChildren() <= kind::metakind::getUpperBoundForKind(getKind()))
+  Assert(getNumChildren() <= kind::metakind::getMaxArityForKind(getKind()))
       << "Nodes with kind " << getKind() << " must have at most "
-      << kind::metakind::getUpperBoundForKind(getKind())
+      << kind::metakind::getMaxArityForKind(getKind())
       << " children (the one under "
          "construction has "
       << getNumChildren() << ")";
index 5eb01ecbb71a0ca777174779e7393caa71e1607c..12fc99eaaec58f3875c8967085976a73c82edaed 100644 (file)
@@ -27,6 +27,7 @@
 #include "expr/bound_var_manager.h"
 #include "expr/dtype.h"
 #include "expr/dtype_cons.h"
+#include "expr/metakind.h"
 #include "expr/node_manager_attributes.h"
 #include "expr/skolem_manager.h"
 #include "expr/type_checker.h"
@@ -108,6 +109,11 @@ NodeManager::NodeManager(ExprManager* exprManager)
   init();
 }
 
+bool NodeManager::isNAryKind(Kind k)
+{
+  return kind::metakind::getMaxArityForKind(k) == expr::NodeValue::MAX_CHILDREN;
+}
+
 TypeNode NodeManager::booleanType()
 {
   return mkTypeConst<TypeConstant>(BOOLEAN_TYPE);
@@ -965,7 +971,7 @@ Node NodeManager::mkAssociative(Kind kind, const std::vector<Node>& children)
 {
   AlwaysAssert(kind::isAssociative(kind)) << "Illegal kind in mkAssociative";
 
-  const unsigned int max = kind::metakind::getUpperBoundForKind(kind);
+  const unsigned int max = kind::metakind::getMaxArityForKind(kind);
   size_t numChildren = children.size();
 
   /* If the number of children is within bounds, then there's nothing to do. */
@@ -973,7 +979,7 @@ Node NodeManager::mkAssociative(Kind kind, const std::vector<Node>& children)
   {
     return mkNode(kind, children);
   }
-  const unsigned int min = kind::metakind::getLowerBoundForKind(kind);
+  const unsigned int min = kind::metakind::getMinArityForKind(kind);
 
   std::vector<Node>::const_iterator it = children.begin();
   std::vector<Node>::const_iterator end = children.end();
index 7eba1b2ea404660d8a9635325ebcef2d14131382..fc58410d17312ddbd1b182e0ba57536af0d158ff 100644 (file)
@@ -98,6 +98,15 @@ class NodeManager
   friend class NodeBuilder;
   friend class NodeManagerScope;
 
+ public:
+  /**
+   * Return true if given kind is n-ary. The test is based on n-ary kinds
+   * having their maximal arity as the maximal possible number of children
+   * of a node.
+   */
+  static bool isNAryKind(Kind k);
+
+ private:
   /** Predicate for use with STL algorithms */
   struct NodeValueReferenceCountNonZero {
     bool operator()(expr::NodeValue* nv) { return nv->d_rc > 0; }
index 0f30b803ad5d19846da6bbe97a4b053cc615a1fe..fa154c245f6d840fbf1eb2601a1bc35e6017807d 100644 (file)
@@ -23,14 +23,20 @@ using namespace std;
 namespace CVC4 {
 namespace util {
 
-Node NaryBuilder::mkAssoc(Kind kind, const std::vector<Node>& children){
-  if(children.size() == 0){
+Node NaryBuilder::mkAssoc(Kind kind, const std::vector<Node>& children)
+{
+  if (children.size() == 0)
+  {
     return zeroArity(kind);
-  }else if(children.size() == 1){
+  }
+  else if (children.size() == 1)
+  {
     return children[0];
-  }else{
-    const unsigned int max = kind::metakind::getUpperBoundForKind(kind);
-    const unsigned int min = kind::metakind::getLowerBoundForKind(kind);
+  }
+  else
+  {
+    const uint32_t max = kind::metakind::getMaxArityForKind(kind);
+    const uint32_t min = kind::metakind::getMinArityForKind(kind);
 
     Assert(min <= children.size());
 
index ee0c172af7484d193f21dcb6e3b690aecdec8e0d..c201c9ffc202266e1320515459174ebf09bcd79a 100644 (file)
@@ -184,9 +184,10 @@ Node ExtendedRewriter::extendedRewrite(Node n)
         // we may have subsumed children down to one
         ret = children[0];
       }
-      else if (isAssoc && children.size() > kind::metakind::getUpperBoundForKind(k))
+      else if (isAssoc
+               && children.size() > kind::metakind::getMaxArityForKind(k))
       {
-        Assert(kind::metakind::getUpperBoundForKind(k) >= 2);
+        Assert(kind::metakind::getMaxArityForKind(k) >= 2);
         // kind may require binary construction
         ret = children[0];
         for (unsigned i = 1, nchild = children.size(); i < nchild; i++)
index 7e36edcd4c15f7a6f82c953c90888780f600fb9b..3cbac95a2741913d3f2b17b9c01da71f87f19e88 100644 (file)
@@ -1182,7 +1182,7 @@ Node EqProof::addToProof(
   // use (= t1 t2) as a premise and rely on a symmetry step to justify it.
   unsigned arity = d_node[0].getNumChildren();
   Kind k = d_node[0].getKind();
-  bool isNary = ExprManager::isNAryKind(k);
+  bool isNary = NodeManager::isNAryKind(k);
 
   // N-ary operators are fun. The following proof is a valid EqProof
   //
index 59dc3943d2f03547ee3d0cd3126bc1cda6fa1007..3eb0ed62996b7dbf221da563bfcdc5482a61719b 100644 (file)
@@ -1029,7 +1029,7 @@ void EqualityEngine::buildEqConclusion(EqualityNodeId id1,
   if ((d_isInternal[id1] || d_isInternal[id2])
       && (k1 != k2 || k1 == kind::APPLY_UF || k1 == kind::APPLY_CONSTRUCTOR
           || k1 == kind::APPLY_SELECTOR || k1 == kind::APPLY_TESTER
-          || !ExprManager::isNAryKind(k1)))
+          || !NodeManager::isNAryKind(k1)))
   {
     return;
   }
index 0d481ea4f8b32d4ed4fae21d5bbbfbf9d8cd8561..6c9c0a932c7287f49bd915f7edc380ba32c447b4 100644 (file)
@@ -445,16 +445,16 @@ TEST_F(TestNodeBlackNode, getNumChildren)
 #ifdef CVC4_ASSERTIONS
   ASSERT_DEATH(testNaryExpForSize(AND, 0),
                "getNumChildren\\(\\) >= "
-               "kind::metakind::getLowerBoundForKind\\(getKind\\(\\)\\)");
+               "kind::metakind::getMinArityForKind\\(getKind\\(\\)\\)");
   ASSERT_DEATH(testNaryExpForSize(AND, 1),
                "getNumChildren\\(\\) >= "
-               "kind::metakind::getLowerBoundForKind\\(getKind\\(\\)\\)");
+               "kind::metakind::getMinArityForKind\\(getKind\\(\\)\\)");
   ASSERT_DEATH(testNaryExpForSize(NOT, 0),
                "getNumChildren\\(\\) >= "
-               "kind::metakind::getLowerBoundForKind\\(getKind\\(\\)\\)");
+               "kind::metakind::getMinArityForKind\\(getKind\\(\\)\\)");
   ASSERT_DEATH(testNaryExpForSize(NOT, 2),
                "getNumChildren\\(\\) <= "
-               "kind::metakind::getUpperBoundForKind\\(getKind\\(\\)\\)");
+               "kind::metakind::getMaxArityForKind\\(getKind\\(\\)\\)");
 #endif /* CVC4_ASSERTIONS */
 }
 
index 2d8570fa53094c49773a16de27e1094a1a761866..a2ede3ed01de5995c2b2fb236fdcb18f5f7b56be 100644 (file)
@@ -314,7 +314,7 @@ TEST_F(TestNodeBlackNodeManager, mkNode_too_many_children)
 {
 #ifdef CVC4_ASSERTIONS
   std::vector<Node> vars;
-  const unsigned int max = metakind::getUpperBoundForKind(AND);
+  const uint32_t max = metakind::getMaxArityForKind(AND);
   TypeNode boolType = d_nodeManager->booleanType();
   Node skolem_i = d_nodeManager->mkSkolem("i", boolType);
   Node skolem_j = d_nodeManager->mkSkolem("j", boolType);