放物線 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 に削除したことを示していますが、常に true であるとは限りません。それがソルバーが間違った答えを出す理由ですか? このような式の最小 (または最大) 値を見つけるには、何をコーディングすればよいですか?
ところで、Z3 のバージョンは Mac では 4.3.2 です。