我试图找到抛物线 y=(x+2)**2-3 的最小值,显然,当 x ==-2 时,答案应该是 y==-3。但是 z3 给出的答案是 [x = 0, y = 1],它不符合 ForAll 断言。
我对某事的假设有误吗?
这是python代码:
from z3 import *
x, y, z = Reals('x y z')
print(Tactic('qe').apply(And(y == (x + 2) ** 2 - 3,
ForAll([z], y <= (z + 2) ** 2 - 3))))
solve(y == x * x + 4 * x +1,
ForAll([z], y <= z * z + 4 * z +1))
结果:
[[y == (x + 2)**2 - 3, True]]
[x = 0, y = 1]
结果表明,“qe”策略将 ForAll 断言消除为 True,尽管它并不总是正确的。这是求解器给出错误答案的原因吗?我应该编写什么代码来找到这种表达式的最小(或最大值)值?
顺便说一句,Z3 版本是 Mac 的 4.3.2。