Generalize eager length bound conflicts for regular expression memberships (#7633)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Tue, 30 Nov 2021 20:30:45 +0000 (14:30 -0600)
committerGitHub <noreply@github.com>
Tue, 30 Nov 2021 20:30:45 +0000 (20:30 +0000)
commit23f134fa7309621be513ca3c728b7a3c03473a45
tree66e2040ec77f4c662971c20ac9b98b6aee61eb11
parent641c531bcb9df45ca6c19f3f9ccfad08afbe17de
Generalize eager length bound conflicts for regular expression memberships (#7633)

This generalizes eager length bound conflicts to take into account regular expression memberships.

For example:

If `(str.in_re x (re.++ (re.* re.allchar) (str.to_re "abc") (re.* re.allchar))` is asserted, then we know `(str.len x) >= 3`.

If e.g. equivalence class of `x` is merged with `(str.substr y 0 2)`, we get the conflict

`(and (str.in_re x (re.++ (re.* re.allchar) (str.to_re "abc") (re.* re.allchar)) (= x (str.substr y 0 2))`

since `(str.len (str.substr y 0 2)) <= 2`.

This also does some minor refactoring to eager prefix conflicts to make it more analogous to our implementation of length conflicts.
src/options/strings_options.toml
src/theory/strings/arith_entail.cpp
src/theory/strings/arith_entail.h
src/theory/strings/eager_solver.cpp
src/theory/strings/eager_solver.h
src/theory/strings/eqc_info.cpp
src/theory/strings/eqc_info.h
src/theory/strings/regexp_entail.cpp
src/theory/strings/regexp_entail.h
src/theory/strings/theory_strings.cpp