summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parser/smt2/Smt2.g25
-rw-r--r--src/parser/smt2/smt2.cpp3
-rw-r--r--src/printer/smt2/smt2_printer.cpp94
-rw-r--r--src/smt/smt_engine.cpp35
4 files changed, 71 insertions, 86 deletions
diff --git a/src/parser/smt2/Smt2.g b/src/parser/smt2/Smt2.g
index 6a045797a..e1f8031da 100644
--- a/src/parser/smt2/Smt2.g
+++ b/src/parser/smt2/Smt2.g
@@ -673,17 +673,14 @@ sygusGrammarV1[CVC4::Type & ret,
: LPAREN_TOK { PARSER_STATE->pushScope(); }
(LPAREN_TOK
symbol[name, CHECK_NONE, SYM_VARIABLE] sortSymbol[t, CHECK_DECLARED] {
- std::stringstream ss;
- ss << fun << "_" << name;
if (name == "Start")
{
startIndex = datatypes.size();
}
- std::string dname = ss.str();
sgts.push_back(std::vector<CVC4::SygusGTerm>());
sgts.back().push_back(CVC4::SygusGTerm());
PARSER_STATE->pushSygusDatatypeDef(t,
- dname,
+ name,
datatypes,
sorts,
ops,
@@ -692,18 +689,18 @@ sygusGrammarV1[CVC4::Type & ret,
allow_const,
unresolved_gterm_sym);
Type unres_t;
- if (!PARSER_STATE->isUnresolvedType(dname))
+ if (!PARSER_STATE->isUnresolvedType(name))
{
// if not unresolved, must be undeclared
- Debug("parser-sygus") << "Make unresolved type : " << dname
+ Debug("parser-sygus") << "Make unresolved type : " << name
<< std::endl;
- PARSER_STATE->checkDeclaration(dname, CHECK_UNDECLARED, SYM_SORT);
- unres_t = PARSER_STATE->mkUnresolvedType(dname);
+ PARSER_STATE->checkDeclaration(name, CHECK_UNDECLARED, SYM_SORT);
+ unres_t = PARSER_STATE->mkUnresolvedType(name);
}
else
{
- Debug("parser-sygus") << "Get sort : " << dname << std::endl;
- unres_t = PARSER_STATE->getSort(dname);
+ Debug("parser-sygus") << "Get sort : " << name << std::endl;
+ unres_t = PARSER_STATE->getSort(name);
}
sygus_to_builtin[unres_t] = t;
Debug("parser-sygus") << "--- Read sygus grammar " << name
@@ -899,10 +896,6 @@ sygusGTerm[CVC4::SygusGTerm& sgt, const std::string& fun]
sgt.d_name = name;
sgt.d_gterm_type = SygusGTerm::gterm_op;
}else{
- //prepend function name to base sorts when reading an operator
- std::stringstream ss;
- ss << fun << "_" << name;
- name = ss.str();
if( PARSER_STATE->isDeclared(name, SYM_SORT) ){
Debug("parser-sygus") << "Sygus grammar " << fun
<< " : nested sort " << name << std::endl;
@@ -957,9 +950,7 @@ sygusGrammar[CVC4::Type & ret,
{
Trace("parser-sygus2") << "Declare datatype " << i.first << std::endl;
// make the datatype, which encodes terms generated by this non-terminal
- std::stringstream ss;
- ss << "dt_" << fun << "_" << i.first;
- std::string dname = ss.str();
+ std::string dname = i.first;
datatypes.push_back(Datatype(EXPR_MANAGER, dname));
// make its unresolved type, used for referencing the final version of
// the datatype
diff --git a/src/parser/smt2/smt2.cpp b/src/parser/smt2/smt2.cpp
index a7033b277..7b7e9dd82 100644
--- a/src/parser/smt2/smt2.cpp
+++ b/src/parser/smt2/smt2.cpp
@@ -172,7 +172,8 @@ void Smt2::addStringOperators() {
addOperator(kind::STRING_PREFIX, "str.prefixof" );
addOperator(kind::STRING_SUFFIX, "str.suffixof" );
// at the moment, we only use this syntax for smt2.6.1
- if (getLanguage() == language::input::LANG_SMTLIB_V2_6_1)
+ if (getLanguage() == language::input::LANG_SMTLIB_V2_6_1
+ || getLanguage() == language::input::LANG_SYGUS_V2)
{
addOperator(kind::STRING_ITOS, "str.from_int");
addOperator(kind::STRING_STOI, "str.to_int");
diff --git a/src/printer/smt2/smt2_printer.cpp b/src/printer/smt2/smt2_printer.cpp
index 8153d6856..07422cd8b 100644
--- a/src/printer/smt2/smt2_printer.cpp
+++ b/src/printer/smt2/smt2_printer.cpp
@@ -128,6 +128,7 @@ void Smt2Printer::toStream(std::ostream& out,
case REAL_TYPE: out << "Real"; break;
case INTEGER_TYPE: out << "Int"; break;
case STRING_TYPE: out << "String"; break;
+ case REGEXP_TYPE: out << "RegLan"; break;
case ROUNDINGMODE_TYPE: out << "RoundingMode"; break;
default:
// fall back on whatever operator<< does on underlying type; we
@@ -1206,7 +1207,8 @@ static string smtKindString(Kind k, Variant v)
case kind::STRING_CHARAT: return "str.at" ;
case kind::STRING_STRIDOF: return "str.indexof" ;
case kind::STRING_STRREPL: return "str.replace" ;
- case kind::STRING_STRREPLALL: return "str.replaceall";
+ case kind::STRING_STRREPLALL:
+ return v == smt2_6_1_variant ? "str.replace_all" : "str.replaceall";
case kind::STRING_TOLOWER: return "str.tolower";
case kind::STRING_TOUPPER: return "str.toupper";
case kind::STRING_REV: return "str.rev";
@@ -1214,15 +1216,16 @@ static string smtKindString(Kind k, Variant v)
case kind::STRING_SUFFIX: return "str.suffixof" ;
case kind::STRING_LEQ: return "str.<=";
case kind::STRING_LT: return "str.<";
- case kind::STRING_CODE: return "str.code";
+ case kind::STRING_CODE:
+ return v == smt2_6_1_variant ? "str.to_code" : "str.code";
case kind::STRING_ITOS:
- return v == smt2_6_1_variant ? "str.from-int" : "int.to.str";
+ return v == smt2_6_1_variant ? "str.from_int" : "int.to.str";
case kind::STRING_STOI:
- return v == smt2_6_1_variant ? "str.to-int" : "str.to.int";
+ return v == smt2_6_1_variant ? "str.to_int" : "str.to.int";
case kind::STRING_IN_REGEXP:
- return v == smt2_6_1_variant ? "str.in-re" : "str.in.re";
+ return v == smt2_6_1_variant ? "str.in_re" : "str.in.re";
case kind::STRING_TO_REGEXP:
- return v == smt2_6_1_variant ? "str.to-re" : "str.to.re";
+ return v == smt2_6_1_variant ? "str.to_re" : "str.to.re";
case kind::REGEXP_EMPTY: return "re.nostr";
case kind::REGEXP_SIGMA: return "re.allchar";
case kind::REGEXP_CONCAT: return "re.++";
@@ -2071,25 +2074,23 @@ static void toStream(std::ostream& out, const SynthFunCommand* c)
Type type = c->getFunction().getType();
const std::vector<Expr>& vars = c->getVars();
Assert(!type.isFunction() || !vars.empty());
- c->getCommandName();
+ out << '(';
if (type.isFunction())
{
// print variable list
std::vector<Expr>::const_iterator i = vars.begin(), i_end = vars.end();
Assert(i != i_end);
- out << '(';
- do
+ out << '(' << *i << ' ' << i->getType() << ')';
+ ++i;
+ while (i != i_end)
{
- out << '(' << *i << ' ' << (*i).getType() << ')';
- if (++i != i_end)
- {
- out << ' ';
- }
- } while (i != i_end);
- out << ')';
+ out << " (" << *i << ' ' << i->getType() << ')';
+ ++i;
+ }
FunctionType ft = type;
type = ft.getRangeType();
}
+ out << ')';
// if not invariant-to-synthesize, print return type
if (!c->isInv())
{
@@ -2105,6 +2106,7 @@ static void toStream(std::ostream& out, const SynthFunCommand* c)
std::list<Type> typesToPrint;
grammarTypes.insert(sygusType);
typesToPrint.push_back(sygusType);
+ NodeManager* nm = NodeManager::currentNM();
// for each datatype in grammar
// name
// sygus type
@@ -2118,61 +2120,41 @@ static void toStream(std::ostream& out, const SynthFunCommand* c)
Assert(curr.isDatatype()
&& static_cast<DatatypeType>(curr).getDatatype().isSygus());
const Datatype& dt = static_cast<DatatypeType>(curr).getDatatype();
- types_list << "(" << dt.getName() << " " << dt.getSygusType() << "\n(";
- types_predecl << "(" << dt.getName() << " " << dt.getSygusType() << ")";
+ types_list << '(' << dt.getName() << ' ' << dt.getSygusType() << " (";
+ types_predecl << '(' << dt.getName() << ' ' << dt.getSygusType() << ") ";
if (dt.getSygusAllowConst())
{
types_list << "(Constant " << dt.getSygusType() << ") ";
}
for (const DatatypeConstructor& cons : dt)
{
- DatatypeConstructor::const_iterator i = cons.begin(),
- i_end = cons.end();
- if (i != i_end)
+ // make a sygus term
+ std::vector<Node> cchildren;
+ cchildren.push_back(Node::fromExpr(cons.getConstructor()));
+ for (const DatatypeConstructorArg& i : cons)
{
- types_list << "(";
- SygusPrintCallback* spc = cons.getSygusPrintCallback().get();
- if (spc != nullptr && options::sygusPrintCallbacks())
+ Type argType = i.getRangeType();
+ std::stringstream ss;
+ ss << argType;
+ Node bv = nm->mkBoundVar(ss.str(), TypeNode::fromType(argType));
+ cchildren.push_back(bv);
+ // if fresh type, store it for later processing
+ if (grammarTypes.insert(argType).second)
{
- spc->toStreamSygus(sygus_printer, types_list, cons.getSygusOp());
- }
- else
- {
- types_list << cons.getSygusOp();
- }
- do
- {
- Type argType = (*i).getRangeType();
- // print argument type
- types_list << " " << argType;
- // if fresh type, store it for later processing
- if (grammarTypes.insert(argType).second)
- {
- typesToPrint.push_back(argType);
- }
- } while (++i != i_end);
- types_list << ")";
- }
- else
- {
- SygusPrintCallback* spc = cons.getSygusPrintCallback().get();
- if (spc != nullptr && options::sygusPrintCallbacks())
- {
- spc->toStreamSygus(sygus_printer, types_list, cons.getSygusOp());
- }
- else
- {
- types_list << cons.getSygusOp();
+ typesToPrint.push_back(argType);
}
}
- types_list << "\n";
+ Node consToPrint = nm->mkNode(kind::APPLY_CONSTRUCTOR, cchildren);
+ // now, print it
+ sygus_printer->toStreamSygus(types_list, consToPrint);
+ types_list << ' ';
}
types_list << "))\n";
} while (!typesToPrint.empty());
- out << "\n(" << types_predecl.str() << ")\n(" << types_list.str() << ")";
+ out << "\n(" << types_predecl.str() << ")\n(" << types_list.str() << ')';
}
- out << ")";
+ out << ')';
}
static void toStream(std::ostream& out, const DeclareSygusFunctionCommand* c)
diff --git a/src/smt/smt_engine.cpp b/src/smt/smt_engine.cpp
index 2dc20cc31..6f40d815f 100644
--- a/src/smt/smt_engine.cpp
+++ b/src/smt/smt_engine.cpp
@@ -963,16 +963,18 @@ void SmtEngine::finishInit()
d_assertionList = new(true) AssertionList(d_userContext);
}
- // dump out a set-logic command
- if(Dump.isOn("benchmark")) {
- if (Dump.isOn("raw-benchmark")) {
- Dump("raw-benchmark") << SetBenchmarkLogicCommand(d_logic.getLogicString());
- } else {
+ // dump out a set-logic command only when raw-benchmark is disabled to avoid
+ // dumping the command twice.
+ if (Dump.isOn("benchmark") && !Dump.isOn("raw-benchmark"))
+ {
LogicInfo everything;
everything.lock();
- Dump("benchmark") << CommentCommand("CVC4 always dumps the most general, all-supported logic (below), as some internals might require the use of a logic more general than the input.")
- << SetBenchmarkLogicCommand(everything.getLogicString());
- }
+ Dump("benchmark") << CommentCommand(
+ "CVC4 always dumps the most general, all-supported logic (below), as "
+ "some internals might require the use of a logic more general than "
+ "the input.")
+ << SetBenchmarkLogicCommand(
+ everything.getLogicString());
}
Trace("smt-debug") << "Dump declaration commands..." << std::endl;
@@ -1128,9 +1130,18 @@ void SmtEngine::setLogic(const LogicInfo& logic)
void SmtEngine::setLogic(const std::string& s)
{
SmtScope smts(this);
- try {
+ try
+ {
setLogic(LogicInfo(s));
- } catch(IllegalArgumentException& e) {
+ // dump out a set-logic command
+ if (Dump.isOn("raw-benchmark"))
+ {
+ Dump("raw-benchmark")
+ << SetBenchmarkLogicCommand(d_logic.getLogicString());
+ }
+ }
+ catch (IllegalArgumentException& e)
+ {
throw LogicException(e.what());
}
}
@@ -3937,7 +3948,6 @@ void SmtEngine::declareSygusPrimedVar(const std::string& id, Type type)
{
// do nothing (the command is spurious)
Trace("smt") << "SmtEngine::declareSygusPrimedVar: " << id << "\n";
- Dump("raw-benchmark") << DeclareSygusPrimedVarCommand(id, type);
// don't need to set that the conjecture is stale
}
@@ -3947,7 +3957,8 @@ void SmtEngine::declareSygusFunctionVar(const std::string& id,
{
d_private->d_sygusVars.push_back(Node::fromExpr(var));
Trace("smt") << "SmtEngine::declareSygusFunctionVar: " << var << "\n";
- Dump("raw-benchmark") << DeclareSygusFunctionCommand(id, var, type);
+ Dump("raw-benchmark") << DeclareSygusVarCommand(id, var, type);
+
// don't need to set that the conjecture is stale
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback