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)为
其中
看起来是不是很显然?最后我的证明大小达到了 8.5KiB,还是借助了 LLM 的帮助才得以完成.
使用体验
折磨.要是没有 LLM 的帮助就纯纯坐牢了.但是 LLM 也没那么智能,谁用谁知道.AlphaProof 这种一般人用不起,一般人能用的 ChatGPT 等又不够智能,输出的 lean 代码看起来很像那么回事,但实际复制粘贴一看就会发现全是报错:不是编了个不存在的定理就是用了错误的语法.但另一方面,这也有一部分 lean 自身的问题,由于 lean4 和 mathlib4 一直在发展,有些 LLM 的训练资料可能还停留在 lean3 或者使用旧的 mathlib,报错也在一定程度上情有可原.
好像特仑苏陶这种大神用起来挺流畅的,那可能还是我的问题.
但是如果你放弃严谨证明的目标,那就没那么折磨.使用 sorry 或 admit 可以跳过证明,就像游戏里的作弊码一样,用来跳过一些显然的证明还是很方便的.诶不对,我为什么要使用 lean 来着?
所以可能 lean 的发展还要依赖于 AI 的发展,等哪一天 AI 能把人类的数学证明轻松地翻译成 lean 验证后,lean 就能得到大规模的普及了.
还有一点值得提的是带了 mathlib 后,lean 占用的内存和外存都是 GiB 级别的,像我的渣机有时在用 apply? 时会卡.

浙公网安备 33010602011771号