Выполнение следующего запроса с Z3 решателя:Simplfying Expression: Z3 SMT Solver
(assert (exists ((c0_s Int) (c1_s Int) (c2_s Int))
(and
(= (+ c0 c1 c2) 5) (>= c0 0) (>= c1 1) (>= c2 1)
(= c0_s c0) (= c1_s (- c1 1)) (= c2_s (+ c2 1))
(= c2_s 3) (= (+ c0_s c1_s) 2)
))
)
(apply (then qe ctx-solver-simplify propagate-ineqs))
производит следующий вывод:
(goals
(goal
(>= c0 0)
(<= c0 2)
(>= c1 1)
(<= c1 3)
(<= (+ (* (- 1) c0) (* (- 1) c1)) (- 3))
(<= (+ c1 c0) 3)
(= c2 2)
:precision precise :depth 3)
)
где я ожидал результата от Z3 решателя, как это:
(goals
(goal
(>= c0 0)
(<= c0 2)
(>= c1 1)
(<= c1 3)
(= (+ c1 c0) 3)
(= c2 2)
:precision precise :depth 3)
)
Может ли кто-нибудь объяснить, почему Z3 производит такой сложный результат вместо того, что я ожидал? Есть ли способ заставить Z3 упростить этот вывод?
Очевидно, Z3 не знает, чтобы упростить отрицание. Возможно, вам следует отправить запрос функции на GitHub. – usr
Спасибо за ваш быстрый ответ, я попрошу об этом как можно скорее, если это так. Однако мне было интересно, почему в первую очередь это порождало отрицание, когда в этом нет необходимости. –