给定以下浮点约束,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)
答案 0 :(得分:1)
这不是错误,这些是所涉及的运营商的正确语义(根据SMT-LIB和IEEE-754也是如此)。我得到的模型是:
(not (fp.leq (fp.add roundNearestTiesToEven x y) z))
且确实x + y
已满足,即NaN
不小于NaN
,因为没有任何内容小于NaN
(z
的所有谓词均为假输入)。
如果不需要这种行为,我们当然可以添加另一个约束,以确保NaN
不是(assert (not (= z (_ NaN 11 53))))
:
y
然后和Z3会找到x+y
(因而NaN
)为{{1}}的模型。