name: 证明 description: 具有研究、测试和验证阶段的正式定理证明 triggers: [“prove”, “verify”, “show that”, “is it true”, “formalize”] allowed-tools: [Bash, Read, Write, Edit, WebSearch, WebFetch, AskUserQuestion, Grep, Glob] priority: high
/prove - 机器验证证明(五阶段工作流程)
面向不想学习Lean语法的数学家的验证证明。
先决条件
在使用此技能前,检查Lean4是否已安装:
# 检查lake是否可用
command -v lake &>/dev/null && echo "Lean4已安装" || echo "Lean4未安装"
如果未安装:
# 安装elan(Lean版本管理器)
curl https://raw.githubusercontent.com/leanprover/elan/master/elan-init.sh -sSf | sh
# 重启shell,然后验证
lake --version
首次运行/prove将通过lake build下载Mathlib(约2GB)。
使用方法
/prove 每个群同态保持单位元
/prove Monsky定理
/prove 紧集上的连续函数一致连续
五阶段工作流程
┌─────────────────────────────────────────────────────────────┐
│ 📚 研究 → 🏗️ 设计 → 🧪 测试 → ⚙️ 实现 → ✅ 验证 │
└─────────────────────────────────────────────────────────────┘
阶段1:研究(在任何Lean代码之前)
目标: 理解是否可以以及如何形式化。
-
使用Loogle搜索Mathlib(主要 - 类型感知搜索)
# 使用loogle进行类型签名搜索 - 通过形状查找引理 loogle-search "pattern_here" # 示例: loogle-search "Nontrivial _ ↔ _" # 查找Nontrivial引理 loogle-search "(?a → ?b) → List ?a → List ?b" # 类似映射的函数 loogle-search "IsCyclic, center" # 多个概念查询语法:
_= 任何单个类型?a,?b= 类型变量(相同变量表示相同类型)Foo, Bar= 必须同时提及
-
外部搜索 - 已知的证明策略是什么?
- 如果可用,使用Nia MCP:
mcp__nia__search - 如果可用,使用Perplexity MCP:
mcp__perplexity__search - 备用WebSearch搜索论文/参考资料
- 检查:其他地方是否有现有形式化(Coq、Isabelle)?
- 如果可用,使用Nia MCP:
-
识别障碍
- 哪些引理不在Mathlib中?
- 证明是否需要超出ZFC的公理?(选择公理、排中律等)
- 陈述是否真的成立?(搜索反例)
-
输出: 证明策略和障碍的简要总结
检查点: 如果发现障碍,使用AskUserQuestion:
- “这需要[X]。选项:(a) 限制版本,(b) 接受公理,© 中止”
阶段2:设计(带sorry的骨架)
目标: 在填充细节前构建证明结构。
-
创建Lean文件,包含:
- 导入
- 所需定义
- 主定理陈述
- 辅助引理作为
sorry
-
注释每个sorry:
-- SORRY: 需要证明(直接) -- SORRY: 需要证明(复杂 - 约50行) -- AXIOM CANDIDATE: v₂约束 - 将在阶段3测试 -
验证骨架编译(带sorry)
输出: proofs/<theorem_name>.lean带注释的结构
阶段3:测试(反例搜索)
目标: 在尝试证明前捕捉错误引理。
对于每个AXIOM CANDIDATE sorry:
-
生成测试用例
-- 创建#eval或example语句 #eval testLemma (randomInput1) -- 应返回true #eval testLemma (randomInput2) -- 应返回true -
运行测试
lake env lean test_lemmas.lean -
如果找到反例:
- 报告反例
- 使用AskUserQuestion:“引理是假的。选项:(a) 限制域,(b) 重新表述,© 中止”
检查点: 仅当所有公理候选通过测试时继续。
阶段4:实现(填充sorry)
目标: 完成证明。
标准迭代循环:
- 选择一个sorry
- 编写证明尝试
- 编译器在环检查(自动触发钩子)
- 如果错误,Godel-Prover建议修复
- 迭代直到sorry被填充
- 重复所有sorry
活动工具:
- 编译器在环钩子(每次写入时)
- Godel-Prover建议(错误时)
阶段5:验证(审计)
目标: 确认证明质量。
-
公理审计
lake build && grep "depends on axioms" output- 标准:propext, Classical.choice, Quot.sound ✓
- 自定义公理:列出每一个
-
Sorry计数
grep -c "sorry" proofs/<file>.lean- 必须为0以表示“完整”证明
-
生成总结
✓ 机器验证(或 ⚠️ 部分 - N公理) 定理:<陈述> 证明策略:<简要描述> 已证明: - <引理1> - <引理2> 公理化(如果有): - <公理>:<为什么需要> 文件:proofs/<名称>.lean
研究工具优先级
使用任何可用的工具,按顺序:
| 工具 | 最适合 | 命令 |
|---|---|---|
| Loogle | 类型签名搜索(主要) | loogle-search "pattern" |
| Nia MCP | 库文档 | mcp__nia__search |
| Perplexity MCP | 证明策略、论文 | mcp__perplexity__search |
| WebSearch | 一般参考资料 | WebSearch工具 |
| WebFetch | 特定论文/页面内容 | WebFetch工具 |
Loogle设置: 需要~/tools/loogle带Mathlib索引。运行loogle-server &进行快速查询。
如果无搜索工具可用,谨慎进行并注明“研究阶段跳过”。
检查点(自动)
工作流程在以下情况暂停用户输入:
- ⚠️ 研究发现障碍
- ❌ 测试发现反例
- 🔄 实现遇到N次尝试后无法填充的sorry
输出格式
┌─────────────────────────────────────────────────────┐
│ ✓ 机器验证 │
│ │
│ 定理:∀ φ : G →* H, φ(1_G) = 1_H │
│ │
│ 证明策略:直接应用 │
│ MonoidHom.map_one 来自 Mathlib. │
│ │
│ 阶段: │
│ 📚 研究:在 Mathlib.Algebra.Group.Hom 中找到 │
│ 🏗️ 设计:单个引理,无需sorry │
│ 🧪 测试:不适用(平凡) │
│ ⚙️ 实现:3行 │
│ ✅ 验证:0自定义公理,0 sorry │
│ │
│ 文件:proofs/group_hom_identity.lean │
└─────────────────────────────────────────────────────┘
我可以证明什么
| 领域 | 示例 |
|---|---|
| 范畴论 | 函子、自然变换、Yoneda |
| 抽象代数 | 群、环、同态 |
| 拓扑学 | 连续性、紧致性、连通性 |
| 分析 | 极限、导数、积分 |
| 逻辑 | 命题逻辑、一阶逻辑 |
限制
- 复杂证明可能需要多次迭代
- 新颖的研究级证明可能超出能力范围
- 一些陈述在ℚ上不可证(需要ℝ扩展)
幕后
- Lean 4.26.0 - 定理证明器
- Mathlib - 100K+ 形式化定理
- Godel-Prover - AI战术建议(通过LMStudio)
- 编译器在环 - 每次写入时自动验证
- 研究工具 - Nia、Perplexity、WebSearch(优雅降级)
另请参阅
/loogle-search- 通过类型签名搜索Mathlib(在阶段1研究中使用)/math-router- 用于计算(积分、方程)/lean4- 直接Lean语法访问