簡體   English   中英

z3 4.3.2未能找到Why3生成(可滿足)目標的模型

[英]z3 4.3.2 fails to find a model for Why3-generated (satisfiable) goals

我正在嘗試使用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的輸出有點了解,最后粘貼了錯誤版本的問題)。 現在,此問題已解決。

附加公理

(斷言(不是(forall((x Int))(<= 0(abs1 x)))))

由於abs1始終返回非負整數,並且使用其他公理,因此對於a x來說abs1必須存在負結果,從而使該問題無法解決。 Z3的網絡版本按預期返回unsat,請參見此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM