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 のみを含む ini ファイルで使用しました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
がこの新しいノードにバインドされているのはなぜですか? 私は、私の主張の 1 つ ( (assert(or (= m0_1 n0)(= m0_1 n1)))
) がこれを禁止すると考えていました。
前もって感謝します!:)