Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

最近やったこと PPL2023(第25回プログラミングおよびプログ ラミング言語ワークショップ) に参加してきま した! ワークショップって言うから実際に手を動 かしたりするのかな?と思っていたら違っ た 興味ある分野について研究してる研究室が いくつか分かった 無知の知 <- 実際に聞けた 4

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

「パターンマッチングは好きか」という質問に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

Slide 12

Slide 12 text

パターンマッチングを用いた関数の例(ピアノ数) 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

Slide 13

Slide 13 text

パターンマッチングを用いた関数の例(ピアノ数)(再掲) 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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

できらぁ! 17

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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