最初に25個と決めて、でもよく考えると12/24で終了すべき。都合が良いのでここで2つ紹介して帳尻を合わせます。
left は constructor 1 、right は constructor 2 の意味で、実は goal が A \/ B の場合に限らず、コンストラクタが2通りあってどちらかを明示的に指定したい時に使えます。
大抵そういう場合は左右と対応している訳ですが、例えば nat とかも left が O を指すはず。同様に n:nat に対して destruct n ではなく split とかも使えるはず。単に他人に判りにくいだけですが。
今回は sumbool について left, right を使う例です。やはり左右に対応しています。
Coq < Lemma Sample_of_left_right : forall n:nat, {n = 0} + {n <> 0}.
1 subgoal
============================
forall n : nat, {n = 0} + {n <> 0}
Sample_of_left_right < induction n.
2 subgoals
============================
{0 = 0} + {0 <> 0}
subgoal 2 is:
{S n = 0} + {S n <> 0}
Sample_of_left_right < left.
2 subgoals
============================
0 = 0
subgoal 2 is:
{S n = 0} + {S n <> 0}
Sample_of_left_right < reflexivity.
1 subgoal
n : nat
IHn : {n = 0} + {n <> 0}
============================
{S n = 0} + {S n <> 0}
Sample_of_left_right < right.
1 subgoal
n : nat
IHn : {n = 0} + {n <> 0}
============================
S n <> 0
Sample_of_left_right < intro.
1 subgoal
n : nat
IHn : {n = 0} + {n <> 0}
H : S n = 0
============================
False
Sample_of_left_right < inversion H.
Proof completed.
Sample_of_left_right < Qed.
No comments:
Post a Comment