AI辅助形式化验证:从类型标注算法到Isabelle/HOL证明
1. 项目概述:当AI成为你的形式化验证搭档
在编程语言理论这个领域里,我们每天都在和类型系统、编译器、静态分析工具打交道。一个算法的正确性,尤其是那些关乎类型安全、程序等价性转换的核心算法,其验证工作往往是理论研究中最为耗时、也最容易出错的环节。传统的做法是,研究者需要将算法的直觉和设计思路,用严谨的数学语言重新表述,定义出精确的前置条件、后置条件和不变量,然后手动构造证明,最后再将其形式化到Coq、Isabelle/HOL或Lean这样的证明助手中。这个过程,少则数周,多则数月,期间任何一个逻辑跳跃或定义疏忽都可能导致前功尽弃。
我最近深度参与了一个项目,它试图回答一个让所有理论计算机科学从业者都心跳加速的问题:我们能否让AI来分担,甚至主导这部分最“烧脑”的证明构造与形式化工作? 具体来说,我们聚焦于一个在Isabelle/HOL社区中实际使用多年,但缺乏严格形式化证明的算法——Smolka和Blanchette提出的最小化类型标注算法。这个算法的目标很直观:给定一个带有完整类型信息的项(比如(c::nat, d::nat)),我们需要打印它,但为了可读性,希望去掉所有冗余的类型标注(比如打印成(c, d))。然而,去掉之后,当我们重新解析这个字符串并运行类型推断时,必须能唯一地、精确地恢复出原始的类型信息。这个“打印-解析”的往返过程必须是无损的。算法需要保证完备性(标注足够多,能恢复原类型)和最小性(标注尽可能少)。
我们的实验设计了一场“人机对决”与“人机协作”。一方面,由人类专家(也就是我们团队)独立完成从问题形式化到手工证明的全过程。另一方面,我们让一个基于Claude Opus的AI智能体,仅凭算法描述、实现代码和一个执行示例,去独立完成一份可发表的、包含证明的学术论文草稿。最后,我们再让另一个AI智能体,将这两份“纸质”证明分别自动形式化到Isabelle/HOL中。整个流程,就像是为形式化验证领域设计的一次“图灵测试”与“协同工作流”的压力测试。
这篇文章,我将为你拆解这个项目的全过程。无论你是对形式化方法感兴趣的研究者,希望了解AI前沿应用的工程师,还是单纯好奇“机器如何证明定理”的极客,都能从中看到AI如何理解复杂的元理论概念,如何填补证明中的逻辑缝隙,以及它目前能力的边界在哪里。更重要的是,我会分享我们在让AI与Isabelle“对话”时趟过的坑、总结的技巧,以及对于未来“AI辅助验证”工作流的切实展望。
2. 核心问题形式化:为算法划定精确的战场
在让AI或任何人开始证明之前,我们必须先给问题建立一个无歧义的数学模型。Smolka和Blanchette的原始论文和实现更多是操作性的描述,比如“目标是让生成的HOL公式在被Isabelle重新解析时能正确推断出类型”。这种描述对于实现者足够,但对于证明者来说是模糊的。我们的首要任务就是将其转化为精确的数学定义。
2.1 构建语法与类型的基础设施
我们工作在秩1多态λ演算的框架内,这是HOL和ML类型系统的基础。首先定义核心集合:
- 类型变量:无穷集
TVar,用α, β表示。 - 项变量:无穷集
Var,用x, y, z表示。 - 类型构造子:一个带元数的集合
(K, arOf),比如list的元数为1,prod(乘积)的元数为2。 - 类型:由语法
σ ::= α | σ ⇒ τ | (σ₁, ..., σ_{arOf(κ)}) κ生成。即类型变量、函数类型或类型构造子的应用。 - 常量签名:一个函数
ctpOf: C → Type,为每个常量分配一个(可能是多态的)类型。
注意:这里的基础定义看似繁琐,但它是所有后续推理的基石。在与AI协作时,我们发现必须极其严格地定义这些基础概念,任何微小的歧义(比如“实例”关系的定义是否包含恒等替换)都会在后续的证明中引发蝴蝶效应,导致AI推导出错误的引理。
2.2 定义“部分标注项”与关键关系
为了统一描述从“完全标注”到“部分标注”再到“无标注”的整个过程,我们引入了 “可能类型” 的概念:Type⊥ = Type ∪ {⊥}。其中 ⊥ 代表“此处无类型标注”。
基于此,我们定义部分类型化项的语法:
这意味着变量、常量、应用和抽象都可以被一个“可能类型”ξ或ζ所修饰。当ξ是具体类型(如nat)时,这就是一个类型标注;当ξ是⊥时,则表示该处没有标注。
这个设计非常精妙,它用一个统一的框架捕获了:
- 完全类型化项:所有
ξ都是具体类型(⊥不出现)。 - Church风格项:只有变量和常量绑定处有具体类型,所有应用和抽象节点的修饰都是
⊥。这对应着像λx: nat. x这样的用户输入。 - 算法输出项:部分节点有标注,部分节点为
⊥,是我们要研究的对象。
我们定义了三个核心关系:
- 实例关系
t ≤ s:项t可以通过一个类型替换ρ从s得到(即t = s[ρ])。这描述了类型泛化与特化的关系。 - 标注子集关系
t ⊑ s:直观上,s可以通过在t的基础上添加(而不是改变)类型标注得到。这是一个偏序关系,是我们讨论“增加/删除标注”的数学基础。 - 良类型关系
⊢ t:基于标准的简单类型λ演算规则,但增加了一个关键约束:在抽象项(λx^σ. u)^τ中,项u体内所有自由出现的x都必须具有完全相同的类型σ。这排除了λx^α. x^β这种病态项,保证了类型的一致性。
2.3 精确界定“正确打印”问题
有了上述基础,我们可以给出“完备性”和“最小性”的精确形式化定义。
定义:良类型补全
对于一个(可能是部分标注的)项t,如果一个完全类型化项u满足:
t ⊑ u(u只是在t的基础上增加了标注)⊢ u(u本身是良类型的) 则称u是t的一个良类型补全。
定义:最一般良类型补全
如果u是t的一个良类型补全,并且对于t的任意其他良类型补全v,都存在一个替换ρ使得v ≤ρ u(即v是u的一个实例),那么u就是t的最一般良类型补全。这对应着Hindley-Milner类型推断所返回的“主类型”。
现在,我们可以陈述算法的规范:
给定一个完全类型化项u(输入),算法会输出一个部分类型化项t,使得:
- 完备性:
u是t的一个良类型补全。这意味着从t出发进行类型推断,至少能恢复出u。 - 最小性:对于任何满足
s ⊏ t(即s是t的真子集,标注更少)的项s,u不是s的良类型补全。这意味着你无法在不破坏完备性的前提下,删除t中的任何一个标注。
实操心得:在最初的形式化中,我们和AI都曾混淆“操作性的最小性”和“声明性的最小性”。算法内部使用一个“覆盖测试”来贪婪地选择标注位置,这保证了关于该测试的“局部最小性”。但我们需要证明的是,这种“局部最小性”蕴含了上面定义的、关于最终输出结果的“全局最小性”。明确区分这两个层次,是证明成功的关键。AI在初次尝试时,几乎直接使用了算法内部的描述来定义最小性,经过多轮评审才纠正过来。
3. 人类专家证明拆解:逻辑的构建与抽象的艺术
人类专家的证明过程,是一个从具体算法向上抽象,构建概念脚手架,再逐步推导的过程。我们的证明核心围绕一个关键的“覆盖测试”函数 coverageTest(v, s, p) 展开,其中v是最一般补全,s是待标注项,p是一个候选标注位置。
3.1 证明的核心思路与“三明治”引理
算法的基本思想是反向贪心:从一个完全标注的项开始,尝试逐个移除标注。对于一个候选位置p,移除其标注是否安全?这取决于“覆盖测试”:如果位置p的标注所约束的类型变量,也出现在其他已被保留的标注所约束的集合中,那么p的标注就是冗余的,可以安全移除。
为了证明这个测试的有效性,我们构建了几个核心引理:
引理8(三明治引理):设s是一个项,v是它的一个最一般良类型补全。如果对于某个位置p,有mtpOf(s, p) = ⊥(即s在p处无标注),并且coverageTest(v, s, p)失败(即p处的类型变量未被其他保留位置覆盖),那么一定存在另一个最一般良类型补全v',它在p处具有不同的类型。
这个引理是连通“覆盖测试”与“唯一性”的桥梁。它的证明需要深入分析类型变量在项结构中的传播方式,以及替换如何影响不同位置的类型。
引理10(实例变更引理):这个引理处理更微妙的情况。假设我们有两个项s和s',且s' ⊑ s(即s'的标注更少)。如果我们对s的最一般补全v施加两种不同的类型替换ρ和ρ',使得它们在所有与s'“相关”的位置上都一致,那么s'将同时是v[ρ]和v[ρ']的实例。这个引理允许我们在保持某些约束不变的情况下,故意改变某个特定类型变量,从而构造出反例。
3.2 完备性与最小性定理的证明
利用上述引理,我们可以证明两个主定理:
定理4(完备性):算法输出的项t,其最一般良类型补全mgen(t),与输入项u的最一般良类型补全mgen(u),是α等价的。这意味着从t进行类型推断,得到的结果与从原始输入u推断的结果完全相同,从而保证了类型信息的不丢失。
证明草图:通过对项的结构进行归纳,并利用覆盖测试的定义。核心在于说明,算法移除一个标注当且仅当该标注所约束的类型变量,在剩余标注所构成的覆盖集里已经被“保护”起来。因此,移除它不会扩大最一般补全的集合。
定理5(最小性):假设存在一个标注更少的项s' ⊏ t,并且u仍然是s'的良类型补全。我们将通过反证法导出矛盾。
- 由于
s'的标注更少,必然存在一个位置p,在t中有标注,在s'中无标注。 - 根据完备性定理,我们知道
u和t共享同一个最一般补全v。 - 因为
t在p处有标注,而算法没有移除它,说明coverageTest(v, t, p)失败。即存在一个类型变量α,它出现在p位置的类型中,但不出现在任何其他被保留的标注位置里。 - 现在考虑
s'。由于s'在p处无标注,并且u是s'的补全,我们可以利用引理10(实例变更引理)。我们构造两个替换ρ和ρ',它们在所有与s'相关的位置上行为一致,唯独在α上赋予不同的类型。 - 根据引理10,
s'将同时是v[ρ]和v[ρ']的实例。而由于α在v中是自由的,且ρ和ρ'在α上不同,我们知道v[ρ]和v[ρ']是两个不同的项。 - 因此,
s'至少有两个不同的良类型补全。但是,如果s'的标注集合是“完备的”(即能唯一确定类型),那么根据类型推断的原理,它应该只有一个最一般补全(最多相差α等价)。这就产生了矛盾。 - 矛盾表明最初的假设不成立,因此不存在这样的
s'。从而证明了t的标注集合是极小的。
注意事项:最小性定理的证明严重依赖于“最一般补全”的唯一性(在α等价意义下)。这本身是Hindley-Milner类型推断的一个经典性质。在我们的形式化中,我们需要将其作为一个明确的引理或公理来使用。AI在初次证明时,曾试图绕过这一点,导致证明链条出现断裂。
3.3 人类证明的优势与代价
人类证明的优势在于概念的清晰性与结构的优雅性。我们引入了“可能类型”、“标注子集关系”等中间概念,使得证明的每一步都建立在直观的数学对象之上,逻辑链条清晰。整个证明像搭积木一样,从基础定义到简单引理,再到核心引理,最后完成主定理的证明,可读性和可维护性都很高。
然而,代价是巨大的时间与精力成本。从理解问题、设计形式化方案、探索证明思路、撰写详细证明,到最终检查逻辑一致性,整个流程花费了大约5个人日。这还不包括后续与AI生成结果进行对比、分析和整合的时间。
4. AI智能体的“纸上谈兵”:潜力与缺陷的集中展示
与人类专家并行,我们配置了一个Claude Opus智能体,将其置于一个模拟的学术写作与评审环境中。我们给了它原始论文、Isabelle/ML的实现代码,以及一个算法执行的跟踪记录,然后指令它:“写一篇包含精确定义和完整证明的学术论文。”
4.1 AI证明的生成与迭代过程
我们采用了多轮“撰写-评审-修订”的循环,模拟学术出版流程:
-
第一轮:AI产出了一份包含证明草稿的文档。其表现令人印象深刻:
- 它正确地形式化了“完备性”的概念(与我们的定义等价)。
- 它提出了一个基本正确的“最小性”陈述。
- 它独立发现了证明所需的一些关键引理,例如“替换外延性的逆引理”。
- 然而,问题也很突出:证明被不必要地限制在了基项上,最小性陈述中存在一个使其平凡真的存在量词实例化错误,并且缺少了许多关键概念的定义。
-
第二轮至第四轮:每一轮,人类专家提供评审意见,指出逻辑缺陷、定义缺失和表述不清之处。AI能够根据反馈进行修改、泛化和完善。
- 例如,AI最初的定义过于贴近Isabelle/ML的实现细节,使用了
dummyT、pattern模式等内部术语。经过评审,它逐渐学会了抽象。 - 它成功地将证明从基项泛化到了包含变量的项。
- 最终,经过四轮迭代,我们得到了一份在逻辑上基本正确、且可被自动形式化的文档。
- 例如,AI最初的定义过于贴近Isabelle/ML的实现细节,使用了
4.2 AI证明的特点分析
优势:
- 成本与速度:总成本约70美元(API调用),计算时间约2小时,加上约1天的人力评审。远低于人类专家的5天。
- 探索能力:AI在无人指导的情况下,发现了“强正确打印”这一概念(虽然没明确命名)。在我们的框架里,这体现在它证明的定理实际上是关于“强正确打印”的,而通过一个等价性引理(我们的推论7),可以推出关于“正确打印”的定理。这一点甚至反过来启发了人类专家,让我们意识到必须明确陈述和证明最小性。
- 信息量:AI生成的文档,尽管不完美,但成为了极佳的学习材料。通过批判性地阅读它的证明思路,人类专家能更快地把握问题的核心和证明的难点。
缺陷与局限:
- 缺乏精确性:这是最持久的问题。表现为定义缺失、定义轻微错误、引理陈述不准确、隐含错误假设等。例如,它曾断言“对于任何种类为
s的类型τ,类型τ list也具有种类s”,这在多态类型系统中通常不成立。 - 难以进行概念创新:AI的思维似乎被提供的材料(原始论文和实现代码)所锚定。它很难像人类一样,发明出像“可能类型”和“标注子集关系”这样能干净捕获问题本质的新概念。它的形式化更偏向于对现有实现的直接描述,导致理论结构不够清晰。
- 自我评审的盲区:我们让AI进行模拟的“自我评审”和“同行评审”,它能发现一些表述问题,但对于深层的逻辑错误,其识别能力远逊于人类专家。这凸显了当前LLM在复杂逻辑一致性检查上的不足。
实操心得:与AI协作进行理论工作时,人类必须扮演严格的“验证者”和“概念架构师”角色。AI是一个强大的“推导引擎”和“草稿生成器”,但它缺乏对整体理论结构美感和一致性的把握。我们的工作流是:人类设定形式化的顶层框架和核心定义,AI去填充大量的中间引理和证明细节,然后人类再进行严格的逻辑审查和概念重构。这种分工能极大提升效率。
5. 迈向Isabelle:AI作为形式化工程师
证明写在纸上,无论人写的还是AI写的,都可能有疏漏。形式化的终极目标是在证明助手中验证。我们接下来的实验,就是让AI智能体扮演“形式化工程师”,将两份纸质证明转化为Isabelle/HOL理论文件。
5.1 技术配置:连接AI与Isabelle
我们搭建了一个集成环境:
- OpenCode:作为AI智能体的运行环境,提供文件操作、命令行等工具。
- Isabelle/Q:一个连接Isabelle/jEdit的MCP服务器。这让AI能通过代码与Isabelle交互:创建理论文件、运行证明、查询定理、使用Sledgehammer自动化工具等。
- Isabelle指南文件:我们为AI编写了一份指南,包含Isabelle的风格规范(如使用地道的Isar证明格式)和高效的证明工程模式。
AI智能体(同样是Claude Opus)接收纸质证明的所有材料(LaTeX源文件、笔记、评审意见),并被要求制定一个形式化计划,并在Isabelle中实现。
5.2 形式化AI自证:对齐的挑战
形式化AI自己生成的证明,面临一个独特挑战:对齐。即确保Isabelle中的定理陈述与纸质文档中的陈述严格对应。
第一轮结果:AI成功生成了一个无sorry(占位符)的Isabelle证明。它甚至做了一些有益的结构化工作:
- 使用Isabelle Locale来封装输入项的良构性假设,并公理化“最一般类型”的存在性。
- 使用另一个Locale来抽象主定理的证明,固定一组“局部最小”的标注集合。
- 在证明每个被保留的标注位置都对覆盖有必要性时,AI识别出一个需要进行复杂归纳陈述泛化的需求,并成功地实现了它。
人类评审发现的问题:
- 定理未实例化:完备性和最小性定理只在抽象的Locale内部被证明,但没有被实例化到具体的算法输出上。虽然所有需要的条件在形式化中都已存在,但AI没有完成这最后一步的“应用”。
- 抽象与具体的偏差:证明声称抽象了标注处理的顺序,但实际上却固定了一个具体的后序遍历枚举。这个偏差在多次人类评审指出后,依然存在。
- 定义歧义:纸质证明中使用了一个非正式的“项与标注集一致性”概念。AI在形式化中给出的定义,似乎与纸质文档的意图不完全匹配。
经过多轮反馈,AI最终修正了大部分问题,完成了定理陈述的对齐,并使整个形式化在Isabelle中可被验证通过。
5.3 形式化人类证明:清晰性的红利
接下来,AI被要求形式化人类专家撰写的证明。这份证明从一开始就考虑了可形式化性,结构清晰,定义明确。
过程对比:
- AI同样生成了无
sorry的证明,并且更加忠实于原始材料。 - 由于人类证明的概念更干净,AI在形式化时遇到的“对齐”问题更少。主要的纠偏工作集中在一些小的定义细节上(例如,根据纸质证明的更新,修正了抽象项良类型化条件中关于自由类型变量的约束)。
- 效率差异:人类证明的形式化耗时更短,所需的人类评审轮次和针对性反馈也更少。最终,人类证明的形式化代码约1938行,成本约139美元;AI证明的形式化约2071行,成本约140美元。两者计算资源成本相近,但人类证明在人力评审成本上显著占优。
5.4 评估AI作为证明工程师
优势:
- 能力全面:AI能够编写冗长、复杂的嵌套Isar证明,使用Locales、归纳谓词、递归数据类型等高级特性,产出代码在风格上基本符合Isabelle习惯。
- 能处理复杂逻辑:生成的证明虽然有时冗长,但逻辑上是正确的,并且由Isabelle内核保证了最终正确性。
局限与怪癖:
- 偏好低级量化:AI倾向于使用对象逻辑的全称量词(
∀)和存在量词(∃),而不是Isar的结构化fix/assume/show语句。这使得定理更难被后续的证明复用和实例化。 - “蛮力”工作流:AI经常忽略我们建议的“渐进式”工作流(先定义,再陈述引理,最后一步步写证明)。它喜欢一次性生成一大段Isar证明,然后回头修复错误。这有点像新手程序员的行为。
- 未充分利用自动化:AI几乎从不使用Sledgehammer这个强大的自动化工具,而是依赖基于模式的事实搜索和手动证明开发。这可能是由于引导策略或其对工具理解不足导致的。
- 对交互反馈的误解:在少数情况下,AI会误解Isabelle/Q返回的错误信息,特别是关于非终止证明方法的错误,需要人类干预纠正。
避坑指南:如果你计划用AI辅助Isabelle形式化,以下几点至关重要:
- 提供极其详细的风格指南:明确规定Locales的使用场景、Isar的格式偏好、定理命名规范、避免使用
apply脚本等。- 强制进行“定义-陈述-证明”的分离:在提示中明确要求AI先只提交定义和定理陈述,经人类确认无误后,再分阶段完成证明。
- 积极引导使用自动化:明确指令AI在遇到证明义务时,优先尝试
sledgehammer。可以为其提供使用Sledgehammer的成功案例模板。- 人类紧盯“对齐”环节:AI极易在定义和定理陈述的细微之处偏离原意。必须由人类专家仔细核对Isabelle中的每一个
definition、lemma和theorem是否与纸质文档的意图精确对应。
6. 总结与展望:人机协作的新范式
这个项目成功地验证了AI在编程语言元理论形式化验证全流程中的辅助能力。从模糊的算法描述,到精确的数学定义,再到手工证明,最后到机器验证的代码,AI在每一个环节都扮演了积极的角色。
核心结论:
- AI是强大的“副驾驶”:它可以快速生成大量证明草稿、填充繁琐的细节、探索不同的证明路径,并能将纸质证明转化为可运行的形式化代码。这能极大减轻研究者的机械性负担。
- 人类是不可或缺的“领航员”:在概念设计、整体架构、逻辑把关、深度创新和最终质量把控上,人类专家的作用无可替代。AI目前无法理解“为什么”要这样定义,也无法欣赏一个优雅的证明结构。
- 形式化验证是AI生成内容的“试金石”:对于AI生成的数学内容,将其形式化到证明助手中是当前最可靠的验证手段。它能暴露定义模糊、逻辑跳跃和隐藏假设等所有问题。
未来方向:
- 处理更复杂的理论:当前实验的背景理论相对简单。未来的挑战是让AI在大型形式化库(如Isabelle的Archive of Formal Proofs)中导航,并形式化更复杂的计算机科学证明,如图算法或编程语言元理论。
- 降低成本和提升效率:需要研发更擅长与证明助手交互的专用LLM,并更好地集成Sledgehammer、Isabelle Linter等符号工具,减少token消耗和人类评审负担。
- 改进评审机制:探索使用“批判模型”专门审核AI生成的定义和定理陈述,在形式化之前就提前发现对齐问题。
- 探索新的协作模式:也许未来不再是“人类写证明,AI来形式化”,而是“人类提出猜想和总体思路,AI同时生成证明草稿和形式化代码,人类再进行优化和确认”。
个人体会:从事这个项目让我深刻感受到,我们正处在一个范式转变的关口。AI不会取代理论研究者或形式化专家,但它会彻底改变我们的工作方式。那些最耗时、最重复、最需要耐心的工作,将越来越多地由AI承担。而人类的智慧,将更聚焦于提出真正有深度的问题、设计精巧的模型、以及进行跨领域的创造性思考。学会与AI协作,善用这把新的“瑞士军刀”,将是未来每一位从事复杂逻辑工作者的必备技能。这次在类型标注算法上的实践,只是这场漫长旅程的一个起点。