我使用以下两个脚本尝试使用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存在一些问题?谢谢!
答案 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
有关详细信息,请参阅此问题和答案(它更多地讨论了实数,但整数的情况类似,整数理论指的是如何在真实理论中处理除法):