Mentre lavoro sulla mia tesi di master con z3 ho trovato qualcosa di strano che non riesco a capire. Spero che tu possa aiutarmi. :)ini-option CASE_SPLIT produce un modello strano
SMT-file che ho scritto si presenta così:
(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)
Tutto funziona abbastanza bene durante l'utilizzo Z3 come uno strumento a riga di comando con il default-opzioni. Il modello generato contiene:
;; universe for Node:
;; Node!val!0 Node!val!1
;; -----------
e
(define-fun n0() Node
Node!val!0)
(define-fun n1() Node
Node!val!1)
(define-fun m0_1() Node
Node!val!0)
Quindi il mio m0_1 variabile è legata al n0 nodo.
Quindi ho usato z3 con un file ini contenente solo CASE_SPLIT=5
. Il risultato è stato uno strano modello. A mio avviso la differenza è in pratica che la mia variabile m0_1 NON è associata a nessuno dei miei nodi n0 o n1. Il modello prodotto contiene:
;; universe for Node:
;; Node!val!2 Node!val!0 Node!val!1
;; -----------
e
(define-fun n0() Node
Node!val!0)
(define-fun n1() Node
Node!val!1)
(define-fun m0_1() Node
Node!val!2)
Quindi la mia domanda è questa: perché Z3 creare un altro nodo (Node!val!2
) e perché è la mia variabile m0_1
legato a questo nuovo nodo? Ho pensato che una delle mie asserzioni ((assert(or (= m0_1 n0)(= m0_1 n1)))
) lo avrebbe proibito.
Grazie in anticipo! :)