我正在尝试使用Why3 的 Z3 后端来检索模型,然后这些模型可用于派生显示程序错误的测试用例。然而,Z3 版本 4.3.2 似乎无法回答sat
任何 Why3 目标。看起来Why3 使用的一些公理化定义以某种方式混淆了 Z3。例如,下面的例子(这是 Why3 生成的一小部分)
(declare-fun abs1 (Int) Int)
;; abs_def
(assert
(forall ((x Int)) (ite (<= 0 x) (= (abs1 x) x) (= (abs1 x) (- x)))))
(check-sat)
结果timeout
如下命令行:
z3 -smt2 model.partial=true file.smt2 -T:10
另一方面,将定义更改为
(declare-fun abs1 (Int) Int)
;; abs_def
(assert
(forall ((x Int)) (=> (<= 0 x) (= (abs1 x) x))))
(assert
(forall ((x Int)) (=> (> 0 x) (= (abs1 x) (- x)))))
会给我一个模型(看起来很合理)
(model
(define-fun abs1 ((x!1 Int)) Int
(ite (>= x!1 0) x!1 (* (- 1) x!1)))
)
但是如果我尝试添加原始Why3文件中存在的下一个公理,即
;; Abs_pos
(assert (forall ((x Int)) (<= 0 (abs1 x))))
Z3 再次回答timeout
。
Z3的配置中是否缺少我的东西?此外,在以前的Why3 版本中,有一个选项MODEL_ON_TIMEOUT
,允许在这种情况下检索模型。尽管不能保证这是一个真实的模型,因为 Z3 无法完成检查,但实际上这些模型通常包含我需要的所有信息。但是,我在 4.3.2 中没有找到类似的选项。它还存在吗?
更新最后一个公理Abs_pos
是错误的(我在此处发布之前对Why3 的输出进行了一些玩弄,最终粘贴了该问题的错误版本)。现在已修复。