如果我将以下脚本提供给Z3:
(set-option :MBQI true)
(set-option :produce-models true)
(declare-fun s1 ((_ BitVec 16)) (_ BitVec 16))
(assert (forall ((s0 (_ BitVec 16))) (bvuge s0 (s1 s0))))
(check-sat)
(get-model)
(eval (s1 #x0000))
Z3成功构建模型,其中s1
被赋予身份函数。但是,对eval的调用会导致Z3超时。我需要设置一个特定的选项吗?
另外,我注意到如果删除该行:
(set-option :MBQI true)
然后Z3回应unknown
。由于QBVF是可判定的,所以我需要设置一个选项,这有点令人惊讶。是不是我们应该在所有QBVF问题中将MBQI设置为true
,或者这个实例有什么特别的东西吗?
谢谢..
答案 0 :(得分:1)
Z3有几个处理量词的引擎:电子匹配,MBQI,叠加等。 虽然QBVF是一个可判定的片段,但只有MBQI引擎可以决定它。 E匹配模块仅在显示公式不可满足时有效。 对于可满足的实例,它总是会失败(返回未知)。 叠加模块在纯(无理论)一阶逻辑公式中是有效的。
在某些版本的Z3中,默认情况下不启用MBQI模块,因为它非常昂贵。 某些应用程序(如VCC和Spec#)使用非常复杂的量化公式,这些公式不在MBQI可支持的任何可判定片段中。 因此,MBQI模块只是这些应用程序的开销。 在Z3 3.1(可在Z3网站上下载)中,默认情况下启用MBQI。
在即将推出的Z3 3.2中,逻辑UFBV将得到官方支持。 UFBV是QBVF的SMT-LIB名称。
因此,您将能够使用(set-logic UFBV)
,Z3将自动为此逻辑配置自己。
关于eval
命令,这是一个错误,我会修复它。该修复程序将在Z3 3.2中提供。