Z3实际运算和统计(Z3 real arithmetic and statistics)

2019-06-25 09:28发布

由于使用Z3的实数编码的问题,统计的是Z3 /smt2 /st产生可能是有益的,以判断是否雷亚尔引擎“有问题/做大量的工作”?

就我而言,我有一个问题的两个主要相当于编码,无论是使用实数。 在编码“小”的差别,然而,这使得在运行时间有很大的区别,即,该编码的需要2:30分钟和编码乙13分钟。 Z3的统计数据显示, conflictsquant-instantiations大多是等价的,但有些则没有,例如grobnerpivotsnonlinear-horner

这两种不同的统计资料作为依据 。


编辑 (解决狮子座的评论):

所述SMT2编码由两个版本生成是〜30K线和其中使用实数的断言洒遍布代码。 的主要区别在于编码乙使用大量尚未得以实时类型的常量从范围0.01.0由不等式限定,例如0.0 < r1 < 1.00.0 < r3 < 0.75 - r1 - r2 ,而在编码大量的这些尚未得以常数已被替换为固定的实数值从相同的范围内,例如, 0.10.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))

造成显著的性能损失?

Answer 1:

新的非线性算法求解器只用于仅包含算术问题。 由于您的问题使用量词,新的非线性求解器将不会被使用。 因此,Z3将使用基于组合旧的方法:单工(枢轴STAT),Groebner基(STAT的Groebner)和间隔传播(霍纳STAT)。 这不是一个完整的方法。 此外,根据您在主旨张贴的片段,Groebner基不会是非常有效的。 这种方法通常是在包含了很多平等的问题,有效。 因此,它可能只是开销。 您可以通过选项来禁用它NL_ARITH_GB=false 。 当然,这只是根据您发布的问题片段的猜测。

编码之间的差异AB十分可观。 编码A本质上是线性问题,因为几个常数固定的实数值。 Z3总是完整的线性算术问题。 所以,这应该解释在性能上的差异。

关于你提到的有关别名问题,引进别名的首选方法是:

(define-const $Perms.$Zero $Perms 0.0)
(define-const $Perms.$Write $Perms 1.0)

Z3还包含使用线性方程消除变量的预处理器。 此预处理器默认情况下,在包含量词问题禁用。 这种设计决定是由程序验证工具,使在量词大量使用触发器/模式的动机。 该变量消除过程可以修改小心设计触发器/模式,影响总的运行时间。 您可以使用新的战术/战略框架Z3,迫使它应用此预处理器。 您可以替换命令

(check-sat)

(check-sat-using (then simplify solve-eqs smt))

这种策略是告诉Z3执行简化器,然后解方程(并消除变量),然后执行默认求解器引擎smt 。 你可以找到更多关于在以下战术和战略的教程 。



文章来源: Z3 real arithmetic and statistics