不要依賴任何求解器的隱式類型轉換。相反, 使用to_real
和to_int
進行顯式類型轉換。只發送 井型公式給求解器。然後Mohamed Iguernelala的例子成爲以下內容。
(set-logic AUFLIRA)
(declare-fun x() Int)
(assert (= (to_real x) 1.5))
(check-sat)
(exit)
(set-logic AUFLIRA)
(declare-fun x() Int)
(assert (= 1.5 (to_real x)))
(check-sat)
(exit)
這兩個都返回UNSAT在Z3和CVC4。相反,如果您真的想要找到 的模型,那麼x = 1
您應該使用以下的一個 。
(set-option :produce-models true)
(set-logic AUFLIRA)
(declare-fun x() Int)
(assert (= (to_int 1.5) x))
(check-sat)
(get-model)
(exit)
(set-option :produce-models true)
(set-logic AUFLIRA)
(declare-fun x() Int)
(assert (= x (to_int 1.5)))
(check-sat)
(get-model)
(exit)
這兩個與x = 1
在Z3和CVC4返回飽和
一旦你使所有的類型轉換都是顯式的,並且只處理良好類型的公式,那麼等於的參數順序就不再重要了(爲了正確性)。
http://rise4fun.com/z3/tutorial指出:「...與大多數編程語言不同,Z3不會自動將整數轉換爲實數,反之亦然......」 –
Oki,所以如果沒有隱式轉換時,斷言在類型檢查時應該被拒絕。 –
@PetrVepřek想知道當你聲稱'0.5等於0'時哪些語言會自動將0.5轉換爲0 ... – MxyL