背景:我研究使用 z3 进行有界 Java 程序验证。我想得到一个关于线性化问题的优化模型。一种标准方法可以是逐步搜索模型,直到找到未满足的情况。但是性能似乎是个问题,它通过引入 JNI 破坏了代码的可移植性,它将 z3 c/c++ api 集成到我的工具中。
现在我想对 java 方法的所有输入添加约束。我使用数量数组(我使用数组理论来模拟堆)。但是,z3 总是在可满足的问题上立即返回“未知”。似乎不可能生成模型。我注意到z3有一个选项,INST_GEN,然后我试图理解它。我将以下公式提供给 z3。
(set-option :INST_GEN true)
(define-sort S () (_ BitVec 2))
(declare-fun s () S)
(assert (= s (_ bv0 2)))
(define-sort A () (Array S S))
(push) ;; 1st case
(assert (forall ((a A)) (= (select a s) s)))
(check-sat)
(get-model)
(pop)
(push) ;; 2nd case
(declare-fun a () A)
(assert (forall ((t S)) (= (select a t) t)))
(check-sat)
(get-model)
(pop)
(push) ;; 3rd case
(check-sat)
(get-model)
(pop)
在第一种和第二种情况下,z3 在 Linux 中返回“分段错误”,而在 Windows 7 中崩溃。z3 都是版本 4.0,x64。
第三种情况,免量化,Z3成功生成模型
sat
(model (define-fun s () (_ BitVec 2) #b00) )
我的第一个问题是这个选项是如何工作的?它是否枚举数组?
第二个问题是,我注意到 z3 可以在量化数组的不满意问题上成功返回“unsat”。z3 是否支持某些选项或方法来在量化数组、有界索引和元素的满意问题中生成模型?例如使用 if-then-else 子句。
感谢您的阅读和考虑!任何建议都非常感谢!