在用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)))
)会禁止这一点。
在此先感谢! :)