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

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

soukouki
March 19, 2023

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

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

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

soukouki

March 19, 2023
Tweet

More Decks by soukouki

Other Decks in Technology

Transcript

  1. sou7っていいます 春から学部3年 GDSC(Google Developer Student Community) Aizu Leadです Coq触ったりしてます Factorio楽しい

    (^_^) 鉄オタです 先週の水曜に羽沢横浜国大駅とか新横 浜駅とか行ってきました つい昨日、それらを結ぶ相鉄新横浜 線・東急新横浜線が開業しました .                 やぁ > 2
  2. 実際の帰納型を使ったコードの例(曜日) Inductive day : Type := | monday : day

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

    | S : nat -> nat. 上の例では、natという型を定義しています。natはSとOというコンストラクタがあり ます。 Sの場合、引数にnat型の値を1つ取って、nat型の値を返します。 こんなふうに、帰納型は自分自身の型を各コンストラクタの引数に取れます。 9
  4. 「パターンマッチングは好きか」という質問に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
  5. パターンマッチングを用いた関数の例(ピアノ数) 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
  6. パターンマッチングを用いた関数の例(ピアノ数)(再掲) 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
  7. 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
  8. Falseを用いたパターンマッチング Definition False_ind (P: Prop) (f: False): P := match

    f with end. パターンマッチングの節がない Q. これ、戻り値は何になるんだ? 19