Z3Py 中的最大值模型不正确
Incorrect model of max value in Z3Py
我想找到一个最大区间,其中表达式 e
对所有 x 都为真。这样一个公式的写法应该是:Exists d : ForAll x in (-d,d) . e and ForAll x not in (-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()
输出 [d = 1/4]
.
为了检查它,我设置了 delta = RealVal('1/4')
,从 f
中删除 ForAll
量词,我得到 x = 1/2
。我将 delta
替换为 1/2
并得到 3/4
,然后是 7/8
等等。界限应该是 1
。我可以让 Z3 立即输出吗?
如果您自己算一下,您会发现答案是 x != 0, x < 1
。或者您可以直接让 Wolfram Alpha 为您完成。所以,没有这样的 delta
.
您遇到的问题是您断言:
s.add(Not(f))
这将 x
上的全称量化变成了存在论;要求 z3
找到一个 delta
这样 有一些 x 符合要求。 (也就是说,你否定了你的整个公式。)相反,你应该这样做:
s.add(delta > 0, f)
这也确保 delta
为正。通过该更改,z3 将正确响应:
unsat
(然后调用 s.model()
会出错,如果之前调用 s.check()
returns sat
.)
我想找到一个最大区间,其中表达式 e
对所有 x 都为真。这样一个公式的写法应该是:Exists d : ForAll x in (-d,d) . e and ForAll x not in (-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()
输出 [d = 1/4]
.
为了检查它,我设置了 delta = RealVal('1/4')
,从 f
中删除 ForAll
量词,我得到 x = 1/2
。我将 delta
替换为 1/2
并得到 3/4
,然后是 7/8
等等。界限应该是 1
。我可以让 Z3 立即输出吗?
如果您自己算一下,您会发现答案是 x != 0, x < 1
。或者您可以直接让 Wolfram Alpha 为您完成。所以,没有这样的 delta
.
您遇到的问题是您断言:
s.add(Not(f))
这将 x
上的全称量化变成了存在论;要求 z3
找到一个 delta
这样 有一些 x 符合要求。 (也就是说,你否定了你的整个公式。)相反,你应该这样做:
s.add(delta > 0, f)
这也确保 delta
为正。通过该更改,z3 将正确响应:
unsat
(然后调用 s.model()
会出错,如果之前调用 s.check()
returns sat
.)