如何在 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 等;正是为此目的而建造的。
我一直在想如何在 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 等;正是为此目的而建造的。