Show the code for utilities in the docs. (#8387)
authorAbdalrhman Mohamed <32971963+abdoo8080@users.noreply.github.com>
Wed, 30 Mar 2022 02:11:08 +0000 (21:11 -0500)
committerGitHub <noreply@github.com>
Wed, 30 Mar 2022 02:11:08 +0000 (02:11 +0000)
This PR adds the code for printing synthesis solutions to the docs. Various other changes are made to increase the consistency between the different bindings.

Signed-off-by: Abdalrhman M Mohamed <abdalrhman-mohamed@uiowa.edu>
17 files changed:
docs/conf.py.in
docs/examples/sygus-fun.rst
docs/examples/sygus-grammar.rst
docs/examples/sygus-inv.rst
examples/api/cpp/CMakeLists.txt
examples/api/cpp/sygus-fun.cpp
examples/api/cpp/sygus-grammar.cpp
examples/api/cpp/sygus-inv.cpp
examples/api/cpp/utils.cpp
examples/api/cpp/utils.h
examples/api/java/SygusFun.java
examples/api/java/SygusGrammar.java
examples/api/java/SygusInv.java
examples/api/java/Utils.java [new file with mode: 0644]
examples/api/python/sygus-grammar.py
examples/api/python/utils.py
src/api/java/io/github/cvc5/api/Utils.java

index 1b09f152af381c72aa188c1690dd0945c17290dd..4d54a49d8b92f246da08ec647dc66b22d4ae5ff9 100644 (file)
@@ -150,6 +150,11 @@ examples_types = {
                 'lang': 'c++',
                 'group': 'c++'
         },
+        '\.h$': {
+                'title': 'C++ (header)',
+                'lang': 'c++',
+                'group': 'c++'
+        },
         '\.java$': {
                 'title': 'Java',
                 'lang': 'java',
index 164a8f65b6d06c0bca49eb6978bb6287119e3ba2..d2470c6d80af06c11fc69f3064bac93ca569b22c 100644 (file)
@@ -7,3 +7,12 @@ SyGuS: Functions
     <examples>/api/java/SygusFun.java
     <examples>/api/python/sygus-fun.py
     <examples>/api/smtlib/sygus-fun.sy
+
+The utility method used for printing the synthesis solutions in the examples
+above is defined separately in the ``utils`` module:
+
+.. api-examples::
+    <examples>/api/cpp/utils.h
+    <examples>/api/cpp/utils.cpp
+    <examples>/api/java/Utils.java
+    <examples>/api/python/utils.py
index 4d416b5f824dfa1a6adc9418cbcfac15ae826da1..c659be6aefdb12feb333f889465d068bf114f73e 100644 (file)
@@ -7,3 +7,12 @@ SyGuS: Grammars
     <examples>/api/java/SygusGrammar.java
     <examples>/api/python/sygus-grammar.py
     <examples>/api/smtlib/sygus-grammar.sy
+
+The utility method used for printing the synthesis solutions in the examples
+above is defined separately in the ``utils`` module:
+
+.. api-examples::
+    <examples>/api/cpp/utils.h
+    <examples>/api/cpp/utils.cpp
+    <examples>/api/java/Utils.java
+    <examples>/api/python/utils.py
index b2addf8c172f35e410cdd1968743901b7da40d1a..80f89ccc1b4840504493b6e5079d0a17187e837c 100644 (file)
@@ -7,3 +7,12 @@ SyGuS: Invariants
     <examples>/api/java/SygusInv.java
     <examples>/api/python/sygus-inv.py
     <examples>/api/smtlib/sygus-inv.sy
+
+The utility method used for printing the synthesis solutions in the examples
+above is defined separately in the ``utils`` module:
+
+.. api-examples::
+    <examples>/api/cpp/utils.h
+    <examples>/api/cpp/utils.cpp
+    <examples>/api/java/Utils.java
+    <examples>/api/python/utils.py
index defb716c3d817e7cd83c98473221fc433374b0c6..6d462da5d177e0e2a7d0d19decabf8f76922eba7 100644 (file)
@@ -31,7 +31,7 @@ set(CVC5_EXAMPLES_API
 )
 
 foreach(example ${CVC5_EXAMPLES_API})
-  cvc5_add_example(${example} "" "api")
+  cvc5_add_example(${example} "" "api/cpp")
 endforeach()
 
 set(SYGUS_EXAMPLES_API
@@ -41,5 +41,5 @@ set(SYGUS_EXAMPLES_API
 )
 
 foreach(example ${SYGUS_EXAMPLES_API})
-  cvc5_add_example(${example} "${example}.cpp utils.h utils.cpp" "api")
+  cvc5_add_example(${example} "${example}.cpp utils.h utils.cpp" "api/cpp")
 endforeach()
index 895a791d68f1ae0c6896cce5f31f7feca3c6f76c..864ab6a111764f50aa49691a8ab9de6224903874 100644 (file)
  * A simple demonstration of the Sygus API.
  *
  * A simple demonstration of how to use the Sygus API to synthesize max and min
- * functions. Here is the same problem written in Sygus V2 format:
- *
- * (set-logic LIA)
- *
- * (synth-fun max ((x Int) (y Int)) Int
- *   ((Start Int) (StartBool Bool))
- *   ((Start Int (0 1 x y
- *                (+ Start Start)
- *                (- Start Start)
- *                (ite StartBool Start Start)))
- *    (StartBool Bool ((and StartBool StartBool)
- *                     (not StartBool)
- *                     (<= Start Start)))))
- *
- * (synth-fun min ((x Int) (y Int)) Int)
- *
- * (declare-var x Int)
- * (declare-var y Int)
- *
- * (constraint (>= (max x y) x))
- * (constraint (>= (max x y) y))
- * (constraint (or (= x (max x y))
- *                 (= y (max x y))))
- * (constraint (= (+ (max x y) (min x y))
- *                (+ x y)))
- *
- * (check-synth)
- *
- * The printed output for this example should be equivalent to:
- * (
- *   (define-fun max ((x Int) (y Int)) Int (ite (<= x y) y x))
- *   (define-fun min ((x Int) (y Int)) Int (ite (<= x y) x y))
- * )
+ * functions.
  */
 
 #include <cvc5/cvc5.h>
@@ -137,7 +105,7 @@ int main()
     //   (define-fun min ((x Int) (y Int)) Int (ite (<= x y) x y))
     // )
     std::vector<Term> terms = {max, min};
-    printSynthSolutions(terms, slv.getSynthSolutions(terms));
+    utils::printSynthSolutions(terms, slv.getSynthSolutions(terms));
   }
 
   return 0;
index a6a1dfedee49b7e2d0fbc960866a9e137b2db8a4..cca30d301b9baf86c9c5c79594877ac8214a9321 100644 (file)
  * A simple demonstration of the Sygus API.
  *
  * A simple demonstration of how to use Grammar to add syntax constraints to
- * the Sygus solution for the identity function. Here is the same problem
- * written in Sygus V2 format:
- *
- * (set-logic LIA)
- *
- * (synth-fun id1 ((x Int)) Int
- *   ((Start Int)) ((Start Int ((- x) (+ x Start)))))
- *
- * (synth-fun id2 ((x Int)) Int
- *   ((Start Int)) ((Start Int ((Variable Int) (- x) (+ x Start)))))
- *
- * (synth-fun id3 ((x Int)) Int
- *   ((Start Int)) ((Start Int (0 (- x) (+ x Start)))))
- *
- * (synth-fun id4 ((x Int)) Int
- *   ((Start Int)) ((Start Int ((- x) (+ x Start)))))
- *
- * (declare-var x Int)
- *
- * (constraint (= (id1 x) (id2 x) (id3 x) (id4 x) x))
- *
- * (check-synth)
- *
- * The printed output for this example should look like:
- * (
- *   (define-fun id1 ((x Int)) Int (+ x (+ x (- x))))
- *   (define-fun id2 ((x Int)) Int x)
- *   (define-fun id3 ((x Int)) Int (+ x 0))
- *   (define-fun id4 ((x Int)) Int (+ x (+ x (- x))))
- * )
+ * the Sygus solution for the identity function.
  */
 
 #include <cvc5/cvc5.h>
@@ -65,7 +36,6 @@ int main()
   slv.setLogic("LIA");
 
   Sort integer = slv.getIntegerSort();
-  Sort boolean = slv.getBooleanSort();
 
   // declare input variable for the function-to-synthesize
   Term x = slv.mkVar(integer, "x");
@@ -126,7 +96,7 @@ int main()
     //   (define-fun id4 ((x Int)) Int (+ x (+ x (- x))))
     // )
     std::vector<Term> terms = {id1, id2, id3, id4};
-    printSynthSolutions(terms, slv.getSynthSolutions(terms));
+    utils::printSynthSolutions(terms, slv.getSynthSolutions(terms));
   }
 
   return 0;
index d872ca5fd1e7ccda277c20ebc2366ffdd73668a4..5d517d03dac25bb70ae3b0c810fc599ac4e78a36 100644 (file)
  * A simple demonstration of the Sygus API.
  *
  * A simple demonstration of how to use the Sygus API to synthesize a simple
- * invariant. Here is the same problem written in Sygus V2 format:
- *
- * (set-logic LIA)
- *
- * (synth-inv inv-f ((x Int)))
- *
- * (define-fun pre-f ((x Int)) Bool
- *   (= x 0))
- * (define-fun trans-f ((x Int) (xp Int)) Bool
- *   (ite (< x 10) (= xp (+ x 1)) (= xp x)))
- * (define-fun post-f ((x Int)) Bool
- *   (<= x 10))
- *
- * (inv-constraint inv-f pre-f trans-f post-f)
- *
- * (check-synth)
- *
- * The printed output for this example should be equivalent to:
- * (
- *   (define-fun inv-f ((x Int)) Bool (not (>= x 11)))
- * )
+ * invariant.
  */
 
 #include <cvc5/cvc5.h>
@@ -92,7 +72,7 @@ int main()
     //   (define-fun inv-f ((x Int)) Bool (not (>= x 11)))
     // )
     std::vector<Term> terms = {inv_f};
-    printSynthSolutions(terms, slv.getSynthSolutions(terms));
+    utils::printSynthSolutions(terms, slv.getSynthSolutions(terms));
   }
 
   return 0;
index bb25738436d4be132607ea044a27a7951aed21c4..788f509f2f3ebb554482c64538dabfafcdba3495 100644 (file)
 
 #include <iostream>
 
+namespace utils {
+
+using namespace cvc5;
+
 /**
  * Get the string version of define-fun command.
  * @param f the function to print
@@ -25,8 +29,8 @@
  * @return a string version of define-fun
  */
 std::string defineFunToString(const cvc5::Term& f,
-                              const std::vector<cvc5::Term> params,
-                              const cvc5::Term body)
+                              const std::vector<cvc5::Term>& params,
+                              const cvc5::Term& body)
 {
   cvc5::Sort sort = f.getSort();
   if (sort.isFunction())
@@ -51,18 +55,18 @@ void printSynthSolutions(const std::vector<cvc5::Term>& terms,
                          const std::vector<cvc5::Term>& sols)
 {
   std::cout << '(' << std::endl;
-
   for (size_t i = 0, n = terms.size(); i < n; ++i)
   {
     std::vector<cvc5::Term> params;
-    cvc5::Term body;
+    cvc5::Term body = sols[i];
     if (sols[i].getKind() == cvc5::LAMBDA)
     {
       params.insert(params.end(), sols[i][0].begin(), sols[i][0].end());
       body = sols[i][1];
     }
-    std::cout << "  " << defineFunToString(terms[i], params, body)
-              << std::endl;
+    std::cout << "  " << defineFunToString(terms[i], params, body) << std::endl;
   }
   std::cout << ')' << std::endl;
 }
+
+}  // namespace utils
index c6393427f1aa597009f6865e3fa260b8f3344585..ec22e4fa85944201f869e8816d7e26eb5da04aca 100644 (file)
@@ -18,6 +18,8 @@
 
 #include <cvc5/cvc5.h>
 
+namespace utils {
+
 /**
  * Print solutions for synthesis conjecture to the standard output stream.
  * @param terms the terms for which the synthesis solutions were retrieved
@@ -26,4 +28,6 @@
 void printSynthSolutions(const std::vector<cvc5::Term>& terms,
                          const std::vector<cvc5::Term>& sols);
 
+}  // namespace utils
+
 #endif  // CVC5__UTILS_H
index 42a93e4f7cd0755944c4331d8cfe327ee9d742de..6063a82394faab7fd0368a9f7b10cdaa79455514 100644 (file)
  * A simple demonstration of the Sygus API.
  *
  * A simple demonstration of how to use the Sygus API to synthesize max and min
- * functions. Here is the same problem written in Sygus V2 format:
- *
- * (set-logic LIA)
- *
- * (synth-fun max ((x Int) (y Int)) Int
- *   ((Start Int) (StartBool Bool))
- *   ((Start Int (0 1 x y
- *                (+ Start Start)
- *                (- Start Start)
- *                (ite StartBool Start Start)))
- *    (StartBool Bool ((and StartBool StartBool)
- *                     (not StartBool)
- *                     (<= Start Start)))))
- *
- * (synth-fun min ((x Int) (y Int)) Int)
- *
- * (declare-var x Int)
- * (declare-var y Int)
- *
- * (constraint (>= (max x y) x))
- * (constraint (>= (max x y) y))
- * (constraint (or (= x (max x y))
- *                 (= y (max x y))))
- * (constraint (= (+ (max x y) (min x y))
- *                (+ x y)))
- *
- * (check-synth)
- *
- * The printed output for this example should be equivalent to:
- * (
- *   (define-fun max ((x Int) (y Int)) Int (ite (<= x y) y x))
- *   (define-fun min ((x Int) (y Int)) Int (ite (<= x y) x y))
- * )
+ * functions. This is a direct translation of sygus-fun.cpp.
  */
 
 import static io.github.cvc5.api.Kind.*;
index ce59ab9c55409e1259b3b54175f1830bf660bdc0..cb8a5106aefcaaa6872fba1dcd62e68eee44c6d2 100644 (file)
  * A simple demonstration of the Sygus API.
  *
  * A simple demonstration of how to use Grammar to add syntax constraints to
- * the Sygus solution for the identity function. Here is the same problem
- * written in Sygus V2 format:
- *
- * (set-logic LIA)
- *
- * (synth-fun id1 ((x Int)) Int
- *   ((Start Int)) ((Start Int ((- x) (+ x Start)))))
- *
- * (synth-fun id2 ((x Int)) Int
- *   ((Start Int)) ((Start Int ((Variable Int) (- x) (+ x Start)))))
- *
- * (synth-fun id3 ((x Int)) Int
- *   ((Start Int)) ((Start Int (0 (- x) (+ x Start)))))
- *
- * (synth-fun id4 ((x Int)) Int
- *   ((Start Int)) ((Start Int ((- x) (+ x Start)))))
- *
- * (declare-var x Int)
- *
- * (constraint (= (id1 x) (id2 x) (id3 x) (id4 x) x))
- *
- * (check-synth)
- *
- * The printed output for this example should look like:
- * (
- *   (define-fun id1 ((x Int)) Int (+ x (+ x (- x))))
- *   (define-fun id2 ((x Int)) Int x)
- *   (define-fun id3 ((x Int)) Int (+ x 0))
- *   (define-fun id4 ((x Int)) Int (+ x (+ x (- x))))
- * )
+ * the Sygus solution for the identity function. This is a direct translation
+ * of sygus-grammar.cpp.
  */
 
 import static io.github.cvc5.api.Kind.*;
@@ -63,7 +35,6 @@ public class SygusGrammar
       slv.setLogic("LIA");
 
       Sort integer = slv.getIntegerSort();
-      Sort bool = slv.getBooleanSort();
 
       // declare input variable for the function-to-synthesize
       Term x = slv.mkVar(integer, "x");
index f1d611b2eae1d7742e2499317a79ff5f7c756146..8e9f79eac29b4c3e73e680638583facfd026ca42 100644 (file)
  * A simple demonstration of the Sygus API.
  *
  * A simple demonstration of how to use the Sygus API to synthesize a simple
- * invariant. Here is the same problem written in Sygus V2 format:
- *
- * (set-logic LIA)
- *
- * (synth-inv inv-f ((x Int)))
- *
- * (define-fun pre-f ((x Int)) Bool
- *   (= x 0))
- * (define-fun trans-f ((x Int) (xp Int)) Bool
- *   (ite (< x 10) (= xp (+ x 1)) (= xp x)))
- * (define-fun post-f ((x Int)) Bool
- *   (<= x 10))
- *
- * (inv-constraint inv-f pre-f trans-f post-f)
- *
- * (check-synth)
- *
- * The printed output for this example should be equivalent to:
- * (
- *   (define-fun inv-f ((x Int)) Bool (not (>= x 11)))
- * )
+ * invariant. This is a direct translation of sygus-inv.cpp.
  */
 
 import static io.github.cvc5.api.Kind.*;
diff --git a/examples/api/java/Utils.java b/examples/api/java/Utils.java
new file mode 100644 (file)
index 0000000..6cfd6c7
--- /dev/null
@@ -0,0 +1,83 @@
+/******************************************************************************
+ * Top contributors (to current version):
+ *   Abdalrhman Mohamed
+ *
+ * This file is part of the cvc5 project.
+ *
+ * Copyright (c) 2009-2022 by the authors listed in the file AUTHORS
+ * in the top-level source directory and their institutional affiliations.
+ * All rights reserved.  See the file COPYING in the top-level source
+ * directory for licensing information.
+ * ****************************************************************************
+ *
+ * Utility methods.
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.github.cvc5.api.CVC5ApiException;
+import io.github.cvc5.api.Kind;
+import io.github.cvc5.api.Sort;
+import io.github.cvc5.api.Term;
+
+public class Utils
+{
+  /**
+   * Get the string version of define-fun command.
+   *
+   * @param f the function to print
+   * @param params the function parameters
+   * @param body the function body
+   * @return a string version of define-fun
+   */
+  private static String defineFunToString(Term f, Term[] params, Term body)
+  {
+    Sort sort = f.getSort();
+    if (sort.isFunction())
+    {
+      sort = sort.getFunctionCodomainSort();
+    }
+    StringBuilder ss = new StringBuilder();
+    ss.append("(define-fun ").append(f).append(" (");
+    for (int i = 0; i < params.length; ++i)
+    {
+      if (i > 0)
+      {
+        ss.append(' ');
+      }
+      ss.append('(').append(params[i]).append(' ').append(params[i].getSort())
+          .append(')');
+    }
+    ss.append(") ").append(sort).append(' ').append(body).append(')');
+    return ss.toString();
+  }
+
+  /**
+   * Print solutions for synthesis conjecture to the standard output stream.
+   *
+   * @param terms the terms for which the synthesis solutions were retrieved
+   * @param sols the synthesis solutions of the given terms
+   */
+  public static void printSynthSolutions(Term[] terms, Term[] sols)
+      throws CVC5ApiException
+  {
+    System.out.println('(');
+    for (int i = 0; i < terms.length; ++i)
+    {
+      List<Term> params = new ArrayList<>();
+      Term body = sols[i];
+      if (sols[i].getKind() == Kind.LAMBDA)
+      {
+        for (Term t : sols[i].getChild(0))
+        {
+          params.add(t);
+        }
+        body = sols[i].getChild(1);
+      }
+      System.out.println("  "
+          + defineFunToString(terms[i], params.toArray(new Term[0]), body));
+    }
+    System.out.println(')');
+  }
+}
index 7c020e39dba43cf93c0ded5104d16f65636154cb..1613f659516c00a40d1bce9280f0635a104e9398 100644 (file)
@@ -32,7 +32,6 @@ if __name__ == "__main__":
   slv.setLogic("LIA")
 
   integer = slv.getIntegerSort()
-  boolean = slv.getBooleanSort()
 
   # declare input variable for the function-to-synthesize
   x = slv.mkVar(integer, "x")
index e367a743dbb4da554f0f3e11a7e26d44d227ce3a..765327eb40546a243417341740e38d50f68ea13f 100644 (file)
@@ -28,8 +28,7 @@ def define_fun_to_string(f, params, body):
     sort = f.getSort()
     if sort.isFunction():
         sort = f.getSort().getFunctionCodomainSort()
-    result = ""
-    result += "(define-fun " + str(f) + " ("
+    result = "(define-fun " + str(f) + " ("
     for i in range(0, len(params)):
         if i > 0:
             result += " "
@@ -44,11 +43,13 @@ def define_fun_to_string(f, params, body):
 
 
 def print_synth_solutions(terms, sols):
-    result = ""
+    result = "(\n"
     for i in range(0, len(terms)):
         params = []
+        body = sols[i]
         if sols[i].getKind() == Kind.Lambda:
             params += sols[i][0]
             body = sols[i][1]
         result += "  " + define_fun_to_string(terms[i], params, body) + "\n"
+    result += ")"
     print(result)
index 54e0c9ced76b21f336337018fb8ad3f25df1318d..6254d43ba30056efe931ee8cc887dce210dd7d89 100644 (file)
@@ -161,61 +161,4 @@ public class Utils
   {
     return pair.first.toString() + "/" + pair.second.toString();
   }
-
-  /**
-   * Get the string version of define-fun command.
-   * @param f the function to print
-   * @param params the function parameters
-   * @param body the function body
-   * @return a string version of define-fun
-   */
-  private static String defineFunToString(Term f, Term[] params, Term body)
-  {
-    Sort sort = f.getSort();
-    if (sort.isFunction())
-    {
-      sort = sort.getFunctionCodomainSort();
-    }
-    StringBuilder ss = new StringBuilder();
-    ss.append("(define-fun ").append(f).append(" (");
-    for (int i = 0; i < params.length; ++i)
-    {
-      if (i > 0)
-      {
-        ss.append(' ');
-      }
-      ss.append('(').append(params[i]).append(' ').append(params[i].getSort()).append(')');
-    }
-    ss.append(") ").append(sort).append(' ').append(body).append(')');
-    return ss.toString();
-  }
-
-  /**
-   * Print solutions for synthesis conjecture to the standard output stream.
-   * @param terms the terms for which the synthesis solutions were retrieved
-   * @param sols the synthesis solutions of the given terms
-   */
-  public static void printSynthSolutions(Term[] terms, Term[] sols) throws CVC5ApiException
-  {
-    System.out.println('(');
-
-    for (int i = 0; i < terms.length; ++i)
-    {
-      List<Term> params = new ArrayList<>();
-      Term body = null;
-      if (sols[i].getKind() == Kind.LAMBDA)
-      {
-        for (Term t : sols[i].getChild(0))
-        {
-          params.add(t);
-        }
-        body = sols[i].getChild(1);
-      }
-      if (body != null)
-      {
-        System.out.println("  " + defineFunToString(terms[i], params.toArray(new Term[0]), body));
-      }
-    }
-    System.out.println(')');
-  }
 }