Fix constant contains ITOS rewrite (#2799)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Wed, 16 Jan 2019 05:15:27 +0000 (23:15 -0600)
committerAndres Noetzli <andres.noetzli@gmail.com>
Wed, 16 Jan 2019 05:15:27 +0000 (21:15 -0800)
src/theory/strings/theory_strings_rewriter.cpp
test/regress/CMakeLists.txt
test/regress/regress0/strings/itos-entail.smt2 [new file with mode: 0644]
test/regress/regress0/strings/rewrites-v2.smt2

index 57a99532eb98d808ae04301f5bcc43942d4df931..b4c80e55bcd50dec8a774889c6d743e37ae47fde 100644 (file)
@@ -3234,7 +3234,7 @@ bool TheoryStringsRewriter::canConstantContainConcat( Node c, Node n, int& first
         pos = new_pos + s.size();
       }
     }
-    else if (n[i].getKind() == kind::STRING_ITOS)
+    else if (n[i].getKind() == kind::STRING_ITOS && checkEntailArith(n[i][0]))
     {
       // find the first occurrence of a digit starting at pos
       while (pos < tvec.size() && !String::isDigit(tvec[pos]))
index dbefe3af270ec9c4bf78b53aa6b6790fb98e1b3a..15dbf0df8d31f24a99caa31b9d86dc0b472bd0b3 100644 (file)
@@ -822,6 +822,7 @@ set(regress_0_tests
   regress0/strings/ilc-like.smt2
   regress0/strings/indexof-sym-simp.smt2
   regress0/strings/issue1189.smt2
+  regress0/strings/itos-entail.smt2
   regress0/strings/leadingzero001.smt2
   regress0/strings/loop001.smt2
   regress0/strings/model001.smt2
diff --git a/test/regress/regress0/strings/itos-entail.smt2 b/test/regress/regress0/strings/itos-entail.smt2
new file mode 100644 (file)
index 0000000..f9dcf4c
--- /dev/null
@@ -0,0 +1,11 @@
+(set-info :smt-lib-version 2.5)
+(set-logic ALL)
+(set-info :status sat)
+(set-option :strings-exp true)
+(declare-fun x () Int)
+(declare-fun y () String)
+(declare-fun z () String)
+
+(assert (str.contains "ABCD" (str.++ y (int.to.str x) z)))
+
+(check-sat)
index ce2f140ae236534b929b8f033db8f09c08288324..15954525f6a32ab84527bfdcedba670f717d1811 100644 (file)
@@ -5,12 +5,12 @@
 (set-info :status unsat)
 (declare-fun x () String)
 (declare-fun y () String)
-(declare-fun z () Int)
+(declare-fun z () String)
 
 ; these should all rewrite to false
 (assert (or
-(str.contains "abcdef0ghij1abced" (str.++ "g" (int.to.str z) x "a" y (int.to.str (+ z 1))))
-(str.contains "abc23cd" (str.++ (int.to.str z) (int.to.str z) (int.to.str z)))
+(str.contains "abcdef0ghij1abced" (str.++ "g" (int.to.str (str.len z)) x "a" y (int.to.str (+ (str.len z) 1))))
+(str.contains "abc23cd" (str.++ (int.to.str (str.len z)) (int.to.str (str.len z)) (int.to.str (str.len z))))
 (not (str.contains (str.++ x "ab" y) (str.++ "b" (str.substr y 0 4))))
 (not (str.contains (str.++ x "ab" y) (str.++ (str.substr x 5 (str.len x)) "a")))
 (str.contains (str.++ x y) (str.++ x "a" y))