ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

形式化验证怎么做?从庞加莱猜想首次机器检查看数学证明的可靠路径

形式化验证怎么做?从庞加莱猜想首次机器检查看数学证明的可靠路径

“广义庞加莱猜想”这个词一冒出来,圈内人自然兴奋,圈外人第一反应往往是“这跟日常生活有什么关系”。可标题后半句“首次形式化验证”才是真正值得琢磨的部分:它不是让计算机背答案,也不是用AI写了个新证明,而是把一条历经多年整理的人工证明,逐字逐句编译成机器能查错的那种结构。整件事看起来像数学新闻,本质上却是一场关于“数学证据到底怎么确认”的方法论实验。这篇内容我会从证明助理工具的实际体验出发,把事情掰开讲清楚:形式化验证在做什么,广义庞加莱猜想卡在哪里,以及一个普通读者应该怎么判断这种“重大宣布”的分量。没有数学博士背景也能跟上,核心逻辑其实很朴素:把证明变成代码,让编译器来挑刺。

1. 这次“形式化验证”到底是什么

1.1 一台不会“懂”数学,但会“检查逻辑”的编译器

很多人一听到“验证”,第一反应是拿一组随机数代进去跑结果,看两边是否相等。这种思路适用于物理实验或者数值模拟,但数学证明不是这样运作的。数学证明里的每一个中间步骤都是一种“演绎动作”,比如从“A包含于B”推出“A的元素都属于B”,或者从“f连续”推出“f的复合也连续”。形式化验证要做的事情,是把整串演绎动作编码成机器能解析的语法树,再用一个被称为“证明检查器”的程序,逐节点确认每一步都符合预先约定的推理规则。

打个比方:编译器不会理解你的业务逻辑,但它能检查你写的变量类型、函数签名是否前后一致。形式化证明也是类似,证明助理读不懂“这个流形很光滑”背后的几何直觉,但能检查“光滑流形”这个类型是否被正确构造,检查“同胚”这个关系的证明是否真的闭合。只要每一个逻辑模块都通过检查,那么整个证明在结构上是无懈可击的。换句话说,计算机验证的不是“你发现了新大陆”,而是“你走的每一步路都在合法路径上”。

这也是为什么形式化验证和传统审稿完全不同。人类审稿人会因为论文太长、符号太复杂而跳过某些细节,默认“这部分应该没问题”;证明助理不给你这种偷懒的机会,每一个变量声明、每一条引理引用、每一处归纳假设,都必须精确匹配。整理过大型形式化项目的人都知道,这种“精细化”带来的负担非常重,很多直觉上“显然成立”的步骤,放到机器面前会暴露出大量隐藏前提。

1.2 广义庞加莱猜想本身长什么样

先给不熟悉拓扑学的读者补一段背景。经典的庞加莱猜想知道的人多:任何一个三维的、闭的、单连通的流形,本质上就是三维球面——注意这里的“单连通”指任意一条闭合曲线都能连续缩成一个点,“闭”指本身封闭且没有边界。三维情形后来被一位隐居风格极强的数学家解决,那条路走的是几何分析,依靠里奇流的变形技术处理奇异点。

“广义”两个字,通常指把这个问题推移到更高维度,并替换为同伦等价、同胚等更抽象的拓扑关系。笼统地说:如果一个高维闭流形和球面具有相同的同伦性质,那么这个流形是否必然同胚于球面?不同维度条件会不一样,有些维度在较早年代已经被证明,三维反而是最难攻克的一块。所以广义庞加莱猜想并不是单一公式,更像是一个“维度家族”的总称。标题里说“首次形式化验证”,意味着这个家族中某一条关键证明链被完整搬进了证明助理系统,从基础定义到核心定理,一路机器检查到底。

这里容易产生误解:形式化验证的对象并不是“刚刚诞生一个新证明”,而往往是把已经发表、被广泛讨论的证明重新用机器语言写一遍。这项工作绝大多数精力花在翻译、拆解和补全细节上,远远多于发现新思路。可别小看这个翻译过程——几何分析的证明中大量使用“不妨设”“取足够小的常数”“在某个尺度下近似于欧氏空间”这类非形式化语言,它们背后都藏着极限过程、正则性估计和紧性论断。把这些内容翻译成机器的严格语言,工作量比多数人想象的大一个数量级。

1.3 为什么说“首次”而不是“再次”

圈内隔三岔五会出现“某个著名猜想被形式化验证”的新闻,为什么这次值得单独拿出来说?因为广义庞加莱猜想的证明横跨微分几何、代数拓扑、偏微分方程三个山头。很多形式化项目选择相对“孤立”的定理下手,例如单群分类、四色定理或某个纯组合恒等式,它们依赖的知识模块相对集中,可以在一个框架里搭好。

但高维拓扑、流形几何这个方向,需要先把大量的微分流形理论、同调群、高阶同伦群、黎曼几何工具全部移植进证明助理。这不是一两个引理的事,而是要把整个理论大厦的地基重砌一遍。过去并非没有人尝试,知难而退的居多。所以“首次”二字,含金量在于技术栈的整体打通,而不是单点突破。它表达出这样的信号:“就算是最依赖几何直觉、最需要分析技巧的长证明,也有被完全机械化的可能。”

2. 为什么把这块硬骨头选为攻刻目标

2.1 几何分析的主干证明最不适合机器化

严格来说,“不适合”的意思是:它需要的先修知识量太大,翻译成本太高,而不是证明本身存在漏洞。我见过不少讨论,误以为选择某个大猜想做形式化验证,是为了检验原证明是否有错。其实对绝大多数已发表的经典证明,数学家已经反复咀嚼过,逻辑漏洞早就被挑得差不多了。形式化验证真正的门槛不在“找错”,而在“重建”。

几何分析里常见的论证链长这样:先构造一个里奇流,在有限时间内可能产生奇异点,然后对奇异点做缩放分析,得到某个极限结构,再通过比较几何分类这个极限结构,推断原流形具有某种拓扑约束。这条链里的每一步都需要调用大量分析不等式,比如梯度估计、热核估计、体积比较,同时还要维护流形曲率的有界性。把这些内容全部型化成代码,意味着要先把平滑流形、纤维丛、变分算子、局部坐标变换用类型系统精确描述出来。

我自己在写形式化题目时就深有体会:一个在草稿纸上写着“由标准椭圆正则性可得”的步骤,放进证明助理里可能要补出三页纸。那些在人类数学家脑中被默认省略的“显然”,在机器面前通通要变成可检查的引理。这是形式化工程天然不受欢迎的原因:产出看起来只是“把已知变成已知”,没有新定理,却耗费大量时间,所以真正长时间投入这门技艺的人,多少都有点执念。

2.2 形式化验证的“温和破坏力”

虽然工程量大,但这事最迷人的地方在于它的连锁效应。一旦广义庞加莱猜想这条主链被形式化,那么边上那些排队等着的支撑定理,例如“同伦球面的分类定理”“高维流形的配边不变量”等,都会跟着受益。证明助理项目有一个特性:它鼓励模块复用。你打通了一条证明通道,旁边几百条分支引理也顺便被验证了。于是每完成一次大工程,等价于给某个数学子领域建立了一座“可复用砖厂”。

可以把这件事类比成修桥:修一座跨河大桥本身很重要,但修桥过程里研发出的造桥机械、钢筋标准、测量规范,会一并改变整个行业的建造方式。形式化验证首次完成某个大猜想,给后来者留下的是数目庞大的可复用定义库、战术脚本、自动化策略。再有人想验证其他几何拓扑定理时,不必从零开始,直接从库里调用现成的“光滑流形的单连通性”定义、“同伦群计算工具”等等。这种“温和破坏力”才是长期价值所在。

所以即使一位普通读者看不懂证明本身,也能意识到:这项工作的产出不仅是“一个定理被机器确认”,更是一套能反复利用的数学机器语言基础设施。它像一张不断加密的地图,把以前只能靠人肉直觉导航的数学地形,逐渐变成可精确计算、可检索的坐标体系。

3. 实操拆解:一份可验证证明如何生产

3.1 用Lean看一眼“可检查证明”的日常

目前数学界活跃的形式化工具不止一种,最常见的包括Lean、Coq、Isabelle/HOL,各有侧重。以近几年讨论度比较高的Lean为例,它的核心思路是把数学命题直接表示为一种依赖类型,证明则被表示成一种特殊的构造过程。你写下一个定理,紧接着要给出它的证明项;证明项经过#check命令,会被内核解析并确认类型是否匹配。

下面是一段非常简单、适合入门的Lean代码,它验证的是自然数加法的基础引理:

import Mathlib.Data.Nat.Basic import Mathlib.Tactic example (n : ℕ) : n + 0 = n := by induction n with | zero => simp | succ n ih => rw [Nat.succ_eq_add_one, ih]

这段代码干的事:先声明一个命题“任意自然数加0等于它自己”,然后用归纳法证明基础情形,再处理后继情形。在命令行里执行时,如果所有目标都被闭合,就会显示“No goals”,否则会停留在未完成状态。这就体现了证明助理的核心模式:它不是替你找思路,而是严格检查你的思路是否处处闭环。

你也许会说:这跟广义庞加莱猜想有什么关系?关系在于,那种几万字的大证明,本质上就是由成千上万个这样的小证明拼接而成。区别在于每一个模块要考察的对象不再是自然数,而是光滑流形、向量丛、同伦映射。复杂的部分不是单个战术,而是“如何组织这成千上万个模块,让它们之间不产生矛盾”。

3.2 把几何直觉翻译成类型系统的三件难事

第一件难事,是把“流形”定义得既足够一般又足够精确。传统微分几何里,流形是一堆相容坐标卡的并集,坐标变换要求光滑。进入证明助理后,“相容”和“光滑”都必须用逻辑谓语完全刻画,还要处理“第二可数”“豪斯多夫”这些拓扑条件。任何一个遗漏,证明链后面都可能崩掉。

第二件难事,是把“同伦等价”与“同胚”之间的辨析做好。证明一个大定理时,你经常需要从一个弱的拓扑关系推理出强的拓扑关系,中间要构建大量具体的映射,并且证明这些映射连续、双射、有连续逆。人类拓扑学家习惯说“考虑某个自然映射”,但形式化世界里没有“自然”二字,你必须把这个映射的公式写出来,把连续性证明完整做出来,否则目标无法闭合。

第三件难事,是管理分析的极限步骤。庞加莱类证明后面藏着大量“逼近”操作:用平滑函数逼近粗糙映射,用截断工具构造局部坐标,用极限过程抽取收敛子列。在类型里做逼近,要引入滤波器、网、收敛定义,而这些定义本身又依赖实数公理化,整个依赖链非常长。

实际项目推进时,几乎没人会选择“把最终目标写在开头,然后一行行证明到底”的直线策略,因为那样编译错误会堆积到让人崩溃。我看到团队普遍采用“倒推式拆解”:先定义最终定理的陈述,暂不证明,然后把证明分解成若干个中间引理,每验证完一个引理就用#check确认类型,最后再用一个小模块把所有引理串起来。这样可以尽早发现底层定义写错了,避免浪费大量时间。

3.3 一条能落地的验证路线图

如果你也想尝试把某个数学结果做成形式化,而不是空谈概念,可以参考下面这条降低初始难度的路线。

第一步,不要从大猜想开始,而是选择一个只有两三个引理的小结论,把它写成一个精确命题。例如“某个简单拓扑空间是单连通的”这种级别的题,重在熟悉环境。

第二步,为你的目标建立“语义模型”。先不看证明,而是把问题里出现的所有对象,对照库里已有的定义翻译成类型;如果库里没有,先补定义。这一步最容易出错,我建议把定义写完后先做几个小测试定理,跑一遍确保定义行为符合预期。

第三步,编写证明脚本。Lean里常用rw、simp、apply这些战术,有时还要自己写一个小战术处理重复结构。不要把证明写成上万行巨型脚本,按引理粒度拆分,每个文件控制在一屏内为佳。

第四步,反复编译并保持提交信息清楚。形式化项目的文件依赖关系很敏感,今天改了一个底层定义,上层可能瞬间红了十几个文件。建议每一段时间就运行一次全项目构建,及时调整依赖。

第五步,也是很多人忽略的:给证明加注释。机器验证的结果只能说明“逻辑结构合法”,但未来维护者(大概率是你自己)需要知道每一步的数学意图。没有注释的形式化代码,半年后就是天书。

3.4 给研究者、工程师的一些配置心得

运行Lean这类证明助理,配置其实不复杂,但有几个地方容易让人卡住。

内存方面,Lean编译大文件时对内存有一定要求,建议开发机至少16GB起步,同时预留一定磁盘空间存放中间产物。许多大型项目会在目录下生成.olean缓存文件,编译一次后能显著加速后续开发,不要随便删。

编辑器选型上,VS Code搭配配套插件是当前最主流的选择。常见的交互方式是把鼠标悬浮在某一行,看到当前待证明目标;目标是逐步缩小的过程,每写一个战术就能看到状态变化,调试体验接近游戏里的“解谜模式”。

我自己的工作流里永远会建一个sandbox文件夹,专门用来测试不确定的小引理。犹豫一个归纳法是否可行,就在sandbox里跑通再挪进正式文件。这样能避免正式项目里堆满失败实验,也让主项目保持可编译状态。

4. 对数学圈、AI圈和普通读者的真实影响

4.1 数学证明开始有“测试用例”

传统数学证明依赖审稿人和同行复现,但一篇大证明很难被快速复验。多数时候,社区只能依赖“作者信誉+局部抽查+逐年讨论”。形式化验证的推进,等于给数学证明引入了持续集成测试:只要构造文件和代码没有变,本身就是可以随时重跑的逻辑单元。

这件事对数学教育的潜在影响也挺大。形式化证明本质上是把抽象的证明过程转变成可操作的工程对象,学生可以像读代码一样读定理:前提条件就是输入参数,结论就是返回值,证明就是算法体。那些过于含混的“显然”在形式化视角下会暴露原形。我接触过一些刚学拓扑的人,用证明助理把简单结论验证一遍之后,对“为什么连续函数的复合仍连续”这类基础命题的理解,会比光看笔记扎实得多。

对AI辅助证明来说,这类工程也意义深远。现在很多人用大语言模型生成证明片段,但生成结果正确与否需要系统快速判断。形式化工具就是最自然的裁判:让AI生成的证明代码直接进Lean编译,能通过就算初步有效,不能通过就给出具体失败目标。没有这套裁判体系,AI给出的“论文式证明”只是一堆让人半信半疑的文本。

4.2 这些工作最容易被误读的地方

最容易出现的误读有两类。第一类是“计算机证明了猜想”——不对,计算机只是检查了人类给出的证明链条,它没有提出新的几何构造,也没有做出创造性突破。真正提出证明的还是人。第二类是“证明已经万无一失”——严格说,形式化验证检验的是逻辑推导的语法合法性,如果定义本身建模错误,或者选定的公理体系不恰当,检查通过并不等于绝对真理。

另一种更微妙的误读是把“形式化验证”和“AI证明”等同起来。头一回看到新闻的人容易想象成AI自己哼哧哼哧推了几万步把定理证出来了,实际上更像是人类把整个证明过程“重新写一遍语言”,再由AI辅助完成部分繁琐战术。参与这类项目的人对AI的态度通常很实际:战术自动化和前提搜索会用上,但核心逻辑仍然掌握在数学家手里。

对普通读者来说,我觉得最值得关注的不是“这个定理被证明了”,而是“数学证据的定义正在发生变化”。过去十年,数学共同体对什么是“可靠证明”的粒度要求越来越高,形式化验证是这个变化的助力也是风向标。即使你现在只把它当成猎奇新闻,也应该记住这个判断工具:所谓“证明完毕”,可能有两种含义,一种是有人盖章了,一种是机器能复跑了。

5. 常见疑问与避坑速查

5.1 五个高频问题逐个说

问题一:为什么需要几年时间才能形式化一个猜想?直接回答:不是因为逻辑难到机器理解不了,而是因为“翻译”太费人力。人脑脑子里有两个步骤之间的跨度是直觉性的,机器需要一格格补上阶梯。

问题二:验证一个老证明到底有什么新贡献?这就好比给一栋旧楼做结构安全检测。楼住着没问题,但你不清楚哪些承重墙合理、哪些管线冗余。检测完,你得到的不只是一份安全报告,还有一套建筑规范。

问题三:Lean、Coq、Isabelle选哪个好?看学科背景。近些年数学圈用Lean的多,因为Mathlib维护得很活跃,很多分析、拓扑、代数基础结论已经躺在库里。如果目标是软件系统验证,Coq也用得多。建议新手跟社区走,别自己闭门造车。

问题四:形式化验证通过,是不是原证明没有漏洞?要分两层理解。如果形式化过程忠实复刻原证明逻辑,至少证明里的那些显式推导步骤没问题;但初始定义是否完全匹配原论文的语义,仍依赖建模者的判断。

问题五:这项工作会不会导致数学变冷冰冰?恰恰相反,越是做形式化,越能体会数学直觉的珍贵。机器能检查的只是形式骨架,几何想象力和对“为什么成立”的洞察,仍然只属于人类。

5.2 避坑:如何判断一份形式化证明靠谱

如果你看到网上流传“某定理已形式化”,别急着欢呼,先做几个小检查。第一,看仓库是否公开且活跃,公开仓库意味着别人可以复查代码。第二,看验证范围:证明声明在哪个文件、用什么库版本、最终产物的#check输出是否稳定。第三,看定义代码和论文之间的映射说明,有没有文档解释“这里的类型对应论文里的哪个概念”。

我一直强调一个经验:恰心虚的人很难伪造出能稳定编译的文件,因为形式化证明对一致性要求极其苛刻。哪怕你只想骗人,也要构建上千个相互咬合的模块,这工作量足够写好几篇实打实的论文了。所以“可复现构建”这个属性本身,就是一种可信度背书。

另外,从消费信息的角度,别把“首次”的头衔看得太重。首次完成一个方向的验证,大概率依赖前人数年搭建的底层库。更好的判断标准是:这个工程是否留下了可复用的新组件,是否让后续者更省力。能推动技术进步的项目,从来不是孤立的一座纪念碑。

到这一步,我对这件事的个人体会就一句话:形式化验证最迷人的地方,不是“让机器变成数学家”,而是“让数学家学会像机器一样严谨”。以后再看新闻里出现“某某猜想被验证”时,不要只盯着结果,多看一眼它留下了什么工具、打通了哪条路。继续往里挖,你可能会发现,这一小步撬动的远不止一个定理本身。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进