Когда вы используете (assert (forall ((i Int)) (> i 10)))
, i
является ограниченной переменной, и квантифицированная формула эквивалентна истинному значению, которое в данном случае false
.
Я думаю, что вы хотите определить макрос с помощью квантификаторов:
(declare-fun greaterThan10 (Int) Bool)
(assert (forall ((i Int)) (= (greaterThan10 i) (> i 10))))
И вы можете использовать их, чтобы избежать повторения кода:
(declare-const x (Int))
(declare-const y (Int))
(assert (greaterThan10 x))
(assert (greaterThan10 y))
(check-sat)
По сути, это способ определения макросов с использованием неинтерпретированных функций при работе с Z3 API. Обратите внимание, что вы должны установить (set-option :macro-finder true)
, чтобы Z3 заменял универсальные квантификаторы телами этих функций.
Однако, если вы работаете с текстовым интерфейсом, макрос define-fun
в SMT-LIB v2 - более простой способ сделать то, что вы хотите:
(define-fun greaterThan10 ((i Int)) Bool
(> i 10))