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的模型