Theory Reference: Strings
cvc5 supports all operators of the SMT-LIB standard for strings . It additionally supports some non-standard operators that are described below.
Semantics
* (str.indexof_re String RegLan Int Int)
Let w₂ = ⟦str.substr⟧(w, i, |w| - i)
- ⟦str.indexof_re⟧(w, L, i) = -1 if no substring of w₂ is in L or i < 0
- ⟦str.indexof_re⟧(w, L, i) = |u₁|
where u₁, w₁ are the shortest words such that
- w₂ = u₁w₁u₂
- w₁ ∈ L
if some substring of w₂ is in L and i > 0
* (str.update String Int String)
- ⟦str.update⟧(w, i, w₂) = w if i < 0 or i >= |w|
- ⟦str.update⟧(w, i, w₂) = u₁u₂u₃
where
- w = u₁w₃u₃
- |w₃| = |u₂|
- |u₁| = i
- u₂u₄ = w₂
- |u₂| = min(|w₂|, |w| - i) otherwise
* (str.rev String String)
⟦str.rev⟧(w) is the string obtained by reversing w, e.g.,
⟦str.rev⟧("abc") = "cba".
* (str.to_lower String String)
⟦str.to_lower⟧(w) = w₂
where
- |w| = |w₂|
- the i-th character ri in w₂ is:
code(ri) = code(si) + ite(65 <= code(si) <= 90, 32, 0)
where si is the i-th character in w
Note: This operator performs the case conversion for the ASCII portion of
Unicode only.
* (str.to_upper String String)
⟦str.to_upper⟧(w) = w₂
where
- |w| = |w₂|
- the i-th character ri in w₂ is:
code(ri) = code(si) - ite(97 <= code(si) <= 122, 32, 0)
where si is the i-th character in w
Note: This operator performs the case conversion for the ASCII portion of
Unicode only.