我想找到一个表达式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
。
答案 0 :(得分:1)
您的常量将被强制转换为整数。不用写:
1/5000
您应该写:
1.0/5000.0
您可以通过以下方式查看生成的表达式:
print s.sexpr()
这将使您警惕该问题。
NB。在编写常量时,明确声明类型始终很重要。请参见以下答案,以了解与此主题相关的变化,它可能导致进一步的问题:https://stackoverflow.com/a/46860633/936310