From: Haniel Barbosa Date: Sat, 3 Aug 2019 15:40:36 +0000 (-0500) Subject: Collapse @ chains in SMT2 printer (#3140) X-Git-Tag: cvc5-1.0.0~4046 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fbc61a7bbe75c99b29cd238f552c18542deb5c32;p=cvc5.git Collapse @ chains in SMT2 printer (#3140) --- diff --git a/src/options/printer_options.toml b/src/options/printer_options.toml index 89ae3b559..c1871259c 100644 --- a/src/options/printer_options.toml +++ b/src/options/printer_options.toml @@ -21,3 +21,11 @@ header = "options/printer_options.h" handler = "stringToInstFormatMode" includes = ["options/printer_modes.h"] help = "print format mode for instantiations, see --inst-format=help" + +[[option]] + name = "flattenHOChains" + category = "regular" + long = "flatten-ho-chains" + type = "bool" + default = "false" + help = "print (binary) application chains in a flattened way, e.g. (a b c) rather than ((a b) c)" diff --git a/src/printer/smt2/smt2_printer.cpp b/src/printer/smt2/smt2_printer.cpp index 163c8acad..fd8b4ce85 100644 --- a/src/printer/smt2/smt2_printer.cpp +++ b/src/printer/smt2/smt2_printer.cpp @@ -24,6 +24,7 @@ #include "expr/node_manager_attributes.h" #include "options/bv_options.h" #include "options/language.h" +#include "options/printer_options.h" #include "options/smt_options.h" #include "printer/dagification_visitor.h" #include "smt/smt_engine.h" @@ -509,7 +510,34 @@ void Smt2Printer::toStream(std::ostream& out, // uf theory case kind::APPLY_UF: typeChildren = true; break; // higher-order - case kind::HO_APPLY: break; + case kind::HO_APPLY: + if (!options::flattenHOChains()) + { + break; + } + // collapse "@" chains, i.e. + // + // ((a b) c) --> (a b c) + // + // (((a b) ((c d) e)) f) --> (a b (c d e) f) + { + Node head = n; + std::vector args; + while (head.getKind() == kind::HO_APPLY) + { + args.insert(args.begin(), head[1]); + head = head[0]; + } + toStream(out, head, toDepth, types, TypeNode::null()); + for (unsigned i = 0, size = args.size(); i < size; ++i) + { + out << " "; + toStream(out, args[i], toDepth, types, TypeNode::null()); + } + out << ")"; + } + return; + case kind::LAMBDA: out << smtKindString(k, d_variant) << " "; break;