Z3 предоставляет неизвестное для простой задачи:
(assert
(forall ((y (Array Int Int)))
(= (select y 1) 0))
)
(check-sat)
Я обнаружил, что он становится сат, если отрицать forall
, но это кажется особенно простой задачей, которую невозможно решить.
Это вызывает проблемы, потому что класс проблем, которые я хочу решить, больше похож на:
(declare-fun u () Int)
(assert
(forall ((y (Array Int Int)) )
(=>
(= u 0) (<= (select y 1) 0))
)
)
(check-sat)
Где отрицание одного только forall не является той же проблемой, так что здесь этого сделать нельзя. Есть ли какой-нибудь способ задать этот стиль проблемы Z3, чтобы получить результат un/sat?