【发布时间】:2019-02-14 07:27:09
【问题描述】:
我有一个以 smt2-lib 格式编写的 z3 模型。我注意到当我使用时:
(declare-const flat1 (Seq Dummy))
(assert (= flat1 (unroll dummyFormula1)))
模型是坐着的,而当我使用时:
(define-fun flat1 () (Seq Dummy) (unroll dummyFormula1))
模型被报告为未知。 为什么差异很重要?如果有帮助,我可以生成模型的最小版本。
编辑 #1 - 一个最小的示例
由于this bug,请务必使用来自 github master 的 z3 运行它。您可以在下面我用A) 和B) 指示的两个版本之间进行切换。
(set-option :produce-models true)
; --------------- Basic Definitions -------------------
(declare-datatype Dummy (A B))
(declare-datatype Formula
((Base (forB Dummy))
(And (andB1 Formula) (andB2 Formula))
(Or (orB1 Formula) (orB2 Formula))
(Not (notB Formula))))
(declare-const dummyFormula1 Formula)
(assert (= dummyFormula1 (Base A)))
(declare-const dummyFormula2 Formula)
(assert (= dummyFormula2 (And (Base A) (Base A))))
; --------------- Some functions -----------------------
(define-fun
in_list ((o Dummy) (l (Seq Dummy))) Bool
(seq.contains l (seq.unit o)))
(define-fun
permutation ((l1 (Seq Dummy)) (l2 (Seq Dummy))) Bool
(forall ((o Dummy)) (= (in_list o l1) (in_list o l2))))
(define-fun-rec unroll ((f Formula)) (Seq Dummy)
(match f
(((Base j) (seq.unit j))
((And f1 f2) (seq.++ (unroll f1) (unroll f2)))
((Or f1 f2) (seq.++ (unroll f1) (unroll f2)))
((Not f1) (unroll f1)))))
; -------------- The question -------------------------
;; Here are two versions that should express the same idea, but try commenting
;; the first one and uncommenting the second one!
;; A)
(declare-const flat1 (Seq Dummy))
(assert (= flat1 (unroll dummyFormula1)))
;; B)
; (define-fun flat1 () (Seq Dummy) (unroll dummyFormula1))
; -----------------------------------------------------
(declare-const flat2 (Seq Dummy))
(assert (= flat2 (unroll dummyFormula2)))
(assert (permutation flat1 flat2))
; --------------- Verify -------------------
(check-sat)
(get-model)
【问题讨论】:
-
最小版本确实会有所帮助。
-
@PatrickTrentin 添加了一个最小示例,请告诉我您是否可以重现该行为。
标签: z3 smt model-checking