1 /******************************************************************************
2 * Top contributors (to current version):
3 * Abdalrhman Mohamed, Andrew Reynolds, Morgan Deters
5 * This file is part of the cvc5 project.
7 * Copyright (c) 2009-2021 by the authors listed in the file AUTHORS
8 * in the top-level source directory and their institutional affiliations.
9 * All rights reserved. See the file COPYING in the top-level source
10 * directory for licensing information.
11 * ****************************************************************************
13 * Base of the pretty-printer interface.
15 #include "printer/printer.h"
19 #include "expr/node_manager_attributes.h"
20 #include "options/base_options.h"
21 #include "options/language.h"
22 #include "printer/ast/ast_printer.h"
23 #include "printer/smt2/smt2_printer.h"
24 #include "printer/tptp/tptp_printer.h"
25 #include "proof/unsat_core.h"
26 #include "smt/command.h"
27 #include "theory/quantifiers/instantiation_list.h"
34 Printer::d_printers
[static_cast<size_t>(Language::LANG_MAX
)];
36 unique_ptr
<Printer
> Printer::makePrinter(Language lang
)
39 case Language::LANG_SMTLIB_V2_6
:
40 return unique_ptr
<Printer
>(
41 new printer::smt2::Smt2Printer(printer::smt2::smt2_6_variant
));
43 case Language::LANG_TPTP
:
44 return unique_ptr
<Printer
>(new printer::tptp::TptpPrinter());
46 case Language::LANG_SYGUS_V2
:
47 // sygus version 2.0 does not have discrepancies with smt2, hence we use
48 // a normal smt2 variant here.
49 return unique_ptr
<Printer
>(
50 new printer::smt2::Smt2Printer(printer::smt2::smt2_6_variant
));
52 case Language::LANG_AST
:
53 return unique_ptr
<Printer
>(new printer::ast::AstPrinter());
55 default: Unhandled() << lang
;
59 void Printer::toStream(std::ostream
& out
, const smt::Model
& m
) const
61 // print the declared sorts
62 const std::vector
<TypeNode
>& dsorts
= m
.getDeclaredSorts();
63 for (const TypeNode
& tn
: dsorts
)
65 toStreamModelSort(out
, tn
, m
.getDomainElements(tn
));
67 // print the declared terms
68 const std::vector
<Node
>& dterms
= m
.getDeclaredTerms();
69 for (const Node
& n
: dterms
)
71 toStreamModelTerm(out
, n
, m
.getValue(n
));
75 void Printer::toStreamUsing(Language lang
,
77 const smt::Model
& m
) const
79 getPrinter(lang
)->toStream(out
, m
);
82 void Printer::toStream(std::ostream
& out
, const UnsatCore
& core
) const
84 for(UnsatCore::iterator i
= core
.begin(); i
!= core
.end(); ++i
) {
85 toStreamCmdAssert(out
, *i
);
88 }/* Printer::toStream(UnsatCore) */
90 void Printer::toStream(std::ostream
& out
, const InstantiationList
& is
) const
92 out
<< "(instantiations " << is
.d_quant
<< std::endl
;
93 for (const InstantiationVec
& i
: is
.d_inst
)
96 if (i
.d_id
!= theory::InferenceId::UNKNOWN
)
101 for (const Node
& n
: i
.d_vec
)
106 if (i
.d_id
!= theory::InferenceId::UNKNOWN
)
108 out
<< " :source " << i
.d_id
;
109 if (!i
.d_pfArg
.isNull())
111 out
<< " " << i
.d_pfArg
;
117 out
<< ")" << std::endl
;
120 void Printer::toStream(std::ostream
& out
, const SkolemList
& sks
) const
122 out
<< "(skolem " << sks
.d_quant
<< std::endl
;
124 for (const Node
& n
: sks
.d_sks
)
128 out
<< ")" << std::endl
;
129 out
<< ")" << std::endl
;
132 Printer
* Printer::getPrinter(Language lang
)
134 if (lang
== Language::LANG_AUTO
)
136 // Infer the language to use for output.
138 // Options can be null in certain circumstances (e.g., when printing
139 // the singleton "null" expr. So we guard against segfault
140 if (not Options::isCurrentNull())
142 if (Options::current().base
.outputLanguageWasSetByUser
)
144 lang
= options::outputLanguage();
146 if (lang
== Language::LANG_AUTO
147 && Options::current().base
.inputLanguageWasSetByUser
)
149 lang
= options::inputLanguage();
152 if (lang
== Language::LANG_AUTO
)
154 lang
= Language::LANG_SMTLIB_V2_6
; // default
157 if (d_printers
[static_cast<size_t>(lang
)] == nullptr)
159 d_printers
[static_cast<size_t>(lang
)] = makePrinter(lang
);
161 return d_printers
[static_cast<size_t>(lang
)].get();
164 void Printer::printUnknownCommand(std::ostream
& out
,
165 const std::string
& name
) const
167 out
<< "ERROR: don't know how to print " << name
<< " command" << std::endl
;
170 void Printer::toStreamCmdEmpty(std::ostream
& out
, const std::string
& name
) const
172 printUnknownCommand(out
, "empty");
175 void Printer::toStreamCmdEcho(std::ostream
& out
,
176 const std::string
& output
) const
178 printUnknownCommand(out
, "echo");
181 void Printer::toStreamCmdAssert(std::ostream
& out
, Node n
) const
183 printUnknownCommand(out
, "assert");
186 void Printer::toStreamCmdPush(std::ostream
& out
) const
188 printUnknownCommand(out
, "push");
191 void Printer::toStreamCmdPop(std::ostream
& out
) const
193 printUnknownCommand(out
, "pop");
196 void Printer::toStreamCmdDeclareFunction(std::ostream
& out
,
197 const std::string
& id
,
200 printUnknownCommand(out
, "declare-fun");
203 void Printer::toStreamCmdDeclareFunction(std::ostream
& out
, const Node
& v
) const
205 std::string vs
= v
.getAttribute(expr::VarNameAttr());
206 toStreamCmdDeclareFunction(out
, vs
, v
.getType());
209 void Printer::toStreamCmdDeclarePool(std::ostream
& out
,
210 const std::string
& id
,
212 const std::vector
<Node
>& initValue
) const
214 printUnknownCommand(out
, "declare-pool");
217 void Printer::toStreamCmdDeclareType(std::ostream
& out
,
220 printUnknownCommand(out
, "declare-sort");
223 void Printer::toStreamCmdDefineType(std::ostream
& out
,
224 const std::string
& id
,
225 const std::vector
<TypeNode
>& params
,
228 printUnknownCommand(out
, "define-sort");
231 void Printer::toStreamCmdDefineFunction(std::ostream
& out
,
232 const std::string
& id
,
233 const std::vector
<Node
>& formals
,
237 printUnknownCommand(out
, "define-fun");
240 void Printer::toStreamCmdDefineFunction(std::ostream
& out
,
244 std::stringstream vs
;
246 std::vector
<Node
> formals
;
248 TypeNode rangeType
= v
.getType();
249 if (body
.getKind() == kind::LAMBDA
)
251 formals
.insert(formals
.end(), lambda
[0].begin(), lambda
[0].end());
253 Assert(rangeType
.isFunction());
254 rangeType
= rangeType
.getRangeType();
256 toStreamCmdDefineFunction(out
, vs
.str(), formals
, rangeType
, body
);
259 void Printer::toStreamCmdDefineFunctionRec(
261 const std::vector
<Node
>& funcs
,
262 const std::vector
<std::vector
<Node
>>& formals
,
263 const std::vector
<Node
>& formulas
) const
265 printUnknownCommand(out
, "define-fun-rec");
268 void Printer::toStreamCmdDefineFunctionRec(
270 const std::vector
<Node
>& funcs
,
271 const std::vector
<Node
>& lambdas
) const
273 std::vector
<std::vector
<Node
>> formals
;
274 std::vector
<Node
> formulas
;
275 for (const Node
& l
: lambdas
)
277 std::vector
<Node
> formalsVec
;
279 if (l
.getKind() == kind::LAMBDA
)
281 formalsVec
.insert(formalsVec
.end(), l
[0].begin(), l
[0].end());
288 formals
.emplace_back(formalsVec
);
289 formulas
.emplace_back(formula
);
291 toStreamCmdDefineFunctionRec(out
, funcs
, formals
, formulas
);
294 void Printer::toStreamCmdSetUserAttribute(std::ostream
& out
,
295 const std::string
& attr
,
298 printUnknownCommand(out
, "set-user-attribute");
301 void Printer::toStreamCmdCheckSat(std::ostream
& out
) const
303 printUnknownCommand(out
, "check-sat");
306 void Printer::toStreamCmdCheckSatAssuming(std::ostream
& out
,
307 const std::vector
<Node
>& nodes
) const
309 printUnknownCommand(out
, "check-sat-assuming");
312 void Printer::toStreamCmdQuery(std::ostream
& out
, Node n
) const
314 printUnknownCommand(out
, "query");
317 void Printer::toStreamCmdDeclareVar(std::ostream
& out
,
321 printUnknownCommand(out
, "declare-var");
324 void Printer::toStreamCmdSynthFun(std::ostream
& out
,
326 const std::vector
<Node
>& vars
,
328 TypeNode sygusType
) const
330 printUnknownCommand(out
, isInv
? "synth-inv" : "synth-fun");
333 void Printer::toStreamCmdConstraint(std::ostream
& out
, Node n
) const
335 printUnknownCommand(out
, "constraint");
338 void Printer::toStreamCmdAssume(std::ostream
& out
, Node n
) const
340 printUnknownCommand(out
, "assume");
343 void Printer::toStreamCmdInvConstraint(
344 std::ostream
& out
, Node inv
, Node pre
, Node trans
, Node post
) const
346 printUnknownCommand(out
, "inv-constraint");
349 void Printer::toStreamCmdCheckSynth(std::ostream
& out
) const
351 printUnknownCommand(out
, "check-synth");
353 void Printer::toStreamCmdCheckSynthNext(std::ostream
& out
) const
355 printUnknownCommand(out
, "check-synth-next");
358 void Printer::toStreamCmdSimplify(std::ostream
& out
, Node n
) const
360 printUnknownCommand(out
, "simplify");
363 void Printer::toStreamCmdGetValue(std::ostream
& out
,
364 const std::vector
<Node
>& nodes
) const
366 printUnknownCommand(out
, "get-value");
369 void Printer::toStreamCmdGetAssignment(std::ostream
& out
) const
371 printUnknownCommand(out
, "get-assignment");
374 void Printer::toStreamCmdGetModel(std::ostream
& out
) const
376 printUnknownCommand(out
, "ge-model");
379 void Printer::toStreamCmdBlockModel(std::ostream
& out
) const
381 printUnknownCommand(out
, "block-model");
384 void Printer::toStreamCmdBlockModelValues(std::ostream
& out
,
385 const std::vector
<Node
>& nodes
) const
387 printUnknownCommand(out
, "block-model-values");
390 void Printer::toStreamCmdGetProof(std::ostream
& out
) const
392 printUnknownCommand(out
, "get-proof");
395 void Printer::toStreamCmdGetInstantiations(std::ostream
& out
) const
397 printUnknownCommand(out
, "get-instantiations");
400 void Printer::toStreamCmdGetInterpol(std::ostream
& out
,
401 const std::string
& name
,
403 TypeNode sygusType
) const
405 printUnknownCommand(out
, "get-interpol");
408 void Printer::toStreamCmdGetAbduct(std::ostream
& out
,
409 const std::string
& name
,
411 TypeNode sygusType
) const
413 printUnknownCommand(out
, "get-abduct");
416 void Printer::toStreamCmdGetAbductNext(std::ostream
& out
) const
418 printUnknownCommand(out
, "get-abduct-next");
421 void Printer::toStreamCmdGetQuantifierElimination(std::ostream
& out
,
425 printUnknownCommand(out
, "get-quantifier-elimination");
428 void Printer::toStreamCmdGetUnsatAssumptions(std::ostream
& out
) const
430 printUnknownCommand(out
, "get-unsat-assumption");
433 void Printer::toStreamCmdGetUnsatCore(std::ostream
& out
) const
435 printUnknownCommand(out
, "get-unsat-core");
438 void Printer::toStreamCmdGetDifficulty(std::ostream
& out
) const
440 printUnknownCommand(out
, "get-difficulty");
443 void Printer::toStreamCmdGetAssertions(std::ostream
& out
) const
445 printUnknownCommand(out
, "get-assertions");
448 void Printer::toStreamCmdSetBenchmarkLogic(std::ostream
& out
,
449 const std::string
& logic
) const
451 printUnknownCommand(out
, "set-logic");
454 void Printer::toStreamCmdSetInfo(std::ostream
& out
,
455 const std::string
& flag
,
456 const std::string
& value
) const
458 printUnknownCommand(out
, "set-info");
461 void Printer::toStreamCmdGetInfo(std::ostream
& out
,
462 const std::string
& flag
) const
464 printUnknownCommand(out
, "get-info");
467 void Printer::toStreamCmdSetOption(std::ostream
& out
,
468 const std::string
& flag
,
469 const std::string
& value
) const
471 printUnknownCommand(out
, "set-option");
474 void Printer::toStreamCmdGetOption(std::ostream
& out
,
475 const std::string
& flag
) const
477 printUnknownCommand(out
, "get-option");
480 void Printer::toStreamCmdSetExpressionName(std::ostream
& out
,
482 const std::string
& name
) const
484 printUnknownCommand(out
, "set-expression-name");
487 void Printer::toStreamCmdDatatypeDeclaration(
488 std::ostream
& out
, const std::vector
<TypeNode
>& datatypes
) const
491 out
, datatypes
.size() == 1 ? "declare-datatype" : "declare-datatypes");
494 void Printer::toStreamCmdReset(std::ostream
& out
) const
496 printUnknownCommand(out
, "reset");
499 void Printer::toStreamCmdResetAssertions(std::ostream
& out
) const
501 printUnknownCommand(out
, "reset-assertions");
504 void Printer::toStreamCmdQuit(std::ostream
& out
) const
506 printUnknownCommand(out
, "quit");
509 void Printer::toStreamCmdDeclareHeap(std::ostream
& out
,
511 TypeNode dataType
) const
513 printUnknownCommand(out
, "declare-heap");
516 void Printer::toStreamCmdCommandSequence(
517 std::ostream
& out
, const std::vector
<Command
*>& sequence
) const
519 printUnknownCommand(out
, "sequence");
522 void Printer::toStreamCmdDeclarationSequence(
523 std::ostream
& out
, const std::vector
<Command
*>& sequence
) const
525 printUnknownCommand(out
, "sequence");