z3 4.3.2未能找到产生(可满足)目标的原因模型

z3 4.3.2未能找到产生(可满足)目标的原因模型,z3,why3,Z3,Why3,我正试图使用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)))))

我正试图使用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)
另一方面,将定义更改为

(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)))))
但是如果我尝试添加原始Why3文件中的下一个公理,即

;; Abs_pos
(assert (forall ((x Int)) (<= 0 (abs1 x))))
Z3再次响应超时

在Z3的配置中我缺少什么吗?此外,在Why3的早期版本中,有一个选项MODEL_ON_TIMEOUT,允许在这种情况下检索模型。尽管由于Z3无法完成检查,因此无法保证这是一个真实的模型,但实际上,此类模型通常包含我需要的所有信息。但是,我在4.3.2中没有找到类似的选项。它还存在吗

更新上一个axiom Abs_pos是错误的我在这里发布之前对Why3的输出做了一些改动,最后粘贴了一个错误版本的问题。这一点现在已被修正。

附加公理


断言不是所有的x Int oop,我意识到我尝试玩弄Why3的输出时粘贴了错误的部分。Why3提供的真正公理当然是断言所有x Int
(model 
  (define-fun abs1 ((x!1 Int)) Int
    (ite (>= x!1 0) x!1 (* (- 1) x!1)))
)
;; Abs_pos
(assert (forall ((x Int)) (<= 0 (abs1 x))))