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

Agda_1.pdf

 Agda_1.pdf

zeronosu77108

April 29, 2019
Tweet

More Decks by zeronosu77108

Other Decks in Technology

Transcript

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

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

    には,その後者 (suc 0) = 1
 がある. ※(suc 0) も自然数 1,2,3 という数字を知らないフリをして
 定義していると考えても良い 0 (suc 0) (suc (suc 0)) ...
  3. 自然数とは #5 5. 0がある性質を満たし「a がその性質を満た す」ならば「 suc(a) もその性質を満たす」 ときすべての自然数はその性質を満たす 1.

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

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

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

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

    Nat zero + y = y suc x + y = suc (x + y) Nat を2つ受け取り 1つの Nat を返す _+_ は + の両辺に引数を取る
 (引数の位置)
  8. 加法を定義しよう #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
  9. 乗法を定義しよう •かけ算は足し算の繰り返し 2 * 3 2 + (2 * 2)

    2 + (2 * 1) 2 + (2 * 0) _*_ : Nat → Nat → Nat x * zero = zero x * suc y = x + (x * y)
  10. 減法を定義しよう •負になる場合は 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
  11. 可換則が成り立つ証明 #1 add-comm : (x y : Nat) → (x

    + y) ≡ (y + x) add-comm x y = ? 証明も同じように パターンマッチで書いていきます
  12. 可換則が成り立つ証明 #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 他は証明進めるのが難しそう
  13. 可換則が成り立つ証明 #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 となる
  14. 可換則が成り立つ証明 #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 = ?
  15. 便利なやつ •C-c C-,
  Goal type and context •C-c C-.
  Goal

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

    x)→ (y + suc x) Goal: suc (x + y) ≡ (y + suc x) ———————————————— y : Nat x : Nat
  17. 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 が成り立つ
  18. 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)
  19. 可換則が成り立つ証明 #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 よく分からないけど上手いきそう
  20. 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) を示せば行けそう
  21. 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)