Coq について学ぶために、オンライン ブックの「Software Foundations」を使用しています。
第 2 章では、「plus_assoc」定理を証明するよう求められます。
Theorem plus_assoc : forall n m p : nat, n + (m + p) = (n + m) + p.
以前に証明された 2 つの定理を使用します。
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)
次に plus_n_sm
p + S (m + n') = S (n' + m + p)
そして再び plus_n_sm
S (p + (m + n')) = S (n' + m + p)
plus_comm を 2 回使用して証明を終了し、次に 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.
即座に証明を終了します (与えられた文脈 (*) において) ?
明確にしていただきありがとうございます。
ファビアン・パイケ