繁体   English   中英

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

[英]How to declare forall quantifiers in SMTLIB / Z3 / CVC4?

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

forall x < 100, f(x) = 100

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM