我能找到的唯一解决方案是做一个平方根逼近,但这并不符合标准,所以我不能用它来证明。
答案 0 :(得分:3)
SBV已经支持浮点类型的平方根:
单精度:
Prelude Data.SBV> sat $ \x -> x .== fpSqrt sRNE (4.2::SFloat)
Satisfiable. Model:
s0 = 2.04939 :: Float
双精度:
Prelude Data.SBV> sat $ \x -> x .== fpSqrt sRNE (4.2::SDouble)
Satisfiable. Model:
s0 = 2.04939015319192 :: Double
请注意,您需要提供一个舍入模式,在上面我使用sRNE
代表round-nearest-towards-even
,这是Haskell中使用的默认舍入模式。如果需要,SBV支持所有5种IEEE舍入模式。
你也可以使用实数(任意精度代数实数):
Prelude Data.SBV> sat $ \x -> x * x .== (4.2::SReal)
Satisfiable. Model:
s0 = root(1, 5x^2 = 21) = -2.0493901531919196... :: Real
在这种情况下,您得到一个代数方程,并得到实际结果的近似值。 (请注意,上面x*x == 4.2
与5*x^2 = 21
相同)。这两种形式都可以从程序化API中获得。
整数平方根没有单一函数;也不是对数。后面这些可以使用量词来表示,但SMT求解器不太可能为它们产生好的结果,因为它们将涉及非线性算术和量化。
通常注意,SBV和SMT求解器都不适合“简化”符号表达式。您将总是得到一个具体的答案:如果您要求sqrt 50
,您将获得7.07106
(以正确的类型/精度),而不是像5 * sqrt 2
这样的事情,例如