Slide 1

Slide 1 text

Coqのコントリビューターになった話 2023-10-08 Zli 大LT

Slide 2

Slide 2 text

自己紹介 misskey: @[email protected] twitter: @sou7___ アンダーバー3つ 好きな言語: Coq Ruby 学部3年 2

Slide 3

Slide 3 text

自己紹介 misskey: @[email protected] twitter: @sou7___ アンダーバー3つ 好きな言語: Coq Ruby 学部3年 4年で卒業できなそうです 3

Slide 4

Slide 4 text

最近やってること 最近はほぼ毎日Coq触ってます。 4

Slide 5

Slide 5 text

どんなことやってるの? 松坂先生の「集合・位相入門」とい う本を、定理証明支援系「Coq」に よって形式化しています。 5

Slide 6

Slide 6 text

数学の証明はふつう自然言語と数式で書きますが、それをソフトウェアを通して検証 させ、「証明が正しいこと」を検証させる、というものです。 例えば、次の命題をCoqで検証させるには、次のように書きます。 Theorem subsets_cap A B X: X ⊂ A -> X ⊂ B -> X ⊂ A ∩ B. Proof. move=> HXA HXB x HX. (* HXA: X ⊂ A, HXB: X ⊂ B, ∀x, HX: x ∈ X をコンテキストへ移動する *) split. (* x ∈ A ∩ B を x ∈ A と x ∈ B に場合分けして考える *) - by apply HXA. (* x ∈ A なら X ⊂ A より成り立つ *) - by apply HXB. (* x ∈ A なら X ⊂ B より成り立つ *) Qed. 6

Slide 7

Slide 7 text

問題 Xがn個の要素からなる集合であるとき、xのべき集合(xの部分集合である集合の 集合)の要素の個数は2^n個であることを証明せよ。 => そもそも個数って何? 7

Slide 8

Slide 8 text

集合の個数の形式化 こういうときは巨人の肩に乗るのが一番。標準ライブラリの実装を見てみます。 Inductive cardinal : Ensemble U -> nat -> Prop := | card_empty : cardinal (Empty_set U) 0 | card_add : forall (A:Ensemble U) (n:nat), cardinal A n -> forall x:U, ~ In U A x -> cardinal (Add U A x) (S n). cardinalの定義(数式) cardinalの定義だけではまともに扱えないので、それを補助する補題が必要です。 8

Slide 9

Slide 9 text

card_soustr_1の標準ライブラリの証明 集合Xから要素xを取り除いた集合の個数は、Xの個数から1引いたものになる。 Lemma card_soustr_1 : forall (X:Ensemble U) (n:nat), cardinal U X n -> forall x:U, In U X x -> cardinal U (Subtract U X x) (pred n). Proof. intros X n H'; elim H'. - intros x H'0; elim H'0. - clear H' n X. intros X n H' H'0 x H'1 x0 H'2. elim (classic (In U X x0)). + intro H'4; rewrite (add_soustr_xy U X x x0). * elim (classic (x = x0)). -- intro H'5. absurd (In U X x0); auto with sets. rewrite <- H'5; auto with sets. -- intro H'3; try assumption. cut (S (pred n) = pred (S n)). ++ intro H'5; rewrite <- H'5. apply card_add; auto with sets. red; intro H'6; elim H'6. intros H'7 H'8; try assumption. elim H'1; auto with sets. ++ unfold pred at 2. apply (Nat.lt_succ_pred 0). apply inh_card_gt_O with (X := X); auto with sets. apply Inhabited_intro with (x := x0); auto with sets. * red; intro H'3. apply H'1. elim H'3; auto with sets. rewrite H'3; auto with sets. + elim (classic (x = x0)). * intro H'3; rewrite <- H'3. cut (Subtract U (Add U X x) x = X); auto with sets. intro H'4; rewrite H'4; auto with sets. * intros H'3 H'4; try assumption. absurd (In U (Add U X x) x0); auto with sets. red; intro H'5; try exact H'5. lapply (Add_inv U X x x0); tauto. Qed. 9

Slide 10

Slide 10 text

10

Slide 11

Slide 11 text

証明を短く出来る? 理解するために1行ずつ写経したり、場合分けをいじったりしているとあることに気づ きました。 「この証明、短く出来るんじゃない?」 Coqでは短いコード=短い証明のほうが良いとされています。 (例えば、学会のポスター発表で冗長な証明をしていると突っ込まれたりする。) 11

Slide 12

Slide 12 text

12

Slide 13

Slide 13 text

比較用 13

Slide 14

Slide 14 text

14

Slide 15

Slide 15 text

PRを出してみる レビュワーの人怖くないかな・・・ 怒られたりしないかな・・・ PRするほどの変更なのかな・・・ => 一晩置いてから恐る恐る出してみることに 15

Slide 16

Slide 16 text

返事が返ってきた 書き換えた部分の下にも場合分 けがあるので、それも含めて分 解できそう Add_inv を使ってもっと簡潔に 書けそうだよ => めっちゃ短いコード出してきた 16

Slide 17

Slide 17 text

左が自分のコード、右がolaure01さんのコード 17

Slide 18

Slide 18 text

18

Slide 19

Slide 19 text

比較用 19

Slide 20

Slide 20 text

これじゃほぼolaure01さんのコードじゃん・・・ (ちなみにolaure01さんを調べてみると、フランス国立科学研究センター(CNRS)の研究 部長だそう。ひえー) とはいえolaure01さんのコードをよく見てみると、冗長だったり、余計な部分があり ます。 olaure01さんに無くて自分にあるのは時間なので、このファイルの証明を全部1行1 行追って、他の定理も改善できないか確かめていくことにしました。 20

Slide 21

Slide 21 text

改善した補題 cardinal_is_functional card_Add_gen Union_preserves_Finite Finite_downward_closed cardinal_Empty cardinal_unicity inh_card_gt_O incl_card_le incl_st_card_lt(後でレビュワーからめっちゃ短い証明が来た) Generalized_induction_on_finite_sets(後でレビュワーからめっちゃ短い証明が来 た) 追加で10個の補題について証明を改善しました! 21

Slide 22

Slide 22 text

その他も インデントのミスを指摘されたり 不等号に関する修正を加えるか議論したり 名前修飾について配慮するように言われたり 修正したと思ったら直ってなかったり git blameで調べてみたら生まれる前(23年以上!)のコードだったり そんなこんなを約1ヶ月半続け・・・・・ 22

Slide 23

Slide 23 text

マージされまし た!! これでCoqコントリビューターの仲 間入り!!! 追加行数は87行、削除行数は190行 でした、ファイル全体の行数が約 340行->240行なので、かなり短くな りました。 23

Slide 24

Slide 24 text

まとめ Coqを使って集合の形式化をしています 標準ライブラリを覗いてみると、PullRequestチャンスを発見! PRが受け入れられて、Coqコントリビューターになりました!! みんなもPullRequestを送って、コントリビューターになろう!!! 24