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)"
#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"
// 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<Node> 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;