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.)