Library destruct
destruct
case term
1 subgoal ______________________________________(1/1) forall b : bool, negb (negb b) = b最初は、Goal に与えた命題がそのまま証明すべき命題として提示されています。
Show Proof.
?Goalもちろん、この最初の時点の証明項は ?Goal です。
intro b.
1 subgoal b : bool ______________________________________(1/1) negb (negb b) = bCoq の case では引数に term を指定する必要があります。 ここでは b を指定したいのですが、 そのためには前提に b がある(外側で b が束縛されている)必要があります。 そのため、intro で b を前提に動かします。
Show Proof.
(fun b : bool => ?Goal)
case b.
2 subgoals b : bool ______________________________________(1/2) negb (negb true) = true ______________________________________(2/2) negb (negb false) = falsecase b により、b で場合分けを行います。 b は bool なので true か false のどちらかであり、 それぞれの場合についての命題の証明が必要だと提示されています。
Show Proof.
(fun b : bool => if b as b0 return (negb (negb b0) = b0) then ?Goal else ?Goal0)if が表示されてしまったので、Display all low-level contents を有効にして Show Proof をやりなおしましょう。
(fun b : bool => match b as b0 return (@eq bool (negb (negb b0)) b0) with | true => ?Goal@{b:=b} | false => ?Goal0@{b:=b} end)case b をやる前には ?Goal だったところに match 式が埋められています。 つまり、case b が match 式を構築したことがわかります。 この match 式は match b as ... と書かれているので、b で分岐します。 true の場合と false の場合それぞれ分岐の中身は ?Goal@{b:=b} と ?Goal0@{b:=b} と 書かれており、これらは subgoal がふたつあることに対応しています。
reflexivity.
reflexivity.
Show Proof.
reflexivity.
Show Proof.
(fun b : bool => if b as b0 return (negb (negb b0) = b0) then eq_refl else eq_refl)
(fun b : bool => match b as b0 return (@eq bool (negb (negb b0)) b0) with | true => @eq_refl bool true | false => @eq_refl bool false end)
Qed.