Пусть s1 — произвольная строка из Z3Str. Я могу проверить, является ли третий символ строчной буквой:
(declare-const s1 String)
(assert (= s1 "74b\x00!!###$$"))
(assert (str.in.re (str.at s1 2) (re.range "a" "z")))
(check-sat)
(get-value (s1))
Теперь предположим, что это действительно так, и я хочу заменить эту третью букву заглавной (новая строка s2 будет содержать замененную версию). Вдохновленный стандартными языками программирования, у меня может возникнуть соблазн сделать что-то вроде этого:
(declare-const s1 String)
(declare-const s2 String)
(declare-const b1 Bool)
(assert (= s1 "74b\x00!!###$$"))
(assert (= b1 (str.in.re (str.at s1 2) (re.range "a" "z"))))
(assert (= (str.substr s2 0 2) (str.substr s1 0 2)))
(assert (= (str.substr s2 3 8) (str.substr s1 3 8)))
(assert (= (str.len s2) (str.len s1)))
(assert (= (str.at s2 2) (ite b1 (- (str.at s1 2) 32) (str.at s1 2))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 32 = 'a'-'A'
(check-sat)
(get-value (s1 s2 b1))
Но, конечно, это не работает из-за типов:
(error "line 9 column 52: Sort mismatch at argument #1 for function
(declare-fun - (Int Int) Int) supplied sort is String")
Существует ли прямой способ манипулирования десятичным значением символа в строке Z3? Я имею в виду, кроме гигантского переключателя для всех строчных букв ... Кажется, есть некоторая надежда, потому что API поддерживает «\ x61» в качестве альтернативного представления «a». Любая помощь очень ценится, спасибо!!