
1. 为什么我想用 Lean 实测 Claude Code 的定理证明能力形式化验证一直是个门槛很高的领域。Lean 这类交互式定理证明工具能把数学证明写成机器可检查的代码但代价是学习曲线陡峭一个中等规模的证明动辄几百上千行写起来又慢又容易卡壳。最近 Claude Code 在交互式定理证明上的表现被反复讨论说它能独立完成定义建模、定理拆解、证明编写和编译调试甚至能从零重建一篇论文的理论体系。作为一个长期折腾 AI 编程代理的人我第一反应是这事得自己跑一遍才算数。所以这篇不是新闻转述而是一套可复现的验证流程。我会从零初始化一个 Lean 项目写几个待证定理然后通过 TaoToken 的统一 Key/API 通道把 Claude Code 接进来让它去补证明最后记录成功和失败的真实结果。适合谁看想评估 AI 编程代理数学推理能力的开发者、对形式化验证好奇但没时间啃 Lean 教程的人、以及想给 Claude Code 找一个稳定接入通道的工程同学。核心检索词就三个Claude Code、Lean、定理证明。下面所有命令和配置你都可以直接抄。2. 前置准备Lean 环境与 TaoToken 接入通道Lean 的安装推荐用官方工具链 elan它类似 Rust 的 rustup负责管理 Lean 版本和 lake 构建工具。我实测在 macOS 和 Ubuntu 上都能一把过Windows 建议走 WSL2。装完之后lean --version和lake --version都能输出版本号说明环境就绪。# 安装 elanLean 版本管理器 curl https://raw.githubusercontent.com/leanprover/elan/master/elan-init.sh -sSf | sh # 让当前 shell 生效 source ~/.profile # 验证 lean --version lake --version接下来是接入通道。Claude Code 本身是一个命令行代理它需要调用模型 API。我这边统一用 TaoToken 的 Key 和 API 通道来管理好处是 Key 集中、切换模型方便、不用在多个配置文件里来回改。你需要在控制台创建一个 API Key然后把它写进环境变量。注意 API 地址是https://taotoken.net/api不要带多余路径。# 写入环境变量建议放进 ~/.bashrc 或 ~/.zshrc export TAOTOKEN_API_KEY你的_API_Key export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEY$TAOTOKEN_API_KEY这里有个容易踩的坑Claude Code 默认读的是ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL这两个变量如果你只设了TAOTOKEN_API_KEY代理是找不到的。所以上面做了个转发。Key 的创建入口在控制台的 API Keys 页面模型对话入口可以用来先做一次连通性测试确认通道没问题再进 Lean 项目。3. 初始化 Lean 项目与待证定理示例现在建项目。lake 是 Lean 的构建系统lake new会生成标准目录结构。我给它起名lean-ai-proof类型选math方便引入 Mathlib。Mathlib 是 Lean 的数学库体量很大首次拉取会比较久建议留足时间。lake new lean-ai-proof math cd lean-ai-proof # 拉取 Mathlib 缓存关键否则编译极慢 lake exe cache get # 编译一次确认基线 lake build项目结构里LeanAiProof.lean是主文件lakefile.lean是构建配置。我在主文件里放三个待证定理难度递增方便观察 Claude Code 在不同复杂度下的表现。第一个是加法交换律的简化版第二个涉及自然数减法第三个故意写一个「看起来对但其实需要额外条件」的命题用来测试它会不会盲目硬证。import Mathlib -- 定理 1加法交换律基础 theorem add_comm_test (a b : Nat) : a b b a : by sorry -- 定理 2减法与加法的关系中等 theorem sub_add_test (a b : Nat) (h : b ≤ a) : a - b b a : by sorry -- 定理 3一个需要额外条件的命题陷阱 theorem trap_test (a b : Nat) : a - b 0 : by sorryby sorry是 Lean 的占位符表示「这里还没证」。编译能过但会提示有未完成的证明。这就是我们要交给 Claude Code 的起点。你可以先用lake build确认三个 sorry 都被识别出来输出里会有对应的 warning 行号。4. 用 Claude Code 逐步补证明的完整命令进入项目目录后启动 Claude Code。它会自动读取当前目录的上下文包括 lakefile 和 Lean 源文件。我用的提示词策略是「先解释再动手」让它先说明每个定理该用什么策略再逐个替换 sorry每改一个就编译一次。这样出问题容易定位。cd lean-ai-proof claude在 Claude Code 交互界面里我输入的第一条指令是让它分析三个定理并给出证明思路先不改代码。它给出的思路大致是定理 1 用Nat.add_comm定理 2 用Nat.add_sub_cancel配合条件h定理 3 则指出命题不成立需要反例或额外假设。这一步很关键说明它没有直接硬证陷阱题。接着我让它逐个补证明。对定理 1 和定理 2它直接替换为一行策略并编译通过。对定理 3它没有强行写证明而是建议把命题改成带条件的版本比如加上h : b ≤ a后再讨论。我接受了这个建议让它生成修正后的命题和证明。-- Claude Code 补完后的结果 theorem add_comm_test (a b : Nat) : a b b a : by exact Nat.add_comm a b theorem sub_add_test (a b : Nat) (h : b ≤ a) : a - b b a : by exact Nat.sub_add_cancel h -- 陷阱题被改写为可证版本 theorem trap_test_fixed (a b : Nat) (h : b ≤ a) (h2 : a b) : a - b 0 : by subst h2 simp每次修改后我都跑一次lake build确认没有 error。这里有个实用技巧让 Claude Code 自己执行lake build并把报错贴回来它能根据报错自动调整策略。我实测下来定理 1 和定理 2 基本一次过定理 3 的改写它主动提了出来没有陷入反复尝试。5. 验证请求与成功结果记录验证分两层一层是 Lean 编译通过另一层是证明本身没有sorry残留。编译通过只说明语法和类型对sorry是会被 Lean 接受的所以必须额外检查。我用grep扫一遍源文件确认没有 sorry 关键字。# 编译 lake build # 检查是否还有未完成证明 grep -rn sorry LeanAiProof.lean || echo 无 sorry 残留实测结果定理 1 和定理 2 编译通过且无 sorry证明行数各 1 行策略选择正确。定理 3 原始版本被 Claude Code 判定为不可证改写后编译通过。整个过程从启动到完成大约 6 分钟其中大部分时间花在 Mathlib 首次编译上纯证明补全只占一两分钟。为了更直观我把三个定理的结果整理成对照表定理原始状态Claude Code 处理编译结果是否含 sorryadd_comm_testsorry替换为 Nat.add_comm通过否sub_add_testsorry替换为 Nat.sub_add_cancel通过否trap_testsorry判定不可证并改写改写后通过否这个结果和社区讨论的「局部自动化能力」是吻合的它能处理有明确策略可循的证明遇到命题本身有问题时会主动指出而不是硬凑。这一点比单纯「能写代码」更有价值因为它体现了一定的推理判断。6. 本篇常见错误排查第一个高频错误是 Mathlib 没拉缓存导致lake build卡死或超时。现象是编译几十分钟没动静解决方法是先跑lake exe cache get再lake build。如果 cache 拉取失败检查网络和磁盘空间Mathlib 缓存有几个 GB。第二个错误是环境变量没生效Claude Code 报认证失败或找不到 API。排查顺序先echo $ANTHROPIC_API_KEY看有没有值再确认ANTHROPIC_BASE_URL是https://taotoken.net/api最后在模型对话入口做一次简单请求确认 Key 有效。注意变量名大小写ANTHROPIC_API_KEY不能写成ANTHROPIC_KEY。第三个错误是 Lean 版本与 Mathlib 不匹配。现象是import Mathlib报版本冲突。解决方法是看lakefile.lean里指定的 Mathlib 版本用elan show确认当前 Lean 版本必要时在lean-toolchain文件里锁定版本。我建议直接用lake new生成的默认配置不要手动改版本号。第四个错误是 Claude Code 反复修改同一个证明却编译不过。这通常发生在命题本身有歧义或缺少前提时。我的处理方式是中断它让它先解释「为什么这个证明过不了」往往它会指出命题需要额外条件。如果它陷入循环直接手动改写命题再让它继续比让它硬试更省时间。7. 继续深入把验证流程固定下来跑完这一轮我的结论是 Claude Code 在 Lean 定理证明上的能力确实值得认真对待但它更适合当「证明助手」而不是「证明替代者」。它能快速补全有明确策略的证明、能识别不可证命题、能根据编译报错自我修正但在需要全局重构或深层数学洞察的地方仍然需要人来把关。最实用的做法是把这套流程脚本化每次新增定理先让它分析思路再逐个补证明每步编译验证最后 grep 检查 sorry。如果你也想长期跑这类编码和验证任务建议用 Coding Plan 来管理调用额度比按次调用更划算。接入文档里有完整的环境变量说明和排障清单遇到认证或通道问题可以先查那里。模型对话入口适合做单次连通性测试确认 Key 和 API 通道正常后再进项目。把 Lean 项目、Claude Code 和统一 Key 通道这三样固定成一套模板下次遇到新定理直接复用省去重复配置的时间。