summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>2021-09-14 16:29:32 -0500
committerGitHub <noreply@github.com>2021-09-14 21:29:32 +0000
commit74c5067d81b8384701cff7f6e7b697d7fe67cf58 (patch)
tree686d06c8fe27f122a0c8a6ad05d74c487570e966 /src
parentd34e563fe48c42aa06eea44191a21dcf29772339 (diff)
Support sygus version 2.1 command assume (#7081)
Adds support for global assumptions in sygus files. Also guards against cases of declare-const, which should be prohibited in sygus.
Diffstat (limited to 'src')
-rw-r--r--src/api/cpp/cvc5.cpp16
-rw-r--r--src/api/cpp/cvc5.h10
-rw-r--r--src/parser/smt2/Smt2.g14
-rw-r--r--src/printer/printer.cpp5
-rw-r--r--src/printer/printer.h3
-rw-r--r--src/printer/smt2/smt2_printer.cpp5
-rw-r--r--src/printer/smt2/smt2_printer.h3
-rw-r--r--src/smt/command.cpp27
-rw-r--r--src/smt/command.h4
-rw-r--r--src/smt/smt_engine.cpp4
-rw-r--r--src/smt/smt_engine.h8
-rw-r--r--src/smt/sygus_solver.cpp27
-rw-r--r--src/smt/sygus_solver.h6
13 files changed, 106 insertions, 26 deletions
diff --git a/src/api/cpp/cvc5.cpp b/src/api/cpp/cvc5.cpp
index 1aa9a740f..03c464e08 100644
--- a/src/api/cpp/cvc5.cpp
+++ b/src/api/cpp/cvc5.cpp
@@ -7819,7 +7819,21 @@ void Solver::addSygusConstraint(const Term& term) const
term.d_node->getType() == getNodeManager()->booleanType(), term)
<< "boolean term";
//////// all checks before this line
- d_smtEngine->assertSygusConstraint(*term.d_node);
+ d_smtEngine->assertSygusConstraint(*term.d_node, false);
+ ////////
+ CVC5_API_TRY_CATCH_END;
+}
+
+void Solver::addSygusAssume(const Term& term) const
+{
+ NodeManagerScope scope(getNodeManager());
+ CVC5_API_TRY_CATCH_BEGIN;
+ CVC5_API_SOLVER_CHECK_TERM(term);
+ CVC5_API_ARG_CHECK_EXPECTED(
+ term.d_node->getType() == getNodeManager()->booleanType(), term)
+ << "boolean term";
+ //////// all checks before this line
+ d_smtEngine->assertSygusConstraint(*term.d_node, true);
////////
CVC5_API_TRY_CATCH_END;
}
diff --git a/src/api/cpp/cvc5.h b/src/api/cpp/cvc5.h
index 9324e4209..684b89114 100644
--- a/src/api/cpp/cvc5.h
+++ b/src/api/cpp/cvc5.h
@@ -4304,6 +4304,16 @@ class CVC5_EXPORT Solver
void addSygusConstraint(const Term& term) const;
/**
+ * Add a forumla to the set of Sygus assumptions.
+ * SyGuS v2:
+ * \verbatim
+ * ( assume <term> )
+ * \endverbatim
+ * @param term the formula to add as an assumption
+ */
+ void addSygusAssume(const Term& term) const;
+
+ /**
* Add a set of Sygus constraints to the current state that correspond to an
* invariant synthesis problem.
* SyGuS v2:
diff --git a/src/parser/smt2/Smt2.g b/src/parser/smt2/Smt2.g
index 22a042951..2c391169c 100644
--- a/src/parser/smt2/Smt2.g
+++ b/src/parser/smt2/Smt2.g
@@ -518,6 +518,7 @@ sygusCommand returns [std::unique_ptr<cvc5::Command> cmd]
std::vector<std::pair<std::string, cvc5::api::Sort> > sortedVarNames;
std::vector<cvc5::api::Term> sygusVars;
std::string name;
+ bool isAssume;
bool isInv;
cvc5::api::Grammar* grammar = nullptr;
}
@@ -568,14 +569,13 @@ sygusCommand returns [std::unique_ptr<cvc5::Command> cmd]
new SynthFunCommand(name, fun, sygusVars, range, isInv, grammar));
}
| /* constraint */
- CONSTRAINT_TOK {
+ ( CONSTRAINT_TOK { isAssume = false; } | ASSUME_TOK { isAssume = true; } )
+ {
PARSER_STATE->checkThatLogicIsSet();
- Debug("parser-sygus") << "Sygus : define sygus funs..." << std::endl;
- Debug("parser-sygus") << "Sygus : read constraint..." << std::endl;
}
term[expr, expr2]
{ Debug("parser-sygus") << "...read constraint " << expr << std::endl;
- cmd.reset(new SygusConstraintCommand(expr));
+ cmd.reset(new SygusConstraintCommand(expr, isAssume));
}
| /* inv-constraint */
INV_CONSTRAINT_TOK
@@ -784,6 +784,11 @@ smt25Command[std::unique_ptr<cvc5::Command>* cmd]
{ PARSER_STATE->checkUserSymbol(name); }
sortSymbol[t,CHECK_DECLARED]
{ // allow overloading here
+ if( PARSER_STATE->sygus() )
+ {
+ PARSER_STATE->parseErrorLogic("declare-const is not allowed in sygus "
+ "version 2.0");
+ }
api::Term c =
PARSER_STATE->bindVar(name, t, false, true);
cmd->reset(new DeclareFunctionCommand(name, c, t)); }
@@ -2272,6 +2277,7 @@ SYNTH_INV_TOK : { PARSER_STATE->sygus()}?'synth-inv';
CHECK_SYNTH_TOK : { PARSER_STATE->sygus()}?'check-synth';
DECLARE_VAR_TOK : { PARSER_STATE->sygus()}?'declare-var';
CONSTRAINT_TOK : { PARSER_STATE->sygus()}?'constraint';
+ASSUME_TOK : { PARSER_STATE->sygus()}?'assume';
INV_CONSTRAINT_TOK : { PARSER_STATE->sygus()}?'inv-constraint';
SET_FEATURE_TOK : { PARSER_STATE->sygus() }? 'set-feature';
SYGUS_CONSTANT_TOK : { PARSER_STATE->sygus() }? 'Constant';
diff --git a/src/printer/printer.cpp b/src/printer/printer.cpp
index 9bd68e697..01fa7a9fd 100644
--- a/src/printer/printer.cpp
+++ b/src/printer/printer.cpp
@@ -340,6 +340,11 @@ void Printer::toStreamCmdConstraint(std::ostream& out, Node n) const
printUnknownCommand(out, "constraint");
}
+void Printer::toStreamCmdAssume(std::ostream& out, Node n) const
+{
+ printUnknownCommand(out, "assume");
+}
+
void Printer::toStreamCmdInvConstraint(
std::ostream& out, Node inv, Node pre, Node trans, Node post) const
{
diff --git a/src/printer/printer.h b/src/printer/printer.h
index 5ffe07f77..499a9398f 100644
--- a/src/printer/printer.h
+++ b/src/printer/printer.h
@@ -156,6 +156,9 @@ class Printer
/** Print constraint command */
virtual void toStreamCmdConstraint(std::ostream& out, Node n) const;
+ /** Print assume command */
+ virtual void toStreamCmdAssume(std::ostream& out, Node n) const;
+
/** Print inv-constraint command */
virtual void toStreamCmdInvConstraint(
std::ostream& out, Node inv, Node pre, Node trans, Node post) const;
diff --git a/src/printer/smt2/smt2_printer.cpp b/src/printer/smt2/smt2_printer.cpp
index 0d556c1dc..07c5b10d8 100644
--- a/src/printer/smt2/smt2_printer.cpp
+++ b/src/printer/smt2/smt2_printer.cpp
@@ -1877,6 +1877,11 @@ void Smt2Printer::toStreamCmdConstraint(std::ostream& out, Node n) const
out << "(constraint " << n << ')' << std::endl;
}
+void Smt2Printer::toStreamCmdAssume(std::ostream& out, Node n) const
+{
+ out << "(assume " << n << ')' << std::endl;
+}
+
void Smt2Printer::toStreamCmdInvConstraint(
std::ostream& out, Node inv, Node pre, Node trans, Node post) const
{
diff --git a/src/printer/smt2/smt2_printer.h b/src/printer/smt2/smt2_printer.h
index 729caebf4..fd7e0c7ac 100644
--- a/src/printer/smt2/smt2_printer.h
+++ b/src/printer/smt2/smt2_printer.h
@@ -124,6 +124,9 @@ class Smt2Printer : public cvc5::Printer
/** Print constraint command */
void toStreamCmdConstraint(std::ostream& out, Node n) const override;
+ /** Print assume command */
+ void toStreamCmdAssume(std::ostream& out, Node n) const override;
+
/** Print inv-constraint command */
void toStreamCmdInvConstraint(std::ostream& out,
Node inv,
diff --git a/src/smt/command.cpp b/src/smt/command.cpp
index adfd2f71d..4b04abcb2 100644
--- a/src/smt/command.cpp
+++ b/src/smt/command.cpp
@@ -732,7 +732,9 @@ void SynthFunCommand::toStream(std::ostream& out,
/* class SygusConstraintCommand */
/* -------------------------------------------------------------------------- */
-SygusConstraintCommand::SygusConstraintCommand(const api::Term& t) : d_term(t)
+SygusConstraintCommand::SygusConstraintCommand(const api::Term& t,
+ bool isAssume)
+ : d_term(t), d_isAssume(isAssume)
{
}
@@ -740,7 +742,14 @@ void SygusConstraintCommand::invoke(api::Solver* solver, SymbolManager* sm)
{
try
{
- solver->addSygusConstraint(d_term);
+ if (d_isAssume)
+ {
+ solver->addSygusAssume(d_term);
+ }
+ else
+ {
+ solver->addSygusConstraint(d_term);
+ }
d_commandStatus = CommandSuccess::instance();
}
catch (exception& e)
@@ -753,12 +762,12 @@ api::Term SygusConstraintCommand::getTerm() const { return d_term; }
Command* SygusConstraintCommand::clone() const
{
- return new SygusConstraintCommand(d_term);
+ return new SygusConstraintCommand(d_term, d_isAssume);
}
std::string SygusConstraintCommand::getCommandName() const
{
- return "constraint";
+ return d_isAssume ? "assume" : "constraint";
}
void SygusConstraintCommand::toStream(std::ostream& out,
@@ -766,7 +775,15 @@ void SygusConstraintCommand::toStream(std::ostream& out,
size_t dag,
Language language) const
{
- Printer::getPrinter(language)->toStreamCmdConstraint(out, termToNode(d_term));
+ if (d_isAssume)
+ {
+ Printer::getPrinter(language)->toStreamCmdAssume(out, termToNode(d_term));
+ }
+ else
+ {
+ Printer::getPrinter(language)->toStreamCmdConstraint(out,
+ termToNode(d_term));
+ }
}
/* -------------------------------------------------------------------------- */
diff --git a/src/smt/command.h b/src/smt/command.h
index b374a48c9..7587aaa63 100644
--- a/src/smt/command.h
+++ b/src/smt/command.h
@@ -765,7 +765,7 @@ class CVC5_EXPORT SynthFunCommand : public DeclarationDefinitionCommand
class CVC5_EXPORT SygusConstraintCommand : public Command
{
public:
- SygusConstraintCommand(const api::Term& t);
+ SygusConstraintCommand(const api::Term& t, bool isAssume = false);
/** returns the declared constraint */
api::Term getTerm() const;
/** invokes this command
@@ -787,6 +787,8 @@ class CVC5_EXPORT SygusConstraintCommand : public Command
protected:
/** the declared constraint */
api::Term d_term;
+ /** true if this is a sygus assumption */
+ bool d_isAssume;
};
/** Declares a sygus invariant constraint
diff --git a/src/smt/smt_engine.cpp b/src/smt/smt_engine.cpp
index 279761b43..46e83e9e7 100644
--- a/src/smt/smt_engine.cpp
+++ b/src/smt/smt_engine.cpp
@@ -994,11 +994,11 @@ void SmtEngine::declareSynthFun(Node func,
declareSynthFun(func, sygusType, isInv, vars);
}
-void SmtEngine::assertSygusConstraint(Node constraint)
+void SmtEngine::assertSygusConstraint(Node n, bool isAssume)
{
SmtScope smts(this);
finishInit();
- d_sygusSolver->assertSygusConstraint(constraint);
+ d_sygusSolver->assertSygusConstraint(n, isAssume);
}
void SmtEngine::assertSygusInvConstraint(Node inv,
diff --git a/src/smt/smt_engine.h b/src/smt/smt_engine.h
index 06a1c9ae4..9f17fa27e 100644
--- a/src/smt/smt_engine.h
+++ b/src/smt/smt_engine.h
@@ -416,8 +416,12 @@ class CVC5_EXPORT SmtEngine
*/
void declareSynthFun(Node func, bool isInv, const std::vector<Node>& vars);
- /** Add a regular sygus constraint.*/
- void assertSygusConstraint(Node constraint);
+ /**
+ * Add a regular sygus constraint or assumption.
+ * @param n The formula
+ * @param isAssume True if n is an assumption.
+ */
+ void assertSygusConstraint(Node n, bool isAssume = false);
/**
* Add an invariant constraint.
diff --git a/src/smt/sygus_solver.cpp b/src/smt/sygus_solver.cpp
index 32a0ee220..ff701ec48 100644
--- a/src/smt/sygus_solver.cpp
+++ b/src/smt/sygus_solver.cpp
@@ -90,10 +90,18 @@ void SygusSolver::declareSynthFun(Node fn,
setSygusConjectureStale();
}
-void SygusSolver::assertSygusConstraint(Node constraint)
+void SygusSolver::assertSygusConstraint(Node n, bool isAssume)
{
- Trace("smt") << "SygusSolver::assertSygusConstrant: " << constraint << "\n";
- d_sygusConstraints.push_back(constraint);
+ Trace("smt") << "SygusSolver::assertSygusConstrant: " << n
+ << ", isAssume=" << isAssume << "\n";
+ if (isAssume)
+ {
+ d_sygusAssumps.push_back(n);
+ }
+ else
+ {
+ d_sygusConstraints.push_back(n);
+ }
// sygus conjecture is now stale
setSygusConjectureStale();
@@ -186,13 +194,14 @@ Result SygusSolver::checkSynth(Assertions& as)
NodeManager* nm = NodeManager::currentNM();
// build synthesis conjecture from asserted constraints and declared
// variables/functions
- std::vector<Node> bodyv;
Trace("smt") << "Sygus : Constructing sygus constraint...\n";
- size_t nconstraints = d_sygusConstraints.size();
- Node body = nconstraints == 0
- ? nm->mkConst(true)
- : (nconstraints == 1 ? d_sygusConstraints[0]
- : nm->mkNode(AND, d_sygusConstraints));
+ Node body = nm->mkAnd(d_sygusConstraints);
+ // note that if there are no constraints, then assumptions are irrelevant
+ if (!d_sygusConstraints.empty() && !d_sygusAssumps.empty())
+ {
+ Node bodyAssump = nm->mkAnd(d_sygusAssumps);
+ body = nm->mkNode(IMPLIES, bodyAssump, body);
+ }
body = body.notNode();
Trace("smt") << "...constructed sygus constraint " << body << std::endl;
if (!d_sygusVars.empty())
diff --git a/src/smt/sygus_solver.h b/src/smt/sygus_solver.h
index 3db615037..90a6a87f0 100644
--- a/src/smt/sygus_solver.h
+++ b/src/smt/sygus_solver.h
@@ -82,8 +82,8 @@ class SygusSolver
bool isInv,
const std::vector<Node>& vars);
- /** Add a regular sygus constraint.*/
- void assertSygusConstraint(Node constraint);
+ /** Add a regular sygus constraint or assumption.*/
+ void assertSygusConstraint(Node n, bool isAssume);
/**
* Add an invariant constraint.
@@ -185,6 +185,8 @@ class SygusSolver
std::vector<Node> d_sygusVars;
/** sygus constraints */
std::vector<Node> d_sygusConstraints;
+ /** sygus assumptions */
+ std::vector<Node> d_sygusAssumps;
/** functions-to-synthesize */
std::vector<Node> d_sygusFunSymbols;
/**
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback