いくつかのtacticについて

ではいくつかのtacticについて、その簡単な使い方を説明しようと思います。 また、当然Coq上で実際に使うわけですから、λ式や型の表記はCoqの表記で 書こうと思います。

applyについて

head typeとfinal type

まず次のような型を考えます。

  1.     forall (v:A)  ... (v:A), B

ただし、Bはforallでは始まらない型とします。このとき、

  1.     forall (v:A)  ... (v:A), B    (k=1,...,n)

を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

  1.      H : A -> forall x y : D, B x y -> C x y

ですが、これを略記せずに書くと

  1.      H : forall p : A, forall x y : D, forall q : B x y, C x y

となります。よって、 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の証明 を見てください。

もどる