开头
先聊个事。我之前在一篇算法笔记里看别人用 Lean 语言写了一条定理,紧接着机器“啪”地一下就给出了一个证明,配文是“编译器帮我验证完了”。当时我第一反应是:编译器的活不是把代码变成机器码吗?它凭什么验证数学证明?后来我花了好几个晚上,从装环境到写出第一个被 Lean 接受的证明,才算真正明白这句话的意思。
这篇教程,我想把这三件事拧成一股绳讲清楚:Lean 是什么、为什么说“编译器验证数学证明”能成立、以及 AI 在这里面到底能帮你省多少事。如果你是想入门形式化数学、对证明助手好奇、或者平时写数学证明但总担心哪里漏了条件,那你来对地方了。我默认你会一点编程,但不要求你懂数理逻辑。跟着我从零搭环境、敲第一个定理、再让 AI 帮你把活儿干完,整个过程大概两三个小时,走完你就会发现自己已经能看懂 Lean 社区里不少内容了。
我目前用的是 Lean 4,这是当前最主流的版本。如果你之前搜到过 Lean 3 的教程,先别往下看,两者语法差距不小,照着 Lean 3 的写法抄到 Lean 4 里会报错报得你怀疑人生。这篇文章全按 Lean 4 来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
1. 先搞明白:为什么一门“编程语言”能证明数学定理
1.1 编译器不只是翻译,更是验证者
我们平时写代码,编译器做的事情一般有两件:把源代码翻译成目标机器能跑的东西,以及检查程序有没有“不合规则”的地方。比如你声明了一个变量是整数,后面给它赋了一个字符串,编译器就会跳出来说“类型不对”。这里的本质是编译器在利用一套类型规则做逻辑推理:我先规定 2 + 2 的结果必须是整数,你赋了一个字符串,这跟规则矛盾,所以报错。
这个“类型检查”机制,往前再走一步,就是证明助手能干活的地基。如果你把“类型”这个概念再抽象一层,让它不仅仅是 int、string、bool 这种东西,而是可以把“一个数学命题”本身当作一种类型,那么写一个命题的证明,就等价于构造一个满足该类型的实例。机器说自己“验证通过”,意思是它检查了你构造出来的东西,确认没有违反任何规则。
打个比方:你在银行填写存款单,柜员不是猜你填得对不对,而是拿一张规则表逐项打勾。你的每笔数字、日期、签名都必须满足表格上的约束,有一个不满足就退回。数学证明在 Lean 里走的就是这条路——每一步都让机器查一遍规则表,全部通过才算“证明完成”。
1.2 Lean 的定位:数学定理的“形式化裁判”
Lean 是一门依赖类型(Dependent Type Theory)的函数式编程语言,但它最重要的身份是“证明助手”,也就是一个交互式定理证明工具。你给它一个数学命题,它会问你:你有证据吗?你给出推理链,它逐条检查,最后点头说“这条命题在你的公理体系内成立”。或者说不上来哪里不对,但会提示某一步不能从已知条件推出。
这背后的机制是 Curry-Howard 同构,这个术语听起来吓人,其实意思很简单:一个命题可以被当作一种“类型”,而这个命题的证明,就是这种类型的一个“值”。换句话说,“证明存在”等同于“类型有实例”。机器只要确认你能构造出这个实例,就相当于确认命题成立。
所以“编译器验证数学证明”不是比喻,而是字面意义上的实现。Lean 里确实有一个内核(kernel)在做类型检查。你写文档、写策略、甚至不小心写了个错误的推理,最后都要过内核这一关。这个内核还刻意做得很小,目的是减少出漏洞的概率——因为一旦内核有bug,机器承认的证明就有可能是错的。
1.3 一个例子看懂“编译器验证数学证明”
光说理论没意思,直接看一个例子。打开 Lean,输入这段代码:
lean复制theorem add_comm_two (a b : Nat) : a + b = b + a := by
omega
如果你已经装了 Lean 扩展,鼠标放在这行代码上,会看到它显示一个绿色的标志,意思是通过了。如果你硬要手动写证明,也可以这样:
lean复制example (a b : Nat) : a + b = b + a := by
induction a with
| zero =>
simp
| succ a ih =>
simp [Nat.add_succ, ih]
这里 induction、simp 是 Lean 提供的证明策略(tactic)。它们不是在替你“猜答案”,而是在展开数学归纳法的每一步,并把化简过程展示给机器内核,让内核逐行确认。最终内核确认两个方向都没问题,于是这个定理就在 Lean 的体系里被“接受”了。
看到这里你就明白,所谓“编译器验证数学证明”,其实是一套非常朴素但无比严格的机制:你给出一串推理动作,机器检查这串动作每一步是否符合逻辑规则,全部合规就通过。跟编译器的关系,本质是同一种东西:类型检查。这也是 Lean 这类工具现在能在形式化数学、程序验证、甚至AI辅助推理研究里不断出现的根本原因。
2. 环境搭建:Lean 编译器与 IDE 安装(VS Code 方案)
2.1 安装 Lean 4 编译器后端
先说结论:装 Lean 最省事的方式是用官方提供的 elan 工具链管理器,类似 Rust 社区里的 rustup。
Linux 或 macOS 用户在终端里跑:
bash复制curl -fsSL https://raw.githubusercontent.com/leanprover/elan/master/elan-init.sh | sh
Wind
