3
포물선 y = (x + 2) ** 2-3의 최소값을 찾으려고합니다. 분명히 대답은 y == - 3, x == 일 것입니다. -2. 그러나 z3은 ForAll 어설 션을 충족시키지 않는 [x = 0, y = 1] 응답을 제공합니다.Z3의 버그입니까? Real 및 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]
결과는 항상 사실이 아니다 있지만, '양적 완화'전술이 참으로 그 FORALL의 주장을 제거 보여줍니다 여기에
는 파이썬 코드입니다. 그 이유는 해답이 잘못된 답을주는 이유입니까? 이러한 표현식의 최소 (또는 최대) 값을 찾으려면 어떻게 코딩해야합니까?현재, Z3 버전은 Mac의 경우 4.3.2입니다.
이 예제를 작성해 주셔서 감사합니다. 그러나 불안정한 최신 분기를 사용하여 버그를 재현 할 수 없습니다. 몇 달 전에 Monniaux가 작성한 보고서를 기반으로 qe 모듈에 몇 가지 버그가 수정되었습니다. –
@NikolajBjorner 그래서 다음 릴리스에서 위의 문제는 괜찮을 것입니다. – wsysuper