API for theorem proving strategies

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

我正在寻找一个用户友好的API,能够验证类似于以下公式的证明的正确性:

如果可能的话,我更倾向于使用独立的库,而不是像Coq/HOL这样的语言的直接接口。

提前感谢!


回答:

一般来说,没有这样的工具。

一阶逻辑是半可判定的。简而言之,这意味着如果存在证明,你总能找到它。如果不存在,你可能会找到一个反驳,或者永远循环试图找到一个。没有系统能为所有一阶逻辑公式提供开箱即用的证明/反驳。

当然,即使存在证明,也无法保证你能快速找到它。因此,在实践中,在合理的时间/资源内找到证明是一个棘手的问题,即使它们确实存在。从理论上讲,如果你愿意等待足够长的时间,你总能做到这一点。

这是理论方面的情况。在实践中,现代SMT求解器可以做很多事情,特别是如果你对软件-硬件验证中实际出现的引理感兴趣,而不是纯粹的数学。例如,你使用的例子可以用SMTLib语言编码为:

(assert (not (forall ((a Int)) (=> (>= a 0) (exists ((b Int)) (> b a))))))(check-sat)

并且可以由z3轻松证明(假设你将上述文本放入名为a.smt2的文件中):

$ z3 a.smt2unsat

在这里,我们断言了我们想要证明的否定,而z3说unsat不可满足,这意味着原始陈述实际上是一个定理。需要一些努力才能看出对应关系,但这是公认的。此外,如果你的公式不是定理,那么SMT求解器可以给你一个具体的反例;这对于调试或确定虚假性很有用。

这并不意味着z3(或任何其他SMT求解器)会解决你抛给它们的所有公式。特别是对于交替量词,它们可能会给出答案,或者通过说unknown放弃尝试,或者可能永远循环。

毫无疑问,你已经知道解决此类问题的正确工具是像Coq/Hol/Isabelle/ACL2等定理证明器;但你明确寻找的是一键式解决方案。我认为SMT求解器接近你想要的,但要注意它们有我上面提到的固有限制,并且还受到当前启发式和证明引擎集的限制。它们肯定会随着时间的推移而改进,但你永远不会有完全的自动化。

总之,这一切都取决于你的真正目标是什么。对于软件/硬件实际验证任务中出现的问题,SMT求解器会带你走得很远;还有一个额外的好处是它们理解很多“理论”(算术、数组、数据结构,仅举几例)。此外,它们可以很容易地编程,因为大多数求解器在许多高级语言中暴露了高级API,并且大多数编程语言都有使它们易于使用的绑定。

然而,如果你的兴趣在于纯粹的数学,我认为你无法避免半自动化的定理证明世界。试着看看Lean,这是一个现代的、可高度编程的定理证明器。例如,请注意,大多数定理证明器已经带有利用SMT求解器的策略,因此虽然你必须手动编写证明,但有很多自动化工具可以帮助你。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注