いくつかのtacticについて
ではいくつかのtacticについて、その簡単な使い方を説明しようと思います。 また、当然Coq上で実際に使うわけですから、λ式や型の表記はCoqの表記で 書こうと思います。
applyについて
head typeとfinal type
まず次のような型を考えます。
ただし、Bはforallでは始まらない型とします。このとき、
をrank kのhead typeと言います。そして、Bをfinal typeと言うのです。 Bはrank n+1のhead typeと言うこともあります。
自由変数に、同じ型の式を代入したものをinstanceと言いますが、 subgoalが、仮定Hのhead typeのinstanceのとき、apply H.で証明をさかのぼる ことができます。
apply命令で証明をさかのぼる様子を具体例で見てみましょう。まずはすでに 見たOrtoAndでの例です。それは、
OrtoAnd < clear b. 1 subgoal A : Prop B : Prop C : Prop D : Prop H : A \/ B -> C a : A ============================ C OrtoAnd < apply H. 1 subgoal A : Prop B : Prop C : Prop D : Prop H : A \/ B -> C a : A ============================ A \/ B OrtoAnd < |
でした。
仮定のH : A \/ B -> C
(画面上のH : A \/ B -> C)
ですが、これは略記せずに
書けば、
H : (forall x:A \/ B, C)
です。
よって、C
はH
のrank 2のhead typeのinstance
(C
の中に変数x
はないので、変数x
に何かを代入してもしなくても同じ)なので、apply H.を適用できるわけ
です。証明をさかのぼる様子は既に説明した通りです。
次の例です。とても単純な例も見ておきましょう。次の定理をCoqで実行して 証明してみてください。
Section ML.
Variable D : Set.
Variable P : D -> Prop.
Variable a : D.
Theorem exam1 : (forall x:D, P x) -> P a.
Proof.
intro H.
apply H.
Qed.
End ML.
apply H.の実行部分だけ以下に表示します。
exam1 < intro H. 1 subgoal D : Set P : D -> Prop a : D H : forall x : D, P x ============================ P a exam1 < apply H. Proof completed. exam1 < Qed. |
P a は、 H : (forall x : D, P x) のrank 2のhead typeのinstanceです。この場合は、 apply H.を適用するだけで証明は終了しました。
少し複雑(そう)な例も見ましょう。次の定理をCoqで実行して 証明してみてください。
Section ML.
Variable D : Set.
Variable A : Prop.
Variable B C : D -> D -> Prop.
Theorem exam2 : forall a b:D, A -> B a b ->
(A -> forall x y:D, B x y -> C x y) -> C a b.
Proof.
intros a b.
intros Ha Hb H.
apply H.
assumption.
assumption.
Qed.
End ML.
applyの実行部分だけ以下に表示します。
exam2 < intros Ha Hb H. 1 subgoal D : Set A : Prop B : D -> D -> Prop C : D -> D -> Prop a : D b : D Ha : A Hb : B a b H : A -> forall x y : D, B x y -> C x y ============================ C a b exam2 < apply H. 2 subgoals D : Set A : Prop B : D -> D -> Prop C : D -> D -> Prop a : D b : D Ha : A Hb : B a b H : A -> forall x y : D, B x y -> C x y ============================ A subgoal 2 is: B a b exam2 < assumption. |
ここでapplyを適用している仮定 H は
ですが、これを略記せずに書くと
となります。よって、 C a b は H のfinal typeのinstanceになります。この C a b にapply H.が適用される様子を考えて見ましょう。おそらく、 H のfinal typeの C x y とsubgoalの C a b をくらべて、 x が a 、 y が b になればよいと判断し、その上で残った型 A 、 D 、 B a b のうち、 A と B a b が新しいsubgoalになっています。apply H.適用前のsubgoalが C a b でしたから、 a : D および b : D は、型とその型を取る式が完全に定まるので、 D は新しいsubgoalにしなくて良かったのだと思います。
論理式の形から
今度は視点を変えて説明しましょう。実際の証明の場面では、仮定やsubgoalにある (型である)論理式をみて適用するtacticを決めるわけなので、その論理式の 形で分けて説明することにします。
論理式が P -> Q の形のとき
論理式が
forall x : P, Q(x)
の形のとき
ここで
Q(x)
というのは、自由変数として文字
x
を含んだ型のことを表している。
論理式が P /\ Q の形のとき
論理式が P \/ Q の形のとき
論理式が exists x : P, Q の形のとき
論理式が
~ P
の形のとき
「
~ P
」は
「
P
の否定」のことですが、Coqでは「
P -> False
」の略記です。
False
は定項です。意味は「成立しない命題」と思っておけば大丈夫です。
とりあえずは
False
の定義は気にしなくてもいいと思います。
論理式が a = b の形のとき
以上簡潔に表にすると
論理記号 | -> | forall | /\ | \/ | exists | ~ | = |
仮定 | apply | apply | elim | elim | elim | elim | rewrite |
subgoal | intro | intro | split | left right |
exists v | intro | reflexivity symmetry transitivity |
その他
tacticの区切り記号「;」について
複数のtacticを記号「;」で区切って並べることができるのですが、 ただ並べるのとはちょっと違います。具体的には ここの定理Syllogeqの証明の解説を読んで ください。(定理Syllogeqの証明の中に出てくるSyllogは、定理Syllogeqのすぐ 上で証明されている定理です。)
applyにつけるwithについて
apply命令は、subgoalをhead typeとするような仮定を適用するわけですが、 そのとき、仮定の中の束縛変数を何にするかCoqが判断できないときがあります。 これも、具体的には ここの定理Syllogeqの証明の解説を読んで ください。(定理Syllogeqの証明の中に出てくるSyllogは、定理Syllogeqのすぐ 上で証明されている定理です。)
withを使わずに束縛変数を指定する方法について
withをつかってもapply命令がうまくいかないこともありました。そこで、withを 使わない方法も紹介しておこうと思います。上記のwithの解説に続けて、 ここで具体的に説明してあります。
unfoldについて
いわゆる「定義に戻れ」をしなくてはならないときもあります。その命令 がunfoldです。具体的な説明はAndABABの証明 にあります。
exists vへの注意
証明中にexists v.命令を実行するときは、仮定の中にvなるλ式がなくては なりません。あるいは、仮定の中にある式からvを作ることができてもいいようです。 具体例はDm_nexの証明 を見てください。
cut命令
「->」(ならば)に関する証明のさかのぼり方の一種です。これは、subgoalが Bのとき、cut A.命令を実行すると、subgoalがAとA -> Bの2つになります。つまり、 「Bを証明するには、AとA -> Bの2つを証明すればよい」という考えに基づく さかのぼり方です。証明の具体例はAllandの証明 を見てください。