summaryrefslogtreecommitdiff
path: root/src/printer
diff options
context:
space:
mode:
Diffstat (limited to 'src/printer')
-rw-r--r--src/printer/smt2/smt2_printer.cpp30
1 files changed, 29 insertions, 1 deletions
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<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;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback