z3 - 将 `str.indexof` 与 `int2bv` 一起使用时性能不佳
问题描述
我试图将位向量限制为等于字符串中空字节的索引。但是,我遇到了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)
另一方面,“相同”的问题(它允许更多的解决方案)使用int2bv
几乎需要 2 分钟:
; 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)
有没有更好的方法在 z3 中对这种位向量字符串长度操作进行编码?z3strBV 上的这些幻灯片声称有更好的支持,但它们的扩展似乎并未在标准 z3 发行版中实现。
我正在使用 z3 版本 4.8.0 - 64 位并运行smt.string_solver=z3str3
.
解决方案
通过反复试验,我发现该选项smt.str.use_binary_search=true
将第二个问题的解决时间降至 2 秒以下!不过,不确定为什么此选项的默认值为 false。
推荐阅读
- python - 如何将具有numpy数组值的熊猫系列转换为数据框
- makefile - 没有规则来制作目标*,*需要
- java - 单元测试 Spring 抛出 BeanNotOfRequiredTypeException
- python - 如何优化下面的代码以更快地运行,我的数据框大小几乎是 100,000 个数据点
- android - 在 android studio 中将实时数据库添加到我的应用程序 - 无法解决:firebase-database-15.0.0
- laravel - 十月CMS后台登录
- c++ - 使用 2 个指针反转链表
- python - Python - 比较包含的两个字典值并显示匹配项
- c++ - C++ OpenCV 进行人脸识别,直到相机被移除
- javascript - 样式属性不适用于带后缀或前缀的输入