2

我被困在如何在 SMTLIB2 中创建一个声明类似

forall x < 100, f(x) = 100

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

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

我通读了关于量词和模式的 Z3 教程,但这似乎并没有让我在任何地方获得太多帮助。

4

1 回答 1

2

在 SMTLib 中,您可以按如下方式编写该属性:

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

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

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

于 2021-04-14T22:30:17.483 回答