Я хочу найти максимальный интервал, в котором выражение e
верно для всех x. Способ написания такой формулы должен быть: Exists d : ForAll x in (-d,d) . e and ForAll x not in (-d,d) . !e
.
Чтобы получить такое d
, формула f
в Z3 (если смотреть на приведенную выше) может быть следующей:
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')
, сбрасываю квантификатор ForAll
с f
и получаю x = 1/2
. Я заменяю delta
на 1/2
и получаю 3/4
, затем 7/8
и так далее. Граница должна быть 1
. Могу ли я заставить Z3 выводить это немедленно?