基本上,我想证明以下结果:
Lemma nat_ind_2 (P: nat -> Prop): P 0 -> P 1 -> (forall n, P n -> P (2+n)) ->
forall n, P n.
这就是所谓的双重归纳的复发方案。
我试图证明它应用感应两次,但我不确定我会以这种方式得到它。实际上,我在那时陷入困境:
Proof.
intros. elim n.
exact H.
intros. elim n0.
exact H0.
intros. apply (H1 n1).
答案 0 :(得分:9)
实际上,有一个更简单的解决方案。 fix
允许对任何子项进行递归(也称为归纳),而nat_rect
仅允许递归nat
的直接子项。 nat_rect
本身定义为fix
,而nat_ind
只是nat_rect
的特例。
Definition nat_rect_2 (P : nat -> Type) (f1 : P 0) (f2 : P 1)
(f3 : forall n, P n -> P (S (S n))) : forall n, P n :=
fix nat_rect_2 n :=
match n with
| 0 => f1
| 1 => f2
| S (S m) => f3 m (nat_rect_2 m)
end.
答案 1 :(得分:4)
@ Rui的fix
解决方案很普遍。这是一个使用以下观察的替代解决方案:在精神上证明这个引理时,您使用更强的归纳原理。例如,如果P保持两个连续的数字,则很容易使其保持下一对:
Lemma nat_ind_2 (P: nat -> Prop): P 0 -> P 1 -> (forall n, P n -> P (2+n)) ->
forall n, P n.
Proof.
intros P0 P1 H.
assert (G: forall n, P n /\ P (S n)).
induction n as [ | n [Pn PSn]]; auto.
split; try apply H; auto.
apply G.
Qed.
在这里,G证明了一些多余的东西,但是为它调用感应策略为近乎平凡的证据带来了足够的背景。
答案 2 :(得分:1)
我认为有充分理由的归纳是必要的。
Require Import Arith.
Theorem nat_rect_3 : forall P,
(forall n1, (forall n2, n2 < n1 -> P n2) -> P n1) ->
forall n, P n.
Proof.
intros P H1 n1.
apply Acc_rect with (R := lt).
info_eauto.
induction n1 as [| n1 H2].
apply Acc_intro. intros n2 H3. Check lt_n_0. Check (lt_n_0 _). Check (lt_n_0 _ H3). destruct (lt_n_0 _ H3).
destruct H2 as [H2]. apply Acc_intro. intros n2 H3. apply Acc_intro. intros n3 H4. apply H2. info_eauto with *.
Defined.
Theorem nat_rect_2 : forall P,
P 0 ->
P 1 ->
(forall n, P n -> P (S (S n))) ->
forall n, P n.
Proof.
intros ? H1 H2 H3.
induction n as [n H4] using nat_rect_3.
destruct n as [| [| n]].
info_eauto with *.
info_eauto with *.
info_eauto with *.
Defined.