【问题标题】:How to declare forall quantifiers in SMTLIB / Z3 / CVC4?如何在 SMTLIB / Z3 / CVC4 中声明 forall 量词?
【发布时间】:2021-04-14 22:21:40
【问题描述】:

我不知道如何在 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,但这似乎并没有让我在任何地方获得太多。

【问题讨论】:

    标签: z3 smt sat cvc4


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我可以在 Coq 中编写证明,但我希望自动化这个过程。有没有自动化量化 SMT 公式的好方法?
    • 目前,模式是从量化证明中获得任何合理输出的唯一机制。 rise4fun.com/z3/tutorialcontent/guide#h28 这里有一些例子,但是让它做任何花哨的事情都相当棘手;特别是在存在像您这样的递归函数的情况下。另请记住,z3 和 cvc4 将具有不同级别的支持,因此也无法保证一致性。
    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 2021-01-19
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多