.. _transitioning_to_regular_lean:
过渡到主流 Lean
===============
如果你喜欢本书,也许会希望进一步使用 Lean,例如阅读
`Mathematics in Lean `_,
或启动一个
`独立的形式化项目 `_。
你会发现,本书使用的 Lean“方言”不同于 `mathlib `_
库及其相关文献(例如 *Mathematics in Lean*)中使用的主流数学 Lean。
为了帮助你适应,本附录概述主要差异。
本书中使用的一些策略,是 mathlib 中相应策略的有意弱化版本。我这样做,
是为了屏蔽 Lean 的某些能力,因为在本书层次的文字证明中,通常会把这些细节完整写出。
这些有意弱化的策略包括:
.. _tactic_comparison_table:
.. list-table:: 本书策略及其 mathlib 原型
:widths: 30 30 50
:header-rows: 1
* - mathlib 策略
- 弱化的
*证明的技艺*
版本
- 差异
* - ``norm_num``
- ``numbers``
- ``norm_num`` 能完成本书要求读者手工完成的一些计算,
包括模 :math:`n` 化简、
处理逻辑,以及检查整除性和素性
* - ``gcongr``
- ``rel``
- ``gcongr`` 不要求你说明正在代入哪些假设
* - ``linarith``
- ``addarith``
- ``linarith`` 除了加减常数外,还可以取线性不等式的常数倍,
可以组合许多线性不等式,且不要求你说明
正在使用哪些假设
* - ``duper``
- ``exhaust``
- ``duper`` 能处理包含量词的逻辑任务,而不只限于
无量词的任务
本书中使用的一些策略在 mathlib 中没有直接对应物。它们通常是对一小组引理的封装;
在 mathlib 中,这些引理会按名称调用。
.. _tactic_lemma_wrapper_table:
.. list-table:: 本书中没有 mathlib 对应物的策略
:widths: 30 80
:header-rows: 1
* - *证明的技艺* 中的策略
- 所封装的引理
* - ``extra``
- ``Int.modEq_fac_zero``、``le_add_of_nonneg_right``、
``lt_add_of_pos_right`` 等,以及策略
``positivity``
* - ``cancel``
- ``mul_left_cancel₀``、``lt_of_pow_lt_pow``、
``pos_of_mul_pos_left`` 等,以及策略
``positivity``
* - ``simple_induction``
``induction_from_starting_point``
``two_step_induction``
``two_step_induction_from_starting_point``
- ``Nat.le_induction``、``Nat.twoStepInduction`` 等,
以及策略 ``induction`` 或 ``induction'``
本书中的许多问题若以 mathlib 风格的 Lean 来解,会高效得多,
因为某些步骤序列可以由超出本书数学范围的高级算法一步完成。应当了解的这类策略包括:
.. _decision_procedures:
.. list-table:: 本书未使用的高级算法
:widths: 30 30 50
:header-rows: 1
* - 算法
- mathlib 策略
- 该策略可以替代的步骤类型
* - `Fourier-Motzkin 消元法 `_
- ``linarith``
- ``addarith``、``rel``、``ring``、``numbers``
* - `Gröbner 基 `_
- ``polyrith``
- ``rw``、``ring``
* - `叠加演算 `_
- ``duper``
- 证明或子证明末尾的逻辑策略
本书没有涉及的另一点,是如何与库交互。由于 mathlib 含有超过一百万行 Lean 代码,
要弄清库中是否已经有你想要的引理,并不总是容易的!在本书中,
我通过预先告诉你希望你使用的每个引理名称来避开这个问题。
与库交互时,需要了解以下几个基本点:
* `在线文档 `_ 通常比源代码更易读:
它可搜索,并且含有内部超链接。
* 引理往往以极高的一般性陈述……:math:`(a - b) + c = a - (b - c)`
`这个引理 `_
不是针对 :math:`\mathbb{R}` 陈述的,而是针对 ``SubtractionCommMonoid`` 陈述的。
在修完抽象代数和点集拓扑的第一门课程之后,你可能会更容易与库交互。
* 如果你能猜出一个引理的精确陈述,策略 ``exact?`` 会在库中找到它。
以上只是触及皮毛:Lean 还有许多更多功能,可以帮助你进行数学探索。
*Mathematics in Lean*、`社区网站 `_
和 `社区讨论区 `_ 提供了进一步探索的指引。
祝你顺利探索!