Skip to content

Instantly share code, notes, and snippets.

@yamarten
Created May 1, 2018 15:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yamarten/007716fef4c77631b8cae17891ba4969 to your computer and use it in GitHub Desktop.
Save yamarten/007716fef4c77631b8cae17891ba4969 to your computer and use it in GitHub Desktop.

今年読んだ論文2017アドベントカレンダーの補足

おことわり

あれから5ヶ月が過ぎました。年も年度も変わり、いただいたビールも無くなり、修了して社会人になり、今更どころではないですが、一応あの記事についてもう少しだけ書いておこうと思います。

9割方独り言というか覚書のつもりで書いているので、蛇足が過ぎて百足の如き様相を呈していますが、ご了承ください。

自分について

とりあえず自分の立場を明確にしておきます。

自己紹介

今年の3月まで情報理工学研究科の修士課程でCS系の研究をしていました。

4月からは組み込み系の会社にエンジニアとして入社し、研修中の身です。未だに学生気分が抜け切らず、休日に積み論文を崩したりしています。

研究分野

プログラムの検証とか証明の機械化とかその辺の研究をしていました。具体的にはCoqという証明アシスタントのUIというか言語の話ですね。

証明アシスタントのソフトウェア開発への活用例は現状ごく少数しか存在しません。(特にプログラミング未経験の人に)所属研究室の説明をするとき、言語処理系の改良などもひっくるめて「プログラマのためのプログラムを作っています」という言い方を個人的によくするのですが、そういう意味では未だ「プログラマのため」の段階にも至ってないかもしれません。

研究態度

研究室は割と自由にやらせてくれるところで、研究室内でも割とテーマがバラバラだったりしていました。ので、結構ニッチをマイペースにやっていた自覚があります。

「最低でも一度くらいは対外発表しよう」という研究室の方針[1]はあって、実際発表はしてはいるものの、分野事情を知っていると胸を張って言うことはできません。分野の俯瞰や人の名前を覚えることはあまり無かった気がします。

ACについて

アドベントカレンダーに参加した感想というかなんというか。

心がけたこと

個人的にこのACは多分野が入り乱れる状態になるのが一番面白いと思っているので、なるべく前提知識を減らそうと心がけて書きました。リンクをたくさん張るとか脚注で補足するとか。

とはいえ説明慣れしていないこと、参加者を見る限り割とプログラミングの話が通じそうだったことから、C言語経験は前提としました。まあ最初に明示したので自分としては許してもいいかなと。

媒体

Asciidocが使えること、既にアカウント登録済みだったことからGistを使いました。

まあ媒体なんて別になんでもいいと思うんですが、残念なところがありました。割と脚注を使っているのですが、Gistでは(はてな等と違って)ツールチップとして浮かんでくれないので、脚注まで読んでくれる人はページ末尾と本文を行き来する必要があったのではないかと思います。これはAsciidoctorの問題なのでGistが悪いというわけでもないのですが。

他にも画像の追加が面倒な上に見栄えが悪いというのもあり、やはりちゃんとブログを使うべきだったのかなとは思います。一方で編集履歴が残って、かつ過去版を他人に簡単に見せられるというのはさすがGistという感じで、活用させてもらいました。

去年

今回参加した動機は、前回(2016)のリベンジだったわけですが、そもそもなんで前回参加したかというと、読む側として「面白い企画なのに参加者少なくて勿体無いので賑やかしになろう」という想いからでした。その動機から初日をとりたくて、しかし見つけたのが11月末だったので時間が取れなくて苦しみましたが。

結局前回はその後人が増えることもなく悔しい思いをしたような記憶がありますが、今回はその辺あんまり気にしてなかったです。初日をとった意味はあったのでしょうか。

来年

せっかく素晴らしい企画なので、開催されるのであれば何かしら(読む以外)の形で関わりたいと思っています。とはいえ主催になれるかといえばそんな度胸はないのですが。

論文について

以下の記述については、全体的にあまり自信が無いです。

プログラム検証の意義

この研究は、アドベントカレンダーでも書いた通り、ざっくり言えば「プログラム検証[2]」の分野に入ります。形式手法と呼ばれるものの一種です。

当然ながらプログラムにバグなんてあってほしくないわけですが、世の中ではプログラムの正しさというのは「試しに動かしてみて問題無さそうならOK」という方法で確認しています。これに対して、もっと厳密に正しさを追求するのがプログラム検証です。

検証したい「正しさ」を定める時点で大変だったりするのであまり実用例は多くないですが、特にバグの許されない分野では使われているようです[3]

位置付け

プログラム検証の分野では、例えば以下のようなジャンル[4]があります。

モデル検査

プログラムの働きを簡単に示すモデルと呼ばれる表現[5]を作り、それに対して検査を行います。モデルはプログラムの設計図のようなものなので、先にモデルを作ってそれを基にプログラムを作る、ということもあるようです。

シンボリック実行

実行時に決まる値を不定のまま、実行の様子を追っていく手法です。例えば、乱数で得られる値は不明なのでとりあえずxとしておいて、x<3という条件でプログラムが分岐したら「xが3未満の世界」と「xが3以上の世界」に分岐する、といった感じで、どんどん条件付きの平行世界が生み出される様子をイメージしてもらえればいいかと。

定理証明

式変形や帰納法などを用いて、数学の証明のようにプログラムを検証する手法です。一般に、普通の(数学の)定理証明も行えるようなシステムになります。人間がヒントを随時与えるITP(対話的証明器、証明アシスタント)と、全て自動で行うATP(自動証明器)があります。

私の専門はITPなので断言できませんが、この研究はATP+シンボリック実行という感じでしょうか。

強み

この手法は何と言っても多言語対応という点が強みになります。正確に言えば、「Kで意味論が定義されている言語に対して」「検証したいプログラムと仕様を書くだけで」「十分な時間と計算資源さえあれば大抵の仕様を」検証できるということです。

検証器を作るために意味論定義を書くだけでいいというのは、かなり強みだと思います。プログラムを書く量が減るというのは、単に楽であるというだけでなく、バグが生まれ難くなるということでもあります。検証器なんてものを作る上では特に重要です。

論文では「意味論は既にあったから工数に入れなくていいよね」という感じでしたが、もし検証のためだけに意味論を書くとしたら、本当に楽になるのかはわかりません。ただ、どんな方法をとるにせよ検証器を作るのなら意味論を考えるのは特に重要な部分だと思うので、Kの学習コストさえ考えなければそれほど重くはない気がします。

弱み

最大の問題は、検証器のユーザが理屈を理解していないといけないことです。現状のシステムでは、プログラムの状態のKにおける表現がわからなければ、仕様の書き方はわかりません。要するに、意味論を見なければ仕様を書くことができないということです。一般にはユーザが意味論を書くわけではないため、学習コストがかかります。また、多言語対応で一般化されているため、仕様記述が冗長だとか、性能が微妙だとかいう問題もあるでしょう。

その辺は著者らも承知していて、プログラム中に書いたコメントから適当に証明できる形に変換できるシステムを作ればいいと言っています。実例を見ていないのでなんとも言えませんが。


1. 他所では専攻の修了条件として論文投稿が定められていたりすると聞きますが、そういうものはありませんでした。
2. 「静的テスト」とか「形式検証」とかいう呼び方は私の周りでは聞いた覚えが無いです。
3. 鉄道あたりでは割と使われているらしいですし、学術寄りのプロジェクトだとOSやコンパイラを形式手法を使って開発しています。他に有名どころではAWSFeliCaなど、いずれにしても何かしらの意味で「インフラ」と呼ばれる分野ですね。
4. 同列にしてしまっていいのか微妙ですが……。
5. オートマトンがわかる方は、大体あんな感じのものだと思ってもらえればOKです。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment