とにかくまずは動かして感じを掴んでみましょう。

正しくインストールされていれば CoqIDE が普通のアプリケーションとして 起動できるはずです。

Ubuntuの場合

Ubuntuの場合

起動したところ

起動したところ

試しに次のスクリプト

Require Import ssreflect.

Section Tutorial.

  Variable A B C : Prop.

  Lemma HilbertS : (A -> B -> C) -> (A -> B) -> A -> C.
  Proof.
    move => g.
    move => f.
    move => x.
    apply g.
    apply x.
    apply f.
    apply x.
  Qed.

End Tutorial.

をコピペして、左上の下向き矢印アイコンをポチポチ押してみてください。

入力したところ

入力したところ

ポチポチ

ポチポチ

緑の範囲選択が Qed. に到達して右下の窓に HilbertS is defined と表示されたら証明完了です。

証明完了!

証明完了!

解説

まずは全体の説明をします。

次に先程入力したスクリプト

Require Import ssreflect.

Section Tutorial.

  Variable A B C : Prop.

  Lemma HilbertS : (A -> B -> C) -> (A -> B) -> A -> C.
  Proof.
    move => g.
    move => f.
    move => x.
    apply g.
    apply x.
    apply f.
    apply x.
  Qed.

End Tutorial.

の各文を見て行きましょう。

背景

上でみたような命題の証明の背景にあるのは カリー=ハワード同型対応 と呼ばれる証明論と型システムの間の対応です。 ここでは型システムとして 型付きラムダ計算 を考えます。

今後の解説に必要な範囲で簡単に説明しておきます。 文法は Coq のものと揃えておきます。

a : A と書いたら「a は型 A を持つ」と読みます。 型付きラムダ計算は2つの公理からなります。

カリー=ハワード同型対応にしたがって型付きラムダ計算と証明論を比較してみます。 参考に集合論も加えておきます。

このあたりを踏まえて HilbertS の証明を見てみましょう。

HilbertS の証明が完了している段階で Escape (もしくは Navigation から Show Query Pane) を押して、

新規作成っぽいボタンを押して、 PrintHilbertS と入力して Ok を押してみてください。

そこに表示されている

fun (g : A -> B -> C) (f : A -> B) (x : A) => g x (f x)

がさっき書いた証明に対応するプログラム (ラムダ項) です。 これは

fun g : A -> B -> C => fun f : A -> B => fun x : A => g x (f x)

の略記です。 関数適用は左結合なので g x (f x) は括弧をつけると (g x) (f x) となります。

型付きラムダ計算の公理から、 上の式の型を確認してみましょう。

  1. g : A -> B -> C, f : A -> B, x : A を仮定します。

  2. 関数適用により f x : B が得られます。

  3. 関数適用により g x : B -> C が得られます。

  4. 関数適用により g x (f x) : C が得られます。

  5. 関数抽象により仮定 x : A を外して fun x : A => g x (f x) : A -> C が得られます。

  6. 関数抽象により仮定 f : A -> B を外して fun f : A -> B => fun x : A => g x (f x) : (A -> B) -> A -> C が得られます。

  7. 関数抽象により仮定 g : A -> B -> C を外して fun g : A -> B -> C => fun f : A -> B => fun x : A => g x (f x) : (A -> B -> C) -> (A -> B) -> A -> C が得られます

以上の議論から

fun (g : A -> B -> C) (f : A -> B) (x : A) => g x (f x)

は型

(A -> B -> C) -> (A -> B) -> A -> C

を持つことが分かりました。 カリー=ハワード同型対応より、 命題 (A -> B -> C) -> (A -> B) -> A -> C の証明が得られました。

Coq で書いた証明は今行った議論を逆にたどりながら構成しているのがわかるでしょうか。


Top Next