我正在尝试新的FP逻辑。唉,即使是与FMA相关的最简单的查询似乎也会导致z3相当麻烦。
以下是一个这样的例子,我试图证明x*y+0
等于fma(x,y,0)
。它还需要做一些额外的事情来确保x
和y
不是NaN
等等,这样才能确保平等。这个基准测试对z3
造成这么多麻烦有什么原因吗?
我的z3
版本:Z3 [version 4.3.2 - 64 bit - build hashcode 728835357594].
(set-option :produce-models true)
(set-logic QF_FPA)
(define-fun s3 () (_ FP 8 24) (as plusInfinity (_ FP 8 24)))
(define-fun s5 () (_ FP 8 24) (as minusInfinity (_ FP 8 24)))
(define-fun s17 () (_ FP 8 24) ((_ asFloat 8 24) roundNearestTiesToEven (/ 0 1)))
(declare-fun s0 () (_ FP 8 24))
(declare-fun s1 () (_ FP 8 24))
(assert
(let ((s2 (== s0 s0)))
(let ((s4 (< s0 s3)))
(let ((s6 (> s0 s5)))
(let ((s7 (and s4 s6)))
(let ((s8 (and s2 s7)))
(let ((s9 (== s1 s1)))
(let ((s10 (< s1 s3)))
(let ((s11 (> s1 s5)))
(let ((s12 (and s10 s11)))
(let ((s13 (and s9 s12)))
(let ((s14 (and s8 s13)))
(let ((s15 (not s14)))
(let ((s16 (* roundNearestTiesToEven s0 s1)))
(let ((s18 (+ roundNearestTiesToEven s16 s17)))
(let ((s19 (fusedMA roundNearestTiesToEven s0 s1 s17)))
(let ((s20 (== s18 s19)))
(let ((s21 (or s15 s20)))
(not s21)))))))))))))))))))
(check-sat)
答案 0 :(得分:1)
Z3通过将浮点公式转换为位向量公式(然后是SAT)来解决浮点公式。有些方法比某些公式(例如,基于ACDCL或某种形式的近似细化)更快,但在这个特定的公式中,我希望它们都表现出差的性能。乘法(和类似)约束对于底层引擎通常很难,并且证明乘法保留一些属性甚至更难。