summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/printer/smt2/smt2_printer.cpp87
-rw-r--r--src/smt/command.cpp1
-rw-r--r--src/smt/command.h2
3 files changed, 55 insertions, 35 deletions
diff --git a/src/printer/smt2/smt2_printer.cpp b/src/printer/smt2/smt2_printer.cpp
index 773c733d6..bb3870ee5 100644
--- a/src/printer/smt2/smt2_printer.cpp
+++ b/src/printer/smt2/smt2_printer.cpp
@@ -1297,7 +1297,8 @@ void Smt2Printer::toStream(std::ostream& out,
|| tryToStream<DeclareSygusVarCommand>(out, c)
|| tryToStream<SygusConstraintCommand>(out, c)
|| tryToStream<SygusInvConstraintCommand>(out, c)
- || tryToStream<CheckSynthCommand>(out, c))
+ || tryToStream<CheckSynthCommand>(out, c)
+ || tryToStream<GetAbductCommand>(out, c))
{
return;
}
@@ -2049,45 +2050,16 @@ static void toStream(std::ostream& out, const EchoCommand* c, Variant v)
--------------------------------------------------------------------------
*/
-static void toStream(std::ostream& out, const SynthFunCommand* c)
+static void toStreamSygusGrammar(std::ostream& out, const Type& t)
{
- out << '(' << c->getCommandName() << ' ' << CVC4::quoteSymbol(c->getSymbol())
- << ' ';
- Type type = c->getFunction().getType();
- const std::vector<Expr>& vars = c->getVars();
- Assert(!type.isFunction() || !vars.empty());
- out << '(';
- if (type.isFunction())
- {
- // print variable list
- std::vector<Expr>::const_iterator i = vars.begin(), i_end = vars.end();
- Assert(i != i_end);
- out << '(' << *i << ' ' << i->getType() << ')';
- ++i;
- while (i != i_end)
- {
- out << " (" << *i << ' ' << i->getType() << ')';
- ++i;
- }
- FunctionType ft = type;
- type = ft.getRangeType();
- }
- out << ')';
- // if not invariant-to-synthesize, print return type
- if (!c->isInv())
- {
- out << ' ' << type;
- }
- // print grammar, if any
- Type sygusType = c->getSygusType();
- if (sygusType.isDatatype()
- && static_cast<DatatypeType>(sygusType).getDatatype().isSygus())
+ if (!t.isNull() && t.isDatatype()
+ && static_cast<DatatypeType>(t).getDatatype().isSygus())
{
std::stringstream types_predecl, types_list;
std::set<Type> grammarTypes;
std::list<Type> typesToPrint;
- grammarTypes.insert(sygusType);
- typesToPrint.push_back(sygusType);
+ grammarTypes.insert(t);
+ typesToPrint.push_back(t);
NodeManager* nm = NodeManager::currentNM();
// for each datatype in grammar
// name
@@ -2136,6 +2108,39 @@ static void toStream(std::ostream& out, const SynthFunCommand* c)
out << "\n(" << types_predecl.str() << ")\n(" << types_list.str() << ')';
}
+}
+
+static void toStream(std::ostream& out, const SynthFunCommand* c)
+{
+ out << '(' << c->getCommandName() << ' ' << CVC4::quoteSymbol(c->getSymbol())
+ << ' ';
+ Type type = c->getFunction().getType();
+ const std::vector<Expr>& vars = c->getVars();
+ Assert(!type.isFunction() || !vars.empty());
+ out << '(';
+ if (type.isFunction())
+ {
+ // print variable list
+ std::vector<Expr>::const_iterator i = vars.begin(), i_end = vars.end();
+ Assert(i != i_end);
+ out << '(' << *i << ' ' << i->getType() << ')';
+ ++i;
+ while (i != i_end)
+ {
+ out << " (" << *i << ' ' << i->getType() << ')';
+ ++i;
+ }
+ FunctionType ft = type;
+ type = ft.getRangeType();
+ }
+ out << ')';
+ // if not invariant-to-synthesize, print return type
+ if (!c->isInv())
+ {
+ out << ' ' << type;
+ }
+ // print grammar, if any
+ toStreamSygusGrammar(out, c->getSygusType());
out << ')';
}
@@ -2182,6 +2187,18 @@ static void toStream(std::ostream& out, const CheckSynthCommand* c)
out << '(' << c->getCommandName() << ')';
}
+static void toStream(std::ostream& out, const GetAbductCommand* c)
+{
+ out << '(';
+ out << c->getCommandName() << ' ';
+ out << c->getAbductName() << ' ';
+ out << c->getConjecture();
+
+ // print grammar, if any
+ toStreamSygusGrammar(out, c->getGrammarType());
+ out << ')';
+}
+
/*
--------------------------------------------------------------------------
End of Handling SyGuS commands
diff --git a/src/smt/command.cpp b/src/smt/command.cpp
index 095c59374..e60f223b4 100644
--- a/src/smt/command.cpp
+++ b/src/smt/command.cpp
@@ -2192,6 +2192,7 @@ GetAbductCommand::GetAbductCommand(const std::string& name,
Expr GetAbductCommand::getConjecture() const { return d_conj; }
Type GetAbductCommand::getGrammarType() const { return d_sygus_grammar_type; }
+std::string GetAbductCommand::getAbductName() const { return d_name; }
Expr GetAbductCommand::getResult() const { return d_result; }
void GetAbductCommand::invoke(SmtEngine* smtEngine)
diff --git a/src/smt/command.h b/src/smt/command.h
index a6a0faaae..552847fee 100644
--- a/src/smt/command.h
+++ b/src/smt/command.h
@@ -1114,6 +1114,8 @@ class CVC4_PUBLIC GetAbductCommand : public Command
Expr getConjecture() const;
/** Get the grammar type given for the abduction query */
Type getGrammarType() const;
+ /** Get the name of the abduction predicate for the abduction query */
+ std::string getAbductName() const;
/** Get the result of the query, which is the solution to the abduction query.
*/
Expr getResult() const;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback