如何在 SMTLIB / Z3 / CVC4 中声明 forall 量词?

How to declare forall quantifiers in SMTLIB / Z3 / CVC4?

我一直在想如何在 SMTLIB2 中创建声明类似

的声明
forall x < 100, f(x) = 100

这个 属性 将检查一个函数,该函数递归地将所有小于 100 的数字加 1:

(define-fun-rec incUntil100 ((x Int)) Int  
    (ite 
        (= x 100) 
        100
        (incUntil100 (+ x 1))
    )
)

我通读了 Z3 tutorial on quantifiers and patterns,但这似乎对我没有太大帮助。

在 SMTLib 中,您可以这样写 属性:

(assert (forall ((x Int)) (=> (< x 100) (= (incUntil100 x) 100))))
(check-sat)

但是如果您尝试这样做,您会发现 z3 将永远循环并且 CVC4 会告诉您 unknown 作为答案。虽然您可以在 SMTLib 中定义和断言这些类型的函数,但求解器对实际证明的支持相当薄弱,因为它们不进行开箱即用的归纳。

如果证明递归函数的性质是您的目标,那么 SMT 求解器不是一个好的选择;而是研究定理证明器,例如 Isabelle、HOL、Coq、Lean、ACL2 等;正是为此目的而建造的。