diff options
author | Andrew Reynolds <andrew.j.reynolds@gmail.com> | 2021-09-14 16:29:32 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-14 21:29:32 +0000 |
commit | 74c5067d81b8384701cff7f6e7b697d7fe67cf58 (patch) | |
tree | 686d06c8fe27f122a0c8a6ad05d74c487570e966 /src | |
parent | d34e563fe48c42aa06eea44191a21dcf29772339 (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.cpp | 16 | ||||
-rw-r--r-- | src/api/cpp/cvc5.h | 10 | ||||
-rw-r--r-- | src/parser/smt2/Smt2.g | 14 | ||||
-rw-r--r-- | src/printer/printer.cpp | 5 | ||||
-rw-r--r-- | src/printer/printer.h | 3 | ||||
-rw-r--r-- | src/printer/smt2/smt2_printer.cpp | 5 | ||||
-rw-r--r-- | src/printer/smt2/smt2_printer.h | 3 | ||||
-rw-r--r-- | src/smt/command.cpp | 27 | ||||
-rw-r--r-- | src/smt/command.h | 4 | ||||
-rw-r--r-- | src/smt/smt_engine.cpp | 4 | ||||
-rw-r--r-- | src/smt/smt_engine.h | 8 | ||||
-rw-r--r-- | src/smt/sygus_solver.cpp | 27 | ||||
-rw-r--r-- | src/smt/sygus_solver.h | 6 |
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; /** |