プログラミングとか数学とか

抽象化について

抽象化っていうのは「細かいことは忘れちゃって,問題を解くのに都合が良いように考えましょう」っていうこと.数学的もクソもない.

型っていうのは,「この値にはどういう操作が可能なんだろうか?」っていうことをいちいち考えたくないから,導入された概念.ある操作が可能な集合を型として抽象化することによって,この疑問は「ある値がある型に所属しているかどうかを判定する問題」になる.こっちの問題の方が簡単であれば,抽象化したものの勝ち.


抽象化には訓練が必要で,誰にでもできるってわけじゃない.自明な抽象化はできるかもしれないけれど.でも,難しい問題っていうのは,抽象化が難しいから難しいんだということが良くある.でも,ちゃんと訓練をつめば,よっぽど脳の構造がこういう分野に向いていない人を除けば,誰でもそれなりにできるようになる.本当に難しい問題には歯がたたないかもしれないけど,本当に難しいわけではない問題が大部分というのは,どの世界でも一緒だと思う.


あと,こういうことは瑣末な問題でもある.数学で重要なのは「どの問題を解けば数学の進歩に貢献できるか」ということだし,プログラミングでも「どういうプログラムを書けばビジネスが成功するか」ということが大切.


普通にイメージされるところの数学が,プログラミングとどういうふうに関係するのかというのはちょっとイメージしにくいのかもしれない.そういう数学からは「定評のある抽象化を学ぶ」ことができる.プログラミングで言うなら「綺麗に抽象化されたライブラリの使いかたを学ぶ」ということかもしれない.そういう勉強から「どういう抽象化が優れているか」ということを,言葉で表現できるだけきっちり学ぶことは困難だろうけど,でも「どういうのが優れた抽象化なのか」ということを感覚として身につけることはできる.ついでに「良く出てくる問題」の解きかたも知ることができる.


あーでも,数学的な抽象化って言いたくなる場面もある.例えば,「ほげほげのアルゴリズムはAPTIME完全だけど,典型的な入力に対しては実用的な時間で処理できる」と言うときには,APTIME完全を指して「数学的な抽象化」だと言いたくなるといえばなる.この場合でも,数学的な抽象化と数学的じゃない抽象化があるわけではなくって.この「数学的な」は非限定的な形容という言えば良いんだろうか.

形式化について

もう一つ,数学で重要な考えかたに形式化がある.形式化というのは「これは正しい」ということを機械的に判定できるようにする,ということ.例えば証明というのは「一定の規則を適用して得られるなんらかの主張」だと考えることができる.ここで重要なのは証明の正しさという問題が「一定の規則の適用」を考えればわかること.証明の各ステップがその規則の適用になっているかを確認することで,その証明が正しいということがわかる.これはものすごく便利な性質だったりする.

この形式化を滞りなく進めるために,抽象化が重要になる.うまく抽象化できた問題は,形式化するのが簡単になる.形式化できるってことは,その問題を解けるっていうことと,ほとんど等しい.

プログラミングには,形式化と良く似ている部分がある.というか,プログラムで重要なのはそのプログラムがどういう計算を行なうかということで,それはアルゴリズムという形で表現される.そしてアルゴリズムは,そのまんま形式化だ.どんな阿呆がそのアルゴリズムを実行したとしても,そのアルゴリズムの実行方法が正しければ,その結果は正しい.結果が正しいかということは,アルゴリズムを忠実に実行できたかということを確認すれば良い.そしてアルゴリズムを忠実に実行することにかけては,コンピュータというのは最高の機械である.

あたりまえだけど

これらは,別に数学やプログラミングに特有の概念ではない.例えば法律というのは,罪を犯した人間に与える罰を求める方法を形式的に記述したものだと考えることができる.法律にのっとって罰を決めることで,不公平な裁判が行なわれないことが保証できる.裁判において責任を問われている事件がなんだったかということは,罪というかたちで抽象化されていると考えられる.包丁で指したのかバールのようなもので殴ったのかということは抽象化されて,殺意があったかなかったかということだけが問題になる.