String 从Z3字符串中的字符提取十进制值

String 从Z3字符串中的字符提取十进制值,string,z3,smt,String,Z3,Smt,设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将包含替换的版本)。受到标准编程语言的启发, 我可能会想做这样的事情: (de

设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”的替代表示形式。非常感谢您的帮助,谢谢

以下工作:

(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)))

(declare-const subSecElt (_ BitVec 8))
(declare-const eltUpCase (_ BitVec 8))
(assert (= (bvsub subSecElt #x20) eltUpCase))
(assert (= (seq.unit subSecElt) (str.at s1 2)))
(assert (= (str.at s2 2) (ite b1 (seq.unit eltUpCase) (str.at s1 2))))

(check-sat)
(get-value (s1 s2 b1))
如果可以进一步简化,那就太好了,尽管我看不到一个简单的方法可以做到这一点,因为API似乎不允许直接从序列访问元素。它允许您获取子序列,而不是元素,这是您在这里真正需要的:请注意,长度为1的子序列与该位置的基础元素不同,这解释了您得到的正确类型错误

这是我对这个问题的回答:

sat
((s1 "74b\x00!!###$$")
 (s2 "74B\x00!!###$$")
 (b1 true))

使用Z3 4.5.1,我得到了s2的错误值(小写g):((s1…(s2“74g\x00!!###$$))(b1…)我用我得到的响应更新了答案,这似乎是正确的。字符串解算器已经经历了许多更改,因此您可能希望从这里获得Z3的最新副本:即使是夜间构建,仍然无法使用。我在辅助变量Subcelt和eltUpCase上添加了一个手表,它们确实有期望值。。。但是,我一直得到s2的错误值(小写o):sat((s1…(s2“74o\x00!!####$$))(b1…(Subcelt#x62)(eltUpCase#x42))我刚做了一个新的Z3构建,它对我来说很好。我不认为这有什么关系,但我在Mac电脑上。你在用什么操作系统?我在用UBUNTU 14.04.5。。。下面是我从z3/build:./z3smt.string\u solver=z3str3-smt2example.txt运行的命令行