这是Z3中的分裂错误吗?

时间:2014-07-10 09:22:28

标签: z3 division

我使用以下两个脚本尝试使用rise4fun:

脚本(1):

(declare-const a Int)
(declare-const b Int)
(assert (= 1 (/ a b))) ; division
(check-sat)
(get-model)

脚本(2):

(declare-const a Int)
(declare-const b Int)
(assert (= 1 (rem a b))) ; remainder
(check-sat)
(get-model)

Z3给了我(a = 0,b = 0)作为脚本(1)的模型和(a = 38,b = 0)作为脚本(2)的模型,这显然是错误的。这些解决方案是否表明Z3存在一些问题?谢谢!

1 个答案:

答案 0 :(得分:2)

这不是错误,而是由于如何在SMT和Z3中以数学方式定义函数。问题是你没有断言分母不为零的断言,因此在这两种情况下你都有零除。如果添加b不为零的约束,这将为您提供更多预期结果。以下是您提供更多预期结果的更新示例(rise4fun链接:http://rise4fun.com/Z3/Xokpp):

(declare-const a Int)
(declare-const b Int)
(assert (= 1 (/ a b))) ; 
(check-sat)
(get-model) ; gives a = 0, b = 0

(assert (not (= b 0)))
(check-sat)
(get-model) ; gives a = -1, b = -1

和(rise4fun link:http://rise4fun.com/Z3/x5Is):

(declare-const a Int)
(declare-const b Int)
(assert (= 1 (rem a b)))
(check-sat)
(get-model) ; gives b = 0, a = 38

(assert (not (= b 0)))
(check-sat)
(get-model) ; gives b = 2, a = 1

有关详细信息,请参阅此问题和答案(它更多地讨论了实数,但整数的情况类似,整数理论指的是如何在真实理论中处理除法):

integer division gives incorrect result