New C++ API: declare-datatype. (#2166)
authorAina Niemetz <aina.niemetz@gmail.com>
Mon, 23 Jul 2018 19:29:03 +0000 (12:29 -0700)
committerGitHub <noreply@github.com>
Mon, 23 Jul 2018 19:29:03 +0000 (12:29 -0700)
examples/api/datatypes-new.cpp
src/api/cvc4cpp.cpp
src/api/cvc4cpp.h

index 9ec679f8ef30f6cd45504b3a60482aac4c7ef3c1..0989d3c480eefb4fc154a8d5a94488d442a3afe2 100644 (file)
 #include "api/cvc4cpp.h"
 using namespace CVC4::api;
 
-int main()
+void test(Solver& slv, Sort& consListSort)
 {
-  Solver slv;
-  // This example builds a simple "cons list" of integers, with
-  // two constructors, "cons" and "nil."
-
-  // Building a datatype consists of two steps.
-  // First, the datatype is specified.
-  // Second, it is "resolved" to an actual sort, at which point function
-  // symbols are assigned to its constructors, selectors, and testers.
-
-  DatatypeDecl consListSpec("list"); // give the datatype a name
-  DatatypeConstructorDecl cons("cons");
-  DatatypeSelectorDecl head("head", slv.getIntegerSort());
-  DatatypeSelectorDecl tail("tail", DatatypeDeclSelfSort());
-  cons.addSelector(head);
-  cons.addSelector(tail);
-  consListSpec.addConstructor(cons);
-  DatatypeConstructorDecl nil("nil");
-  consListSpec.addConstructor(nil);
-
-  std::cout << "spec is:" << std::endl
-            << consListSpec << std::endl;
-
-  // Keep in mind that "DatatypeDecl" is the specification class for
-  // datatypes---"DatatypeDecl" is not itself a CVC4 Sort.
-  // Now that our Datatype is fully specified, we can get a Sort for it.
-  // This step resolves the "SelfSort" reference and creates
-  // symbols for all the constructors, etc.
-
-  Sort consListSort = slv.mkDatatypeSort(consListSpec);
-
   // Now our old "consListSpec" is useless--the relevant information
   // has been copied out, so we can throw that spec away.  We can get
   // the complete spec for the datatype from the DatatypeSort, and
@@ -160,6 +130,49 @@ int main()
   slv.assertFormula(assertion);
   std::cout << "Expect sat." << std::endl;
   std::cout << "CVC4: " << slv.checkSat() << std::endl;
+}
+
+int main()
+{
+  Solver slv;
+  // This example builds a simple "cons list" of integers, with
+  // two constructors, "cons" and "nil."
+
+  // Building a datatype consists of two steps.
+  // First, the datatype is specified.
+  // Second, it is "resolved" to an actual sort, at which point function
+  // symbols are assigned to its constructors, selectors, and testers.
+
+  DatatypeDecl consListSpec("list"); // give the datatype a name
+  DatatypeConstructorDecl cons("cons");
+  DatatypeSelectorDecl head("head", slv.getIntegerSort());
+  DatatypeSelectorDecl tail("tail", DatatypeDeclSelfSort());
+  cons.addSelector(head);
+  cons.addSelector(tail);
+  consListSpec.addConstructor(cons);
+  DatatypeConstructorDecl nil("nil");
+  consListSpec.addConstructor(nil);
+
+  std::cout << "spec is:" << std::endl
+            << consListSpec << std::endl;
+
+  // Keep in mind that "DatatypeDecl" is the specification class for
+  // datatypes---"DatatypeDecl" is not itself a CVC4 Sort.
+  // Now that our Datatype is fully specified, we can get a Sort for it.
+  // This step resolves the "SelfSort" reference and creates
+  // symbols for all the constructors, etc.
+
+  Sort consListSort = slv.mkDatatypeSort(consListSpec);
+
+  test(slv, consListSort);
+
+  std::cout << std::endl << ">>> Alternatively, use declareDatatype" << std::endl;
+  std::cout << std::endl;
+
+  std::vector<DatatypeConstructorDecl> ctors = { cons, nil };
+  Sort consListSort2 = slv.declareDatatype("list2", ctors);
+  test(slv, consListSort2);
+
 
   return 0;
 }
index 488590deb436b6956f8fcf1990a319c8918d6c83..938dc127d400129ee32f9260143b90c735bf2085 100644 (file)
@@ -2213,5 +2213,20 @@ std::vector<Expr> Solver::termVectorToExprs(
   return res;
 }
 
+/**
+ *  ( declare-datatype <symbol> <datatype_decl> )
+ */
+Sort Solver::declareDatatype(
+    const std::string& symbol,
+    const std::vector<DatatypeConstructorDecl>& ctors) const
+{
+  DatatypeDecl dtdecl(symbol);
+  for (const DatatypeConstructorDecl& ctor : ctors)
+  {
+    dtdecl.addConstructor(ctor);
+  }
+  return mkDatatypeSort(dtdecl);
+}
+
 }  // namespace api
 }  // namespace CVC4
index 6007aadcc3dfbd5379371c5cc3236ef100ae610a..b76fbb08f6f6cad6d87a87cd175fa1878c4db395 100644 (file)
@@ -2117,6 +2117,17 @@ class CVC4_PUBLIC Solver
    */
   Term declareConst(const std::string& symbol, Sort sort) const;
 
+  /**
+   * Create datatype sort.
+   * SMT-LIB: ( declare-datatype <symbol> <datatype_decl> )
+   * @param symbol the name of the datatype sort
+   * @param ctors the constructor declarations of the datatype sort
+   * @return the datatype sort
+   */
+  Sort declareDatatype(
+      const std::string& symbol,
+      const std::vector<DatatypeConstructorDecl>& ctors) const;
+
   /**
    * Declare 0-arity function symbol.
    * SMT-LIB: ( declare-fun <symbol> ( ) <sort> )