Z3 将'str.indexof'与'int2bv'一起使用时性能不佳`

Z3 将'str.indexof'与'int2bv'一起使用时性能不佳`,z3,smt,Z3,Smt,我试图将位向量约束为等于字符串中空字节的索引。但是,我在int2bv中遇到了性能问题 作为该问题的一个简单示例,此问题(无int2bv)可立即解决: ; Solve time: 0m0.065s (declare-const s String) (declare-const len Int) (assert (= (str.indexof s "\00") len)) (assert (>= len 256)) ; 0x100 (assert (<= len 4095)) ; 0xF

我试图将位向量约束为等于字符串中空字节的索引。但是,我在
int2bv
中遇到了性能问题

作为该问题的一个简单示例,此问题(无
int2bv
)可立即解决:

; Solve time: 0m0.065s
(declare-const s String)
(declare-const len Int)
(assert (= (str.indexof s "\00") len))
(assert (>= len 256)) ; 0x100
(assert (<= len 4095)) ; 0xFFF
(check-sat)
(get-model)
有没有更好的方法在z3中编码这种位向量字符串长度操作?在z3strBV上,它声称有更好的支持,但它们的扩展似乎没有在标准的z3发行版中实现


我使用的是z3版本4.8.0-64位,运行时使用的是
smt.string\u solver=z3str3

通过反复试验,我发现选项
smt.str.use\u binary\u search=true
将第二个问题的求解时间降低到2秒以下!但是,不确定为什么此选项的默认值为false。

您真的要受这里的启发法的支配。我敢肯定,如果您断言析取,即
len
转换为12位BV,并且等于
256
257
<代码>4095将很快得到解决。你会考虑忠实的翻译吗?不幸的是,当您以任意方式组合理论时,很难预测性能。这将是可靠的,但当然是一个巨大的编码。我确实发现,如果我执行
(设置选项:smt.str.use\u binary\u search true)
则长一个的求解时间会下降到2秒以下!不知道为什么默认设置是假的,这是天赐良机!酷,我不知道这个选项。当然,问题是,你总是可以编造一个程序,在这个程序中,二进制搜索执行得非常糟糕,而常规解算器可以非常快地得到。你可以尝试使用“战术”,或许可以并行地运行它们。参见此处了解战术语言;(它是用Python编写的,但是您也可以使用SMTLib接口来表达类似的内容。)看起来您找到的选项可以做到这一点。您可以回答自己的问题并接受它,这样其他人就可以更容易地访问堆栈溢出。
; Solve time: 1m54.861s
(declare-const s String)
(declare-const len Int)
(assert (= (str.indexof s "\00") len))
(assert (>= len 0))
(assert (not (= (bvand ((_ int2bv 12) len) #xF00) #x000)))
(check-sat)
(get-model)