Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Coq intro.

L
March 19, 2021

Coq intro.

L

March 19, 2021
Tweet

More Decks by L

Other Decks in Technology

Transcript

  1. 簡単な例 Variable Entity : Type. Variables human mortal : Entity

    -> Prop. Variable socrates : Entity. Hypothesis hm : forall x, human x -> mortal x. Hypothesis hs : human socrates. Theorem ms : mortal socrates. Proof. apply hm. apply hs. Qed. Print ms. Variable:ある型をもつ値をとりあ えず置く. Hypothesis:その命題を証明なし で認める. A->B:A型の変数を受け取ってB 型の値を返す関数. hm:人は必ず死ぬ. hs:ソクラテスは人だ. ms:ソクラテスは必ず死ぬ.
  2. Print ms. まで実行すると出力画面に ms = hm socrates hs : mortal

    socrates と表示される. 証明の本体は,「mortal socrates」型の値になっている.
  3. @命題論理 @Coq 命題 型 証明 値 含意(A ならば B) A

    -> B etc. このような対応を カリ― - ハワード同型対応 と呼ぶ.
  4. Coq の計算の仕組みは 型付きラムダ計算 に基づいている. 具体的には,CoC に Inductive 型を加えた CIC という計算理論を採用している.

    また,Coq の論理体系は始めの状態では直観主義論理. 古典論理の命題を証明したければ公理に排他律を加えればよい.
  5. Inductive Coq の整数型(nat) は Inductive 型として定義される. Inductive nat : Set

    := O : nat | S : nat -> nat Inductive 型は,その型が構成される方法を記述する. nat の場合は「O は nat,nat に S を作用させたものも nat,それだけが nat」
  6. Definition(再帰無しの定義) Definition 名前 (パラメータ : 型) : 型 := 定義.

    パラメータの型が推論できるときは型を省略可.
  7. 自然数(nat) の和はFixpoint で書かれている. Nat.add = fix add (n m :

    nat) {struct n} : nat := match n with | 0 => m | S p => S (add p m) end : nat -> nat -> nat {struct n} でどの変数について帰納 的か示してやると丁寧. match n with は場合分け 0 か,S に nat を作用させたものとし て表せるか
  8. fun 名前なし関数を作る. 例: Definition n_adder n : nat -> nat

    := fun m => n + m. n を受け取って,「nを加える関数」を返す n_adder
  9. Theorem Theorem 名前 (変数名 : 型) : 型. Proof. 証明

    Qed. Lemma, Corollary, Example などでも全く同じ(人間のためのエイリアス)
  10. 証明でつかえるタクティック(一部) intros:命題中の ”forall n” を ”ある n” に置き換える,“A -> B”

    を “A Ͱ B” に置き換える destruct:場合分けで定義されているものを場合ごとに分割する induction:帰納法.Inductive 型に対して有効. inversion:f x = f y という仮定から x = y を導けたり,仮定に False があれば証明終了で きたりする. rewrite:仮定をつかって示したい命題を書き換える. apply:仮定を適用する. simpl. / reflexivity.:自明な変形をする/自明な変形で証明を終わらせる.
  11. SSReflect で導入できるタクティック(一部) move=>:intros と同じ. move: :“A Ͱ B” を “A

    -> B” に置き換える. apply=>:apply した後 move=> する. apply::move: した後 apply する. case.:destruct と同じ. elim.:induction と同じ. by [].:reflexivity. と同じ.