我正在研究IndProp.v
的Software 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'
是如何生成的?
答案 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 n
与even (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
的假设,但陈述又有所不同。
您通常会问这个归纳假设是如何产生的,因为发生的事情实际上涉及几个操作。