api: Add Solver::mkRegexpAll(). (#7614)
authorAina Niemetz <aina.niemetz@gmail.com>
Wed, 10 Nov 2021 21:10:16 +0000 (13:10 -0800)
committerGitHub <noreply@github.com>
Wed, 10 Nov 2021 21:10:16 +0000 (21:10 +0000)
src/api/cpp/cvc5.cpp
src/api/cpp/cvc5.h
src/api/java/io/github/cvc5/api/Solver.java
src/api/java/jni/solver.cpp
src/api/python/cvc5.pxd
src/api/python/cvc5.pxi
src/parser/smt2/smt2.cpp
test/unit/api/cpp/solver_black.cpp
test/unit/api/java/SolverTest.java
test/unit/api/python/test_solver.py

index ae0ee2ceb70bfe2a929a5d08d4243de00a6843ee..4dcfb466e3215828477eb7584270e861e1266486 100644 (file)
@@ -5796,6 +5796,19 @@ Term Solver::mkReal(int64_t num, int64_t den) const
   CVC5_API_TRY_CATCH_END;
 }
 
+Term Solver::mkRegexpAll() const
+{
+  CVC5_API_TRY_CATCH_BEGIN;
+  //////// all checks before this line
+  Node res = d_nodeMgr->mkNode(
+      cvc5::kind::REGEXP_STAR,
+      d_nodeMgr->mkNode(cvc5::kind::REGEXP_ALLCHAR, std::vector<cvc5::Node>()));
+  (void)res.getType(true); /* kick off type checking */
+  return Term(this, res);
+  ////////
+  CVC5_API_TRY_CATCH_END;
+}
+
 Term Solver::mkRegexpNone() const
 {
   CVC5_API_TRY_CATCH_BEGIN;
index 91a6ae4476d368dc2b6f31c7f7553cf0f4b865d9..ab9a4de25c33a0f2a73ce120580bea200f3c5ae9 100644 (file)
@@ -3443,17 +3443,23 @@ class CVC5_EXPORT Solver
   Term mkReal(int64_t num, int64_t den) const;
 
   /**
-   * Create a regular expression none (re.none) term.
-   * @return the empty term
+   * Create a regular expression all (re.all) term.
+   * @return the all term
    */
-  Term mkRegexpNone() const;
+  Term mkRegexpAll() const;
 
   /**
    * Create a regular expression allchar (re.allchar) term.
-   * @return the sigma term
+   * @return the allchar term
    */
   Term mkRegexpAllchar() const;
 
+  /**
+   * Create a regular expression none (re.none) term.
+   * @return the none term
+   */
+  Term mkRegexpNone() const;
+
   /**
    * Create a constant representing an empty set of the given sort.
    * @param sort the sort of the set elements.
index 09ad66f5b2a48a82ed800ce4e000c5c54f9cc73d..16220228cfe3291c902aa6643707099da941cf6c 100644 (file)
@@ -851,8 +851,8 @@ public class Solver implements IPointer, AutoCloseable
   private native long mkReal(long pointer, long num, long den);
 
   /**
-   * Create a regular expression empty term.
-   * @return the empty term
+   * Create a regular expression none (re.none) term.
+   * @return the none term
    */
   public Term mkRegexpNone()
   {
@@ -863,8 +863,20 @@ public class Solver implements IPointer, AutoCloseable
   private native long mkRegexpNone(long pointer);
 
   /**
-   * Create a regular expression sigma term.
-   * @return the sigma term
+   * Create a regular expression all (re.all) term.
+   * @return the all term
+   */
+  public Term mkRegexpAll()
+  {
+    long termPointer = mkRegexpAll(pointer);
+    return new Term(this, termPointer);
+  }
+
+  private native long mkRegexpAll(long pointer);
+
+  /**
+   * Create a regular expression allchar (re.allchar) term.
+   * @return the allchar term
    */
   public Term mkRegexpAllchar()
   {
index a3ce49f4e8320497813b60430d4259011dccfe7b..2e4404362557e97aa11a3ad9e8071f85dc223cb4 100644 (file)
@@ -990,6 +990,21 @@ JNIEXPORT jlong JNICALL Java_io_github_cvc5_api_Solver_mkRegexpNone(
   CVC5_JAVA_API_TRY_CATCH_END_RETURN(env, 0);
 }
 
+/*
+ * Class:     io_github_cvc5_api_Solver
+ * Method:    mkRegexpAll
+ * Signature: (J)J
+ */
+JNIEXPORT jlong JNICALL
+Java_io_github_cvc5_api_Solver_mkRegexpAll(JNIEnv* env, jobject, jlong pointer)
+{
+  CVC5_JAVA_API_TRY_CATCH_BEGIN;
+  Solver* solver = reinterpret_cast<Solver*>(pointer);
+  Term* retPointer = new Term(solver->mkRegexpAll());
+  return reinterpret_cast<jlong>(retPointer);
+  CVC5_JAVA_API_TRY_CATCH_END_RETURN(env, 0);
+}
+
 /*
  * Class:     io_github_cvc5_api_Solver
  * Method:    mkRegexpAllchar
index baee5899ea7b51f2f8bc6fd701ce19172946ddb7..9dae7da969c914dbed993b444f99085e38bf1f9d 100644 (file)
@@ -215,8 +215,9 @@ cdef extern from "api/cpp/cvc5.h" namespace "cvc5::api":
         Term mkInteger(const uint64_t i) except +
         Term mkInteger(const string& s) except +
         Term mkReal(const string& s) except +
-        Term mkRegexpNone() except +
+        Term mkRegexpAll() except +
         Term mkRegexpAllchar() except +
+        Term mkRegexpNone() except +
         Term mkEmptySet(Sort s) except +
         Term mkEmptyBag(Sort s) except +
         Term mkSepEmp() except +
index 9e1aeaca1adbbd99fce34c89b3090248c8a23174..1df252e8635ca9340cc428916564c92880eec327 100644 (file)
@@ -1130,24 +1130,33 @@ cdef class Solver:
             term.cterm = self.csolver.mkReal("{}/{}".format(val, den).encode())
         return term
 
-    def mkRegexpNone(self):
-        """Create a regular expression empty term.
+    def mkRegexpAll(self):
+        """Create a regular expression all (re.all) term.
 
-        :return: the empty term
+        :return: the all term
         """
         cdef Term term = Term(self)
-        term.cterm = self.csolver.mkRegexpNone()
+        term.cterm = self.csolver.mkRegexpAll()
         return term
 
     def mkRegexpAllchar(self):
-        """Create a regular expression sigma term.
+        """Create a regular expression allchar (re.allchar) term.
 
-        :return: the sigma term
+        :return: the allchar term
         """
         cdef Term term = Term(self)
         term.cterm = self.csolver.mkRegexpAllchar()
         return term
 
+    def mkRegexpNone(self):
+        """Create a regular expression none (re.none) term.
+
+        :return: the none term
+        """
+        cdef Term term = Term(self)
+        term.cterm = self.csolver.mkRegexpNone()
+        return term
+
     def mkEmptySet(self, Sort s):
         """Create a constant representing an empty set of the given sort.
 
index 1fc7a637fb6efb58f4087f6efc8b3b4994cd93c8..b4f39a3153baa75ff562eb43ade4815b7d6951e0 100644 (file)
@@ -145,9 +145,7 @@ void Smt2::addDatatypesOperators()
 }
 
 void Smt2::addStringOperators() {
-  defineVar(
-      "re.all",
-      getSolver()->mkTerm(api::REGEXP_STAR, getSolver()->mkRegexpAllchar()));
+  defineVar("re.all", getSolver()->mkRegexpAll());
   addOperator(api::STRING_CONCAT, "str.++");
   addOperator(api::STRING_LENGTH, "str.len");
   addOperator(api::STRING_SUBSTR, "str.substr");
index 37aed63be4609f2cb3e905c81f59aa4c35eff543..51a0f38b5a9956116482d159a534c02f9fb61108 100644 (file)
@@ -595,12 +595,11 @@ TEST_F(TestApiBlackSolver, mkReal)
   ASSERT_NO_THROW(d_solver.mkReal(val4, val4));
 }
 
-TEST_F(TestApiBlackSolver, mkRegexpNone)
+TEST_F(TestApiBlackSolver, mkRegexpAll)
 {
   Sort strSort = d_solver.getStringSort();
   Term s = d_solver.mkConst(strSort, "s");
-  ASSERT_NO_THROW(
-      d_solver.mkTerm(STRING_IN_REGEXP, s, d_solver.mkRegexpNone()));
+  ASSERT_NO_THROW(d_solver.mkTerm(STRING_IN_REGEXP, s, d_solver.mkRegexpAll()));
 }
 
 TEST_F(TestApiBlackSolver, mkRegexpAllchar)
@@ -611,6 +610,14 @@ TEST_F(TestApiBlackSolver, mkRegexpAllchar)
       d_solver.mkTerm(STRING_IN_REGEXP, s, d_solver.mkRegexpAllchar()));
 }
 
+TEST_F(TestApiBlackSolver, mkRegexpNone)
+{
+  Sort strSort = d_solver.getStringSort();
+  Term s = d_solver.mkConst(strSort, "s");
+  ASSERT_NO_THROW(
+      d_solver.mkTerm(STRING_IN_REGEXP, s, d_solver.mkRegexpNone()));
+}
+
 TEST_F(TestApiBlackSolver, mkSepEmp) { ASSERT_NO_THROW(d_solver.mkSepEmp()); }
 
 TEST_F(TestApiBlackSolver, mkSepNil)
index 161854421acdd14c6466a76c709c77f483f05d59..6a08d79c64750421089a27f71167311fdd3de305 100644 (file)
@@ -639,6 +639,13 @@ class SolverTest
     assertDoesNotThrow(() -> d_solver.mkTerm(STRING_IN_REGEXP, s, d_solver.mkRegexpNone()));
   }
 
+  @Test void mkRegexpAll()
+  {
+    Sort strSort = d_solver.getStringSort();
+    Term s = d_solver.mkConst(strSort, "s");
+    assertDoesNotThrow(() -> d_solver.mkTerm(STRING_IN_REGEXP, s, d_solver.mkRegexpAll()));
+  }
+
   @Test void mkRegexpAllchar()
   {
     Sort strSort = d_solver.getStringSort();
index 71ab174651485aceca900f19971e29503d6f78b6..89e99bd9e574e65f28274f102db6f1673b4d8fb8 100644 (file)
@@ -643,13 +643,19 @@ def test_mk_real(solver):
     solver.mkReal(val4, val4)
 
 
-def test_mk_regexp_empty(solver):
+def test_mk_regexp_none(solver):
     strSort = solver.getStringSort()
     s = solver.mkConst(strSort, "s")
     solver.mkTerm(kinds.StringInRegexp, s, solver.mkRegexpNone())
 
 
-def test_mk_regexp_sigma(solver):
+def test_mk_regexp_all(solver):
+    strSort = solver.getStringSort()
+    s = solver.mkConst(strSort, "s")
+    solver.mkTerm(kinds.StringInRegexp, s, solver.mkRegexpAll())
+
+
+def test_mk_regexp_allchar(solver):
     strSort = solver.getStringSort()
     s = solver.mkConst(strSort, "s")
     solver.mkTerm(kinds.StringInRegexp, s, solver.mkRegexpAllchar())