From 1eaf6cf987fa1452528dc0598ca7235be735ba3b Mon Sep 17 00:00:00 2001 From: Andres Noetzli Date: Tue, 29 Jan 2019 10:17:06 -0800 Subject: [PATCH] Strings: Remove redundant replace rewrite (#2822) Pulling the first constant string from a replace if there is no overlap with the search term is subsumed by the rewrite using `stripConstantEndpoints()`. --- src/theory/strings/theory_strings_rewriter.cpp | 13 ------------- test/unit/theory/theory_strings_rewriter_white.h | 14 ++++++++++++++ 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 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() -- 2.30.2