在使用 z3 撰写硕士论文时,我发现了一些我无法理解的奇怪东西。我希望你能帮助我。:)
我写的 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
. 结果是一个奇怪的模型。在我看来,区别基本上是我的变量 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)))
) 会禁止这样做。
提前致谢!:)