From 691abe521ea8a7e87db51e22880cf101d59bf3e7 Mon Sep 17 00:00:00 2001 From: Andrew Reynolds Date: Wed, 6 Dec 2017 20:57:44 -0600 Subject: Add command for define-fun-rec and add to API (#1412) --- src/printer/smt2/smt2_printer.cpp | 133 +++++++++++++++++++++++++++++--------- 1 file changed, 101 insertions(+), 32 deletions(-) (limited to 'src/printer/smt2/smt2_printer.cpp') diff --git a/src/printer/smt2/smt2_printer.cpp b/src/printer/smt2/smt2_printer.cpp index 19adba6da..c13c519ae 100644 --- a/src/printer/smt2/smt2_printer.cpp +++ b/src/printer/smt2/smt2_printer.cpp @@ -1113,38 +1113,39 @@ void Smt2Printer::toStream(std::ostream& out, expr::ExprPrintTypes::Scope ptScope(out, types); expr::ExprDag::Scope dagScope(out, dag); - if(tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c, d_variant) || - tryToStream(out, c, d_variant) || - tryToStream(out, c, d_variant) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c) || - tryToStream(out, c, d_variant) || - tryToStream(out, c, d_variant) || - tryToStream(out, c) || - tryToStream(out, c, d_variant)) { + if (tryToStream(out, c) || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c, d_variant) + || tryToStream(out, c, d_variant) + || tryToStream(out, c, d_variant) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c) + || tryToStream(out, c, d_variant) + || tryToStream(out, c, d_variant) + || tryToStream(out, c) + || tryToStream(out, c, d_variant)) + { return; } @@ -1501,6 +1502,74 @@ static void toStream(std::ostream& out, const DefineFunctionCommand* c) out << ") " << type << " " << formula << ")"; } +static void toStream(std::ostream& out, const DefineFunctionRecCommand* c) +{ + const vector& funcs = c->getFunctions(); + const vector >& formals = c->getFormals(); + out << "(define-fun"; + if (funcs.size() > 1) + { + out << "s"; + } + out << "-rec "; + if (funcs.size() > 1) + { + out << "("; + } + for (unsigned i = 0, size = funcs.size(); i < size; i++) + { + if (funcs.size() > 1) + { + if (i > 0) + { + out << " "; + } + out << "("; + } + out << funcs[i] << " ("; + // print its type signature + vector::const_iterator itf = formals[i].begin(); + for (;;) + { + out << "(" << (*itf) << " " << (*itf).getType() << ")"; + ++itf; + if (itf != formals[i].end()) + { + out << " "; + } + else + { + break; + } + } + Type type = funcs[i].getType(); + type = static_cast(type).getRangeType(); + out << ") " << type; + if (funcs.size() > 1) + { + out << ")"; + } + } + if (funcs.size() > 1) + { + out << ") ("; + } + const vector& formulas = c->getFormulas(); + for (unsigned i = 0, size = formulas.size(); i < size; i++) + { + if (i > 0) + { + out << " "; + } + out << formulas[i]; + } + if (funcs.size() > 1) + { + out << ")"; + } + out << ")"; +} + static void toStreamRational(std::ostream& out, const Rational& r, bool decimal) { bool neg = r.sgn() < 0; -- cgit v1.2.3