Minor improvements to the API (#6585)
authorGereon Kremer <nafur42@gmail.com>
Thu, 20 May 2021 14:29:17 +0000 (16:29 +0200)
committerGitHub <noreply@github.com>
Thu, 20 May 2021 14:29:17 +0000 (16:29 +0200)
This PR does some minor improvements to the API:
- remove getConstSequenceElements(), use getSequenceValue() instead
- improve documentation for Term

docs/cpp/term.rst
src/api/cpp/cvc5.cpp
src/api/cpp/cvc5.h
src/api/cpp/cvc5_kind.h
src/api/python/cvc5.pxd
src/api/python/cvc5.pxi
src/parser/parser.cpp
test/python/unit/api/test_term.py
test/unit/api/term_black.cpp

index 022c570b540ab1576bcfab997b198182230c22f8..1f112a58a5532a79be52c02e9b4e37f851062283 100644 (file)
@@ -1,6 +1,13 @@
 Term
 ====
 
+The :cpp:class:`Term <cvc5::api::Term>` class represents arbitrary expressions that are Boolean or from some of the supported theories. The list of all supported types (or kinds) is given by the :cpp:enum:`Kind <cvc5::api::Kind>` enum.
+The :cpp:class:`Term <cvc5::api::Term>` class provides methods for general inspection (e.g., comparison, retrieve the kind and sort, access sub-terms), but also methods to retrieving constant values for the supported theories (i.e., :code:`is<Type>Value()` and :code:`get<Type>Value()`, which returns the constant values in the best type standard C++ offers).
+
+Additionally, a :cpp:class:`Term <cvc5::api::Term>` can be hashed (using :cpp:class:`std::hash\<cvc5::api::Term>`) and given to output streams, including terms within standard containers like :code:`std::map`, :code:`std::set`, or :code:`std::vector`.
+
+The :cpp:class:`Term <cvc5::api::Term>` only offers the default constructor to create a null term. Instead, the :cpp:class:`Solver <cvc5::api::Solver>` class provides factory functions for all other terms, e.g., :code:`Solver::mkTerm()` for generic terms and :code:`Solver::mk<Type>()` for constant values of a given type.
+
 .. doxygenclass:: cvc5::api::Term
     :project: cvc5
     :members:
index d7959c95035f94c4e965368ce2750225230ece4f..ed35659f0d0d600a6f026c6e058d8d29e081412e 100644 (file)
@@ -2309,25 +2309,6 @@ bool Term::isNull() const
   CVC5_API_TRY_CATCH_END;
 }
 
-std::vector<Term> Term::getConstSequenceElements() const
-{
-  CVC5_API_TRY_CATCH_BEGIN;
-  CVC5_API_CHECK_NOT_NULL;
-  CVC5_API_CHECK(d_node->getKind() == cvc5::Kind::CONST_SEQUENCE)
-      << "Expecting a CONST_SEQUENCE Term when calling "
-         "getConstSequenceElements()";
-  //////// all checks before this line
-  const std::vector<Node>& elems = d_node->getConst<Sequence>().getVec();
-  std::vector<Term> terms;
-  for (const Node& t : elems)
-  {
-    terms.push_back(Term(d_solver, t));
-  }
-  return terms;
-  ////////
-  CVC5_API_TRY_CATCH_END;
-}
-
 Term Term::notTerm() const
 {
   CVC5_API_TRY_CATCH_BEGIN;
index 42d162e18a4a09ee49b99d4be7eea8d259e1f6db..f77869c2cdf9c6dd629ff926b5a208c57f4a3ea5 100644 (file)
@@ -945,7 +945,7 @@ class CVC5_EXPORT Term
 
  public:
   /**
-   * Constructor.
+   * Constructor for a null term.
    */
   Term();
 
@@ -973,28 +973,28 @@ class CVC5_EXPORT Term
   bool operator!=(const Term& t) const;
 
   /**
-   * Comparison for ordering on terms.
+   * Comparison for ordering on terms by their id.
    * @param t the term to compare to
    * @return true if this term is less than t
    */
   bool operator<(const Term& t) const;
 
   /**
-   * Comparison for ordering on terms.
+   * Comparison for ordering on terms by their id.
    * @param t the term to compare to
    * @return true if this term is greater than t
    */
   bool operator>(const Term& t) const;
 
   /**
-   * Comparison for ordering on terms.
+   * Comparison for ordering on terms by their id.
    * @param t the term to compare to
    * @return true if this term is less than or equal to t
    */
   bool operator<=(const Term& t) const;
 
   /**
-   * Comparison for ordering on terms.
+   * Comparison for ordering on terms by their id.
    * @param t the term to compare to
    * @return true if this term is greater than or equal to t
    */
@@ -1053,13 +1053,6 @@ class CVC5_EXPORT Term
    */
   bool isNull() const;
 
-  /**
-   *  Return the elements of a constant sequence
-   *  throws an exception if the kind is not CONST_SEQUENCE
-   *  @return the elements of the constant sequence.
-   */
-  std::vector<Term> getConstSequenceElements() const;
-
   /**
    * Boolean negation.
    * @return the Boolean negation of this term
index 0375b5e606105ee5414b4dd411d88caddbce7d53..cad029b72b045bed2e5e4426fead6268f8da605c 100644 (file)
@@ -3200,7 +3200,7 @@ enum CVC5_EXPORT Kind : int32_t
    *     (seq.++ (seq.unit c1) ... (seq.unit cn))
    *
    * where n>=0 and c1, ..., cn are constants of some sort. The elements
-   * can be extracted by `Term::getConstSequenceElements()`.
+   * can be extracted by `Term::getSequenceValue()`.
    */
   CONST_SEQUENCE,
   /**
index 24f8ac0a0b9c0c64f2c854f464beed569784a6fa..6fbc5ab57827961f6a67f248764965e2f9dc6a7f 100644 (file)
@@ -359,7 +359,6 @@ cdef extern from "api/cpp/cvc5.h" namespace "cvc5::api":
         Op getOp() except +
         bint isNull() except +
         Term getConstArrayBase() except +
-        vector[Term] getConstSequenceElements() except +
         Term notTerm() except +
         Term andTerm(const Term& t) except +
         Term orTerm(const Term& t) except +
@@ -377,6 +376,7 @@ cdef extern from "api/cpp/cvc5.h" namespace "cvc5::api":
         const_iterator begin() except +
         const_iterator end() except +
         bint isIntegerValue() except +
+        vector[Term] getSequenceValue() except +
 
     cdef cppclass TermHashFunction:
         TermHashFunction() except +
index 6d197168dcaaf3d754bc9b1288f7e1d343423810..cd643d3f30dc256e4da2f7d8100daf04ebb38cb1 100644 (file)
@@ -1550,9 +1550,9 @@ cdef class Term:
         term.cterm = self.cterm.getConstArrayBase()
         return term
 
-    def getConstSequenceElements(self):
+    def getSequenceValue(self):
         elems = []
-        for e in self.cterm.getConstSequenceElements():
+        for e in self.cterm.getSequenceValue():
             term = Term(self.solver)
             term.cterm = e
             elems.append(term)
index d57ec0c9af2c9db46533f3cf21afe89fd7423d41..eb952f8dba7db18b2cbd2685bbc22fe0c09f9169 100644 (file)
@@ -548,7 +548,7 @@ api::Term Parser::applyTypeAscription(api::Term t, api::Sort s)
       ss << "Type ascription on empty sequence must be a sequence, got " << s;
       parseError(ss.str());
     }
-    if (!t.getConstSequenceElements().empty())
+    if (!t.getSequenceValue().empty())
     {
       std::stringstream ss;
       ss << "Cannot apply a type ascription to a non-empty sequence";
index 70263480785ab5b895731ed76933ac4f21b2dbc3..936ff3e1cccbc3c1ad5c1c40894f5d08eada073e 100644 (file)
@@ -1003,14 +1003,14 @@ def test_const_sequence_elements(solver):
 
     assert s.getKind() == kinds.ConstSequence
     # empty sequence has zero elements
-    cs = s.getConstSequenceElements()
+    cs = s.getSequenceValue()
     assert len(cs) == 0
 
     # A seq.unit app is not a constant sequence (regardless of whether it is
     # applied to a constant).
     su = solver.mkTerm(kinds.SeqUnit, solver.mkReal(1))
     with pytest.raises(RuntimeError):
-        su.getConstSequenceElements()
+        su.getSequenceValue()
 
 
 def test_term_scoped_to_string(solver):
index 50ef8bf0f98b00c20caeb25d6d0bb9a559e1ea45..d7f9a4dc3752beca57b15ccc19d2f6483f70d282 100644 (file)
@@ -1077,7 +1077,7 @@ TEST_F(TestApiBlackTerm, constArray)
       d_solver.mkTerm(STORE, stores, d_solver.mkReal(4), d_solver.mkReal(5));
 }
 
-TEST_F(TestApiBlackTerm, constSequenceElements)
+TEST_F(TestApiBlackTerm, getSequenceValue)
 {
   Sort realsort = d_solver.getRealSort();
   Sort seqsort = d_solver.mkSequenceSort(realsort);
@@ -1085,13 +1085,13 @@ TEST_F(TestApiBlackTerm, constSequenceElements)
 
   ASSERT_EQ(s.getKind(), CONST_SEQUENCE);
   // empty sequence has zero elements
-  std::vector<Term> cs = s.getConstSequenceElements();
+  std::vector<Term> cs = s.getSequenceValue();
   ASSERT_TRUE(cs.empty());
 
   // A seq.unit app is not a constant sequence (regardless of whether it is
   // applied to a constant).
   Term su = d_solver.mkTerm(SEQ_UNIT, d_solver.mkReal(1));
-  ASSERT_THROW(su.getConstSequenceElements(), CVC5ApiException);
+  ASSERT_THROW(su.getSequenceValue(), CVC5ApiException);
 }
 
 TEST_F(TestApiBlackTerm, termScopedToString)