我正在编写一些代码,通过调用Z3来计算除法,但我发现模型结果不正确。基本上我想做的是a
和b
的获取值满足a/b == 1
。所以我手动写了一个像下面这样的输入文件来检查它是我的代码问题还是Z3的。
(declare-const a Int)
(declare-const b Int)
(assert (= (div a b) 1))
(assert (not (= b 0)))
(check-sat)
(get-model)
我机器中的结果为a =77 b = 39
,而不是a和b的某些均衡值。这是一个错误还是我做错了什么?
答案 0 :(得分:1)
使用/
代替div
会产生所需的行为(rise4fun link:http://rise4fun.com/Z3/itdK):
(declare-const a Int)
(declare-const b Int)
(assert (not (= b 0)))
(push)
(assert (= (div a b) 1)) ; gives a=2473,b=1237
(check-sat)
(get-model)
(pop)
(push)
(assert (= (/ a b) 1))
(check-sat)
(get-model) ; gives a=-1,b=-1
(pop)
但是,这里可能会有一些混淆,我没有看到/
在整数理论中定义div
只有QF_NIA
(但它似乎在/
逻辑http://smtlib.cs.uiowa.edu/theories/Ints.smt2,因为QF_LIA
被提及被排除在{{1}} http://smtlib.cs.uiowa.edu/logics/QF_NIA.smt2之外,所以我有点困惑,或者它可能与最近的真实有关/ int输入问题:http://smtlib.cs.uiowa.edu/logics/QF_LIA.smt2