summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Noetzli <andres.noetzli@gmail.com>2019-01-25 20:02:47 -0800
committerAndres Noetzli <andres.noetzli@gmail.com>2019-01-25 20:07:21 -0800
commitbf33150907c15c632167a39f70d26b79fe809627 (patch)
treec327198308289e343aabf576ff3e3a05637aa166
parent467ef8692009f440bda74083d476131ff1e88b51 (diff)
Strings: Remove redundant replace rewrite
Pulling the first constant string from a replace if there is no overlap with the search term is subsumed by the rewrite using `stripConstantEndpoints()`.
-rw-r--r--src/theory/strings/theory_strings_rewriter.cpp13
-rw-r--r--test/unit/theory/theory_strings_rewriter_white.h14
2 files changed, 14 insertions, 13 deletions
diff --git a/src/theory/strings/theory_strings_rewriter.cpp b/src/theory/strings/theory_strings_rewriter.cpp
index 8e5e22d38..0c8d6ac8d 100644
--- a/src/theory/strings/theory_strings_rewriter.cpp
+++ b/src/theory/strings/theory_strings_rewriter.cpp
@@ -2373,19 +2373,6 @@ Node TheoryStringsRewriter::rewriteReplace( Node node ) {
{
return returnRewrite(node, node[0], "rpl-const-nfind");
}
- // if no overlap, we can pull the first child
- if (s.overlap(t) == 0)
- {
- std::vector<Node> spl(children0.begin() + 1, children0.end());
- Node ret = NodeManager::currentNM()->mkNode(
- kind::STRING_CONCAT,
- children0[0],
- NodeManager::currentNM()->mkNode(kind::STRING_STRREPL,
- mkConcat(kind::STRING_CONCAT, spl),
- node[1],
- node[2]));
- return returnRewrite(node, ret, "rpl-prefix-nfind");
- }
}
else
{
diff --git a/test/unit/theory/theory_strings_rewriter_white.h b/test/unit/theory/theory_strings_rewriter_white.h
index 59d36d9e8..5f08ce741 100644
--- a/test/unit/theory/theory_strings_rewriter_white.h
+++ b/test/unit/theory/theory_strings_rewriter_white.h
@@ -495,6 +495,7 @@ class TheoryStringsRewriterWhite : public CxxTest::TestSuite
Node empty = d_nm->mkConst(::CVC4::String(""));
Node a = d_nm->mkConst(::CVC4::String("A"));
+ Node ab = d_nm->mkConst(::CVC4::String("AB"));
Node b = d_nm->mkConst(::CVC4::String("B"));
Node c = d_nm->mkConst(::CVC4::String("C"));
Node d = d_nm->mkConst(::CVC4::String("D"));
@@ -625,6 +626,19 @@ class TheoryStringsRewriterWhite : public CxxTest::TestSuite
b);
repl = d_nm->mkNode(kind::STRING_STRREPL, b, x, b);
differentNormalForms(repl_repl, repl);
+
+ {
+ // Same normal form:
+ //
+ // (str.replace (str.++ "AB" x) "C" y)
+ //
+ // (str.++ "AB" (str.replace x "C" y))
+ Node lhs = d_nm->mkNode(
+ kind::STRING_STRREPL, d_nm->mkNode(kind::STRING_CONCAT, ab, x), c, y);
+ Node rhs = d_nm->mkNode(
+ kind::STRING_CONCAT, ab, d_nm->mkNode(kind::STRING_STRREPL, x, c, y));
+ sameNormalForm(lhs, rhs);
+ }
}
void testRewriteContains()
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback