Floating point 验证性能

Floating point 验证性能,floating-point,z3,Floating Point,Z3,我正在试验新的FP逻辑。唉,即使是与FMA相关的最简单的查询似乎也给z3带来了不少麻烦 下面是一个这样的例子,我试图证明x*y+0等于fma(x,y,0)。它做了一些额外的事情来确保x和y不是NaNs,等等,这样平等性就确实成立了。这个基准测试给z3带来这么多麻烦,有什么原因吗 我的z3version:z3[版本4.3.2-64位-构建哈希代码7288357594]。 (set-option :produce-models true) (set-logic QF_FPA) (define-fun

我正在试验新的FP逻辑。唉,即使是与FMA相关的最简单的查询似乎也给z3带来了不少麻烦

下面是一个这样的例子,我试图证明
x*y+0
等于
fma(x,y,0)
。它做了一些额外的事情来确保
x
y
不是
NaN
s,等等,这样平等性就确实成立了。这个基准测试给
z3
带来这么多麻烦,有什么原因吗

我的
z3
version:
z3[版本4.3.2-64位-构建哈希代码7288357594]。

(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)
(设置选项:生成模型为真)
(设置逻辑QF_FPA)
(定义funs3()(FP 8 24)(作为plusInfinity(FP 8 24)))
(定义fun s5()(FP 8 24)(作为无穷小(FP 8 24)))
(定义乐趣s17()(uFP 8 24)(uASFLOAT 8 24)最接近圆的Toeven(/0 1)))
(声明乐趣s0()(uFP 8 24))
(声明乐趣s1()(FP 8 24))
(断言
(让((s2(=S0S0)))
(let((s4(s0 s5)))
(让((s7(和s4 s6)))
(让((s8(和s2-s7)))
(let((s9(=s1)))
(let((s10(s1 s5)))
(let((s12(和s10 s11)))
(let((s13(和s9 s12)))
(让((s14(和s8 s13)))
(让((s15(非s14)))
(let((s16(*最接近圆的部分,甚至s0 s1)))
(let((s18(+最接近s16 s17)))
(let((s19(fusedMA RoundneartiestoEvent s0 s1 s17)))
(让((s20(=s18 s19)))
(让((s21(或s15 s20)))
(不是s21()(()()()())())())
(检查sat)

Z3通过将浮点公式转换为位向量公式(然后转换为SAT)来求解浮点公式。有些方法在某些公式(例如,基于ACDCL或某些形式的近似细化)上比这更快,但在这个特定公式上,我预计所有这些方法都会表现出较差的性能。乘法(和类似的)约束对于底层引擎来说通常很困难,而证明乘法保留某些属性则更加困难

我原以为在
x
y
满足的特定条件下,你会有一个重写规则
fma(x,y,0)=x*y
,但我确实理解像这样的一次性规则不太可能对任意基准有所帮助。确切地说,有一些这样的规则,但具体的规则并不存在。FPA非常复杂,在添加这样的规则之前,我必须确保在每个舍入模式下都会发生什么,例如,对于所有舍入模式,fma(x,y,-0)仍然是x*y吗?但是,是的,目前还没有太多的基准测试,而且这个特定的规则对我们目前所拥有的基准测试没有帮助。@ChristophWintersteiger当然,你可以用Z3和量词来证明这个身份。@usr@ChristophWintersteiger确实有理由怀疑
fma(x,y,0)-->x*y
规则。当
x=-1
y=0
时,它不起作用,因为左侧的计算结果为
+0
,而右侧的计算结果为
-0
。无论采用何种取整模式,这都是正确的!(虽然
-0
比较等于
0
,但这不是有效的重写规则,因为这两个规则可以通过类似
isNZero
的谓词进行区分)