summaryrefslogtreecommitdiff
path: root/src/printer
diff options
context:
space:
mode:
authorAbdalrhman Mohamed <32971963+abdoo8080@users.noreply.github.com>2020-02-24 14:30:02 -0600
committerGitHub <noreply@github.com>2020-02-24 14:30:02 -0600
commitc4f2ca4c1931f91a9647f0daa032ee9417f1b382 (patch)
treea2396581d7de09b033fd44c8f7ad3310280bd5f6 /src/printer
parent90fe2a057cdcdaea34f0a03f837159d9adb45914 (diff)
Fix bugs related to printing Sygus commands (#3804)
With this commit, most Sygus problems should print correctly. The current printing functionality was tested on 158 Sygus regress files (0, 1, and 2) and 153 of them were printed in Sygus2 format and contained "(check-synth)". The printing functionality was tested again on the generated files and gave almost the same results.
Diffstat (limited to 'src/printer')
-rw-r--r--src/printer/smt2/smt2_printer.cpp94
1 files changed, 38 insertions, 56 deletions
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)
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback