Rename getInstantiatedConstructorTerm to getInstantiatedTerm (#8549)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Mon, 4 Apr 2022 18:35:38 +0000 (13:35 -0500)
committerGitHub <noreply@github.com>
Mon, 4 Apr 2022 18:35:38 +0000 (18:35 +0000)
This is in line with the change for non-parametric constructors (getConstructorTerm -> getTerm).

Also adds documentation to make the use of constructors, selectors, testers, updaters more clear.

13 files changed:
src/api/cpp/cvc5.cpp
src/api/cpp/cvc5.h
src/api/java/io/github/cvc5/DatatypeConstructor.java
src/api/java/io/github/cvc5/DatatypeSelector.java
src/api/java/jni/datatype_constructor.cpp
src/api/python/cvc5.pxd
src/api/python/cvc5.pxi
src/parser/parser.cpp
src/parser/smt2/Smt2.g
test/unit/api/cpp/datatype_api_black.cpp
test/unit/api/cpp/solver_black.cpp
test/unit/api/java/DatatypeTest.java
test/unit/api/python/test_datatype_api.py

index 768ec181b18e5ed5767881e3b6c8b34fb36d6acd..610330b76d26a783af8df5f241e3597eb6054f5d 100644 (file)
@@ -3692,8 +3692,7 @@ Term DatatypeConstructor::getTerm() const
   CVC5_API_TRY_CATCH_END;
 }
 
-Term DatatypeConstructor::getInstantiatedConstructorTerm(
-    const Sort& retSort) const
+Term DatatypeConstructor::getInstantiatedTerm(const Sort& retSort) const
 {
   CVC5_API_TRY_CATCH_BEGIN;
   CVC5_API_CHECK_NOT_NULL;
index ef366cfe5becc2d27dc8e51a942df02d17d3abe4..44a30bfed3bced7ff3c966cbaf9d0d22832b35c0 100644 (file)
@@ -2018,13 +2018,23 @@ class CVC5_EXPORT DatatypeSelector
   std::string getName() const;
 
   /**
-   * Get the selector operator of this datatype selector.
+   * Get the selector term of this datatype selector.
+   *
+   * Selector terms are a class of function-like terms of selector
+   * sort (Sort::isDatatypeSelector()), and should be used as the first
+   * argument of Terms of kind #APPLY_SELECTOR.
+   *
    * @return the selector term
    */
   Term getTerm() const;
 
   /**
-   * Get the updater operator of this datatype selector.
+   * Get the updater term of this datatype selector.
+   *
+   * Similar to selectors, updater terms are a class of function-like terms of
+   * updater Sort (Sort::isDatatypeUpdater()), and should be used as the first
+   * argument of Terms of kind #APPLY_UPDATER.
+   *
    * @return the updater term
    */
   Term getUpdaterTerm() const;
@@ -2093,13 +2103,25 @@ class CVC5_EXPORT DatatypeConstructor
   std::string getName() const;
 
   /**
-   * Get the constructor operator of this datatype constructor.
+   * Get the constructor term of this datatype constructor.
+   *
+   * Datatype constructors are a special class of function-like terms whose sort
+   * is datatype constructor (Sort::isDatatypeConstructor()). All datatype
+   * constructors, including nullary ones, should be used as the
+   * first argument to Terms whose kind is #APPLY_CONSTRUCTOR. For example,
+   * the nil list can be constructed by
+   * `Solver::mkTerm(APPLY_CONSTRUCTOR, {t})`, where `t` is the term returned
+   * by this method.
+   *
+   * @note This method should not be used for parametric datatypes. Instead,
+   *       use the method DatatypeConstructor::getInstantiatedTerm() below.
+   *
    * @return the constructor term
    */
   Term getTerm() const;
 
   /**
-   * Get the constructor operator of this datatype constructor whose return
+   * Get the constructor term of this datatype constructor whose return
    * type is retSort. This method is intended to be used on constructors of
    * parametric datatypes and can be seen as returning the constructor
    * term that has been explicitly cast to the given sort.
@@ -2127,7 +2149,7 @@ class CVC5_EXPORT DatatypeConstructor
    * DatatypeConstructor is the one corresponding to nil, and retSort is
    * `(List Int)`.
    *
-   * @note the returned constructor term `t` is an operator, while
+   * @note the returned constructor term `t` is the constructor, while
    *       `Solver::mkTerm(APPLY_CONSTRUCTOR, {t})` is used to construct the
    *       above (nullary) application of nil.
    *
@@ -2136,11 +2158,16 @@ class CVC5_EXPORT DatatypeConstructor
    * @param retSort the desired return sort of the constructor
    * @return the constructor term
    */
-  Term getInstantiatedConstructorTerm(const Sort& retSort) const;
+  Term getInstantiatedTerm(const Sort& retSort) const;
 
   /**
-   * Get the tester operator of this datatype constructor.
-   * @return the tester operator
+   * Get the tester term of this datatype constructor.
+   *
+   * Similar to constructors, testers are a class of function-like terms of
+   * tester sort (Sort::isDatatypeConstructor()) which should be used as the
+   * first argument of Terms of kind #APPLY_TESTER.
+   *
+   * @return the tester term
    */
   Term getTesterTerm() const;
 
index 94a838d9570f8ec3b8387a4dd2418cbdf4d92d87..5a07d2c5e031050cd6e2c0ed61f689f6f6a41b06 100644 (file)
@@ -47,7 +47,18 @@ public class DatatypeConstructor extends AbstractPointer implements Iterable<Dat
   private native String getName(long pointer);
 
   /**
-   * Get the constructor operator of this datatype constructor.
+   * Get the constructor term of this datatype constructor.
+   *
+   * Datatype constructors are a special class of function-like terms whose sort
+   * is datatype constructor ({@link Sort#isDatatypeConstructor()}). All datatype
+   * constructors, including nullary ones, should be used as the
+   * first argument to Terms whose kind is APPLY_CONSTRUCTOR. For example,
+   * the nil list is represented by the term (APPLY_CONSTRUCTOR nil), where
+   * nil is the term returned by this method.
+   *
+   * @api.note This method should not be used for parametric datatypes. Instead,
+   *           use the method {@link DatatypeConstructor#getInstantiatedTerm(Sort)} below.
+   *
    * @return the constructor term
    */
   public Term getTerm()
@@ -59,7 +70,7 @@ public class DatatypeConstructor extends AbstractPointer implements Iterable<Dat
   private native long getTerm(long pointer);
 
   /**
-   * Get the constructor operator of this datatype constructor whose return
+   * Get the constructor term of this datatype constructor whose return
    * type is retSort. This method is intended to be used on constructors of
    * parametric datatypes and can be seen as returning the constructor
    * term that has been explicitly cast to the given sort.
@@ -74,7 +85,7 @@ public class DatatypeConstructor extends AbstractPointer implements Iterable<Dat
    * DatatypeConstructor is the one corresponding to nil, and retSort is
    * (List Int).
    *
-   * Furthermore note that the returned constructor term t is an operator,
+   * Furthermore note that the returned constructor term t is the constructor,
    * while Solver::mkTerm(APPLY_CONSTRUCTOR, t) is used to construct the above
    * (nullary) application of nil.
    *
@@ -83,17 +94,22 @@ public class DatatypeConstructor extends AbstractPointer implements Iterable<Dat
    * @param retSort the desired return sort of the constructor
    * @return the constructor term
    */
-  public Term getInstantiatedConstructorTerm(Sort retSort)
+  public Term getInstantiatedTerm(Sort retSort)
   {
-    long termPointer = getInstantiatedConstructorTerm(pointer, retSort.getPointer());
+    long termPointer = getInstantiatedTerm(pointer, retSort.getPointer());
     return new Term(solver, termPointer);
   }
 
-  private native long getInstantiatedConstructorTerm(long pointer, long retSortPointer);
+  private native long getInstantiatedTerm(long pointer, long retSortPointer);
 
   /**
-   * Get the tester operator of this datatype constructor.
-   * @return the tester operator
+   * Get the tester term of this datatype constructor.
+   *
+   * Similar to constructors, testers are a class of function-like terms of
+   * tester sort ({@link Sort#isDatatypeTester()}), and should be used as the first
+   * argument of Terms of kind APPLY_TESTER.
+   *
+   * @return the tester term
    */
   public Term getTesterTerm()
   {
index 325b0b1d083f383ec0344e3f2656c5608dee4860..c093270cd64d6cf9898a2154c761883675e67547 100644 (file)
@@ -44,7 +44,12 @@ public class DatatypeSelector extends AbstractPointer
   private native String getName(long pointer);
 
   /**
-   * Get the selector operator of this datatype selector.
+   * Get the selector term of this datatype selector.
+   *
+   * Selector terms are a class of function-like terms of selector
+   * sort (Sort::isDatatypeSelector), and should be used as the first
+   * argument of Terms of kind APPLY_SELECTOR.
+   *
    * @return the selector term
    */
   public Term getTerm()
@@ -56,7 +61,12 @@ public class DatatypeSelector extends AbstractPointer
   private native long getTerm(long pointer);
 
   /**
-   * Get the upater operator of this datatype selector.
+   * Get the updater term of this datatype selector.
+   *
+   * Similar to selectors, updater terms are a class of function-like terms of
+   * updater Sort (Sort::isDatatypeUpdater), and should be used as the first
+   * argument of Terms of kind APPLY_UPDATER.
+   *
    * @return the updater term
    */
   public Term getUpdaterTerm()
index 2f6645d0c4e470bc1e72030cd3998ccd891df852..243a9628b0e448f10409773892c536129e389237 100644 (file)
@@ -63,17 +63,17 @@ JNIEXPORT jlong JNICALL Java_io_github_cvc5_DatatypeConstructor_getTerm(
 
 /*
  * Class:     io_github_cvc5_DatatypeConstructor
- * Method:    getInstantiatedConstructorTerm
+ * Method:    getInstantiatedTerm
  * Signature: (JJ)J
  */
 JNIEXPORT jlong JNICALL
-Java_io_github_cvc5_DatatypeConstructor_getInstantiatedConstructorTerm(
+Java_io_github_cvc5_DatatypeConstructor_getInstantiatedTerm(
     JNIEnv* env, jobject, jlong pointer, jlong retSortPointer)
 {
   CVC5_JAVA_API_TRY_CATCH_BEGIN;
   DatatypeConstructor* current = (DatatypeConstructor*)pointer;
   Sort* sort = (Sort*)retSortPointer;
-  Term* retPointer = new Term(current->getInstantiatedConstructorTerm(*sort));
+  Term* retPointer = new Term(current->getInstantiatedTerm(*sort));
   return (jlong)retPointer;
   CVC5_JAVA_API_TRY_CATCH_END_RETURN(env, 0);
 }
index 52d6974922d202e25981e77864fcf0587c0d74b3..2e6dfa49339cf4589a4b35526c79be771ac5c695 100644 (file)
@@ -86,7 +86,7 @@ cdef extern from "api/cpp/cvc5.h" namespace "cvc5":
         DatatypeSelector operator[](const string& name) except +
         string getName() except +
         Term getTerm() except +
-        Term getInstantiatedConstructorTerm(const Sort& retSort) except +
+        Term getInstantiatedTerm(const Sort& retSort) except +
         Term getTesterTerm() except +
         size_t getNumSelectors() except +
         DatatypeSelector getSelector(const string& name) except +
index 90aa5deccf03ed61233497de8d0fb5f94546cca5..a02adec3370a7957d3d4618b4ccf7b71f99e4474 100644 (file)
@@ -257,16 +257,34 @@ cdef class DatatypeConstructor:
         return self.cdc.getName().decode()
 
     def getTerm(self):
-        """
-            :return: The constructor operator as a term.
+        """   
+            Get the constructor term of this datatype constructor.
+            
+            Datatype constructors are a special class of function-like terms
+            whose sort is datatype constructor
+            (:py:meth:`Sort.isDatatypeConstructor()`). All datatype
+            constructors, including nullary ones, should be used as the first
+            argument to Terms whose kind is
+            :py:obj:`APPLY_CONSTRUCTOR <cvc5.Kind.APPLY_CONSTRUCTOR>`.
+            For example, the nil list can be constructed via
+            ``Solver.mkTerm(APPLY_CONSTRUCTOR, [nil])``, where nil is the Term
+            returned by this method.
+
+            .. note::
+
+                This method should not be used for parametric datatypes.
+                Instead, use the method
+                :py:meth:`DatatypeConstructor.getInstantiatedTerm()` below.
+
+            :return: The constructor term.
         """
         cdef Term term = Term(self.solver)
         term.cterm = self.cdc.getTerm()
         return term
 
-    def getInstantiatedConstructorTerm(self, Sort retSort):
+    def getInstantiatedTerm(self, Sort retSort):
         """
-            Get the constructor operator of this datatype constructor whose
+            Get the constructor term of this datatype constructor whose
             return type is retSort. This method is intended to be used on
             constructors of parametric datatypes and can be seen as returning
             the constructor term that has been explicitly cast to the given
@@ -294,7 +312,7 @@ cdef class DatatypeConstructor:
 
             .. note::
 
-                The returned constructor term ``t`` is an operator, while
+                The returned constructor term ``t`` is the constructor, while
                 ``Solver.mkTerm(APPLY_CONSTRUCTOR, [t])`` is used to construct
                 the above (nullary) application of nil.
 
@@ -302,16 +320,21 @@ cdef class DatatypeConstructor:
                          versions.
 
             :param retSort: The desired return sort of the constructor.
-            :return: The constructor operator as a term.
+            :return: The constructor term.
         """
         cdef Term term = Term(self.solver)
-        term.cterm = self.cdc.getInstantiatedConstructorTerm(retSort.csort)
+        term.cterm = self.cdc.getInstantiatedTerm(retSort.csort)
         return term
 
     def getTesterTerm(self):
         """
-            :return: The tester operator that is related to this constructor,
-                     as a term.
+            Get the tester term of this datatype constructor.
+
+            Similar to constructors, testers are a class of function-like terms
+            of tester sort (:py:meth:`Sort.isDatatypeTester`), and should
+            be used as the first argument of Terms of kind APPLY_TESTER.
+
+            :return: The tester term for this constructor.
         """
         cdef Term term = Term(self.solver)
         term.cterm = self.cdc.getTesterTerm()
@@ -496,7 +519,14 @@ cdef class DatatypeSelector:
 
     def getTerm(self):
         """
-            :return: The selector opeartor of this datatype selector as a term.
+            Get the selector term of this datatype selector.
+
+            Selector terms are a class of function-like terms of selector
+            sort (:py:meth:`Sort.isDatatypeSelector()`), and should be used as
+            the first argument of Terms of kind
+            :py:obj:`APPLY_SELECTOR <cvc5.Kind.APPLY_SELECTOR>`.
+
+            :return: The selector term of this datatype selector.
         """
         cdef Term term = Term(self.solver)
         term.cterm = self.cds.getTerm()
@@ -504,7 +534,14 @@ cdef class DatatypeSelector:
 
     def getUpdaterTerm(self):
         """
-            :return: The updater opeartor of this datatype selector as a term.
+            Get the updater term of this datatype selector.
+
+            Similar to selectors, updater terms are a class of function-like
+            terms of updater Sort (:py:meth:`Sort.isDatatypeUpdater()`), and
+            should be used as the first argument of Terms of kind
+            :py:ob:`APPLY_UPDATER <cvc5.Kind.APPLY_UPDATER>`.
+
+            :return: The updater term of this datatype selector.
         """
         cdef Term term = Term(self.solver)
         term.cterm = self.cds.getUpdaterTerm()
index 5bd4c1c9c0e17440b549b3cdc859c3b9b9047c9f..cb26ffd8c52d65815351cc7a899312adae4beefe 100644 (file)
@@ -567,7 +567,7 @@ cvc5::Term Parser::applyTypeAscription(cvc5::Term t, cvc5::Sort s)
       // lookup by name
       cvc5::DatatypeConstructor dc = d.getConstructor(t.toString());
       // ask the constructor for the specialized constructor term
-      t = dc.getInstantiatedConstructorTerm(s);
+      t = dc.getInstantiatedTerm(s);
     }
     // the type of t does not match the sort s by design (constructor type
     // vs datatype type), thus we use an alternative check here.
index 188f6ad06f9ee1ea83219d20b01ac4370841260e..b54ad64615dee8b0624f0271eda8c2edd756dc26 100644 (file)
@@ -1384,7 +1384,7 @@ termNonVariable[cvc5::Term& expr, cvc5::Term& expr2]
           {
             // lookup constructor by name
             cvc5::DatatypeConstructor dc = dt.getConstructor(f.toString());
-            cvc5::Term scons = dc.getInstantiatedConstructorTerm(expr.getSort());
+            cvc5::Term scons = dc.getInstantiatedTerm(expr.getSort());
             // take the type of the specialized constructor instead
             type = scons.getSort();
           }
index ad0c567010fd83c3ad4c746cca7c8984a6fef59f..b29e232e004c8244c809ee9872c2c1be7955c6fb 100644 (file)
@@ -587,10 +587,10 @@ TEST_F(TestApiBlackDatatype, datatypeSpecializedCons)
 
   Term testConsTerm;
   // get the specialized constructor term for list[Int]
-  ASSERT_NO_THROW(testConsTerm = nilc.getInstantiatedConstructorTerm(listInt));
+  ASSERT_NO_THROW(testConsTerm = nilc.getInstantiatedTerm(listInt));
   ASSERT_NE(testConsTerm, nilc.getTerm());
   // error to get the specialized constructor term for Int
-  ASSERT_THROW(nilc.getInstantiatedConstructorTerm(isort), CVC5ApiException);
+  ASSERT_THROW(nilc.getInstantiatedTerm(isort), CVC5ApiException);
 }
 }  // namespace test
 }  // namespace cvc5::internal
index 1e0ff5a66d149cb40dc70cfd5ad0359f512f7057..bcbbe0ac05c35d7b177e2a57b5f1555afbeb7ca0 100644 (file)
@@ -3057,15 +3057,14 @@ TEST_F(TestApiBlackSolver, proj_issue382)
   Term t53 = d_solver.mkTerm(MATCH_BIND_CASE,
                              {d_solver.mkTerm(VARIABLE_LIST, {t52}), t52, t18});
   Term t73 = d_solver.mkVar(s1, "_x78");
-  Term t81 =
-      d_solver.mkTerm(MATCH_BIND_CASE,
-                      {d_solver.mkTerm(VARIABLE_LIST, {t73}),
-                       d_solver.mkTerm(APPLY_CONSTRUCTOR,
-                                       {s6.getDatatype()
-                                            .getConstructor("_x20")
-                                            .getInstantiatedConstructorTerm(s6),
-                                        t73}),
-                       t18});
+  Term t81 = d_solver.mkTerm(
+      MATCH_BIND_CASE,
+      {d_solver.mkTerm(VARIABLE_LIST, {t73}),
+       d_solver.mkTerm(
+           APPLY_CONSTRUCTOR,
+           {s6.getDatatype().getConstructor("_x20").getInstantiatedTerm(s6),
+            t73}),
+       t18});
   Term t82 = d_solver.mkTerm(MATCH, {t13, t53, t53, t53, t81});
   Term t325 = d_solver.mkTerm(
       APPLY_SELECTOR,
index 557db2f9b48d8a3eb04cac3c50040b1be5e6ad70..01e2d29891a1e49e82fed38f23b4473703a8f4bd 100644 (file)
@@ -590,10 +590,10 @@ class DatatypeTest
 
     AtomicReference<Term> atomicTerm = new AtomicReference<>();
     // get the specialized constructor term for list[Int]
-    assertDoesNotThrow(() -> atomicTerm.set(nilc.getInstantiatedConstructorTerm(listInt)));
+    assertDoesNotThrow(() -> atomicTerm.set(nilc.getInstantiatedTerm(listInt)));
     Term testConsTerm = atomicTerm.get();
     assertNotEquals(testConsTerm, nilc.getTerm());
     // error to get the specialized constructor term for Int
-    assertThrows(CVC5ApiException.class, () -> nilc.getInstantiatedConstructorTerm(isort));
+    assertThrows(CVC5ApiException.class, () -> nilc.getInstantiatedTerm(isort));
   }
 }
index 09d5ce05eacb146265895bb5c715314c1ce19d89..a2b79ca7ef88d22d97151b5c810c1abcef2b5a41 100644 (file)
@@ -557,8 +557,8 @@ def test_datatype_specialized_cons(solver):
 
     testConsTerm = Term(solver)
     # get the specialized constructor term for list[Int]
-    testConsTerm = nilc.getInstantiatedConstructorTerm(listInt)
+    testConsTerm = nilc.getInstantiatedTerm(listInt)
     assert testConsTerm != nilc.getTerm()
     # error to get the specialized constructor term for Int
     with pytest.raises(RuntimeError):
-        nilc.getInstantiatedConstructorTerm(isort)
+        nilc.getInstantiatedTerm(isort)