给定一个使用 Z3 的实数编码的问题,Z3 /smt2 /st
产生的哪些统计数据可能有助于判断实数引擎是否“有问题/做了很多工作”?
在我的情况下,我有两个基本等效的问题编码,都使用实数。然而,编码的“小”差异在运行时产生了很大的差异,即编码 A 需要 2:30 分钟,编码 B 需要 13 分钟。Z3 统计显示conflicts
和大部分是等价的,但其他不是,quant-instantiations
例如和。grobner
pivots
nonlinear-horner
这两种不同的统计数据可作为要点提供。
编辑(以解决 Leo 的评论):
两个版本生成的 SMT2 编码约为 30k 行,使用实数的断言遍布整个代码。主要区别在于编码 B 使用了从范围0.0
到1.0
由不等式限制的大量未指定的实类型常量,例如0.0 < r1 < 1.0
or 0.0 < r3 < 0.75 - r1 - r2
,而在编码 A 中,许多这些未指定的常量已被同一范围内的固定实数值替换,例如,0.1
或0.75 - 0.01
. 两种编码都使用非线性实数算术,例如r1 * (1.0 - r2)
.
两种编码中的一些随机示例可用作要点。如上所述,所有出现的变量都是未指定的实数。
PS:是否为固定实数值引入别名,例如,
(define-sort $Perms () Real)
(declare-const $Perms.$Full $Perms)
(declare-const $Perms.$None $Perms)
(assert (= $Perms.Zero 0.0))
(assert (= $Perms.Write 1.0))
造成重大的绩效处罚?