学习自动定理证明


44

我正在独自学习自动定理证明 / SMT求解器 / 证明助手,并从此处开始发布有关该过程的一系列问题。

请注意,如果没有(数学)逻辑的背景知识,就很难轻易消化这些主题。如果您对基本术语有疑问,请继续阅读,例如M. Huth和M. Ryan 撰写的《计算机科学中逻辑》(特别是第一,第二和第四章),或者P撰写的《数学逻辑与类型理论导论》。安德鲁斯。
有关高阶逻辑(HOL)的简短介绍,请参见此处

我看着考克(Coq),并阅读了伊莎贝尔(Isabelle)简介的第一章;自动定理证明的类型

我认识Prolog已有几十年了,现在正在学习F#,因此ML,O'Caml和LISP很有用。Haskell是另一种野兽。

我有以下书籍

艾伦·罗宾逊和安德烈·冯科夫编辑的《自动推理手册》

约翰·哈里森(John Harrison)的“实用逻辑和自动推理手册”

Franz Baader和Tobias Nipkow撰写的“术语重写和所有内容”

  1. Coq和Isabelle有什么区别?

  2. 我应该学习Isabelle还是Coq,或者两者都学习?

  3. 首先学习Isabelle或Coq有优势吗?

此处找到系列的下一个问题。


7
重要的是要注意,您提到的工具不是自动证明,而是证明助手(尽管它们可以自己证明是简单的东西)。
拉斐尔

@DaveClarke复制吗?
拉斐尔

@Raphael:是的(除了现在我的答案包含新数据)。
戴夫·克拉克2013年

@DaveClarke您是否认为我们应该关闭这一项并将两者合并?
拉斐尔

@Raphael:是的。我刚刚将这里答案的文本复制到了另一个问题的答案中。
戴夫·克拉克2013年

Answers:


25

我更喜欢Coq,但我想其他人更喜欢Isabelle。我发现有关Isabelle的一件奇怪的事情是,它存在两级语法,其中一些定义需要用双引号引起来。Coq中没有这种废话。

最终,最适合您的选择可能取决于您要证明的内容。两种语言都有大量的图书馆支持,并且活跃的社区在进行各种开发和示例理论。如果一种语言为您希望开发的各种理论提供了足够的库(或其他)支持,那么我会选择该语言。

一种策略是用两种语言编写一个简单的教程,然后跟进感觉最好的一种。例如,

是一篇博客文章,简要地比较了最终喜欢伊莎贝尔的人对两者的看法。

确保使用正确的IDE(例如ProofGeneral),而不是在命令行上执行操作。

进入Coq的另一种方法是尝试Benjamin Pierce等人的在线书籍Software Foundations。它提供了出色的教程,其中包含大量详细信息。重点主要放在编程语言语义上,但在此过程中涵盖了Coq和半自动定理证明的许多基础知识(以及更多内容)。


4
一旦您驯服了ProofGeneral,它就很棒!关于Isabelle语法:iirc,双引号是您所谈论的东西,即公式。其他一切都是证明控制。尽管明显的区别很好,但是双引号(以及引号内缺乏语法突出显示)可能不是实现它的最佳方法。
拉斐尔

4
去年,我们为课程设置了Isabelle / HOL Wiki;否则很难获得一些不错的概述。
拉斐尔

18

我认为您会发现有趣的一件事是,“定理证明”一词根据您所从事的领域而有很大的不同。尽管它们(抽象地)是有些相关的实用定理证明(例如您所用的那种)参见《自动推理手册》中详细阐述的内容)与Coq或Isabelle的关系比您想象的要少。

当我第一次着手学习有关定理证明的相关知识时,我读的第一本书(尽管现在已经过时了?)是Melvin Fitting出色的一阶逻辑和自动定理证明。 这本书是一本非常优秀的书,涵盖了您将看到的与低阶逻辑有关的各种主题,在这些主题中您实际上可以得到相当多的自动化。您所学的逻辑类型应由您要推理的内容所决定,而不必为此而定论。例如,尽管一阶逻辑为您提供了相当多的表达能力和推理能力,但大多数编程语言社区(这些天我到这里都结束了)已经脱离了较早的定理证明和模型检验学派(更具决策性但缺乏表现力的东西)。

但是,这并不是要意味着-一阶推理和模型检查之类的东西在实践中并不是非常有用。他们已经!您可以将ACL2视为建立在一阶逻辑之上的证明者的示例,该证明者在工业领域取得了惊人的成功。随之,SMT解决方案也有了惊人的发展。现代SMT求解器建立在非常强大的SAT求解器的基础上(主要是通过最近二十年来对DPLL进行改进的发现),并且已经在诸如符号执行之类的应用中得到了广泛的应用。

但是,正如我所说,虽然更传统的“定理证明”有点有趣,但还有很多东西要学习。例如,学习Coq与学习它提供给您的自动化工具没有多大关系,而与学习它所基于的类型理论(共归构造的谓词演算)有很多关系。如果您不习惯于构造逻辑,咖喱霍华德同构或类型理论,那么您将有一段激动人心的时间来学习这些工具,但是我很难认为它们与您在第一卷中看到的内容过于紧密该手册。

因此,决定要执行的操作:验证一阶逻辑中的模型和定理,或使用强大的类型论来推断程序(或构造性逻辑中的定理)的正确性。如果是第一手,请学习更多基于自动演绎的技术,如果是第二手,请学习更多关于Coq,HOL等的信息。顺便说一句,如果您想学习Coq,虽然以上参考文献不错,但我认为有两个学习Coq的真正核心参考:

本杰明·皮尔斯Benjamin Pierce)的软件基础书(皮尔斯博士是一位出色的作家,如果您还没有的话,我建议您也看一下他更流行的“砖书”)。

具有相关类型的认证编程 (Adam Chlipala的写作也相当出色,尽管他的书比Pierce也许更简单的介绍更成熟,更聪明。)


15

交互式定理证明(ITP)有各种各样的系统-另请参阅该会议名称-Coq,Isabelle,HOL,ACL2,PVS等。

所有这些都相对难以学习,并且每种都有自己的特定文化。这就像学习一门外语:假设您已经知道英语,然后可以选择法语,德语,意大利语,西班牙语,葡萄牙语。所有这些都以某种方式相关-不是中文-但很少有人同时管理所有这些。因此,您应该尝试了解每种文化和社区,然后做出承诺。

您的工作中可能还确实需要“杀手级功能”。

这也有助于在这些系统之一周围拥有专家。

  • Coq和Isabelle有什么区别?

两者都是斯坦福/爱丁堡/剑桥的LCF系统的后代。1985年,G。Huet和L. Paulson共同开发了剑桥LCF的最新版本。然后分裂发生在法国的Coc / CIC / COQ(现为Coq),以及剑桥和慕尼黑的Isabelle。请注意,HOL4,HOL-Light,HOL-XYZ是LCF的其他相关后代。

20多年前,Coq与Isabelle的区别是根据逻辑基础进行的:这里的依存类型构造逻辑,在那里的简单类型古典逻辑。如今,由于在每个正式系统的顶部增加了越来越多的层,包括附加工具和库,因此在实践中几乎没有什么影响。

  • 我应该学习Isabelle还是Coq,或者两者都学习?

您应该同时看待两者,如果您喜欢更多的葡萄酒和奶酪,或者多味腊肠和酸菜,请尝试一下。(作为伊莎贝尔(Isabelle)背后的人之一,但目前在法国,令我感到惊讶的是,有多少法国人真正喜欢德国泡菜,而他们却不在家,没人看:-)

  • 首先学习Isabelle或Coq有优势吗?

我不这么认为。可能存在以下危险:您会卡在第一次尝试而又不尝试第二次的尝试上,或者您对第一次尝试感到太早失望而过早地将其解雇。在任何情况下,您都需要时间和持久性来使这两个系统都富有成效。

自从Proof General被称为“ IDE”以来:Proof General / Emacs多年来一直是Coq和Isabelle的标准统一界面,但是我永远不会将其称为IDE。CoqIDE的名称中也带有“ IDE”,但它是Gtk小部件之上相对基本的编辑器。当前的Isabelle包含Isabelle / jEdit,它的名称中没有“ IDE”,但旨在近似于您在Netbeans或IntelliJ IDEA中通常看到的内容-用于证明文本而不是Java代码。


10

是Andrej Bauer提供的一些不错的视频Coq教程。它根本没有完成,但是我认为这是一个很好的介绍。


1
大!请注意“使用Coq的第一个证明”中的一个中心句子:“想想如何在纸上做到这一点。” 有史以来最好的建议。
拉斐尔

4

介绍伊莎贝尔是非常详尽的。

另请参阅伊莎贝尔简介

通常,Isabelle相对容易入门,因为有许多可用的示例。例如在官方网站上

PS-我绝不隶属于Isabelle,我是形式方法方面的理论家,但我知道Isabelle通常会作为默认起点出现。


1
“我知道Isabelle通常作为默认起点出现。”:我宁愿说,HOL通常作为默认起点出现,而作为证明助手,则是Coq通常作为默认起点。考虑到这一点,这很有趣……最著名的逻辑(HOL比CoC更著名)和最著名的证明助手(Coq比Isabelle更著名)不匹配(Coq基于CoC,而Isabelle基于HOL)。
Hibou57 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.