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

Agda_1.pdf

 Agda_1.pdf

3e5cee913e4baa43147a52871b5bba8b?s=128

zeronosu77108

April 29, 2019
Tweet

Transcript

  1. Agda入門会 ʙ自然数を定義して遊び倒すʙ zeronosu77108 2019-04-29

  2. Agda入門会 •Agda で自然数を定義する
 •自然数の加法,減法,乗法を定義する
 •加法において可換則が成り立つことを 証明する
 •後はノリ

  3. Agda とは •定理証明器
  数学的な証明を検証するための言語 •関数型の言語のように書いていって
 証明します •Haskell ライク

  4. 自然数とは #1 •ペアノの公理 によって定義できる 1. 自然数 0 が存在する 2. 任意の自然数

    a にはその後者が存在する 3. 0 はいかなる自然数の後者でもない 4. 異なる自然数は異なる後者を持つ 5. 0がある性質を満たし
 「a がその性質を満たす」ならば
 「 suc(a) もその性質を満たす」とき
 すべての自然数はその性質を満たす ※ここでは自然数に0を含めるとします
  5. 自然数とは #2 1. 自然数 0 が存在する • 0 という自然数が存在する

  6. 自然数とは #3 2. 任意の自然数 a にはその後者 (successor)が存在する • 自然数 0

    には,その後者 (suc 0) = 1
 がある. ※(suc 0) も自然数 1,2,3 という数字を知らないフリをして
 定義していると考えても良い 0 (suc 0) (suc (suc 0)) ...
  7. 自然数とは #4 3. 0は いかなる自然数の後者でもない • 0 が自然数のスタートである このような自然数 a

    は存在しない (suc a) 0 (suc 0) ...
  8. 自然数とは #6 4. 異なる自然数は異なる後者を持つ • 0 が自然数のスタートである a (suc a)

    ... b
  9. 自然数とは #6 4. 異なる自然数は異なる後者を持つ • 0 が自然数のスタートである (suc a) =

    (suc b) → a = b a (suc a) ... b
  10. 自然数とは #5 5. 0がある性質を満たし「a がその性質を満た す」ならば「 suc(a) もその性質を満たす」 ときすべての自然数はその性質を満たす

  11. 自然数とは #5 5. 0がある性質を満たし「a がその性質を満た す」ならば「 suc(a) もその性質を満たす」 ときすべての自然数はその性質を満たす 1.

    P(0) ͕੒ΓཱͭࣄΛࣔ͢ɻ
 2. ೚ҙͷࣗવ਺ k ʹରͯ͠ɺ
 ʮP(k) 㱺 P(k + 1)ʯ͕੒ΓཱͭࣄΛࣔ͢ɻ
 3. Ҏ্ͷٞ࿦͔Β೚ҙͷࣗવ਺ n ʹ͍ͭͯ
 P(n) ͕੒ΓཱͭࣄΛ݁࿦͚ͮΔɻ
  12. 自然数とは #5 5. 0がある性質を満たし「a がその性質を満た す」ならば「 suc(a) もその性質を満たす」 ときすべての自然数はその性質を満たす 帰納法

    1. P(0) ͕੒ΓཱͭࣄΛࣔ͢ɻ
 2. ೚ҙͷࣗવ਺ k ʹରͯ͠ɺ
 ʮP(k) 㱺 P(k + 1)ʯ͕੒ΓཱͭࣄΛࣔ͢ɻ
 3. Ҏ্ͷٞ࿦͔Β೚ҙͷࣗવ਺ n ʹ͍ͭͯ
 P(n) ͕੒ΓཱͭࣄΛ݁࿦͚ͮΔɻ
  13. Agda による自然数の定義 data Nat : Set where zero : Nat

    suc : Nat → Nat •Nat型 の zero がある
 •Nat型 を受け取って
 Nat型 を返す suc → は “\->” で入力できる
  14. 幸せになれる定義 one = (suc zero) two = (suc one) three

    = (suc two) four = (suc three) five = (suc four) six = (suc five)
  15. 加法を定義しよう #1 •関数名と型を書く •関数をパターンマッチで定義する _+_ : Nat → Nat →

    Nat zero + y = y suc x + y = suc (x + y) Nat を2つ受け取り 1つの Nat を返す _+_ は + の両辺に引数を取る
 (引数の位置)
  16. 加法を定義しよう #2 _+_ : Nat → Nat → Nat zero

    + y = y suc x + y = suc (x + y) 3 + 2 1 + (2 + 2) 1 + (1 + 2) 1 + (0+ 2) 1 + 2 3 4 5
  17. 乗法を定義しよう •かけ算は足し算の繰り返し 2 * 3 2 + (2 * 2)

    2 + (2 * 1) 2 + (2 * 0) _*_ : Nat → Nat → Nat x * zero = zero x * suc y = x + (x * y)
  18. 減法を定義しよう •負になる場合は zero としよう •ヒント •suc x - suc y

    は, (1 + x) - (1 + y) _-_ : Nat → Nat → Nat zero - y = zero suc x - zero = suc x suc x - suc y = x - y
  19. 等しいということを定義しよう •“等しい”という定義 •refl に当てはまるかどうかで判断でき る data _≡_ {A : Set}

    : A → A → Set where refl : {x : A} → x ≡ x ≡ は “\==” で入力できる
  20. 可換則が成り立つ証明 #1 add-comm : (x y : Nat) → (x

    + y) ≡ (y + x) add-comm x y = ? 証明も同じように パターンマッチで書いていきます
  21. 可換則が成り立つ証明 #2 add-comm : (x y : Nat) → (x

    + y) ≡ (y + x) add-comm zero zero = refl add-comm zero (suc y) = ? add-comm (suc x) y = ? add-comm zero zero は refl 他は証明進めるのが難しそう
  22. 可換則が成り立つ証明 #3 add-comm zero (suc y) = ? suc を外して

    add-comm zero y が refl になることを利用できると嬉しい cong : {A B : Set} → {x y : A}    → (f : A → B) → x ≡ y → f x ≡ f y refl な関係があったとき
 何か関数を適用しても refl となる
  23. 可換則が成り立つ証明 #4 cong : {A B : Set} → {x

    y : A}    → (f : A → B) → x ≡ y → f x ≡ f y cong f refl = refl 関数f と refl(な関係)を受け取って refl を返す add-comm : (x y : Nat) → (x + y) ≡ (y + x) add-comm zero zero = refl add-comm zero (suc y) = cong suc (add-comm zero y) add-comm (suc x) y = ?
  24. 便利なやつ •C-c C-,
  Goal type and context •C-c C-.
  Goal

    type, context and inferred type この辺で証明のゴールとか見ることができる
  25. ゴール なるほど… 2段階の操作が要りそう (suc x + y) → suc (y+

    x)→ (y + suc x) Goal: suc (x + y) ≡ (y + suc x) ———————————————— y : Nat x : Nat
  26. trans •x ≡ y → y ≡ z → x

    ≡ z trans : {A : Set} {x y z : A} → x ≡ y → y ≡ z → x ≡ z trans refl refl = refl x ≡ y が成り立つ → refl y ≡ z が成り立つ → refl ⏬ x ≡ z が成り立つ
  27. trans •x ≡ y → y ≡ z → x

    ≡ z trans : {A : Set} {x y z : A} → x ≡ y → y ≡ z → x ≡ z trans refl refl = refl (suc x + y) ≡ suc (y+ x) suc (y + x) ≡ (y + suc x) (suc x + y) ≡ (y + suc x)
  28. 可換則が成り立つ証明 #5 add-comm : (x y : Nat) → (x

    + y) ≡ (y + x) add-comm zero zero = refl add-comm zero (suc y) = cong suc (add-comm zero y) add-comm (suc x) y = trans ? ? ?0 : (suc x + y) ≡ _y_66 ?1 : _y_66 ≡ (y + suc x) _y_66 : Nat よく分からないけど上手いきそう
  29. add-comm : (x y : Nat) → (x + y)

    ≡ (y + x) add-comm zero zero = refl add-comm zero (suc y) = cong suc (add-comm zero y) add-comm (suc x) y =
 trans (cong suc (add-comm x y) ? 可換則が成り立つ証明 #6 Goal: suc (y + x) ≡ (y + suc x) ———————————————— y : Nat x : Nat suc (y + x) ≡ (y + suc x) を示せば行けそう
  30. add-comm : (x y : Nat) → (x + y)

    ≡ (y + x) add-comm zero zero = refl add-comm zero (suc y) = cong suc (add-comm zero y) add-comm (suc x) y =
 trans (cong suc (add-comm x y) (add-suc y x) 可換則が成り立つ証明 #7 加法が可換であることが証明できた add-suc : (x y : Nat) →suc (x + y) ≡ (x + (suc y)) add-suc zero y = refl add-suc (suc x) y = cong suc (add-suc x y)
  31. 次は…? •加法の結合則 •乗法 •可換測 •結合則 •分配則 (x + y) +

    z = x + (y + z) (x + y) * z = (x * z) + (y * z)