与Coq相比,Isabelle/HOL证明助手是否有任何优缺点?
与Coq相比,Isabelle/HOL证明助手是否有任何优缺点?
mult : forall (n m p : nat), matrix n m -> matrix m p -> matrix n p
n × m
,另一个维度为m × p
,并返回一个维度为n × p
的矩阵。然而,Isabelle/HOL理论并没有依赖类型,因此不能编写与上述类型相同的mult
函数。相反,需要编写适用于任何类型的矩阵的函数,并在其接收到正确类型的参数时事后证明该函数具有某些特定属性。换句话说,在Coq类型中体现的某些属性需要在使用Isabelle/HOL时作为单独的定理进行断言。Coq的理论默认缺乏许多在数学实践中常见的推理原则,例如排中律(即非构造性推理的能力),外延性(例如,能够说产生相等结果的函数本身是相等的)和选择公理。另一方面,在Isabelle/HOL中,这些原则是内置的。
从理论上讲,这不是一个大问题,因为Coq的逻辑被设计成允许人们安全地将这些推理原则作为额外的公理添加进去。然而,我有这样的印象,即在Isabelle/HOL上进行这种推理更容易,因为该逻辑是从头开始构建来支持它们的。
(您可能会想知道为什么Coq的逻辑中缺少这些基本原则。其动机是哲学性的:在Coq的核心逻辑中,证明可以被视为可执行程序,这赋予了逻辑一种建设性的风格。例如,拒绝排中律的原因是,析取A \/ B的证明对应于返回一个比特位来指示A或B中哪个为真的程序;因此,排中律将对应于决定每个数学问题的程序,而这是不存在的。 这个问题进一步讨论了这个问题。)Coq和Isabelle/HOL都是交互式定理证明器。它们是编写定义及其证明的语言;这些证明通过计算机检查以确保没有错误。在两个系统中,我们通过给出解释如何证明某些东西的命令来书写证明。然而,这在每个系统中发生的方式是不同的。
Isabelle/HOL通常具有更成熟的“按钮式”证明自动化支持。例如,它带有著名的策略,该策略调用多个外部自动定理证明器和求解器来尝试证明定理。Coq也提供了许多强大的证明自动化程序,如或,但它们不太适用于一般情况,在Isabelle/HOL中可以通过单个命令解决的许多定理在Coq中需要更明确的证明。当支持用户定义的证明自动化程序时,情况有点不同。 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
证明系统能够自动证明康托尔的命题。对于研究人员来说,这既有帮助,但也有一定的双刃剑效应。我发现让像对角线论证这样复杂的真实陈述在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的数字组成。 - Manuel Eberl