Насколько я знаю , невозможно встроить утверждения в определения функций.
Я бы попытался отделить ожидаемое поведение, исходные предположения игарантии вывода (если есть).
Пример:
(define-fun f ((x Int)) Int
(ite (= x 1) 1 2)
)
(define-fun f-helper ((x Int)) Bool
(< 0 x)
)
(define-fun g ((x Int)) Int
(+ (f (- x 1)) (f (- x 2)))
)
(define-fun g-helper ((x Int)) Bool
(and (< 5 x)
(f-helper (- x 1))
(f-helper (- x 2))
)
)
(declare-const x Int)
(declare-const y Int)
(assert (and (= y (g x))
(g-helper x)
))
(check-sat)
(get-model)
В этом примере мы используем f
для моделирования поведения исходной функции f
,и f-helper
для моделирования предположений f
. Вывод с использованием онлайн-инструмента Z3 выглядит следующим образом:
sat
(model
(define-fun x () Int
6)
(define-fun y () Int
4)
)
Я бы сказал, что такой подход может стать хитрым, как только f
и g
используются как в положительном, так и в отрицательном контекстах. В этом случае следует обратить особое внимание на правильность полярности утверждений. ожидаемый результат.