Z3Py中最大值的型号不正确

Z3Py中最大值的型号不正确,z3,z3py,Z3,Z3py,我想找到一个最大区间,其中表达式e对所有x都为真。编写这样一个公式的方法应该是:Exists d:ForAll x in(-d,d)。e和所有x不在(-d,d)内!e 为了得到这样一个d,Z3中的f公式(查看上面的公式)可以是: from __future__ import division from z3 import * x = Real('x') delta = Real('d') s = Solver() e = And(1/10000*x**2 > 0, 1/5000*x**

我想找到一个最大区间,其中表达式
e
对所有x都为真。编写这样一个公式的方法应该是:
Exists d:ForAll x in(-d,d)。e和所有x不在(-d,d)内!e

为了得到这样一个
d
,Z3中的
f
公式(查看上面的公式)可以是:

from __future__ import division
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()
来自未来进口部的

从z3进口*
x=实('x')
delta=Real('d')
s=解算器()
e=和(1/10000*x**2>0,1/5000*x**3+-1/5000*x**2<0)
f=所有(x,
和(意味着)和(δ>0,
-delta0,
或(x>delta,x<-delta),
x!=0),
不是(e))
)
)
s、 添加(不是(f))
s、 检查()
打印s.model()
输出
[d=1/4]


为了检查它,我设置了
delta=RealVal('1/4')
,从
f
中删除
ForAll
量词,得到
x=1/2
。我用
1/2
替换
delta
,得到
3/4
,然后
7/8
,依此类推。绑定应为
1
。我能让Z3立即输出它吗?

如果你自己计算,你可以看到解是
x!=0,x<1
。或者你可以简单地要求为你做这件事。所以,没有这样的
delta

你遇到的问题是你在断言:

s.add(Not(f))
这将
x
上的通用量化转换为存在量化;要求
z3
找到一个
delta
,这样就有一些x符合要求。(也就是说,你否定了你的整个公式。)相反,你应该:

s.add(delta > 0, f)
这也确保
delta
为正。通过该更改,z3将正确响应:

unsat

(然后调用
s.model()
,您会得到一个错误,您应该只调用
s.model()
,如果上次调用
s.check()
返回
sat

那么
s.add(d>0,f)
f=ForAll(x,暗示(d>0,…)
在Z3中?前者是连词,后者是蕴涵。对于前者,你告诉Z3找到一个模型,确保
d
是严格正的,并且
f
也成立。对于后者,你告诉Z3找到一个模型,当
d
为正时,你只关心
f
成立。也就是说,它可以找到you a具有
d的模型