在 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 分辨率推断”,但没有进一步解释这意味着什么。

虽然这种转换对于某些应用程序可能是必需的,但在我的用例中,我只想继续使用整数,但没有找到将目标转换回使用整数的好方法。

所以我的问题是:

精益中的归纳策略使用基于类型定义的归纳原则。对于自然数,这个归纳原理是众所周知的。对于整数,定义有点不直观,给出了一个不是很有用的归纳原理。

在 Lean 中,整数被定义为两个自然数副本的不相交并集。这为您提供了从 nat 到 int 的两个函数,规范嵌入将 n 发送到 n,另一个映射将 n 发送到 -(n + 1)。每个整数都是唯一的 n 或 -(n + 1) 形式,其中 n 是自然数,整数的归纳原理基本上考虑了这两种情况,这不是很有用。在 Lean 中,这两个 nat 到 int 的映射称为 int.of_natint.neg_succ_of_nat-[1+ x] int.neg_succ_of_nat.

的表示法

所以虽然inductionx变成了一个自然数,但是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 xrefine 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_natneg_succ_of_nat)都没有将 int 作为参数(该类型仅作为输出出现)。因此,要证明精益中 int 的某些内容成立,您需要证明这些案例中的每一个都成立(没有额外的归纳假设)。然而,正如 Christopher Hughes 指出的那样,许多关于 int 的共同属性和定理已经被证明,并且在 Lean 3 核心库本身或 mathlib 中可用。然后,您可以将这些定理用作构建块来证明更复杂的概念。