rfl:从 lean 开始的异世界生活(1)——lean 初体验

rfl 是什么

是 lean 中一个常见的 tactic(用于证明定理的策略).

lean 是什么

AlphaProof 做 IMO2024 的题目取得了相当于 Ag 的成绩.它是怎么做的?谁来检验它的解答正确性?它并不是直接像人类一样直接用自然语言输入输出,而是把题目翻译成 lean 之后再解答.

那么,lean 是什么?

lean 官网 的标题上有解释:

Programming Language and Theorem Prover

既能作编程语言又能证明数学定理?还有这种好事?能自动帮我写数学证明吗?

不能,它只能检验你的证明是否正确.类似的工具还有 coq 等.想要自动生成数学题的证明,可能还是要依靠 LLM.lean 本身有一定程度的自动化,但也只能搜索一些人眼看起来比较显然的东西.

相关教程:

  • Natural Number Game 是一个互动性的 lean 入门教程,类似于 Learn Git Branching看似学了很多其实学完就忘

  • 特仑苏陶在 github 上发布了他的《Analysis I》的 lean 版本,位于 teorth/analysis

    在这个仓库的 README 里有更多的 lean 教程.

为什么用 lean

这里的理由也适用于其他证明助手.

一个显然的好处就是消灭了过多的显然,以及它们可能导致的伪证,例如费马大定理,「我有一个绝妙的证明」,证明是否成立,翻译成 lean 之后一看便知.

LLM 做数学题可能会出现过程乱编答案正确的情况,这时就需要检验过程.人检验是费力的,而自动化检验更方便.

你在证明一个重要的定理,证明写完之后发现一个引理错了,导致之后的证明全部白费.

为什么不用 lean

因为麻烦.平时一眼能看出来的东西(组合意义),真要形式化论证并不简单.

举一个例子(来自《行列式入门》):设 \(n\) 为大于 \(1\) 的正整数,设数组 \(A = [0, 1, 2, \cdots, n-1]\)\(c\)\(A\) 的子序列且长为 \(k\),从 \(A\) 中删除 \(A, c\) 的公共项得到 \(B\),求证:\(B\) 中的元素 \(x\)\(A\) 中下标(0-index)为

\[f(x) = x - \sum\limits_{i=0}^{k-1} \rho (x, c_i) \]

其中

\[\rho (x, y) = \begin{cases} 0, & x \lt y; \\ 1, & x \ge y. \end{cases} \]

看起来是不是很显然?最后我的证明大小达到了 8.5KiB,还是借助了 LLM 的帮助才得以完成.

使用体验

折磨.要是没有 LLM 的帮助就纯纯坐牢了.但是 LLM 也没那么智能,谁用谁知道.AlphaProof 这种一般人用不起,一般人能用的 ChatGPT 等又不够智能,输出的 lean 代码看起来很像那么回事,但实际复制粘贴一看就会发现全是报错:不是编了个不存在的定理就是用了错误的语法.但另一方面,这也有一部分 lean 自身的问题,由于 lean4 和 mathlib4 一直在发展,有些 LLM 的训练资料可能还停留在 lean3 或者使用旧的 mathlib,报错也在一定程度上情有可原.

好像特仑苏陶这种大神用起来挺流畅的,那可能还是我的问题.

但是如果你放弃严谨证明的目标,那就没那么折磨.使用 sorryadmit 可以跳过证明,就像游戏里的作弊码一样,用来跳过一些显然的证明还是很方便的.诶不对,我为什么要使用 lean 来着?

所以可能 lean 的发展还要依赖于 AI 的发展,等哪一天 AI 能把人类的数学证明轻松地翻译成 lean 验证后,lean 就能得到大规模的普及了.

还有一点值得提的是带了 mathlib 后,lean 占用的内存和外存都是 GiB 级别的,像我的渣机有时在用 apply? 时会卡.

posted @ 2025-06-28 22:04  383494  阅读(92)  评论(0)    收藏  举报