Я пытаюсь найти минимальное значение Параболы y=(x+2)**2-3, видимо, ответ должен быть y==-3, когда x ==-2. Но z3 дает ответ [x = 0, y = 1], который не соответствует утверждению ForAll.
Я что-то неправильно предполагаю?
Вот код питона:
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 — 4.3.2 для Mac.