在Software Foundations的Logical Foundations中,他们使用归纳的思想来证明事物。通过逐步进行以下证明,很难理解为什么可以用原始假设重写要证明的内容。为什么可以用归纳法得出的IHn'(n'= n'+ 0)来证明n = n + 0?
它们在本质上是否是相同的陈述?
Theorem plus_n_O : ∀ n:nat, n = n + 0.
Proof.
intros n. induction n as [| n' IHn'].
- (* n = 0 *) reflexivity.
- (* n = S n' *) simpl. rewrite <- IHn'. reflexivity. Qed.
答案 0 :(得分:3)
它们是相同的陈述,但数字不同:一个大约是n'
,另一个大约是n
,与目标中的S n'
相对应。归纳法就是通过知道某事物对S n'
成立,来证明某事物对n'
是有效的。它们数目不同的事实使得这一点变得微不足道。例如,即使两个语句“相同”,假设S n'
是奇数,也不可能显示n'
是奇数。
您询问了重写的机制。简化后,您的目标如下所示:
n' : nat
IHn' : n' = n' + O
---------------------------------------
S n' = S (n' + O)
致电rewrite
时,是在告诉Coq目标中的n' + O
替换为n'
。这导致了语句S n' = S n'
,这是一个简单的等式,可以通过自反性公理来消除。
修改
这是思考归纳的另一种方式。让我们暂时忘记induction
策略。有可能证明0 = 0 + 0
:
Lemma plus_0_0 : 0 = 0 + 0.
Proof. reflexivity. Qed.
我们可以证明有关任何具体自然数的类似陈述:
Lemma plus_1_0 : 1 = 1 + 0.
Proof. reflexivity. Qed.
Lemma plus_2_0 : 2 = 2 + 0.
Proof. reflexivity. Qed.
但是,我们可以以不同的方式获得这些证明,因此对所讨论数字的形状的假设较少。首先,我们证明以下条件语句。
Lemma plus_Sn_0 : forall n', n' = n' + 0 -> S n' = S n' + 0.
Proof. intros n' Hn'. simpl. rewrite <- Hn'. reflexivity. Qed.
这个引理陈述了归纳证明的归纳步骤。请注意,并不是说n = n + 0
适用于所有自然数n
,而是只适用于n = S n'
形式的数字只要 {{1 }}。我们知道这适用于n' = n' + 0
,因为我们已经在上面进行了证明。结合n' = 0
,我们可以获得plus_Sn_0
的另一个证明。
1 = 1 + 0
现在,我们知道该语句适用于Lemma plus_1_0' : 1 = 1 + 0.
Proof. apply plus_Sn_0. apply plus_0_0. Qed.
,我们可以对n' = 1
起到相同的作用:
n = 2
该证明不直接使用Lemma plus_2_0' : 2 = 2 + 0.
Proof. apply plus_Sn_0. apply plus_1_0'. Qed.
这一事实。这就是为什么我们证明基本情况与证明归纳步骤无关的事实:我们只需要知道感兴趣的数字的前身-在这种情况下,这个前身是0 = 0 + 0
。
自然地,我们可以将1
的证明扩展到plus_1_0'
的证明中:
plus_2_0'
更一般地说,给定任何自然数常数Lemma plus_2_0'' : 2 = 2 + 0.
Proof. apply plus_Sn_0. apply plus_Sn_0. apply plus_0_0. Qed.
,我们可以通过应用n
n = n + 0
次然后加上plus_Sn_0
次来证明n
无归纳 plus_0_0
。数学归纳法的原理将这种直观观察推论到表示自然数的 any 表达式n
,而不仅仅是常数。