Lean 语言参考手册

20.1. 自然数🔗

自然数是非负整数。 逻辑上,它们是数字 0、1、2、3 等,由构造子 Nat.zeroNat.succ 生成。 除了计算机可用内存强加的物理限制外,Lean 对自然数的表示没有施加上限。

由于自然数是数学推理和编程的基础,因此它们在 Lean 的实现中得到特殊支持。 自然数的逻辑模型是一个归纳类型,算术运算则使用该模型来规定。 在 Lean 的内核、解释器和编译代码中,封闭的自然数被表示为高效的任意精度整数。 足够小的数字是那些不需要通过指针间接寻址的值。 算术运算由利用高效表示的原语实现。

20.1.1. 逻辑模型🔗

🔗归纳类型
Nat : Type
Nat : Type

从零开始的自然数。

内核和编译器都会对此类型作特殊处理,并用高效实现覆盖它。二者都使用快速的任意精度算术库(通常是 GMP);运行时,足够小的 Nat 值不装箱。

Nat.zero : Nat

零,即最小的自然数。

通常应避免显式写 Nat.zero,而使用字面量 0;前者是 simp 规范形

Nat.succ (n : Nat) : Nat

自然数 n 的后继。

通常应避免使用 Nat.succ n,而使用 n + 1;前者是 simp 规范形

归纳法证明

自然数是一个归纳类型,所以 induction 策略可用于证明全称量化的陈述。 归纳法证明需要一个基本情况和一个归纳步骤。 基本情况是证明陈述对于 0 为真。 归纳步骤是证明陈述对某个任意数字 i 为真蕴含了它对 i + 1 为真。

该证明在其归纳步骤中使用了引理 Nat.succ_lt_succ

example (n : Nat) : n < n + 1 := i:Natn:Natn < n + 1 induction n with i:Nat0 < 0 + 1 i:Nat0 < 1 All goals completed! 🐙 i✝:Nati:Natih:i < i + 1i + 1 < i + 1 + 1 -- ih : i < i + 1 i✝:Nati:Natih:i < i + 1i + 1 < i + 1 + 1 All goals completed! 🐙

20.1.1.1. 皮亚诺公理🔗

皮亚诺公理是此定义的推论。 为 Nat 生成的归纳原理是归纳公理所要求的:

Nat.rec.{u} {motive : Nat Sort u} (zero : motive zero) (succ : (n : Nat) motive n motive n.succ) (t : Nat) : motive t

这种归纳原理还实现了原语递归。 Nat.succ 的单射性以及 Nat.succNat.zero 的不相交性是归纳原理的推论,使用通常称为“无混淆”的构造:

def NoConfusion : Nat Nat Prop | 0, 0 => True | 0, _ + 1 | _ + 1, 0 => False | n + 1, k + 1 => n = k theorem noConfusionDiagonal (n : Nat) : NoConfusion n n := Nat.rec True.intro (fun _ _ => rfl) n theorem noConfusion (n k : Nat) (eq : n = k) : NoConfusion n k := eq noConfusionDiagonal n theorem succ_injective : n + 1 = k + 1 n = k := noConfusion (n + 1) (k + 1) theorem succ_not_zero : ¬n + 1 = 0 := noConfusion (n + 1) 0

20.1.2. 运行时表示🔗

Nat 声明所暗示的表示效率会极其低下,因为它本质上是一个链表。 链表的长度就是数字。 使用这种表示,加法所花费的时间将与其中一个加数的大小成线性关系,而且数字在内存中占据的机器字数至少与其大小一样多。 因此,自然数在内核和编译器中都具有特殊的专门支持,以避免这种开销。

在内核中,有特殊的 Nat 字面量值使用了广受信赖、高效的任意精度整数库(通常是 GMP)。 像加法这样的基本函数被使用这种表示的原语所覆盖。 因为它们是内核的一部分,如果这些原语不符合它们作为 Lean 函数的定义,可能会破坏健全性。

在编译代码中,足够小的自然数可以在不使用指针间接寻址的情况下表示:对象指针中的最低位用于指示该值实际上不是指针,其余的位用于存储数字。 对于无指针的 Nat,32位架构上有 31 位可用,而 64 位架构上有 63 位可用。 换句话说,小于 2^{31} = 2,147,483,6482^{63} = 9,223,372,036,854,775,808 的自然数不需要分配。 如果一个自然数对于这种表示来说太大,它会作为普通的 Lean 对象进行分配,该对象由对象头和任意精度整数值组成。

20.1.2.1. 性能说明🔗

使用 Lean 内置的算术运算符,而不是重新定义它们,是至关重要的。 Nat 的逻辑模型本质上是链表,所以加法的时间与其中一个参数的大小成线性关系。 更糟糕的是,在这种模型中乘法需要二次方时间。 虽然从头开始定义算术可能是一个有用的学习练习,但这些重新定义的运算速度远不及内置的那么快。

20.1.3. 语法🔗

自然数字面量通过 OfNat 类型类实现重载,这在关于字面量语法的章节中有所描述。

20.1.4. API 参考🔗

20.1.4.1. 算术🔗

🔗定义

自然数的前驱比它小一;0 的前驱定义为 0

该定义在编译器中由高效实现覆盖;这里给出的是逻辑模型。

🔗定义
Nat.add : Nat Nat Nat
Nat.add : Nat Nat Nat

自然数加法,通常通过 + 运算符使用。

内核和编译器都会用任意精度算术库的高效实现覆盖此函数;这里给出的是逻辑模型。

🔗定义
Nat.sub : Nat Nat Nat
Nat.sub : Nat Nat Nat

自然数减法,结果在 0 处截断,通常通过 - 运算符使用。

若结果本应小于零,则结果取零。

内核和编译器都会用任意精度算术库的高效实现覆盖此定义;这里给出的是逻辑模型。

示例:

  • 5 - 3 = 2

  • 8 - 2 = 6

  • 8 - 8 = 0

  • 8 - 20 = 0

🔗定义
Nat.mul : Nat Nat Nat
Nat.mul : Nat Nat Nat

自然数乘法,通常通过 * 运算符使用。

内核和编译器都会用任意精度算术库的高效实现覆盖此函数;这里给出的是逻辑模型。

🔗定义
Nat.div (x y : Nat) : Nat
Nat.div (x y : Nat) : Nat

自然数除法会舍弃余数;除以 0 返回 0,通常通过 / 运算符使用。

这种运算有时称为“向下取整除法”。

运行时会用高效实现覆盖此函数;这里给出的是逻辑模型。

示例:

  • 21 / 3 = 7

  • 21 / 5 = 4

  • 0 / 22 = 0

  • 5 / 0 = 0

🔗定义
Nat.mod : Nat Nat Nat
Nat.mod : Nat Nat Nat

取模运算计算一个自然数除以另一个自然数所得的余数,通常通过 % 运算符使用。除数为 0 时返回被除数,而不会报错。

Nat.modNat.modCore 的包装器,它对两种情况作特殊处理,以获得更好的定义归约:

  • Nat.mod 0 m 应归约为 0,这对所有项 m : Nat 都成立。

  • Nat.mod n (m + n + 1) 应归约为 n,这针对具体的 Nat 字面量 n

这些归约让 Fin n 字面量表现良好,因为 OfNatFin 实例使用 Nat.mod。特别地,(0 : Fin (n + 1)).val 应按定义归约为 0Nat.modCore 能处理所有数,但其定义归约不如这里方便。

运行时会用高效实现覆盖此函数;这里给出的是逻辑模型。

示例:

  • 7 % 2 = 1

  • 9 % 3 = 0

  • 5 % 7 = 5

  • 5 % 0 = 5

  • show (n : Nat), 0 % n = 0 from fun _ => rfl

  • show (m : Nat), 5 % (m + 6) = 5 from fun _ => rfl

🔗定义
Nat.modCore (x y : Nat) : Nat
Nat.modCore (x y : Nat) : Nat

取模运算计算一个自然数除以另一个自然数所得的余数,通常通过 % 运算符使用。除数为 0 时返回被除数,而不会报错。

这是 Nat.mod 的核心实现。它能对任意两个封闭自然数算出正确结果;但当 Nat 含有自由变量时,它缺少一些方便的定义归约。包装器 Nat.mod 会特殊处理这些情况,然后调用 Nat.modCore

运行时会用高效实现覆盖此函数;这里给出的是逻辑模型。

🔗定义
Nat.pow (m : Nat) : Nat Nat
Nat.pow (m : Nat) : Nat Nat

自然数的幂运算,通常通过 ^ 运算符使用。

内核和编译器都会用任意精度算术库的高效实现覆盖此函数;这里给出的是逻辑模型。

🔗定义
Nat.log2 (n : Nat) : Nat
Nat.log2 (n : Nat) : Nat

自然数的以二为底的对数,返回 ⌊max 0 (log₂ n)⌋

运行时会用高效实现覆盖此函数;这里给出的是逻辑模型。

示例:

20.1.4.1.1. 按位运算🔗

🔗定义

将值的二进制表示左移指定的位数,通常通过 <<< 运算符使用。

示例:

  • 1 <<< 2 = 4

  • 1 <<< 3 = 8

  • 0 <<< 3 = 0

  • 0xf1 <<< 4 = 0xf10

🔗定义

将值的二进制表示右移指定的位数,通常通过 >>> 运算符使用。

示例:

  • 4 >>> 2 = 1

  • 8 >>> 2 = 2

  • 8 >>> 3 = 1

  • 0 >>> 3 = 0

  • 0xf13a >>> 8 = 0xf1

🔗定义
Nat.xor : Nat Nat Nat
Nat.xor : Nat Nat Nat

按位异或,通常通过 ^^^ 运算符使用。

仅当对应位恰好在一个输入中置位时,结果的该位才置位。

🔗定义
Nat.lor : Nat Nat Nat
Nat.lor : Nat Nat Nat

按位或,通常通过 ||| 运算符使用。

只要对应位在至少一个输入中置位,结果的该位便置位。

🔗定义
Nat.land : Nat Nat Nat
Nat.land : Nat Nat Nat

按位与,通常通过 &&& 运算符使用。

仅当对应位在两个输入中都置位时,结果的该位才置位。

🔗定义
Nat.bitwise (f : Bool Bool Bool) (n m : Nat) : Nat
Nat.bitwise (f : Bool Bool Bool) (n m : Nat) : Nat

用于实现 Nat 按位运算符的辅助函数。

所得 Nat 的每一位,都是把 f 应用于两个输入 Nat 的对应位所得;处理范围直到任一输入中最高的置位。

🔗定义
Nat.testBit (m n : Nat) : Bool
Nat.testBit (m n : Nat) : Bool

返回 true 的条件是从最低位起第 (n+1) 位为 1;若返回 false,则该位为 0

20.1.4.2. 最小值和最大值🔗

🔗定义
Nat.min (n m : Nat) : Nat
Nat.min (n m : Nat) : Nat

返回两个自然数中较小的一个,通常通过 Min.min 使用。

返回 n 的条件是 n m;返回 m 的条件是 m n

示例:

🔗定义
Nat.max (n m : Nat) : Nat
Nat.max (n m : Nat) : Nat

返回两个自然数中较大的一个,通常通过 Max.max 使用。

返回 m 的条件是 n m;返回 n 的条件是 m n

示例:

20.1.4.3. 最大公约数和最小公倍数🔗

🔗定义
Nat.gcd (m n : Nat) : Nat
Nat.gcd (m n : Nat) : Nat

计算两个自然数的最大公约数,即能同时整除二者的最大自然数。

特别地,一个数与 0 的最大公约数就是该数本身。

这一基于欧几里得算法的参考实现会在内核和编译器中被任意精度算术的高效实现覆盖;这里给出的是逻辑模型。

示例:

🔗定义
Nat.lcm (m n : Nat) : Nat
Nat.lcm (m n : Nat) : Nat

mn 的最小公倍数是能同时被 mn 整除的最小自然数;若 0mn 中的任一个,则返回 0

示例:

20.1.4.4. 2 的幂🔗

🔗定义
Nat.isPowerOfTwo (n : Nat) : Prop
Nat.isPowerOfTwo (n : Nat) : Prop

自然数 n 是二的幂,是指存在某个 k : Nat 使得 n = 2 ^ k

🔗定义

返回大于或等于 n 的最小二次幂。

示例:

20.1.4.5. 比较🔗

20.1.4.5.1. 布尔比较🔗

🔗定义
Nat.beq : Nat Nat Bool
Nat.beq : Nat Nat Bool

自然数的布尔相等比较,通常通过 == 运算符使用。

内核和编译器都会用任意精度算术库的高效实现覆盖此函数;这里给出的是逻辑模型。

🔗定义
Nat.ble : Nat Nat Bool
Nat.ble : Nat Nat Bool

自然数的布尔小于等于比较。

内核和编译器都会用任意精度算术库的高效实现覆盖此函数;这里给出的是逻辑模型。

示例:

🔗定义
Nat.blt (a b : Nat) : Bool
Nat.blt (a b : Nat) : Bool

自然数的布尔小于比较。

内核和编译器都会用任意精度算术库的高效实现覆盖此函数;这里给出的是逻辑模型。

示例:

20.1.4.5.2. 可判定相等🔗

🔗定义
Nat.decEq (n m : Nat) : Decidable (n = m)
Nat.decEq (n m : Nat) : Decidable (n = m)

自然数相等性的判定过程,通常通过 DecidableEq Nat 实例使用。

内核和编译器都会用任意精度算术库的高效实现覆盖此函数;这里给出的是逻辑模型。

示例:

🔗定义

自然数非严格不等式的判定过程,通常通过 DecidableLE Nat 实例使用。

示例:

🔗定义
Nat.decLt (n m : Nat) : Decidable (n < m)
Nat.decLt (n m : Nat) : Decidable (n < m)

自然数严格不等式的判定过程,通常通过 DecidableLT Nat 实例使用。

示例:

20.1.4.5.3. 谓词🔗

🔗归纳谓词
Nat.le (n : Nat) : Nat Prop
Nat.le (n : Nat) : Nat Prop

自然数的非严格(弱)不等式,通常通过 运算符使用。

Nat.le.refl {n : Nat} : n.le n

非严格不等式具有自反性:n n

Nat.le.step {n m : Nat} : n.le m  n.le m.succ

n m,则 n m + 1

🔗定义
Nat.lt (n m : Nat) : Prop
Nat.lt (n m : Nat) : Prop

自然数的严格不等式,通常通过 < 运算符使用。

其定义为 n < m = n + 1 m

20.1.4.6. 迭代🔗

许多迭代运算符有两个版本:结构递归版本和尾递归版本。 结构递归版本通常在定义等价重要的上下文中更容易使用,因为当只知道自然数的某些前缀时它就可以进行计算。

🔗定义
Nat.repeat.{u} {α : Type u} (f : α α) (n : Nat) (a : α) : α
Nat.repeat.{u} {α : Type u} (f : α α) (n : Nat) (a : α) : α

将函数对初始值应用指定次数。

换言之,迭代 fn 次,作用于 a

示例:

  • Nat.repeat f 3 a = f <| f <| f <| a

  • Nat.repeat (· ++ "!") 4 "Hello" = "Hello!!!!"

🔗定义
Nat.repeatTR.{u} {α : Type u} (f : α α) (n : Nat) (a : α) : α
Nat.repeatTR.{u} {α : Type u} (f : α α) (n : Nat) (a : α) : α

将函数对初始值应用指定次数。

换言之,迭代 fn 次,作用于 a

这是 Nat.repeat 的尾递归版本,供运行时使用。

示例:

  • Nat.repeatTR f 3 a = f <| f <| f <| a

  • Nat.repeatTR (· ++ "!") 4 "Hello" = "Hello!!!!"

🔗定义
Nat.fold.{u} {α : Type u} (n : Nat) (f : (i : Nat) i < n α α) (init : α) : α
Nat.fold.{u} {α : Type u} (n : Nat) (f : (i : Nat) i < n α α) (init : α) : α

迭代应用函数 f:从初始值 init 开始,共执行 n 次;每一步按递增顺序,把 f 应用于当前值以及下一个小于 n 的自然数。

示例:

🔗定义
Nat.foldTR.{u} {α : Type u} (n : Nat) (f : (i : Nat) i < n α α) (init : α) : α
Nat.foldTR.{u} {α : Type u} (n : Nat) (f : (i : Nat) i < n α α) (init : α) : α

迭代应用函数 f:从初始值 init 开始,共执行 n 次;每一步按递增顺序,把 f 应用于当前值以及下一个小于 n 的自然数。

这是 Nat.fold 的尾递归版本,供运行时使用。

示例:

🔗定义
Nat.foldM.{u, v} {α : Type u} {m : Type u Type v} [Monad m] (n : Nat) (f : (i : Nat) i < n α m α) (init : α) : m α
Nat.foldM.{u, v} {α : Type u} {m : Type u Type v} [Monad m] (n : Nat) (f : (i : Nat) i < n α m α) (init : α) : m α

迭代应用单子函数 f:从初始值 init 开始,共执行 n 次;每一步按递增顺序,把 f 应用于当前值以及下一个小于 n 的自然数。

🔗定义
Nat.foldRev.{u} {α : Type u} (n : Nat) (f : (i : Nat) i < n α α) (init : α) : α
Nat.foldRev.{u} {α : Type u} (n : Nat) (f : (i : Nat) i < n α α) (init : α) : α

迭代应用函数 f:从初始值 init 开始,共执行 n 次;每一步按递减顺序,把 f 应用于当前值以及下一个小于 n 的自然数。

示例:

🔗定义
Nat.foldRevM.{u, v} {α : Type u} {m : Type u Type v} [Monad m] (n : Nat) (f : (i : Nat) i < n α m α) (init : α) : m α
Nat.foldRevM.{u, v} {α : Type u} {m : Type u Type v} [Monad m] (n : Nat) (f : (i : Nat) i < n α m α) (init : α) : m α

迭代应用单子函数 f:从初始值 init 开始,共执行 n 次;每一步按递减顺序,把 f 应用于当前值以及下一个小于 n 的自然数。

🔗定义
Nat.forM.{u_1} {m : Type Type u_1} [Monad m] (n : Nat) (f : (i : Nat) i < n m Unit) : m Unit
Nat.forM.{u_1} {m : Type Type u_1} [Monad m] (n : Nat) (f : (i : Nat) i < n m Unit) : m Unit

按递增顺序,对所有小于某个界的数执行单子动作。

示例:

0 1 2 3 4 #eval Nat.forM 5 fun i _ => IO.println i 0 1 2 3 4
🔗定义
Nat.forRevM.{u_1} {m : Type Type u_1} [Monad m] (n : Nat) (f : (i : Nat) i < n m Unit) : m Unit
Nat.forRevM.{u_1} {m : Type Type u_1} [Monad m] (n : Nat) (f : (i : Nat) i < n m Unit) : m Unit

按递减顺序,对所有小于某个界的数执行单子动作。

示例:

4 3 2 1 0 #eval Nat.forRevM 5 fun i _ => IO.println i 4 3 2 1 0
🔗定义
Nat.all (n : Nat) (f : (i : Nat) i < n Bool) : Bool
Nat.all (n : Nat) (f : (i : Nat) i < n Bool) : Bool

检查对每个严格小于给定界的数,f 是否都返回 true

示例:

🔗定义
Nat.allTR (n : Nat) (f : (i : Nat) i < n Bool) : Bool
Nat.allTR (n : Nat) (f : (i : Nat) i < n Bool) : Bool

检查对每个严格小于给定界的数,f 是否都返回 true

这是与 Nat.all 等价的尾递归版本,供运行时使用。

示例:

🔗定义
Nat.any (n : Nat) (f : (i : Nat) i < n Bool) : Bool
Nat.any (n : Nat) (f : (i : Nat) i < n Bool) : Bool

检查是否存在某个小于给定界的数,使 f 返回 true

示例:

🔗定义
Nat.anyTR (n : Nat) (f : (i : Nat) i < n Bool) : Bool
Nat.anyTR (n : Nat) (f : (i : Nat) i < n Bool) : Bool

检查是否存在某个小于给定界的数,使 f 返回 true

这是与 Nat.any 等价的尾递归版本,供运行时使用。

示例:

🔗定义
Nat.allM.{u_1} {m : Type Type u_1} [Monad m] (n : Nat) (p : (i : Nat) i < n m Bool) : m Bool
Nat.allM.{u_1} {m : Type Type u_1} [Monad m] (n : Nat) (p : (i : Nat) i < n m Bool) : m Bool

检查单子谓词 p 是否对所有小于给定界的数都返回 true。按递增顺序检查,p 一旦返回 false,便不再检查后续数字。

🔗定义
Nat.anyM.{u_1} {m : Type Type u_1} [Monad m] (n : Nat) (p : (i : Nat) i < n m Bool) : m Bool
Nat.anyM.{u_1} {m : Type Type u_1} [Monad m] (n : Nat) (p : (i : Nat) i < n m Bool) : m Bool

检查是否存在某个小于给定界的数,使单子谓词 p 返回 true。按递增顺序检查,p 一旦返回 true,便不再检查后续数字。

20.1.4.7. 转换🔗

🔗定义

将自然数转换为 8 位无符号整数,溢出时回绕。

运行时会用高效实现覆盖此函数。

示例:

🔗定义

将自然数转换为 16 位无符号整数,溢出时回绕。

运行时会用高效实现覆盖此函数。

示例:

🔗定义

将自然数转换为 32 位无符号整数,溢出时回绕。

运行时会用高效实现覆盖此函数。

示例:

🔗定义

将自然数转换为 64 位无符号整数,溢出时回绕。

运行时会用高效实现覆盖此函数。

示例:

🔗定义

将任意精度自然数转换为无符号机器字大小的整数,溢出时回绕。

运行时会用高效实现覆盖此函数。

🔗定义

将自然数转换为 8 位有符号整数,溢出时回绕到负数。

示例:

🔗定义

将自然数转换为 16 位有符号整数,溢出时回绕到负数。

示例:

🔗定义

将自然数转换为 32 位有符号整数,溢出时回绕到负数。

示例:

🔗定义

将自然数转换为 64 位有符号整数,溢出时回绕到负数。

示例:

🔗定义

将任意精度自然数转换为机器字大小的有符号整数,溢出时回绕。

运行时会用高效实现覆盖此函数。

🔗定义

将自然数转换为最接近的 64 位浮点数;若超出 Float 的范围,则得到无穷浮点值。

🔗定义

将自然数转换为最接近的 32 位浮点数;若超出 Float32 的范围,则得到无穷浮点值。

🔗定义
Nat.isValidChar (n : Nat) : Prop
Nat.isValidChar (n : Nat) : Prop

当一个 Nat 小于 0x110000,且不在代理码点范围(含端点的 0xd8000xdfff)内时,它表示有效的 Unicode 码点。

🔗定义

将自然数转换为其十进制字符串表示。

🔗定义
Nat.toDigits (base n : Nat) : List Char
Nat.toDigits (base n : Nat) : List Char

以给定进制返回自然数的十进制表示所对应的数字字符列表。若进制大于 16,则返回 '*' 来表示大于 0xf 的数字。

示例:

🔗定义

返回 n 的单个数字字符表示,假定所用进制不大于 16;返回 '*' 表示 n > 15

示例:

🔗定义

将自然数转换为字符串,其中以 Unicode 下标数字字符表示其十进制形式。

示例:

🔗定义

将自然数转换为字符串,其中以 Unicode 上标数字字符表示其十进制形式。

示例:

🔗定义

将自然数转换为与其十进制表示对应的 Unicode 上标数字字符列表。

示例:

🔗定义

将自然数转换为与其十进制表示对应的 Unicode 下标数字字符列表。

示例:

🔗定义

将小于 10 的自然数转换为相应的 Unicode 下标数字字符;其他数返回 '*'

示例:

🔗定义

将小于 10 的自然数转换为相应的 Unicode 上标数字字符;其他数返回 '*'

示例:

20.1.4.8. 消除🔗

Nat 自动生成的递归原理会导致以 Nat.zeroNat.succ 的形式来表达证明目标。 这并不是特别友好,因此提供了一个逻辑上等价的替代递归原理,其结果是目标以 0n + 1 的形式表达。 自定义消除器可提供给 inductioncases 策略,方法是使用 induction_eliminatorcases_eliminator 属性。

🔗定义
Nat.recAux.{u} {motive : Nat Sort u} (zero : motive 0) (succ : (n : Nat) motive n motive (n + 1)) (t : Nat) : motive t
Nat.recAux.{u} {motive : Nat Sort u} (zero : motive 0) (succ : (n : Nat) motive n motive (n + 1)) (t : Nat) : motive t

Nat 的递归器,使用 0 表示 Nat.zero,使用 n + 1 表示 Nat.succ

除此以外,它与默认递归器 Nat.rec 相同;induction 策略默认用它处理 Nat

🔗定义
Nat.casesAuxOn.{u} {motive : Nat Sort u} (t : Nat) (zero : motive 0) (succ : (n : Nat) motive (n + 1)) : motive t
Nat.casesAuxOn.{u} {motive : Nat Sort u} (t : Nat) (zero : motive 0) (succ : (n : Nat) motive (n + 1)) : motive t

Nat 的分类讨论原理,使用 0 表示 Nat.zero,使用 n + 1 表示 Nat.succ

除此以外,它与默认递归器 Nat.casesOn 相同;它是 Nat 的默认分类讨论原理,由 Nat 上的 cases 策略使用。

20.1.4.8.1. 替代归纳原理🔗

🔗定义
Nat.strongRecOn.{u} {motive : Nat Sort u} (n : Nat) (ind : (n : Nat) ((m : Nat) m < n motive m) motive n) : motive n
Nat.strongRecOn.{u} {motive : Nat Sort u} (n : Nat) (ind : (n : Nat) ((m : Nat) m < n motive m) motive n) : motive n

自然数上的强归纳。

归纳假设是所有小于给定数的数都满足动机,而目标是证明该给定数也满足动机。

🔗定义
Nat.caseStrongRecOn.{u} {motive : Nat Sort u} (a : Nat) (zero : motive 0) (ind : (n : Nat) ((m : Nat) m n motive m) motive n.succ) : motive a
Nat.caseStrongRecOn.{u} {motive : Nat Sort u} (a : Nat) (zero : motive 0) (ind : (n : Nat) ((m : Nat) m n motive m) motive n.succ) : motive a

基于自然数强归纳的分类讨论。

🔗定义
Nat.div.inductionOn.{u} {motive : Nat Nat Sort u} (x y : Nat) (ind : (x y : Nat) 0 < y y x motive (x - y) y motive x y) (base : (x y : Nat) ¬(0 < y y x) motive x y) : motive x y
Nat.div.inductionOn.{u} {motive : Nat Nat Sort u} (x y : Nat) (ind : (x y : Nat) 0 < y y x motive (x - y) y motive x y) (base : (x y : Nat) ¬(0 < y y x) motive x y) : motive x y

为通过反复减法进行自然数除法的递归模式定制的归纳原理。

🔗定义
Nat.div2Induction.{u} {motive : Nat Sort u} (n : Nat) (ind : (n : Nat) (n > 0 motive (n / 2)) motive n) : motive n
Nat.div2Induction.{u} {motive : Nat Sort u} (n : Nat) (ind : (n : Nat) (n > 0 motive (n / 2)) motive n) : motive n

自然数的归纳原理,包含两种情形:

  • n = 0,并且动机对 0 成立;

  • n > 0,目标是证明动机对 n 成立,并可假设其对 n / 2 成立。

🔗定义
Nat.mod.inductionOn.{u} {motive : Nat Nat Sort u} (x y : Nat) (ind : (x y : Nat) 0 < y y x motive (x - y) y motive x y) (base : (x y : Nat) ¬(0 < y y x) motive x y) : motive x y
Nat.mod.inductionOn.{u} {motive : Nat Nat Sort u} (x y : Nat) (ind : (x y : Nat) 0 < y y x motive (x - y) y motive x y) (base : (x y : Nat) ¬(0 < y y x) motive x y) : motive x y

为推理 Nat.mod 的递归模式而定制的归纳原理。