0
我想在z3中遞歸函數,我很好奇,如果有模型構造的錯誤。試想一下:具有遞歸函數的錯誤?
(define-fun-rec f ((x Int)) Int
(ite (> x 1)
(f (- x 1))
1))
(check-sat)
(get-value ((f 0)))
這裏f
實際上是常數函數1
,只是在一個愚蠢的方式定義。對於這個輸入,Z3打印:
sat
(((f 0) 0))
這似乎是不正確的,因爲f 0
應該等於1
。
有趣的是,如果我斷言什麼Z3提出作爲結果,然後我得到了正確的unsat
答案:
(define-fun-rec f ((x Int)) Int
(ite (> x 1)
(f (- x 1))
1))
(assert (= (f 0) 0))
(check-sat)
我得到:
unsat
因此,它看起來像Z3實際上做現在f 0
不能是0
;儘管它在前一種情況下生產了這種模型。
考慮這一步,如果我發出:
(define-fun-rec f ((x Int)) Int
(ite (> x 1)
(f (- x 1))
1))
(assert (= (f 0) 1))
(check-sat)
(get-model)
然後Z3迴應:
sat
(model
(define-fun f ((x!0 Int)) Int
1)
)
這確實是一個合理的答案。
因此,在某些條件下,似乎可能存在遞歸函數模型的錯誤?
我會在這裏留下這個問題,以防萬一任何人有任何想法..但我也提交它作爲一個可能的錯誤在:http://github.com/Z3Prover/z3/issues/898 –