Используя Z3 версии 2.18, я пытаюсь упростить формулы, такие как:
- (и (> (- (- x 1) 1) 0) (> x 0))
- (или (> (- (- x 1) 1) 0) (> x 0))
в надежде получить что-то вроде: (> x 2) и (> x 0).
Я запускаю Z3 со следующим входным файлом, где F - одна из приведенных выше формул:
(set-option set-param "STRONG_CONTEXT_SIMPLIFIER" "true")
(declare-const x Int)
(simplify F)
Хорошо работает с дизъюнкцией, где я получаю следующий вывод:
(let (($x35 (<= x 0)))
(not $x35))
Однако с соединением я получаю:
(not (or (<= x 0) (<= x 2)))
Есть ли способ заставить Z3 еще больше упростить приведенную выше формулу? Я надеюсь, что смогу получить (not (<= x 2))
.
PS: есть ли способ заставить Z3 встроить свой вывод (т.е. иметь (not (<= x 0))
вместо (let (($x35 (<= x 0))) (not $x35))
)
Спасибо,
Гас