Logic 定理证明策略API

Logic 定理证明策略API,logic,artificial-intelligence,theorem-proving,type-theory,first-order-logic,Logic,Artificial Intelligence,Theorem Proving,Type Theory,First Order Logic,是否有高级API/环境/库用于测试基于一阶逻辑/类型理论生成构造性证明的特定方法(例如启发式算法)的有效性 我试图找到一个用户友好的API,可以验证公式证明的正确性,例如: 如果可能的话,我更喜欢独立的库,而不是像Coq/HOL这样的语言的直接接口 提前谢谢 一般来说不是,不是 一阶逻辑是。简而言之,这意味着如果有证据,你总能找到它。如果没有,你可能会找到一个反驳,或循环永远试图找到一个。任何系统都不会对所有一阶逻辑公式进行开箱即用的证明/反驳 当然,即使有证据,也不能保证你能很快找到。因此,在

是否有高级API/环境/库用于测试基于一阶逻辑/类型理论生成构造性证明的特定方法(例如启发式算法)的有效性

我试图找到一个用户友好的API,可以验证公式证明的正确性,例如:

如果可能的话,我更喜欢独立的库,而不是像Coq/HOL这样的语言的直接接口

提前谢谢

一般来说不是,不是

一阶逻辑是。简而言之,这意味着如果有证据,你总能找到它。如果没有,你可能会找到一个反驳,或循环永远试图找到一个。任何系统都不会对所有一阶逻辑公式进行开箱即用的证明/反驳

当然,即使有证据,也不能保证你能很快找到。因此,在实践中,在合理的时间/资源量内找到证据是一个棘手的问题,即使它们存在。理论上,如果你愿意等待足够长的时间,你总是可以这样做的

这是理论的一面。在实践中,现代SMT解算器可以做很多事情,特别是如果您对在软硬件验证实践中出现的引理感兴趣;而不是纯粹的数学。例如,您使用的示例可以用以下语言编码:

(assert (not (forall ((a Int)) (=> (>= a 0) (exists ((b Int)) (> b a))))))
(check-sat)
例如,可以很容易地证明这一点(假设您将上述文本放在名为
a.smt2
的文件中):

在这里,我们断言我们想要证明的东西是否定的,z3说
unsat
是可定的,这意味着原始陈述实际上是一个定理。这需要一点眯着眼睛才能看到通信,但这已经很确定了。此外,如果你的公式不是一个定理,那么SMT解算器可以给你一个具体的反例;这有利于调试或建立错误

这并不意味着z3(或任何其他SMT解算器)将立即解决您向其抛出的所有公式。特别是对于交替使用的量词,他们可能会想出一个答案,或者放弃尝试说
unknown
,或者他们可能永远循环

毫无疑问,您已经知道解决这些问题的合适工具是定理证明器,如Coq/Hol/Isabelle/ACL2等;但你显然是在寻找一个按钮式的东西。我认为SMT解算器接近您想要的,但需要注意的是,它们既有我上面提到的固有局限性,也受其当前启发式和验证引擎集的限制。它们肯定会随着时间的推移而改进,但您永远不会实现完全自动化

总而言之,这完全取决于你的目标到底是什么。对于软件/硬件的实际验证任务中出现的问题,SMT解决方案将带您走得更远;还有一个额外的好处,就是他们理解很多“理论”(算术、数组、数据结构等等)。此外,他们可以很容易地编程,因为大多数解算器在许多高级语言中公开高级API,并且大多数编程语言都有使其易于使用的绑定

然而,如果你对纯数学感兴趣,我不相信你能避免定理证明的半自动化世界。试试看,这是一个现代的定理证明,高度可编程的,例如。请注意,大多数定理证明者已经使用了利用SMT解算器的策略,因此,尽管您必须手动编写证明,但仍有许多自动化功能可以帮助您。

一般来说不是,不是

一阶逻辑是。简而言之,这意味着如果有证据,你总能找到它。如果没有,你可能会找到一个反驳,或循环永远试图找到一个。任何系统都不会对所有一阶逻辑公式进行开箱即用的证明/反驳

当然,即使有证据,也不能保证你能很快找到。因此,在实践中,在合理的时间/资源量内找到证据是一个棘手的问题,即使它们存在。理论上,如果你愿意等待足够长的时间,你总是可以这样做的

这是理论的一面。在实践中,现代SMT解算器可以做很多事情,特别是如果您对在软硬件验证实践中出现的引理感兴趣;而不是纯粹的数学。例如,您使用的示例可以用以下语言编码:

(assert (not (forall ((a Int)) (=> (>= a 0) (exists ((b Int)) (> b a))))))
(check-sat)
例如,可以很容易地证明这一点(假设您将上述文本放在名为
a.smt2
的文件中):

在这里,我们断言我们想要证明的东西是否定的,z3说
unsat
是可定的,这意味着原始陈述实际上是一个定理。这需要一点眯着眼睛才能看到通信,但这已经很确定了。此外,如果你的公式不是一个定理,那么SMT解算器可以给你一个具体的反例;这有利于调试或建立错误

这并不意味着z3(或任何其他SMT解算器)将立即解决您向其抛出的所有公式。特别是对于交替使用的量词,他们可能会想出一个答案,或者放弃尝试说
unknown
,或者他们可能永远循环

毫无疑问,您已经知道解决这些问题的合适工具是定理证明器,如Coq/Hol/Isabelle/ACL2等;但你显然是在寻找一个按钮式的东西。我认为SMT解算器接近您想要的,但需要注意的是,它们既有我上面提到的固有局限性,也受其当前启发式和验证引擎集的限制。它们肯定会随着时间的推移而改进,但您永远不会实现完全自动化

总而言之,这完全取决于你的目标到底是什么。对于软件/硬件的实际验证任务中出现的问题,SMT解决方案将带您走得更远;还有一个额外的好处是他们理解很多“理论”(算术、数组、数据结构等等)。此外,他们可以很容易地编程,就像mo一样