与Coq相比,Isabelle / HOL证明助手是否有任何弱点和优势?
Answers:
我对Coq最为熟悉,并且对Isabelle / HOL没有太多经验,但是我可能会有所帮助。也许其他对Isabelle / HOL有更多经验的人可以帮助改善这一点。
两种系统之间有两点分歧:基础理论和互动方式。我将简要概述每种情况下的主要区别。
Coq和Isabelle / HOL均基于功能强大且表达力强的高阶逻辑。但是,这些逻辑在一些功能上有所不同:
Coq的逻辑是从属类型理论,称为归纳结构演算(简称CIC)。“从属类型”在这里意味着Coq中的类型可以引用普通值。例如,可以编写一个mult
类型为的矩阵乘法函数
mult : forall (n m p : nat), matrix n m -> matrix m p -> matrix n p
此函数的类型表示它以两个矩阵作为输入,一个维度为维n x m
,另一个维度为维m x p
,并返回一个维度矩阵n x p
。另一方面,Isabelle / HOL的理论不具有依赖类型。因此,不能编写mult
与上述函数相同类型的函数。取而代之的是,必须编写一个适用于任何类型矩阵的函数,并在接收到正确类型的参数时证明该函数的某些后验性质。换句话说,在处理Isabelle / HOL时,需要将Coq类型中体现的某些属性断言为单独的定理。
尽管从属类型在某些方面很有趣,但尚不清楚它们在总体上有多有用。我的印象是,有些人觉得它们的使用非常复杂,并且在类型级别上表达某些属性而不是将它们作为单独的定理所带来的好处不值得这种额外的复杂性。就个人而言,在有明确的理由时,我喜欢在少数情况下使用依赖类型。
缺省情况下,Coq的理论缺少许多数学实践中常见的推理原理,例如被排除的中间律(即非构造性推理的能力),可扩展性(例如,能够说产生相同结果的函数)相等),以及选择的公理。另一方面,在Isabelle / HOL中,此类原则是内置的。
从理论上讲,这不是什么大问题,因为Coq的逻辑旨在让人们安全地将这些推理原理添加为额外的公理。不过,我的印象是,在Isabelle / HOL上进行这种推理比较容易,因为逻辑是从头开始构建以支持它们的。
(您可能想知道为什么将这些基本原理排除在Coq逻辑之外是什么原因。动机是哲学上的:在Coq的核心逻辑中,证明可以看作是可执行程序,从而使逻辑具有建设性的味道。拒绝排除的原因是中间,例如,是一个析取的证明A \/ B
对应于一个程序,返回一个指示其中一个A
或B
为真;因此,被排除的中间将对应于一个程序,决定每一个数学问题,其中不能存在这个问题进一步讨论这个问题。)
Coq和Isabelle / HOL都是交互式定理证明。它们是用于编写定义和证明的语言。计算机会检查这些证明,以确保它们没有错误。在这两种系统中,都通过给出解释如何证明事物的命令来写下证明。但是,在每个系统上发生这种情况的方式各不相同。
通常,Isabelle / HOL对“按钮式”证明自动化具有更成熟的支持。例如,它带有著名的sledgehammer
策略,该策略调用多个外部自动定理证明者和求解器以尝试证明一个定理。Coq还提供了许多强大的证明自动化程序,例如omega
或congruence
,但是它们并不普遍适用,并且在Isabelle / HOL中可以用单个命令解决的许多定理需要在Coq中提供更明确的证明。
当然,这种便利是有代价的。有人告诉我,在Isabelle / HOL中很难控制自己的举证,因为该系统试图自己做很多事情。证明简单定理时,这不是问题,但是当证明自动化的功能不足时,这便成为问题,您需要告诉定理证明者如何进行更详细的说明。
在支持用户定义的自动证明程序时,情况有所不同。Coq附带了一种用于编写证明的战术语言,称为Ltac,这是一种独立的编程语言。即使Ltac有一些设计问题,它也允许用户以轻量级的方式对相当复杂的证明自动化程序进行编码。对于繁重的任务,Coq还允许用户使用Coq的实现语言OCaml编写插件。相反,在Isabelle / HOL中,没有像Ltac这样的高级自动化语言,并且用户可以编程自定义证明自动化过程的唯一方法是使用插件。
我将举例说明Isabelle / HOL的“按钮式”功效的一个方面是它对Cantor的经典“对角化”论点的自动化(回想一下,这表明从自然到其功率集没有任何排斥,或更一般地任何设置为它的功率集)。
theorem Cantor: "∄f :: 'a ⇒ 'a set. ∀A. ∃x. A = f x"
proof
assume "∃f :: 'a ⇒ 'a set. ∀A. ∃x. A = f x"
then obtain f :: "'a ⇒ 'a set" where *: "∀A. ∃x. A = f x" ..
let ?D = "{x. x ∉ f x}"
from * obtain a where "?D = f a" by blast
moreover have "a ∈ ?D ⟷ a ∉ f a" by blast
ultimately show False by blast
qed
我刚才向您介绍的是将Cantor的经典论点翻译成Isabelle / HOL。毫无疑问,巧妙!Isabelle / HOL甚至可以从此证明中自动消除洞察力,但是:
theorem "∄f :: 'a ⇒ 'a set. ∀A. ∃x. f x = A"
by best
theorem "∄f :: 'a ⇒ 'a set. ∀A. ∃x. f x = A"
by force
证明系统能够自动证明Cantor的陈述。对于研究人员来说,一方面这是有帮助的,但从某种意义上说,这是一把双刃剑。我发现,对角化参数如此复杂的真实语句可以被Isabelle / HOL内部证明是有帮助的,因为我的定理由此变得更加复杂。另一方面,由于计算机的自动化进程推动了我的研究工作,我就可以越来越少地解释定理为什么成立或为何成立。只有计算机知道原因,如果我们可以提出要求!
由于问题中的“ Isabelle / HOL”是精确的,因此我将讨论Isabelle中使用的HOL逻辑,我认为这是与Coq进行比较的最佳方法。我不是类型系统和逻辑方面的专家,但是我认为我所说的是正确的,至少是正确的。这当然也是一个问题;-),我的回答可能是主观的。
最深刻的区别在于类型系统和逻辑。
我想说,对于了解ML系列功能语言的人(甚至对于了解SML的人),它的力量会更加自然,并且它会采用务实的方法来解决问题,例如使用经典逻辑一个基础。它的类型系统接近Hindley Milner的类型系统,并且默认情况下终止(如果用户未对其进行修改)。
另一方面,Coq更为严格,并使用直觉逻辑。它具有一个特殊的类型系统,该系统具有多个顺序,并允许类型依赖性,这种依赖性可能很难处理,并且在某些情况下可能不会终止。它还允许人们从证明中提取程序(可能效率较低),而这在Isabelle中是不可能直接实现的。
('a::semiring_1)^'n^'m ⇒ 'a^'p^'n ⇒ 'a^'p^'m
。你可以,例如,矩阵乘法类型real^2^3
和real^4^2
获得类型之一real^4^3
。之所以可行n
,是因为对于任何正整数,都有一个内置类型,该类型由从0到n-1的数字组成。