整数除法给出错误的结果

时间:2013-11-12 15:23:55

标签: z3

我尝试检查x div y == 2x / y == 2的可满足性,但两次都得到了错误的结果。看起来Z3不支持这些吗?

(declare-fun x () Int)
(declare-fun y () Int)

(assert (=  (div x y ) 2))

(check-sat)
(get-model)
(exit)

sat
(model 
  (define-fun y () Int
    0)
  (define-fun x () Int
    38)
)



(declare-fun x () Int)
(declare-fun y () Int)

(assert (=  (/ x y ) 2))

(check-sat)
(get-model)
(exit)

sat
(model 
  (define-fun y () Int
    0)
  (define-fun x () Int
    1)
)

1 个答案:

答案 0 :(得分:1)

支持整数除法,请参阅:http://smtlib.cs.uiowa.edu/theories/Ints.smt2

也支持真正的分裂(从这里:http://smtlib.cs.uiowa.edu/theories/Reals.smt2),你提到的除零问题包括: “由于在SMT-LIB逻辑中,所有函数符号都被解释为总函数,因此形式(/ t 0)的术语在每个Reals实例中都是有意义。但是,声明对它们的值没有任何限制这特别意味着    - 对于每个实例理论T和    - 对于排序Real的每个关闭项t1和t2, 有一个满足(= t1(/ t2 0))的T模型。“

你应该添加一个断言,即除数不等于零。

(assert (not (= y 0)))

以下是示例(rise4fun链接:http://rise4fun.com/Z3/IUDE):

(declare-fun x () Int)
(declare-fun y () Int)

(assert (not (= y 0)))

(push)
(assert (=  (div x y ) 2))
(check-sat)
(get-model) ; gives x = 2, y = 1
(pop)

(push)
(assert (=  (/ x y ) 2))
(check-sat)
(get-model) ; gives x = -2, y = -1
(pop)