たにしきんぐダム

プログラミングやったりゲームしてます

月報 2021/06

f:id:tanishiking24:20210628145130j:plain
東工大大岡山キャンパス

  • たまーに気分転換に大学図書館にチャリで行ったりしている。授業とか研究室のゼミとかは相変わらずオンライン、早くキャンパスライフってやつエンジョイしたい。
  • TaPL 15章読みました、次は23章だよ
  • 小森めとさんにはまってる
  • APEX いったんお休み
    • ここしばらく毎月100時間以上遊んでてちょっとまずいなと思ったので一旦距離を置くことにした、もうちょっと適度な距離感で遊びたい
  • Test to code traceability
    • 最近は Unit test を API code example として使えないかということに興味を持っていて、そのために必要となるテスト->実装の自動対応付けの論文を読み漁っていた
    • scrapbox.io
    • GSoC 終わったら手を動かし始められる状態になっていたい
    • 先行研究がだいたい Java のデータセットに対してやられているので、僕も Java のプログラム解析学ばないといけないんじゃないかと思っている。
  • CHI勉強会2021 | 2021年6月26日(土)、今年もオンライン開催!! で2本だけ論文紹介した(全部で1分)
  • たまに運動してる
    • ちょいちょいランニングしたりしてる、体動かしたほうが元気になる
  • GSoC

月報 2021/05

scrapbox.io

  • GSoC への proposal が accept されました Scala Center | Google Summer of Code、6月2週から約2ヶ月半はお金をいただきながらOSSやらせていただきます
  • TaPL だいぶ面白くなってきた、11章の後 subtyping とか recursive type からいきなり面白くなってきた感じがある
  • 大学の授業に時間かけすぎてる感じがある。
    • 英語の社会学っぽい授業が面白くて、systemic racism や education inequality and inequity とかにとても詳しくなった
    • 一方これに時間かけすぎてて研究とかの時間が疎かになってる
  • 月前半は研究のためのサーベイいろいろやってたけど月後半は微妙な感じ...
    • なんか疲れてて全然記憶がない日が多い
    • unit test をcode example として活用するために test case prioritization とか example-centric programming とか調べてた
    • Test case がどれだけ characterizing test としての性質を持っているかの良いメトリクスを定めることが重要な気がする
  • 授業料免除の2次書類提出
    • けっこう大変なんだけど、多分免除通らないだろうなぁ...(実際は大学入学によって収入が下がるので年間収入はかなり少ないが、直近3ヶ月は生活費のために多めに働いていたので見た目の年収が高い、これで免除通ってなかったら仕事しないほうが良かったみたいな話になって最悪なのでせめて半額免除は通ってほしい)
  • APEX やっとるな
    • ちょっと落ち着いてきた、少なくとも最近はソロランク回すみたいな気力がない

もう2ヶ月経ってしまったが何もできてないぞ...6月からはGSoCと研究に集中したい(ずっと言ってる)

2021/4

2021/4 から日記を箇条書きで書くようにしてみた、これ以上不可が大きいと続かないけど、これくらいならなんとか続いている

scrapbox.io

  • 大学院に入学したよ
  • 研究室のセミナーでTaPLの輪講してるよ、11章までやった
    • 証明などのが解がふわっとしてるところが議論によって固められるので体験が良い
    • 一方この手の証明とかやるの慣れてないので最初はかなり苦戦してた
  • 大学行く用事があるときに図書館行ったりしてる、東工大の図書館広いし、採光面積も広くて良い
  • GSoC の proposal 書いたよ
  • 授業を受けてるよ、結局このクォーターは (東工大はクォーター制)
  • こいつ毎日APEXやってるな
    • プラチナにはなりました
  • 各種事務手続きやった(偉い)
    • 授業料免除申請
    • 学生支援機構(第二種)申し込み
    • 学生支援機構在学猶予
    • いろいろ
  • 引き続きはてなでアルバイトしているよ
  • Webっぽいお勉強
    • OAuth / OIDC の仕組みの復習
    • Terraform

f:id:tanishiking24:20210430191750j:plain
夜の東工大附属図書館(雨)

今月は勉強はたっぷりできたものの、論文読みまくったり、OSSやったりする余裕がなかったのは良くなかった。頑張りましょう

導出に関する帰納法と項に関する構造的帰納法についてのメモ

最近TaPLを読んでいるのだけれど、いかんせん構造的帰納法に不慣れなもので、導出に関する帰納法による証明を読んだり書いたりしているうちに

  • 自分が何をしているのか
  • 何を示すことで命題を証明しようとしているのか
  • そもそも項に関する帰納法と導出に関する帰納法って何が違うんだっけ???

が分からなくなることがあった。

分かってしまった今となっては何でこんなことが分からなかったのか分からないけど、恥をしのんで自分の理解をメモしておく。メモしておかないとどうせ後でまた混乱し始めると思う。


項に関する構造的帰納法

これはTaPL3章の定理3.3.4にある通り

各項 s に対して、s の任意の直接の部分項 r に対して P (r) が成り立つとき、P (s) が証明できる
ならば、すべての s に対して P (s) が成り立つ。

つまり項 $t_1$ ... $t_n$ があって、それらの各項について $P(t_1)$ ... $ P(t_n) $ が成り立つとき、$t_1$ ... $t_n$ を直接の部分項として持つ項 $s$ について $P(s)$ が成り立つ。

例えば、TaPL 第8章の、定理8.2.4の型の一意性 (t: R1 かつ t: R2 ならば R1 = R2)

ある項のsの任意の直接の部分項rに対して、型の一意性が成り立つことを帰納法の仮定と置いて、そのとき項sについて型の一意性が成り立つことを(inversion lemmaを使いつつ)示し、それにより定理を証明している。

導出に関する帰納法

一方、定理8.3.2の進行定理の証明では、項に関する帰納法ではなく、t: T の導出に関する帰納法により定理を証明する。

項に関する帰納法が直接の部分項に着目するのに対し、導出に関する帰納法では導出木の直接の部分木(に現れる項と型の2つ組)に着目する。

各項と型の関係 s: S に対して、s: S の任意の直接の(導出木の)部分木に現れる2つ組 r: R に対して P(r: R) が成り立つとき、P(s: S) が証明できる
ならば、すべての s: S に対して P(s: S)が成り立つ

こういう感じか???

進行定理の証明では、導出木の根を導出するのに直接使われた導出規則について場合分けを行い、それぞれの場合について導出に関する帰納法を用いて定理を証明する。

例えば T-IF の場合、つまり t = if t1 then t2 else t3 (で t: T) の場合、まずinversion lemma より

  • t1: Bool
  • t2: T
  • t3: T

がわかる。ここで帰納法の仮定より、t1 は値である。もしくは t1' が存在して t1 -> t1' となる。

ここで何を示すべきかを思い出してみると、上に書いた帰納法の仮定の下で、命題: t = it t1 then t2 else t3 自体に t が値である or t' が存在して t -> t' であることを示せればよいのであった。

あとはt1が値である場合と、t1が評価される、どちらの場合でも t について命題が成り立つことを示せれば良い。

  • t1 が値ならば canonical formよりt1はtrue か false
    • true なら E-IFTRUE により if true then t2 else t3 -> t2 だし
    • false なら E-IFFALSE にょり if false then t2 else t3 -> t3
  • t1 -> t1'なら E-IF より if t1 then t2 else t3 -> if t1' then t2 else t3

よって、どちらの場合でも t' が存在して t -> t' となることが分かる。

といった具合である。


分かってしまえば何てことはないのだけれど、ここを分かったフリしたまま進んでしまうと多分何も分からないで死んでたので分かってよかったですね。

東京工業大学・情報理工学院(修士)に入学した

2017年4月から新卒で株式会社はてなに入社してフルタイムでWebアプリケーションエンジニアとして働いたのですが、2021年4月に東京工業大学情報理工学院 数理計算科学系の修士課程に入学しました。しばらくは貯金とアルバイトと学生支援機構からのローンで生活する予定です。

主に programming environment や program comprehension みたいな、ソフトウェア工学プログラミング言語(実装より)の間くらいのところ研究しようと考えています。

  • もともとプログラミング支援ツール(formatter, linter, IDE, etc...)を作るのが好きで、趣味でScalaIDEやformatterやその基盤システムの開発を細々とお手伝いしていた。
  • そこらへんのコミュニティや海外カンファで、企業や大学に所属してプログラミング支援ツールをフルタイムで作っている人と会話しているうちに、そういうツール作るの専門にしていきたいなという気分になってきた。
  • 思い切って一度大学院でプログラミング環境の研究しつつ、あわよくばキャリアチェンジしよう思い、大学院に入学することにした。
    • (仕事はいつでもできるが、大学に入学して収入が激減したときの打撃は人生が進めば進むほど大きくなりそうだし、仕事しながら大学院いくほどのバイタリティはない)
  • できれば卒業後は開発支援ツール作る仕事に就きたいとぼんやり思っているが、卒業後のキャリアとかはまだ一切考えていない...
    • 突然2000万円くらい天から降ってきたりしない限りは博士課程にそのまま進学する予定はありません。

今後もScalaとかのツール開発に参加しつつ、研究でもプログラマの生産性を向上させる便利システムを作っていきたいですね。