在用z3工作我的碩士論文時,我發現了一些我無法理解的奇怪東西。 我希望你能幫助我。 :)ini-option CASE_SPLIT產生奇怪的模型
的SMT-文件我寫了這個樣子的:
(set-logic QF_UF)
(set-info :smt-lib-version 2.0)
;Declare sort Node and its objects.
(declare-sort Node 0)
(declare-fun n0() Node)
(declare-fun n1() Node)
;Predicate
(declare-fun dead_0 (Node) Bool)
;Abbreviation
(declare-fun I() Bool)
;initial configuration
(assert(= I (and
(not(= n0 n1))
(not(dead_0 n0))
(dead_0 n1))))
;Predicate
(declare-fun dead_1 (Node) Bool)
;variable
(declare-fun m0_1() Node)
;Abbreviation for Transformation
(declare-fun TL1_1() Bool)
;Transformation1neuerKnoten1
(assert(or (= m0_1 n0)(= m0_1 n1)))
;Is the whole formula satisfiable?
(assert(= (and I TL1_1) true))
(check-sat)
(get-model)
一切都運行得很好,而使用Z3作爲默認選項的命令行工具。 生成的模型包含:
;; universe for Node:
;; Node!val!0 Node!val!1
;; -----------
和
(define-fun n0() Node
Node!val!0)
(define-fun n1() Node
Node!val!1)
(define-fun m0_1() Node
Node!val!0)
所以我的變量m0_1綁定到節點N0。
然後我用z3和一個只包含CASE_SPLIT=5
的ini文件。 結果是一個奇怪的模型。在我看來,差異基本上是 ,我的變量m0_1沒有綁定到我的任何節點n0或n1。 產生的模型包含:
;; universe for Node:
;; Node!val!2 Node!val!0 Node!val!1
;; -----------
和
(define-fun n0() Node
Node!val!0)
(define-fun n1() Node
Node!val!1)
(define-fun m0_1() Node
Node!val!2)
所以我的問題是:爲什麼Z3創建另一個節點(Node!val!2
)爲什麼是綁定到這個新的節點我的變量m0_1
?我認爲我的一個斷言((assert(or (= m0_1 n0)(= m0_1 n1)))
)會禁止這一點。
在此先感謝! :)