我写在Haskell调用Z3求解器解决制约一些复杂公式的应用程序。由于哈斯克尔我可以快速切换,我处理的数据类型。
当使用SBV的AlgReal
类型计算,我得到了合理的时间的结果,但是切换到Float
或Double
类型使得Z3消费〜2GB的RAM,不会导致甚至在30分钟。
难道这预计生产浮点解决方案需要更多的时间,或者是在我身边的一些错误呢?
正如有关求解器性能的任何问题,这是不可能一概而论。克里斯托夫WINTERSTEIGER(https://stackoverflow.com/users/869966/christoph-wintersteiger)将是对这个专家发表意见,但我不知道他是如何密切关注这一群体。克里斯:如果你正在读这篇文章,我很想听听你的想法!
还有这里比较苹果与橘子的风险:雷亚尔和彩车是两个完全不同的逻辑,用不同的决策程序,启发式算法等我敢肯定,你可以发现问题,其中一个优于其他的,没有明确的“性能”获得者。
说了这么多,这里有一些事情,使浮点(FP)棘手:
a * 1/a == 1
并不适用于浮动。无论是做x + 1 /= x
或(x + a == x) -> (a == 0)
和你很想能够让许多其他的“明显”的简化。所有这些复杂的推理。NaN
值的存在,使得平等非反思:没有什么比等于NaN
包括它本身。所以,平等换平等的替代也是有问题的,需要附加条件。+0
和-0
的,这是由于四舍五入问题复杂化比较平等的,但表现不同。典型的例子是x == 0 -> fma(a, b, x) == a * b
不成立(其中fma
融合乘法 - 加法),因为这取决于零个这两个表达式的符号可产生对于不同的舍入模式不同的值。此外,我想强调的比较这两种不同的逻辑解算器的性能是错误的,因为它们是完全不同的野兽。但我们希望,以上几点说明,为什么浮点在实践中是非常棘手。
一个伟大的纸阅读有关IEEE754的治疗SMT求解浮是:http://smtlib.cs.uiowa.edu/papers/BTRW14.pdf。你可以看到操作的大量支持,并获得复杂的感觉。