我尝试检查x div y == 2
和x / 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)
)
答案 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)