Fix off by one error in strings flat form explanation (#3273)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Wed, 25 Sep 2019 23:26:41 +0000 (18:26 -0500)
committerAndres Noetzli <andres.noetzli@gmail.com>
Wed, 25 Sep 2019 23:26:41 +0000 (16:26 -0700)
commit923abd7000a2ab6e3c0776c59d159bdc3a4d9a52
tree8f5a1e11428ce181abc5b722997847c4faecc29f
parent91565cda11ad42082a11055514e12ddeee459460
 Fix off by one error in strings flat form explanation (#3273)

Fixes #3272.

This was caused by not explaining the last equal component in a flat form inference.  For example, if `x=y`, we may infer `z=""` from `u++x++z=u++y` since the 1st and 2nd components of these strings are equal. However, we would not add the explanation of `x=y` due to an off-by-one error.

Notice that this code is very rarely used (the code for F_EndpointEmp is not covered by our regressions). This is since length elaboration should catch conflicting cases like above, where `len(u++x++z)!=len(u++y)` if `x=y` and `z!=""` and thus `u++x++z != u++y`.  #3272 happened to catch a rare case where it is applied. This is likely due to theory combination not propagating an equality prior to running a full effort call to strings check, which is unexpected but not impossible.
src/theory/strings/theory_strings.cpp
test/regress/CMakeLists.txt
test/regress/regress1/strings/issue3272.smt2 [new file with mode: 0644]