对抗知识焦虑,从看懂这条开始
App 下载对抗知识焦虑,从看懂这条开始
App 下载
类型系统|代码可验证性|依赖类型|Lean编程语言|软件工程|前沿科技
旧金山湾区的一场派对上,有人能一口气报出40种编程语言的名字——从古老的Prolog到新潮的Rust,从脚本语言Python到系统语言C++。但当被问到「哪一种最好」时,答案只有一个:Lean。理由不是它现在完美,而是它「可完善」。你可以用Lean写下关于Lean本身的性质,用代码证明代码的正确性,让整个语言和它的证明体系一起进化。这在几乎所有其他语言里都是天方夜谭:你可以写一个永远返回5的函数,但你没法让语言本身帮你利用这个事实——除了Lean。为什么它能做到?这要从一种叫「依赖类型」的技术说起。
你可以把传统编程语言的类型系统想象成快递的外包装——只能告诉你里面是「文件」还是「电子产品」,但没法保证里面的内容符合预期。而Lean的依赖类型,相当于给快递加了一份精确到小数点的「收货合同」:不仅说明这是「文件」,还能明确写着「这份文件里每一页的第三行都是数字5」。

依赖类型的核心是「类型可以依赖于值」。比如在Lean里,你可以定义一个类型Vector α n,表示「长度为n的α类型向量」——这里的长度n不是一个模糊的描述,而是类型的一部分。如果有人想把一个长度为3的向量和长度为5的向量拼接,编译器会直接报错,因为它能从类型上就看出这违反了「拼接后长度为两者之和」的契约。

但真实的机制比这更精确:Lean的依赖类型遵循Curry-Howard对应——类型即命题,程序即证明。你写的每一段代码,同时也是在证明某个命题的正确性;而你要证明的每一个性质,也可以用代码的形式写进类型里。比如你写了一个returnFive函数,就能同时写一个定理证明它永远返回5:
def returnFive (x : Int) : Int := 5
theorem returnFive_eq_five (x : Int) : returnFive x = 5 := rfl
编译器会自动验证这个证明,并且在后续的代码里直接使用这个结论——比如它能帮你自动推导出returnFive a + 1 = 6,不需要你手动计算。
几乎所有编程语言都在朝着「加类型」的方向进化:PHP 7.4加了类型声明,Python引入了类型提示,Go也在不断强化泛型,C++模板更是把类型玩到了极致。但这些都是在现有语言上打补丁,而Lean从一开始就把「可完善」刻进了基因里。
「可完善」不是说Lean现在没有缺点,而是它允许你用语言本身的工具,一步步补全它的能力。你可以先写一个简单的函数,再慢慢为它添加性质证明;你可以自定义语法,把复杂的领域逻辑包装成直观的DSL——比如Lean用户曾用元编程实现了井字棋的棋盘语法,直接用X | O | _这样的符号就能定义棋盘,编译器还能自动验证棋盘的合法性。
这种能力的核心是Lean的定理证明基础设施。它不是一个外挂的工具,而是和语言本身深度融合的:你可以用Lean写自动化的证明策略,让机器帮你完成重复的证明步骤;你可以证明两段代码的等价性,让编译器用更高效的代码替换原来的实现——比如你证明了returnFive x + 1和6等价,编译器就能在编译时直接把前者替换成后者,既保证正确性,又提升性能。
当然,Lean也有它的局限:它的学习曲线陡峭,没有数学或形式化方法背景的开发者需要花时间适应;它的性能虽然比前代版本提升很多,但还赶不上Rust这样的系统语言;而且Lean 4为了进化,甚至打破了和Lean 3的向后兼容,让一些老用户不得不重新适应。
Lean的「可完善」特性,刚好和AI的能力形成了完美互补。最近几年,研究者们开始把大语言模型和Lean结合,让AI成为人类证明者的「副驾驶」——比如Lean Copilot可以在你写证明时,自动给出下一步的策略建议;Apollo框架能利用Lean的编译器反馈,自动修复AI生成的错误证明。
在miniF2F基准测试中,Apollo框架把7B参数模型的证明准确率提升到了65%-75%,还能把生成的样本数减少两个数量级。更重要的是,所有AI生成的证明都必须经过Lean的可信内核验证——这个内核只有几千行代码,相当于整个系统的「安全锁」,能确保AI不会生成看似正确实则错误的「幻觉证明」。
这种人机协作的模式,正在改变数学和编程的边界:数学家可以用Lean验证复杂的定理,让机器帮他们完成繁琐的证明步骤;程序员可以用Lean写出零bug的关键系统,比如AWS就用Lean验证了它的权限语言Cedar,确保访问控制策略的绝对正确。
当我们谈论编程语言的未来时,我们其实在谈论「如何让代码更可信」。从无类型到静态类型,从类型到依赖类型,人类一直在追求更精确的代码契约——而Lean把这种追求推到了一个新的高度:它不是给你一个固定的契约,而是给你一套能自己制定和验证契约的工具。
「代码即证明,证明即代码」,这不仅是Lean的核心理念,也是未来编程的一种可能:我们写的不再是简单的指令,而是一套可以被数学验证的逻辑体系;我们的代码不再是一次性的产物,而是可以不断进化、不断完善的「活的系统」。
派对上的40种语言各有千秋,但只有Lean真正回答了一个终极问题:如何让代码和我们对它的期望,永远保持一致。