API 定理证明策略
API for theorem proving strategies
是否有 high-level API/environments/libraries 用于测试基于 first-order logic/type 理论生成构造性证明的特定方法(例如启发式算法)的有效性?
我试图找到一个 user-friendly API 可以验证公式证明的正确性,例如:.
如果可能的话,我更喜欢独立的库而不是像 Coq/HOL 这样的语言的直接接口。
提前致谢!
一般不会,没有。
一阶逻辑是semi-decidable。简而言之,这意味着只要有证据,你总能找到。如果没有,您可能会找到反驳,或者永远循环寻找反驳。没有系统会为您提供所有一阶逻辑公式的开箱即用 proof/refutation。
当然,即使有证据,也不能保证你能很快找到。因此,在实践中,找到合理数量的 time/resources 证明是一个棘手的问题,即使它们存在。理论上,如果您愿意等待足够长的时间,您总是可以这样做。
这就是它的理论方面。在实践中,现代 SMT 求解器可以做很多事情,特别是如果您对软硬件验证实践中出现的引理感兴趣;而不是纯数学。例如,您使用的示例可以用 SMTLib 语言编码为:
(assert (not (forall ((a Int)) (=> (>= a 0) (exists ((b Int)) (> b a))))))
(check-sat)
并且可以证明,例如,z3 很容易(假设您将上述文本放在名为 a.smt2
的文件中):
$ z3 a.smt2
unsat
这里我们已经断言了我们想要证明的否定,并且 z3 说 unsat
是可验证的,这意味着原始陈述实际上是一个定理。需要眯着眼睛才能看到对应关系,但它已经确定了。另外,如果你的公式是不是定理,那么SMT求解器可以给你一个具体的反例;这对于调试或建立谎言很有用。
这 而不是 意味着 z3(或任何其他 SMT 解算器)将开箱即用地解出您扔给它们的所有公式。尤其是对于交替量词,他们可能会想出一个答案,或者说 unknown
放弃尝试,或者他们可能会永远循环。
毫无疑问,您已经知道解决此类问题的正确工具是定理证明器,例如 Coq/Hol/Isabelle/ACL2 等;但是您明确地正在寻找按钮。我认为 SMT 求解器接近你想要的,但需要注意的是,它们既有我上面提到的固有局限性,也受限于它们当前的启发式和证明引擎所做的事情。它们肯定会随着时间的推移而改进,但您永远无法实现完全自动化。
总而言之,这完全取决于您的真正目标。对于software/hardware实际验证任务中出现的问题,SMT求解器带你走的更远;额外的好处是他们了解很多“理论”。 (算术、数组、数据结构,仅举几例。)此外,它们可以很容易地编程,因为大多数求解器都以许多高级语言公开高级 API,并且大多数编程语言都具有使它们易于使用的绑定使用。
但是,如果您对纯数学感兴趣,我认为您无法避免定理证明的半自动化世界。例如,尝试研究 Lean,这是一个高度可编程的现代定理证明器。请注意,大多数定理证明器已经带有利用 SMT 求解器的策略,因此虽然您必须手动编写证明,但有很多自动化可以帮助您。
是否有 high-level API/environments/libraries 用于测试基于 first-order logic/type 理论生成构造性证明的特定方法(例如启发式算法)的有效性?
我试图找到一个 user-friendly API 可以验证公式证明的正确性,例如:.
如果可能的话,我更喜欢独立的库而不是像 Coq/HOL 这样的语言的直接接口。
提前致谢!
一般不会,没有。
一阶逻辑是semi-decidable。简而言之,这意味着只要有证据,你总能找到。如果没有,您可能会找到反驳,或者永远循环寻找反驳。没有系统会为您提供所有一阶逻辑公式的开箱即用 proof/refutation。
当然,即使有证据,也不能保证你能很快找到。因此,在实践中,找到合理数量的 time/resources 证明是一个棘手的问题,即使它们存在。理论上,如果您愿意等待足够长的时间,您总是可以这样做。
这就是它的理论方面。在实践中,现代 SMT 求解器可以做很多事情,特别是如果您对软硬件验证实践中出现的引理感兴趣;而不是纯数学。例如,您使用的示例可以用 SMTLib 语言编码为:
(assert (not (forall ((a Int)) (=> (>= a 0) (exists ((b Int)) (> b a))))))
(check-sat)
并且可以证明,例如,z3 很容易(假设您将上述文本放在名为 a.smt2
的文件中):
$ z3 a.smt2
unsat
这里我们已经断言了我们想要证明的否定,并且 z3 说 unsat
是可验证的,这意味着原始陈述实际上是一个定理。需要眯着眼睛才能看到对应关系,但它已经确定了。另外,如果你的公式是不是定理,那么SMT求解器可以给你一个具体的反例;这对于调试或建立谎言很有用。
这 而不是 意味着 z3(或任何其他 SMT 解算器)将开箱即用地解出您扔给它们的所有公式。尤其是对于交替量词,他们可能会想出一个答案,或者说 unknown
放弃尝试,或者他们可能会永远循环。
毫无疑问,您已经知道解决此类问题的正确工具是定理证明器,例如 Coq/Hol/Isabelle/ACL2 等;但是您明确地正在寻找按钮。我认为 SMT 求解器接近你想要的,但需要注意的是,它们既有我上面提到的固有局限性,也受限于它们当前的启发式和证明引擎所做的事情。它们肯定会随着时间的推移而改进,但您永远无法实现完全自动化。
总而言之,这完全取决于您的真正目标。对于software/hardware实际验证任务中出现的问题,SMT求解器带你走的更远;额外的好处是他们了解很多“理论”。 (算术、数组、数据结构,仅举几例。)此外,它们可以很容易地编程,因为大多数求解器都以许多高级语言公开高级 API,并且大多数编程语言都具有使它们易于使用的绑定使用。
但是,如果您对纯数学感兴趣,我认为您无法避免定理证明的半自动化世界。例如,尝试研究 Lean,这是一个高度可编程的现代定理证明器。请注意,大多数定理证明器已经带有利用 SMT 求解器的策略,因此虽然您必须手动编写证明,但有很多自动化可以帮助您。