检索Z3Py中的值会产生意外结果

时间:2018-06-19 23:44:49

标签: z3 z3py

我想找到一个表达式e对所有x为真的最大间隔。编写此类公式的方法应为:Exists d : ForAll x in (-d,d) . e and ForAll x not in (-d,d) . !e

要获得这样的d,Z3中的公式f(看上面的一个)可以是:

from z3 import *

x = Real('x')
delta = Real('d')
s = Solver()

e = And(1/10000*x**2 > 0, 1/5000*x**3 + -1/5000*x**2 < 0)

f = ForAll(x,
And(Implies(And(delta > 0,
                -delta < x, x < delta, 
                x != 0),
            e),
    Implies(And(delta > 0,
                Or(x > delta, x < -delta),
                x != 0),
            Not(e))
    )
)

s.add(Not(f))
s.check()
print s.model()

它打印:[d = 2]。这肯定是不正确的(采用x = 1)。怎么了?

另外:通过指定delta = RealVal('1'),即使应避免使用x = 0,反例也是x = 0

1 个答案:

答案 0 :(得分:1)

您的常量将被强制转换为整数。不用写:

1/5000

您应该写:

1.0/5000.0

您可以通过以下方式查看生成的表达式:

print s.sexpr()

这将使您警惕该问题。

NB。在编写常量时,明确声明类型始终很重要。请参见以下答案,以了解与此主题相关的变化,它可能导致进一步的问题:https://stackoverflow.com/a/46860633/936310