Z3为我的浮点约束

时间:2016-11-14 09:44:14

标签: z3

给定以下浮点约束,Z3产生异常模型,其中z是NaN。显然,这不是一个正确的解决方案。这是一个错误吗? BTW。 z3的版本是4.5.0

(declare-const x (_ FP 11 53))
(declare-const y (_ FP 11 53))
(declare-const z (_ FP 11 53))


(assert 
 (and 
  (not (fp.lt x (_ +zero 11 53)))
  (not (fp.lt y (_ +zero 11 53)))
  (not (fp.lt z (_ +zero 11 53)))
  (not (fp.leq (fp.add roundNearestTiesToEven x y) z))
 )
)

(check-sat)
(get-model)

1 个答案:

答案 0 :(得分:1)

这不是错误,这些是所涉及的运营商的正确语义(根据SMT-LIB和IEEE-754也是如此)。我得到的模型是:

(not (fp.leq (fp.add roundNearestTiesToEven x y) z))

且确实x + y已满足,即NaN不小于NaN,因为没有任何内容小于NaNz的所有谓词均为假输入)。

如果不需要这种行为,我们当然可以添加另一个约束,以确保NaN不是(assert (not (= z (_ NaN 11 53))))

y
然后

和Z3会找到x+y(因而NaN)为{{1}}的模型。