跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Lean证明简介
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Lean证明简介 = '''Lean证明简介'''是学习Lean定理证明器的第一步,它介绍了如何在Lean中构造数学证明的基本概念和方法。Lean是一个基于依赖类型理论的交互式定理证明器,允许用户以形式化的方式表达数学命题并构造严格的证明。本节将引导初学者了解Lean证明的核心思想、语法结构以及基础应用。 == 什么是Lean证明? == 在Lean中,'''证明'''(Proof)是一个构造过程,通过应用逻辑规则和已有的定理,逐步推导出目标命题的正确性。Lean的核心思想是将数学证明转化为可计算的程序,其中每个证明步骤都对应着类型检查的过程。具体来说: * '''命题即类型''':在Lean中,每个数学命题被表示为一个类型(Type),而该命题的证明则是该类型的项(Term)。例如,命题“1 + 1 = 2”对应的类型是<code>1 + 1 = 2</code>,而它的证明是一个具体的项(如<code>rfl</code>,表示自反性)。 * '''构造证明''':用户通过编写代码(如策略(Tactics)或直接构造项)来生成证明对象。Lean的类型检查器会验证这些证明是否符合逻辑规则。 == 基础语法与示例 == 以下是一个简单的Lean证明示例,展示了如何证明一个等式命题: <syntaxhighlight lang="lean"> -- 引入Lean的标准库 import Mathlib.Tactic -- 定义一个简单的命题:证明 1 + 1 = 2 example : 1 + 1 = 2 := by -- 使用`rfl`策略(自反性)自动完成证明 rfl </syntaxhighlight> '''输出''':Lean接受此证明,因为<code>1 + 1</code>和<code>2</code>在定义上是相等的。 === 分步解释 === 1. <code>example</code>关键字用于声明一个匿名命题。 2. <code>1 + 1 = 2</code>是命题的类型,也是需要证明的目标。 3. <code>:= by</code>表示接下来的内容是一个证明脚本。 4. <code>rfl</code>是“自反性”策略,用于证明两个完全相同的表达式相等。 == 证明策略(Tactics) == Lean提供了丰富的策略来辅助证明构造。以下是初学者常用的策略: {| class="wikitable" |- ! 策略名称 !! 用途 !! 示例 |- | <code>rfl</code> || 证明自反性等式 || <code>example : x = x := by rfl</code> |- | <code>exact</code> || 直接提供证明项 || <code>example (h : P) : P := by exact h</code> |- | <code>apply</code> || 应用定理或假设 || <code>example (h : P → Q) (hp : P) : Q := by apply h; exact hp</code> |- | <code>intro</code> || 引入假设或变量 || <code>example : P → P := by intro h; exact h</code> |} == 实际案例:证明自然数加法结合律 == 以下是一个更复杂的例子,展示如何证明自然数加法的结合律: <syntaxhighlight lang="lean"> import Mathlib.Tactic theorem add_assoc (a b c : ℕ) : (a + b) + c = a + (b + c) := by -- 对`a`进行归纳法 induction a with | zero => -- 基础情况:a = 0 rfl | succ n ih => -- 归纳步骤:a = n + 1 simp [Nat.add_succ] -- 使用归纳假设 rw [ih] </syntaxhighlight> '''解释''': 1. <code>induction a</code>对变量<code>a</code>进行数学归纳。 2. <code>zero</code>分支处理<code>a = 0</code>的情况,直接使用自反性。 3. <code>succ n ih</code>分支处理<code>a = n + 1</code>的情况,其中<code>ih</code>是归纳假设。 4. <code>simp</code>和<code>rw</code>策略用于简化表达式并应用归纳假设。 == 依赖类型与命题 == Lean的核心特性是'''依赖类型系统''',它允许类型依赖于值。例如: * 命题“对于所有自然数n,n + 0 = n”可以表示为依赖函数类型: <syntaxhighlight lang="lean"> example : ∀ (n : ℕ), n + 0 = n := by intro n induction n with | zero => rfl | succ n ih => simp [Nat.add_succ, ih] </syntaxhighlight> == 可视化:证明构造流程 == 以下Mermaid图展示了一个简单证明的构造流程: <mermaid> graph TD A[命题P] --> B{选择策略} B -->|应用rfl| C[直接验证] B -->|应用induction| D[归纳法] D --> E[基础情况] D --> F[归纳步骤] F --> G[使用归纳假设] </mermaid> == 数学公式支持 == Lean的命题可以嵌入数学公式。例如,平方和公式: <math> \sum_{k=1}^n k^2 = \frac{n(n+1)(2n+1)}{6} </math> 对应的Lean命题为: <syntaxhighlight lang="lean"> example (n : ℕ) : ∑ k in Finset.range n, k^2 = n * (n + 1) * (2 * n + 1) / 6 := by sorry -- 实际证明需要更复杂的步骤 </syntaxhighlight> == 总结 == Lean证明的核心是将数学命题转化为类型,并通过构造项或使用策略来生成证明。初学者可以从简单的等式证明开始,逐步学习归纳法、依赖类型和高级策略。通过实践,用户能够掌握形式化数学证明的基本方法,并应用到更复杂的数学或编程验证中。 [[Category:计算机科学]] [[Category:Lean]] [[Category:Lean证明基础]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)