在 Lean 中对整数进行归纳会创建非 int 类型
Induction on integers in Lean creates non-int types
我想对整数变量使用归纳法,在正向和负向进行归纳。
考虑以下定理(为了演示,不管它是否有意义):
theorem exmpl (x : ℤ) : (x = 5):=
begin
induction x,
-- inductive steps
end
在精益策略状态下产生:
case int.of_nat
x: ℕ
⊢ int.of_nat x = 5
case int.neg_succ_of_nat
x: ℕ
⊢ -[1+ x] = 5
按理说,感应产生两种情况,一种是正方向,一种是负方向。但同样发生的是 x 现在变成了一个自然数,在目标中它变成了 int.of_nat x
和 -[1+ x]
.
由于我的归纳法在整数内部运行,我假设这些类型是它们的某种“子集”,可能具有比整数更有用的属性。 Lean Reference 声明第二个似乎是“一个隐式参数,应该由类型 class 分辨率推断”,但没有进一步解释这意味着什么。
虽然这种转换对于某些应用程序可能是必需的,但在我的用例中,我只想继续使用整数,但没有找到将目标转换回使用整数的好方法。
所以我的问题是:
- 那些新类型
x
被转换成什么,它们是什么意思,为什么转换有意义?
- 而且,更重要的是:如何将目标改回可以再次使用整数的情况?
精益中的归纳策略使用基于类型定义的归纳原则。对于自然数,这个归纳原理是众所周知的。对于整数,定义有点不直观,给出了一个不是很有用的归纳原理。
在 Lean 中,整数被定义为两个自然数副本的不相交并集。这为您提供了从 nat 到 int 的两个函数,规范嵌入将 n 发送到 n,另一个映射将 n 发送到 -(n + 1)。每个整数都是唯一的 n 或 -(n + 1) 形式,其中 n 是自然数,整数的归纳原理基本上考虑了这两种情况,这不是很有用。在 Lean 中,这两个 nat 到 int 的映射称为 int.of_nat
和 int.neg_succ_of_nat
,-[1+ x]
是 int.neg_succ_of_nat
.
的表示法
所以虽然induction
把x
变成了一个自然数,但是int.of_nat x
和-[1+ x]
仍然是整数
如果你想要一种更有用的整数归纳法,你可以使用在 mathlib data.int.basic
中定义的定理 int.induction_on
https://leanprover-community.github.io/mathlib_docs/data/int/basic.html 你可以通过导入这个来使用它文件(在 mathlib 网站上有关于安装和导入 mathlib 文件的文档)和使用 induction x using int.induction_on
(此方法并不总是有效)或类似 apply int.induction_on x
或 refine int.induction_on x _ _ _
的方法也可能有效。
还值得一提的是,在 Lean 中处理整数时很少使用归纳法,大多数情况下你只是使用库定理来证明你想要的大部分内容。
要对 Christopher Hughes 的回答做一点补充,int
类型在精益 3 核心中定义为:
inductive int : Type
| of_nat : nat → int
| neg_succ_of_nat : nat → int
参见 here。
induction
策略(即 induction x
)在 inductive
类型不是递归的情况下与 cases x
相同,int
不是——它的构造函数(例如 of_nat
和 neg_succ_of_nat
)都没有将 int
作为参数(该类型仅作为输出出现)。因此,要证明精益中 int
的某些内容成立,您需要证明这些案例中的每一个都成立(没有额外的归纳假设)。然而,正如 Christopher Hughes 指出的那样,许多关于 int
的共同属性和定理已经被证明,并且在 Lean 3 核心库本身或 mathlib 中可用。然后,您可以将这些定理用作构建块来证明更复杂的概念。
我想对整数变量使用归纳法,在正向和负向进行归纳。
考虑以下定理(为了演示,不管它是否有意义):
theorem exmpl (x : ℤ) : (x = 5):=
begin
induction x,
-- inductive steps
end
在精益策略状态下产生:
case int.of_nat
x: ℕ
⊢ int.of_nat x = 5
case int.neg_succ_of_nat
x: ℕ
⊢ -[1+ x] = 5
按理说,感应产生两种情况,一种是正方向,一种是负方向。但同样发生的是 x 现在变成了一个自然数,在目标中它变成了 int.of_nat x
和 -[1+ x]
.
由于我的归纳法在整数内部运行,我假设这些类型是它们的某种“子集”,可能具有比整数更有用的属性。 Lean Reference 声明第二个似乎是“一个隐式参数,应该由类型 class 分辨率推断”,但没有进一步解释这意味着什么。
虽然这种转换对于某些应用程序可能是必需的,但在我的用例中,我只想继续使用整数,但没有找到将目标转换回使用整数的好方法。
所以我的问题是:
- 那些新类型
x
被转换成什么,它们是什么意思,为什么转换有意义? - 而且,更重要的是:如何将目标改回可以再次使用整数的情况?
精益中的归纳策略使用基于类型定义的归纳原则。对于自然数,这个归纳原理是众所周知的。对于整数,定义有点不直观,给出了一个不是很有用的归纳原理。
在 Lean 中,整数被定义为两个自然数副本的不相交并集。这为您提供了从 nat 到 int 的两个函数,规范嵌入将 n 发送到 n,另一个映射将 n 发送到 -(n + 1)。每个整数都是唯一的 n 或 -(n + 1) 形式,其中 n 是自然数,整数的归纳原理基本上考虑了这两种情况,这不是很有用。在 Lean 中,这两个 nat 到 int 的映射称为 int.of_nat
和 int.neg_succ_of_nat
,-[1+ x]
是 int.neg_succ_of_nat
.
所以虽然induction
把x
变成了一个自然数,但是int.of_nat x
和-[1+ x]
仍然是整数
如果你想要一种更有用的整数归纳法,你可以使用在 mathlib data.int.basic
中定义的定理 int.induction_on
https://leanprover-community.github.io/mathlib_docs/data/int/basic.html 你可以通过导入这个来使用它文件(在 mathlib 网站上有关于安装和导入 mathlib 文件的文档)和使用 induction x using int.induction_on
(此方法并不总是有效)或类似 apply int.induction_on x
或 refine int.induction_on x _ _ _
的方法也可能有效。
还值得一提的是,在 Lean 中处理整数时很少使用归纳法,大多数情况下你只是使用库定理来证明你想要的大部分内容。
要对 Christopher Hughes 的回答做一点补充,int
类型在精益 3 核心中定义为:
inductive int : Type
| of_nat : nat → int
| neg_succ_of_nat : nat → int
参见 here。
induction
策略(即 induction x
)在 inductive
类型不是递归的情况下与 cases x
相同,int
不是——它的构造函数(例如 of_nat
和 neg_succ_of_nat
)都没有将 int
作为参数(该类型仅作为输出出现)。因此,要证明精益中 int
的某些内容成立,您需要证明这些案例中的每一个都成立(没有额外的归纳假设)。然而,正如 Christopher Hughes 指出的那样,许多关于 int
的共同属性和定理已经被证明,并且在 Lean 3 核心库本身或 mathlib 中可用。然后,您可以将这些定理用作构建块来证明更复杂的概念。