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

帰納型とパターンマッチングの紹介

 帰納型とパターンマッチングの紹介

Joken & Zli LT (2023-03-19) で発表したLTのスライドです。

帰納型とパターンマッチの軽い紹介をした上で、帰納型独特のパターンマッチによる再帰や、コンストラクタが1つもない型に対するパターンマッチを紹介しました。

soukouki

March 19, 2023
Tweet

More Decks by soukouki

Other Decks in Technology

Transcript

  1. 帰納型とパターンマッチングの紹介
    Joken&Zli 合同LT 2023-03-19
    sou7 / soukouki
    1

    View Slide

  2. sou7っていいます
    春から学部3年
    GDSC(Google Developer Student
    Community) Aizu Leadです
    Coq触ったりしてます
    Factorio楽しい (^_^)
    鉄オタです
    先週の水曜に羽沢横浜国大駅とか新横
    浜駅とか行ってきました
    つい昨日、それらを結ぶ相鉄新横浜
    線・東急新横浜線が開業しました
    .                 やぁ >
    2

    View Slide

  3. Twitter : @sou7___
    Github : @soukouki
    某SNS : 「レターパックで現金送れはすべ
    て詐欺」
    3

    View Slide

  4. 最近やったこと
    PPL2023(第25回プログラミングおよびプログ
    ラミング言語ワークショップ) に参加してきま
    した!
    ワークショップって言うから実際に手を動
    かしたりするのかな?と思っていたら違っ

    興味ある分野について研究してる研究室が
    いくつか分かった
    無知の知
    <- 実際に聞けた
    4

    View Slide

  5. 今日話すこと
    Coqをベースとした帰納型とパターンマッチングとその応用
    帰納型(Inductive Type)の話
    パターンマッチングの話
    ↑2つを使ったFalseの話
    好きなことをダラダラ書いてたら後半わりと難しそうな感じになったので、雰囲
    気だけでも伝わったら嬉しいです!
    5

    View Slide

  6. Coqってなんぞや
    純粋関数型のプログラミング言語であり、定理証明支援系
    6

    View Slide

  7. 帰納型ってなんぞや
    Q. 帰納型(Inductive Type)って聞いたことある人は手を上げてください!
    (みんな思ってそうなこと)
    聞いたこと無い・・
    数学的帰納法・・・?
    会津大の入試では毎回数学的帰納法が問われるので、1年生はお馴染みかも
    7

    View Slide

  8. 実際の帰納型を使ったコードの例(曜日)
    Inductive day : Type :=
    | monday : day
    | tuesday : day
    | wednesday : day
    | thursday : day
    | friday : day
    | saturday : day
    | sunday : day.
    雰囲気としてはC言語のenumだったり、Haskellその他にある列挙型に似ています。
    このday型はmondayからsundayのうちのどれかの値を持ちます!
    8

    View Slide

  9. 実際の帰納型を使ったコードの例(ピアノ数)
    Inductive nat : Type :=
    | O : nat
    | S : nat -> nat.
    上の例では、natという型を定義しています。natはSとOというコンストラクタがあり
    ます。
    Sの場合、引数にnat型の値を1つ取って、nat型の値を返します。
    こんなふうに、帰納型は自分自身の型を各コンストラクタの引数に取れます。
    9

    View Slide

  10. パターンマッチング
    Q. パターンマッチングは好きですか?
    選択肢
    好き
    YES
    はい
    10

    View Slide

  11. 「パターンマッチングは好きか」という質問に100%の方が賛同するという結果が出ま
    した!
    パターンマッチングを用いた関数の例(曜日)
    Definition next_weekday (d:day) : day :=
    match d with
    | monday => tuesday
    | tuesday => wednesday
    | wednesday => thursday
    | thursday => friday
    | friday => monday
    | saturday => monday
    | sunday => monday
    end.
    この関数は、曜日を引数に取って、その次の曜日を返します。
    パターンマッチングでは、if式などと違い、すべての値のパターンを網羅しないとエラ
    ーが出ます。 11

    View Slide

  12. パターンマッチングを用いた関数の例(ピアノ数)
    Definition is_even (n:nat) : bool :=
    match n with
    | O => true
    | S O => false
    | S (S n') => is_even n'
    end.
    この関数は、nat型の値を引数に取って、その値が偶数かどうかを返します。
    このパターンマッチでは、nat型の値nに対して、3つのパターンに分岐させていま
    す。
    12

    View Slide

  13. パターンマッチングを用いた関数の例(ピアノ数)(再掲)
    Definition is_even (n:nat) : bool :=
    match n with
    | O => true
    | S O => false
    | S (S n') => is_even n'
    end.
    O => true は 0の場合に対応してます
    S O => false は 1の場合に対応してます
    S (S n') => is_even n' は 2以上の場合に対応してます
    例えば、ピアノ数では3は S (S (S O)) と表現されます
    S (S n') を S (S (S O)) にマッチさせると、 n' の部分に S O =1が入ります、
    この n' を再帰的に is_even に渡すことで、偶数判定がうまいこと出来ます。
    13

    View Slide

  14. 帰納型をもうちょっと活用してみる
    ピアノ数ではSとOの2つのコンストラクタで定義していました。
    => もっと減らしてみたくないですか?
    14

    View Slide

  15. 1つのコンストラクタを持つ場合(cap)
    Inductive Cap (A B: Ensemble): Ensemble :=
    Cap_intro: forall x: T, x \in A -> x \in B -> x \in (Cap A B).
    (今までの例と違ってちょっと応用的な感じになってしまったんですが、出来ます!)
    15

    View Slide

  16. じゃぁ、0個の場合は・・・?
    16

    View Slide

  17. できらぁ!
    17

    View Slide

  18. 0個のコンストラクタを持つ場合(False)
    Inductive False: Prop := .
    !?!?!?
    18

    View Slide

  19. Falseを用いたパターンマッチング
    Definition False_ind (P: Prop) (f: False): P :=
    match f with
    end.
    パターンマッチングの節がない
    Q. これ、戻り値は何になるんだ?
    19

    View Slide

  20. A. なんでもいい
    上で定義したFalse_indは、Falseを受け取って、任意のProp型(命題型)の値を返しま
    す。
    これは、論理学の「矛盾からなんでも導ける」という性質に対応しています。
    => プログラミングと論理学は繋がってるんだ!
    20

    View Slide

  21. まとめ
    帰納型は、自分自身の型を引数に取ることができる
    パターンマッチングはとても良い
    0個のコンストラクタを持つ帰納型を定義することができる
    0個のコンストラクタを持つ帰納型は、論理学の偽と対応し、偽(矛盾)からはなん
    でも導ける
    カリー・ハワード同形対応(プログラミングと数学が対応している)というものが
    あり、今回紹介したものはその系です。(たぶん)
    21

    View Slide