1
我正在寫一個新的程序邏輯proofchecker,處理軟弱內存。 Z3確實繁重:我在我的所有檢查翻譯成的AST,並使用ML結合在Z3扔。 (但是,見下文,我已經通過rise4fun在線查看了Z3,給出了相同的答案)。這是我想檢查,漂亮的打印,所以我能理解運營商的嵌套,稍有簡化的名稱,因此很容易,看看他們是什麼含義:神祕的「未知」從Z3
r1=1
=> y=1
/\ x=1
/\ xnew=x
/\ ynew=2
=> xnew=x
/\ ynew=y
\/ Exists(r1)
r1=1
=> y=1
/\ x=1
/\ xnew=x
/\ ynew=2
這轉化爲AST的很好(類型聲明不示,但請參閱下面的實際Z3輸入):
(let ((a1 (and (=> (= r1 1) (and (= y 1) (= x 1)))
(= xnew x)
(= ynew 2)))
(a2 (exists ((r1 Int))
(and (=> (= r1 1) (and (= y 1) (= x 1)))
(= xnew x)
(= ynew 2)))))
(=> a1 (or
(和(= xnew X)(= ynew Y))A2)))
所以這就是所有的罰款。但Z3說'未知'。奇怪的是,在我所有的測試中,這是成千上萬個查詢中唯一能夠得出這個結果的查詢。所以我用Z3的在線版本進行調查,通過rise4fun教程,它接受了這個輸入
(declare-const r1 Int)
(declare-const y Int)
(declare-const x Int)
(declare-const xnew Int)
(declare-const ynew Int)
(define-fun a1() Bool
(and (=> (= r1 1) (and (= y 1) (= x 1)))
(= xnew x)
(= ynew 2))
)
(define-fun a2() Bool
(exists ((r1 Int))
(and (=> (= r1 1) (and (= y 1) (= x 1)))
(= xnew x)
(= ynew 2)))
)
(define-fun conjecture() Bool
(=> a1 (or (and (= xnew x) (= ynew y)) a2))
)
(assert (not conjecture))
(check-sat)
並表示'unknown'。
我是不是做一個簡單的錯誤,或者這是一個錯誤,還是什麼?
感謝。我會屏住呼吸:-) – user3464390
@Nikolaj:這是一個相對較小的輸入,會產生「未知」結果 - [Z3輸入](http://stackoverflow.com/questions/22670784/why-does-z3-return -Unknown-ON-此-簡單輸入)。它不使用任何理論,如算術。也許這可能會幫助你重現行爲。 –