* Smt2 printer for datatypes
authorFrançois Bobot <francois@bobot.eu>
Fri, 6 Apr 2012 22:51:27 +0000 (22:51 +0000)
committerFrançois Bobot <francois@bobot.eu>
Fri, 6 Apr 2012 22:51:27 +0000 (22:51 +0000)
* Fix DefineFunctionCommand when a constant is defined

src/printer/cvc/cvc_printer.cpp
src/printer/smt2/smt2_printer.cpp
test/regress/run_regression

index a3d15f822592904690d71478ed76c887ca2e7b09..857513fa3fb376e63116eb348878c77c1efd46ad 100644 (file)
@@ -140,6 +140,10 @@ void CvcPrinter::toStream(std::ostream& out, TNode n, int depth, bool types, boo
       }
       break;
 
+    case kind::DATATYPE_TYPE:
+      out << n.getConst<Datatype>().getName();
+      break;
+
     default:
       Warning() << "Constant printing not implemented for the case of " << n.getKind() << endl;
       out << n.getKind();
index 218654a1930547e9a83f190e1ae5e16ba31776c8..03422c1625165504af9174283c4d2da051f179b8 100644 (file)
@@ -140,6 +140,10 @@ void Smt2Printer::toStream(std::ostream& out, TNode n,
       out << "(subtype " << n.getConst<Predicate>() << ')';
       break;
 
+    case kind::DATATYPE_TYPE:
+      out << n.getConst<Datatype>().getName();
+      break;
+
     default:
       // fall back on whatever operator<< does on underlying type; we
       // might luck out and be SMT-LIB v2 compliant
@@ -159,7 +163,7 @@ void Smt2Printer::toStream(std::ostream& out, TNode n,
 
   bool stillNeedToPrintParams = true;
   // operator
-  out << '(';
+  if(n.getNumChildren() != 0) out << '(';
   switch(Kind k = n.getKind()) {
     // builtin theory
   case kind::APPLY: break;
@@ -237,6 +241,12 @@ void Smt2Printer::toStream(std::ostream& out, TNode n,
     stillNeedToPrintParams = false;
     break;
 
+    // datatypes
+  case kind::APPLY_TESTER:
+  case kind::APPLY_CONSTRUCTOR:
+  case kind::APPLY_SELECTOR:
+    break;
+
   default:
     // fall back on however the kind prints itself; this probably
     // won't be SMT-LIB v2 compliant, but it will be clear from the
@@ -268,7 +278,7 @@ void Smt2Printer::toStream(std::ostream& out, TNode n,
       out << ' ';
     }
   }
-  out << ')';
+  if(n.getNumChildren() != 0) out << ')';
 }/* Smt2Printer::toStream(TNode) */
 
 static string smtKindString(Kind k) throw() {
@@ -534,19 +544,23 @@ static void toStream(std::ostream& out, const DeclareFunctionCommand* c) throw()
 static void toStream(std::ostream& out, const DefineFunctionCommand* c) throw() {
   Expr func = c->getFunction();
   const vector<Expr>& formals = c->getFormals();
-  Expr formula = c->getFormula();
   out << "(define-fun " << func << " (";
-  vector<Expr>::const_iterator i = formals.begin();
-  for(;;) {
-    out << "(" << (*i) << " " << (*i).getType() << ")";
-    ++i;
-    if(i != formals.end()) {
-      out << " ";
-    } else {
-      break;
+  Type type = func.getType();
+  if(type.isFunction()) {
+    vector<Expr>::const_iterator i = formals.begin();
+    for(;;) {
+      out << "(" << (*i) << " " << (*i).getType() << ")";
+      ++i;
+      if(i != formals.end()) {
+        out << " ";
+      } else {
+        break;
+      }
     }
+    type = FunctionType(type).getRangeType();
   }
-  out << ") " << FunctionType(func.getType()).getRangeType() << " " << formula << ")";
+  Expr formula = c->getFormula();
+  out << ") " << type << " " << formula << ")";
 }
 
 static void toStream(std::ostream& out, const DeclareTypeCommand* c) throw() {
@@ -620,16 +634,29 @@ static void toStream(std::ostream& out, const GetOptionCommand* c) throw() {
 
 static void toStream(std::ostream& out, const DatatypeDeclarationCommand* c) throw() {
   const vector<DatatypeType>& datatypes = c->getDatatypes();
-  out << "DatatypeDeclarationCommand([";
+  out << "(declare-datatypes (";
   for(vector<DatatypeType>::const_iterator i = datatypes.begin(),
         i_end = datatypes.end();
       i != i_end;
       ++i) {
-    out << *i << ";" << endl;
-  }
-  out << "])";
 
-  out << "ERROR: don't know how to output datatype declaration command" << endl;
+    const Datatype & d = i->getDatatype();
+
+    out << "(" << d.getName() << "  ";
+    for(Datatype::const_iterator ctor = d.begin(), ctor_end = d.end();
+        ctor != ctor_end; ++ctor){
+      out << "(" << ctor->getName() << " ";
+
+      for(DatatypeConstructor::const_iterator arg = ctor->begin(), arg_end = ctor->end();
+          arg != arg_end; ++arg){
+        out << "(" << arg->getSelector() << " "
+            << static_cast<SelectorType>(arg->getType()).getRangeType() << ")";
+      }
+      out << ") ";
+    }
+    out << ")" << endl;
+  }
+  out << "))";
 }
 
 static void toStream(std::ostream& out, const CommentCommand* c) throw() {
index 81570e817694d6677dc7bd67b585c2a1b1805d2e..587d3cdda1d3f06779c7d0b55d5db148dba69ac7 100755 (executable)
@@ -13,7 +13,7 @@
 prog=`basename "$0"`
 
 if [ $# -lt 2 -o $# -gt 3 ]; then
-  echo "usage: $prog cvc4-binary [ --proof | --dump ] [ benchmark.cvc | benchmark.smt | benchmark.smt2 ]" >&2
+  echo "usage: $prog [ --proof | --dump ] cvc4-binary [ benchmark.cvc | benchmark.smt | benchmark.smt2 ]" >&2
   exit 1
 fi