В следующем примере я попытался использовать неинтерпретированную булеву функцию, например, "(Declare-Const P (Int) Bool)", а не одну логическую константу для каждого предположения. Но это не работает (это дает ошибку компиляции).
(set-option :produce-unsat-cores true)
(set-option :produce-models true)
(declare-fun p (Int) Bool)
;(declare-const p1 Bool)
;(declare-const p2 Bool)
; (declare-const p3 Bool)
;; We assert (=> p C) to track C using p
(declare-const x Int)
(declare-const y Int)
(assert (=> (p 1) (> x 10)))
;; An Boolean constant may track more than one formula
(assert (=> (p 1) (> y x)))
(assert (=> (p 2) (< y 5)))
(assert (=> (p 3) (> y 0)))
(check-sat (p 1) (p 2) (p 3))
(get-unsat-core)
выход
Z3(18, 16): ERROR: invalid check-sat command, 'not' expected, assumptions must be Boolean literals
Z3(19, 19): ERROR: unsat core is not available
Я понимаю, что невозможно (не поддерживается) использовать булеву функцию. Есть ли причина этого? Есть ли другой способ сделать это?