summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>2019-04-03 15:53:52 -0500
committerHaniel Barbosa <hanielbbarbosa@gmail.com>2019-04-03 15:53:52 -0500
commite1f463c0884dccf8fe513bd59bfd7ba6a8592183 (patch)
treee695789b17bcff3ab2565cd701fc09a1fa21e322
parent8a9ffdbb248ddcc6a41f628f6dcbc070b57e6a28 (diff)
Fix combination of datatypes + strings in PBE (#2930)
-rw-r--r--src/theory/quantifiers/sygus/sygus_unif_io.cpp47
-rw-r--r--test/regress/CMakeLists.txt1
-rw-r--r--test/regress/regress1/sygus/issue2914.sy26
3 files changed, 57 insertions, 17 deletions
diff --git a/src/theory/quantifiers/sygus/sygus_unif_io.cpp b/src/theory/quantifiers/sygus/sygus_unif_io.cpp
index 47fd41300..7d51ec43a 100644
--- a/src/theory/quantifiers/sygus/sygus_unif_io.cpp
+++ b/src/theory/quantifiers/sygus/sygus_unif_io.cpp
@@ -161,7 +161,12 @@ bool UnifContextIo::getStringIncrement(SygusUnifIo* sui,
if (d_vals[j] == sui->d_true)
{
// example is active in this context
- Assert(vals[j].isConst());
+ if (!vals[j].isConst())
+ {
+ // the value is unknown, thus we cannot use it to increment the strings
+ // position
+ return false;
+ }
String mystr = vals[j].getConst<String>();
ival = mystr.size();
if (mystr.size() <= ex_vals[j].size())
@@ -199,7 +204,11 @@ bool UnifContextIo::isStringSolved(SygusUnifIo* sui,
if (d_vals[j] == sui->d_true)
{
// example is active in this context
- Assert(vals[j].isConst());
+ if (!vals[j].isConst())
+ {
+ // value is unknown, thus it does not solve
+ return false;
+ }
String mystr = vals[j].getConst<String>();
if (ex_vals[j] != mystr)
{
@@ -949,23 +958,27 @@ bool SygusUnifIo::getExplanationForEnumeratorExclude(
std::vector<unsigned> cmp_indices;
for (unsigned i = 0, size = results.size(); i < size; i++)
{
- Assert(results[i].isConst());
- Assert(d_examples_out[i].isConst());
- Trace("sygus-sui-cterm-debug")
- << " " << results[i] << " <> " << d_examples_out[i];
- Node cont = nm->mkNode(STRING_STRCTN, d_examples_out[i], results[i]);
- Node contr = Rewriter::rewrite(cont);
- if (contr == d_false)
+ // If the result is not constant, then it is worthless. It does not
+ // impact whether the term is excluded.
+ if (results[i].isConst())
{
- cmp_indices.push_back(i);
- Trace("sygus-sui-cterm-debug") << "...not contained." << std::endl;
- }
- else
- {
- Trace("sygus-sui-cterm-debug") << "...contained." << std::endl;
- if (isConditional)
+ Assert(d_examples_out[i].isConst());
+ Trace("sygus-sui-cterm-debug")
+ << " " << results[i] << " <> " << d_examples_out[i];
+ Node cont = nm->mkNode(STRING_STRCTN, d_examples_out[i], results[i]);
+ Node contr = Rewriter::rewrite(cont);
+ if (contr == d_false)
{
- return false;
+ cmp_indices.push_back(i);
+ Trace("sygus-sui-cterm-debug") << "...not contained." << std::endl;
+ }
+ else
+ {
+ Trace("sygus-sui-cterm-debug") << "...contained." << std::endl;
+ if (isConditional)
+ {
+ return false;
+ }
}
}
}
diff --git a/test/regress/CMakeLists.txt b/test/regress/CMakeLists.txt
index 13d1540f6..a9b807e82 100644
--- a/test/regress/CMakeLists.txt
+++ b/test/regress/CMakeLists.txt
@@ -1624,6 +1624,7 @@ set(regress_1_tests
regress1/sygus/inv-example.sy
regress1/sygus/inv-missed-sol-true.sy
regress1/sygus/inv-unused.sy
+ regress1/sygus/issue2914.sy
regress1/sygus/large-const-simp.sy
regress1/sygus/let-bug-simp.sy
regress1/sygus/list-head-x.sy
diff --git a/test/regress/regress1/sygus/issue2914.sy b/test/regress/regress1/sygus/issue2914.sy
new file mode 100644
index 000000000..0f125a870
--- /dev/null
+++ b/test/regress/regress1/sygus/issue2914.sy
@@ -0,0 +1,26 @@
+; EXPECT: unsat
+; COMMAND-LINE: --sygus-out=status
+(set-logic SLIA)
+(declare-datatype JSIdentifier ((JSString (jsString String)) (Error )))
+
+(synth-fun substring ((x1 String) (x3 Int))String
+ ((Start String (ntString))
+ (ntInt Int
+ (0 x3)
+ )
+ (ntJSIdentifier JSIdentifier
+ (
+ Error
+ )
+ )
+ (ntString String
+ (x1
+ (str.substr ntString ntInt ntInt)
+ (jsString ntJSIdentifier)
+ (str.++ ntString ntString)
+ )
+ )
+ )
+)
+(constraint (= (substring "ey" 1) "e"))
+(check-synth)
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback