summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>2018-10-11 00:31:57 -0500
committerGitHub <noreply@github.com>2018-10-11 00:31:57 -0500
commitc26a0f8fd971a72e8e9bdf058930c06587856604 (patch)
tree9bb09874d05fe49d59747b3a4b9ab62a675b36c2
parent1d1d1908f7929f0bf3532d7d6bf09103e400cc4f (diff)
Fix string ext inference for rewrites that introduce negation (#2618)
-rw-r--r--src/theory/strings/theory_strings.cpp11
-rw-r--r--test/regress/CMakeLists.txt1
-rw-r--r--test/regress/Makefile.tests1
-rw-r--r--test/regress/regress1/strings/timeout-no-resp.smt27
4 files changed, 16 insertions, 4 deletions
diff --git a/src/theory/strings/theory_strings.cpp b/src/theory/strings/theory_strings.cpp
index 26ff9188f..fb25e1348 100644
--- a/src/theory/strings/theory_strings.cpp
+++ b/src/theory/strings/theory_strings.cpp
@@ -1778,18 +1778,21 @@ void TheoryStrings::checkExtfInference( Node n, Node nr, ExtfInfoTmp& in, int ef
Node conc =
nm->mkNode(STRING_STRCTN, pol ? nr[1] : onr, pol ? onr : nr[1]);
conc = Rewriter::rewrite(conc);
+ conc = conc.negate();
bool do_infer = false;
- if (conc.getKind() == EQUAL)
+ bool pol = conc.getKind() != NOT;
+ Node lit = pol ? conc : conc[0];
+ if (lit.getKind() == EQUAL)
{
- do_infer = !areDisequal(conc[0], conc[1]);
+ do_infer = pol ? !areEqual(lit[0], lit[1])
+ : !areDisequal(lit[0], lit[1]);
}
else
{
- do_infer = !areEqual(conc, d_false);
+ do_infer = !areEqual(lit, pol ? d_true : d_false);
}
if (do_infer)
{
- conc = conc.negate();
std::vector<Node> exp_c;
exp_c.insert(exp_c.end(), in.d_exp.begin(), in.d_exp.end());
Node ofrom = d_extf_info_tmp[nr[0]].d_ctn_from[opol][i];
diff --git a/test/regress/CMakeLists.txt b/test/regress/CMakeLists.txt
index bfcd640b9..902ddf0f9 100644
--- a/test/regress/CMakeLists.txt
+++ b/test/regress/CMakeLists.txt
@@ -1548,6 +1548,7 @@ set(regress_1_tests
regress1/strings/strings-lt-simple.smt2
regress1/strings/strip-endpt-sound.smt2
regress1/strings/substr001.smt2
+ regress1/strings/timeout-no-resp.smt2
regress1/strings/type002.smt2
regress1/strings/type003.smt2
regress1/strings/username_checker_min.smt2
diff --git a/test/regress/Makefile.tests b/test/regress/Makefile.tests
index fc080f0e0..91f33721a 100644
--- a/test/regress/Makefile.tests
+++ b/test/regress/Makefile.tests
@@ -1545,6 +1545,7 @@ REG1_TESTS = \
regress1/strings/strings-lt-simple.smt2 \
regress1/strings/strip-endpt-sound.smt2 \
regress1/strings/substr001.smt2 \
+ regress1/strings/timeout-no-resp.smt2 \
regress1/strings/type002.smt2 \
regress1/strings/type003.smt2 \
regress1/strings/username_checker_min.smt2 \
diff --git a/test/regress/regress1/strings/timeout-no-resp.smt2 b/test/regress/regress1/strings/timeout-no-resp.smt2
new file mode 100644
index 000000000..65608da62
--- /dev/null
+++ b/test/regress/regress1/strings/timeout-no-resp.smt2
@@ -0,0 +1,7 @@
+(set-logic SLIA)
+(set-info :status sat)
+(set-option :strings-exp true)
+(declare-const x String)
+(declare-const y String)
+(assert (not (= (str.replace "A" (str.replace x "A" y) x) (str.replace "A" x (str.replace x y x)))))
+(check-sat) \ No newline at end of file
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback