了解Coq中证据的归纳法

时间:2019-05-23 11:38:10

标签: coq theorem-proving coq-tactic induction

我正在研究IndProp.vSoftware Foundations (Vol 1: Logical Foundations)中的定理ev_ev__ev

Theorem ev_ev__ev : forall n m,
  even (n+m) -> even n -> even m.
Proof.
  intros n m Enm En. induction En as [| n' Hn' IHn'].
  - (* En: ev_0 *) simpl in Enm. apply Enm.
  - (* En: ev_SS n' Hn': even n' 
              with IHn': even (n' + m) -> even m *)
    apply IHn'. simpl in Enm. inversion Enm as [| n'm H]. apply H.
Qed.

其中even定义为:

Inductive even : nat -> Prop :=
| ev_0 : even 0
| ev_SS (n : nat) (H : even n) : even (S (S n)).

在第二个项目符号-处,上下文和目标如下:

m, n' : nat
Enm : even (S (S n') + m)
Hn' : even n'
IHn' : even (n' + m) -> even m
______________________________________(1/1)
even m

我了解如何在上下文中生成m, n', Enm, Hn'。但是,IHn'是如何生成的?

1 个答案:

答案 0 :(得分:3)

归纳假设是为同一类型族中的构造函数的前提系统地创建的。因此,您可以独立查看每个构造函数。

假设您有一个以以下内容开头的归纳定义:

Inductive arbitraryName : A -> B -> Prop :=

将创建一个称为arbitraryName_ind的归纳原理,它首先对具有相同类型的通常称为P的任意谓词进行量化

forall P : A -> B -> Prop,

现在,如果您具有以下形式的构造函数

arbitrary_constructor : forall x y, arbitraryName x y -> ...

归纳原理对此构造函数有一个子句,该子句以对构造函数中所有变量的相同量化,相同的假设开头,并为依赖于任意名称的前提归纳假设。

forall x y, arbitraryName x y -> P x y -> ...

最后,归纳定义的每个构造函数都必须以定义的类型族(在这种情况下为arbitraryName)的应用结束。该构造函数的子句末尾将函数P应用于相同的参数。

让我们回到arbitrary_constructor并假设它具有以下完整类型:

arbitrary_constructor : forall x y, arbitraryName x y -> arbitraryName (g x y) (h x y)

在这种情况下,归纳原理中的子句是:

 (forall x y, arbitraryName x y -> P x y -> P (g x y) (h x y))

在偶数的情况下,有一个具有以下形状的构造函数(我不记得这个名字):

even_constructor : forall x, even x -> even (S (S x))

因此生成的子句具有以下形状:

(forall x, even x -> P x -> P (S (S x)))

归纳假设IHn'与此子句中的P完全对应。

完全归纳原理具有以下形状。

forall P : nat -> Prop, P 0 -> 
   (forall x, even x -> P x -> P (S (S x))) ->
   forall n, even n -> P x

键入induction En时,将应用该定理。假设even n(其中n被普遍量化)与当时目标中的En文本匹配。事实证明,该假设的陈述是even n(此处的n已在目标中固定),因此通用量化的n用本地n从目标环境。然后,该策略尝试在出现此n的上下文中找到所有假设。在这种情况下,存在Enm,因此此假设用于定义将在其上实例化归纳原理的P。从某种意义上说,发生的事情是Emn被放回到目标的结论中,就像执行了revert Emn一样。

我们需要P neven (n + m) -> even m相同。最自然的解决方案是P等于函数fun x => even (x + m) -> even m

因此,在归纳证明的第二种情况下,引入了新的n'并将P应用于n'以给出归纳假设的内容:

(even (n' + m) -> even m)

P应用于S (S n'),以给出最终目标的内容。

 even (S (S n') + m) -> even m

现在,在调用induction策略时,假设Enm在上下文中,因此语句even (S (S n') + m)在道德上是Enm的后代以相同的名称放回上下文中。请注意,另一个目标中已经有一个名为Emn的假设,但陈述又有所不同。

您通常会问这个归纳假设是如何产生的,因为发生的事情实际上涉及几个操作。