微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我被困在如何在 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 等;正是为此目的而构建的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。