感性的事實,我想證明在Z3,微軟的SMT求解器的電感事實。我知道,Z3,一般也不會提供這種功能,如Z3 guide解釋(第8節:數據類型),但它看起來就像當我們限制了我們想要證明的事實域中,這是可能的。請看下面的例子:證明在Z3
(declare-fun p (Int) Bool)
(assert (p 0))
(assert (forall ((x Int))
(=>
(and (> x 0) (<= x 20))
(= (p (- x 1)) (p x)))))
(assert (not (p 20)))
(check-sat)
求解器與unsat
正確響應,這意味着(p 20)
是有效的。問題是,當我們放鬆這個約束時(我們用上面例子中的20
替換大於20的整數),求解器迴應unknown
。
我發現這種奇怪的,因爲它並不需要Z3長,解決了原來的問題,但是,當我們由一個增加上限也突然變得不可能。我曾嘗試的模式添加到量詞如下:
(declare-fun p (Int) Bool)
(assert (p 0))
(assert (forall ((x Int))
(! (=>
(and (> x 0) (<= x 40))
(= (p (- x 1)) (p x))) :pattern ((<= x 40)))))
(assert (not (p 40)))
(check-sat)
這似乎更好地工作,但現在的上限是40,這是否意味着我可以最好不要用Z3來證明這些事實,或我錯誤地闡述了我的問題嗎?
謝謝,真的很有幫助!是否有一些資源可以提供有關可以設置的所有選項的更多信息?我知道[這個列表](http://research.microsoft.com/en-us/um/redmond/projects/z3/config.html),但這是相當簡潔,我希望可能會有一個更詳細的某處解釋。 – marczoid
不幸的是,我們沒有詳細描述選項的文檔/頁面。我試圖將Z3移動到一個新的參數設置框架中,其中每個組件都有自己的參數和文檔。待辦事項列表中的另一項是從您在評論中引用的列表中刪除過時的選項。 –