第一次看到“用编译器验证数学证明”这个说法时,你可能会觉得有点奇怪:数学证明不是拿笔在草稿纸上推的么,怎么扯到编译器和AI了?我之前也这么想,直到真的上手了 Lean 这个交互式定理证明器,才发现它的核心思路非常硬核:你把定理当成函数签名写下来,把证明过程当成程序一样逐步构建,Lean 的编译器内核会在后台把所有证明步骤编译成一个底层证明项,再逐条检查是否真的能推出结论。如果哪一步写错了,它立刻给你报错,根本不给含糊其辞的机会。
这个教程写给谁?写给想真正入门 Lean、同时也想知道 AI 到底怎么在数学证明里打辅助的初学者。我会从最基础的环境搭建开始讲,一路讲到第一个完整证明、Lean 怎么拆分数学推导过程,再教你怎么用 AI 来帮你写策略、解释报错、加快调试验证。全程每段代码都可以直接复制运行,你只要能装好环境,跟着敲一遍,基本就能明白“编译器验证数学证明”这件事到底是怎么转起来的。
1. 为什么数学证明需要“编译器”
1.1 笔算证明为什么靠不住
别误会,我不是说手写证明没有价值。数学系训练的就是那种“从公理出发,一步一步推到结论”的能力,这个思维过程永远重要。但问题是,一旦证明变长、变量变多、定义层叠套娃,人脑靠短时记忆去跟踪几十层子目标,出错率会急剧上升。
举个大家可能听过的例子:四色定理当年就是用计算机辅助验证的,数学家花了大量精力去核对程序,起初很多人都担心“这玩意儿到底算不算严格证明”。后来像 Kepler 猜想这种巨型证明,人工审稿甚至花了十几年。问题的本质说白了就一句话:人工检查是建立在“大家都认为这一步显然成立”之上的,而这个“显然”在某些上下文里是会骗人的。
LeaN 做的事情不是替代你思考,而是强制你把每一步“显然”变成编译器能接受的精确规则。你写下一步的时候,它不会因为你自认为“显然”就放你过去,而是要用它的逻辑内核把当前目标和已有假设做一次严格的模式匹配。这种做法和写代码时编译器强制做类型检查其实是一模一样的。
1.2 Lean如何把证明“翻译”给编译器
Lean 背后的核心思想叫“命题即类型”(Curry-Howard Correspondence)。这个概念听起来很吓人,其实说白了就一句话:一个数学命题可以看成一个类型,而“这个命题的一个证明”可以看成一个满足该类型的程序对象。
- 命题
a = b是一个类型; - 证明
a = b就是构造出一个类型为a = b的证明项; - 编译器内核负责检查这个证明项的类型是否真的等于命题对应的类型。
所以你在 Lean 里看到的所有 theorem、lemma、example,底层最后都会被归约成一个验证项。Lean 的“编译器”角色就在这里:它的内核只认最终生成的证明项,至于你是用 simp 一键搞定、还是用 induction 一步步推,它并不关心,它只关心最后交给它的证明项类型是否合法。
我自己觉得最容易理解的方式,是把 Lean 想象成一个特别较真的判卷老师。你把试卷交上去,老师不看你中间写得多花哨,只看你的每一条推论是否都符合已经被接受的规则。如果某个中间步骤用了“显而易见得证”,老师立刻打个红叉,告诉你这一步没有规则依据。
1.3 编译器与编辑器的区别
很多人刚接触 Lean 时会有一个误解:看到 VS Code 里飘红报错,以为是“编辑器”在报错。其实不是。编辑器只是负责给你展示文本、提供高亮和快捷键,真正干活的是一套独立的 Lean 后台服务。
- 编辑器:VS Code、Neovim、Emacs 都行,负责让你舒服地写代码,它本身不判断逻辑;
- 编译器/内核:Lean 的服务端负责解析代码、展开定义、检查类型、生成信息视图(Infoview)里那些目标状态和报错信息。
打个比方:编辑器是你的 Word,编译器是你的语法检查引擎。Word 本身不保证你写出来的句子是符合语法、符合逻辑的,它只是把错误标记出来的媒介。Lean 的内核才是那个真正会思考“你的证明能不能拼起来”的东西。
理解这个区别之后,你在排错时就不会再一头雾水:看到错误优先看内核给的提示,而不是怀疑电脑出了问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
