如何使用先前的引理正确简化 coq 目标?
How does one properly simplify a coq goal with a previous lemma?
为什么我的证明的最后一行没有去掉一个后继者而不是添加一个。
注意:我在课堂之外做这些练习,不要容忍人们用它来欺骗硬件,我只是不知道还能在哪里问。
来自皮尔斯的战术章节。
Theorem plus_n_n_injective : forall n m,
n + n = m + m ->
n = m.
Proof.
intros n. induction n as [| n'].
intros.
simpl in H.
destruct m.
reflexivity.
discriminate.
intros.
rewrite <- plus_n_Sm in H.
destruct m.
discriminate.
rewrite <- plus_n_Sm in H.
apply S_injective in H.
simpl in H.
apply S_injective in H.
apply S_injective.
这些辅助词用在什么地方
Theorem S_injective : forall (n m : nat),
S n = S m ->
n = m.
Proof.
intros n m H1.
assert (H2: n = pred (S n)). { reflexivity. }
rewrite H2. rewrite H1. reflexivity.
Qed.
Theorem plus_n_Sm : forall n m : nat,
S (n + m) = n + (S m).
Proof.
intros n m. induction n as [| n' IHn'].
simpl.
reflexivity.
simpl.
rewrite -> IHn'.
reflexivity.
Qed.
如果你看一下S_injective
的声明:
Theorem S_injective : forall (n m : nat),
S n = S m ->
n = m.
你会看到它说要证明 n = m
就足以证明 S n = S m
。
在你应用之前,你要证明S n' = S m
,然后你说你只需要证明S (S n') = S (S m)
。因为目标中的apply
在做一些逆向思考
你想要的是能够说 n = m -> S n = S m
。您可以像以前那样手动证明引理,或者您可以使用 f_equal
策略,该策略通常适用于从 n = m
证明 f n = f m
对于任何 f
(大致)。
为什么我的证明的最后一行没有去掉一个后继者而不是添加一个。 注意:我在课堂之外做这些练习,不要容忍人们用它来欺骗硬件,我只是不知道还能在哪里问。 来自皮尔斯的战术章节。
Theorem plus_n_n_injective : forall n m,
n + n = m + m ->
n = m.
Proof.
intros n. induction n as [| n'].
intros.
simpl in H.
destruct m.
reflexivity.
discriminate.
intros.
rewrite <- plus_n_Sm in H.
destruct m.
discriminate.
rewrite <- plus_n_Sm in H.
apply S_injective in H.
simpl in H.
apply S_injective in H.
apply S_injective.
这些辅助词用在什么地方
Theorem S_injective : forall (n m : nat),
S n = S m ->
n = m.
Proof.
intros n m H1.
assert (H2: n = pred (S n)). { reflexivity. }
rewrite H2. rewrite H1. reflexivity.
Qed.
Theorem plus_n_Sm : forall n m : nat,
S (n + m) = n + (S m).
Proof.
intros n m. induction n as [| n' IHn'].
simpl.
reflexivity.
simpl.
rewrite -> IHn'.
reflexivity.
Qed.
如果你看一下S_injective
的声明:
Theorem S_injective : forall (n m : nat),
S n = S m ->
n = m.
你会看到它说要证明 n = m
就足以证明 S n = S m
。
在你应用之前,你要证明S n' = S m
,然后你说你只需要证明S (S n') = S (S m)
。因为目标中的apply
在做一些逆向思考
你想要的是能够说 n = m -> S n = S m
。您可以像以前那样手动证明引理,或者您可以使用 f_equal
策略,该策略通常适用于从 n = m
证明 f n = f m
对于任何 f
(大致)。