我正在使用在线书籍“软件基础”来了解 Coq。
第二章要求证明“plus_assoc”定理:
Theorem plus_assoc : forall n m p : nat, n + (m + p) = (n + m) + p.
我利用了两个先前证明的定理:
Theorem plus_comm : forall n m : nat, n + m = m + n.
Theorem plus_n_Sm : forall n m : nat, S (n + m) = n + (S m).
我在 n 上使用归纳法证明了 plus_assoc 定理:
Proof.
intros n m p.
induction n as [ | n' ].
reflexivity.
rewrite plus_comm.
rewrite <- plus_n_Sm.
rewrite plus_comm.
rewrite IHn'.
symmetry.
rewrite plus_comm.
此时,上下文(*)为:
1 subgoals
case := "n = S n'" : String.string
n' : nat
m : nat
p : nat
IHn' : n' + (m + p) = n' + m + p
______________________________________(1/1)
p + (S n' + m) = S (n' + m + p)
我想用 plus_comm 来获取
p + (m + S n') = S (n' + m + p)
然后加上_n_sm
p + S (m + n') = S (n' + m + p)
然后又是 plus_n_sm
S (p + (m + n')) = S (n' + m + p)
并使用 plus_comm 完成证明两次然后 reflexivity
S (p + (n' + m)) = S (n' + m + p)
S (n' + m + p) = S (n' + m + p)
小问题是我不知道如何将 plus_comm 应用于 (S n' + m)。
最大的问题是:为什么要发行
apply plus_comm.
立即完成证明(在给定的上下文 (*) 中)?
提前感谢您的任何澄清!
法比安·皮克