summaryrefslogtreecommitdiff
path: root/src/parser
diff options
context:
space:
mode:
authorajreynol <andrew.j.reynolds@gmail.com>2015-04-16 11:21:07 +0200
committerajreynol <andrew.j.reynolds@gmail.com>2015-04-16 11:21:19 +0200
commit1bf5bc13506ba8c517925a50a6650a594d3ec42d (patch)
tree50b8e87dbf38cbd483ce1848b814489792016aef /src/parser
parent15d1cd77d1ab30bcbd2d89b77a3f2aab577b86cf (diff)
Handle (degenerate) case of synthesis conjectures for constants. Disable delta lemmas.
Diffstat (limited to 'src/parser')
-rw-r--r--src/parser/smt2/Smt2.g11
-rw-r--r--src/parser/smt2/smt2.cpp65
2 files changed, 48 insertions, 28 deletions
diff --git a/src/parser/smt2/Smt2.g b/src/parser/smt2/Smt2.g
index 8b7c0bda2..8dac9915e 100644
--- a/src/parser/smt2/Smt2.g
+++ b/src/parser/smt2/Smt2.g
@@ -586,7 +586,10 @@ sygusCommand returns [CVC4::Command* cmd = NULL]
++i) {
terms.push_back(PARSER_STATE->mkBoundVar((*i).first, (*i).second));
}
- Expr bvl = MK_EXPR(kind::BOUND_VAR_LIST, terms);
+ Expr bvl;
+ if( !terms.empty() ){
+ bvl = MK_EXPR(kind::BOUND_VAR_LIST, terms);
+ }
terms.clear();
terms.push_back(bvl);
}
@@ -633,8 +636,10 @@ sygusCommand returns [CVC4::Command* cmd = NULL]
PARSER_STATE->checkDeclaration(name, CHECK_UNDECLARED, SYM_VARIABLE);
std::vector<Type> evalType;
evalType.push_back(dtt);
- for(size_t j = 0; j < terms[0].getNumChildren(); ++j) {
- evalType.push_back(terms[0][j].getType());
+ if( !terms[0].isNull() ){
+ for(size_t j = 0; j < terms[0].getNumChildren(); ++j) {
+ evalType.push_back(terms[0][j].getType());
+ }
}
evalType.push_back(sorts[i]);
Expr eval = PARSER_STATE->mkVar(name, EXPR_MANAGER->mkFunctionType(evalType));
diff --git a/src/parser/smt2/smt2.cpp b/src/parser/smt2/smt2.cpp
index 20f3c364b..0c1b36655 100644
--- a/src/parser/smt2/smt2.cpp
+++ b/src/parser/smt2/smt2.cpp
@@ -489,26 +489,30 @@ void Smt2::includeFile(const std::string& filename) {
ss << fun << "_v_" << j;
sygusVars.push_back(getExprManager()->mkBoundVar(ss.str(), argTypes[j]));
}
- Type funt = getExprManager()->mkFunctionType(funType, rangeType);
- Debug("parser-sygus") << "...eval function type : " << funt << std::endl;
+ Type funt;
+ if( !funType.empty() ){
+ funt = getExprManager()->mkFunctionType(funType, rangeType);
+ Debug("parser-sygus") << "...eval function type : " << funt << std::endl;
+
+ // copy the bound vars
+ /*
+ std::vector<Expr> sygusVars;
+ //std::vector<Type> types;
+ for(size_t i = 0; i < d_sygusVars.size(); ++i) {
+ std::stringstream ss;
+ ss << d_sygusVars[i];
+ Type type = d_sygusVars[i].getType();
+ sygusVars.push_back(getExprManager()->mkBoundVar(ss.str(), type));
+ //types.push_back(type);
+ }
+ Debug("parser-sygus") << "...made vars, #vars=" << sygusVars.size() << std::endl;
+ */
- // copy the bound vars
- /*
- std::vector<Expr> sygusVars;
- //std::vector<Type> types;
- for(size_t i = 0; i < d_sygusVars.size(); ++i) {
- std::stringstream ss;
- ss << d_sygusVars[i];
- Type type = d_sygusVars[i].getType();
- sygusVars.push_back(getExprManager()->mkBoundVar(ss.str(), type));
- //types.push_back(type);
+ //Type t = getExprManager()->mkFunctionType(types, rangeType);
+ //Debug("parser-sygus") << "...function type : " << t << std::endl;
+ }else{
+ funt = rangeType;
}
- Debug("parser-sygus") << "...made vars, #vars=" << sygusVars.size() << std::endl;
- */
-
- //Type t = getExprManager()->mkFunctionType(types, rangeType);
- //Debug("parser-sygus") << "...function type : " << t << std::endl;
-
Expr lambda = mkFunction(fun, funt, ExprManager::VAR_FLAG_DEFINED);
Debug("parser-sygus") << "...made function : " << lambda << std::endl;
std::vector<Expr> applyv;
@@ -560,8 +564,13 @@ Expr Smt2::getSygusAssertion( std::vector<DatatypeType>& datatypeTypes, std::vec
bvs.push_back(bv);
extraArgs.push_back(bv);
}
- bvs.insert(bvs.end(), terms[0].begin(), terms[0].end());
- Expr bvl = getExprManager()->mkExpr(kind::BOUND_VAR_LIST, bvs);
+ if( !terms[0].isNull() ){
+ bvs.insert(bvs.end(), terms[0].begin(), terms[0].end());
+ }
+ Expr bvl;
+ if( !bvs.empty() ){
+ bvl = getExprManager()->mkExpr(kind::BOUND_VAR_LIST, bvs);
+ }
Debug("parser-sygus") << "...made bv list " << bvl << std::endl;
std::vector<Expr> patv;
patv.push_back(eval);
@@ -573,7 +582,9 @@ Expr Smt2::getSygusAssertion( std::vector<DatatypeType>& datatypeTypes, std::vec
Expr cpatv = getExprManager()->mkExpr(kind::APPLY_CONSTRUCTOR, applyv);
Debug("parser-sygus") << "...made eval ctor apply " << cpatv << std::endl;
patv.push_back(cpatv);
- patv.insert(patv.end(), terms[0].begin(), terms[0].end());
+ if( !terms[0].isNull() ){
+ patv.insert(patv.end(), terms[0].begin(), terms[0].end());
+ }
Expr evalApply = getExprManager()->mkExpr(kind::APPLY_UF, patv);
Debug("parser-sygus") << "...made eval apply " << evalApply << std::endl;
std::vector<Expr> builtApply;
@@ -581,7 +592,9 @@ Expr Smt2::getSygusAssertion( std::vector<DatatypeType>& datatypeTypes, std::vec
std::vector<Expr> patvb;
patvb.push_back(evals[DatatypeType(extraArgs[k].getType())]);
patvb.push_back(extraArgs[k]);
- patvb.insert(patvb.end(), terms[0].begin(), terms[0].end());
+ if( !terms[0].isNull() ){
+ patvb.insert(patvb.end(), terms[0].begin(), terms[0].end());
+ }
builtApply.push_back(getExprManager()->mkExpr(kind::APPLY_UF, patvb));
}
for(size_t k = 0; k < builtApply.size(); ++k) {
@@ -599,9 +612,11 @@ Expr Smt2::getSygusAssertion( std::vector<DatatypeType>& datatypeTypes, std::vec
}
Debug("parser-sygus") << "...made built term " << builtTerm << std::endl;
Expr assertion = getExprManager()->mkExpr(evalApply.getType().isBoolean() ? kind::IFF : kind::EQUAL, evalApply, builtTerm);
- Expr pattern = getExprManager()->mkExpr(kind::INST_PATTERN, evalApply);
- pattern = getExprManager()->mkExpr(kind::INST_PATTERN_LIST, pattern);
- assertion = getExprManager()->mkExpr(kind::FORALL, bvl, assertion, pattern);
+ if( !bvl.isNull() ){
+ Expr pattern = getExprManager()->mkExpr(kind::INST_PATTERN, evalApply);
+ pattern = getExprManager()->mkExpr(kind::INST_PATTERN_LIST, pattern);
+ assertion = getExprManager()->mkExpr(kind::FORALL, bvl, assertion, pattern);
+ }
Debug("parser-sygus") << "...made assertion " << assertion << std::endl;
//linearize multiplication if possible
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback