たろいもさんが抽象化に関して興味深い記事を書いていた。
なので、抽象化に関する自分の考えを書いてみたいと思う。
抽象化と体系化
引用元のブログでキーワードとなっているのが、「抽象化」と「体系化」という言葉。
この2つは非常に関係が深い言葉だけれど、「抽象の体系化」という言い方はちょっと気になるところ。
この2つのキーワードについて考えを深めるには、「抽象」と「体系」のそれぞれの対義語について考えてみるといいと思う。
「抽象」の対義語は、「具体」。
これは、まとめられていない個々の内容のこと。
一方、「体系」の対義語は、「無秩序」とか「雑然」とか。 これは、個々の内容が明確な関係性をもってまとめられてない様子。
つまり、いずれも「まとめられている」ー「まとめられていない」という共通の構造になってる。
帰納と演繹
実のところ、「抽象化」も「体系化」も、「帰納」という操作の一種でしかない。
帰納
帰納とは、個別的・特殊的な事例から一般的・普遍的な規則・法則を見出そうとする論理的推論の方法のこと。 (wikipediaより)
「抽象化」とは、「個々の事象」から共通の内容を抜き出すこと。
この「個々の事象」というのは一種の変数なので、それを「個々の事象の集まり」に置き換えてみる。
すると、この「個々の事象の集まり」に対する抽象化が、「体系化」になる。
一方、「体系化」を行う場合、それは同時に「個々の事象の集まりの『各要素』」についても共通化を行わなければ、全体として共通の要素を抜き出すことも出来ない。
したがって、「体系化」を行うには、「抽象化」が必須となる。
つまり、「体系化」とは「抽象化」の一つであるし、「抽象化」とは「体系化」の一部であるという関係になっている。
そして、抽象化と体系化のいずれも、個々の様々な事象から一般的な規則、法則、あるいは仕組みを見出そうとする行為であることから、帰納の一種であると言える。
なお、「帰納」の対義語は「演繹」。
演繹
演繹は、一般的・普遍的な前提から、より個別的・特殊的な結論を得る論理的推論の方法である。 (wikipediaより)
この「演繹」のことを忘れていると、「帰納」は泥沼に陥る可能性がある。
何のために帰納を行うのか?
たろいもさんの記事から、ちょっと引用。
抽象化の先にはいったい何があるのだろうか。
すべての仕組みを含む「仕組みの原点」のようなものに辿り着くことがあるのだろうか。
奈須きのこ作品に出てくる「根源の渦」みたいな感じで、なんとも厨二心を惹かれる表現w
その気持ちはすごく分かるw
実際、数学をやっていると、「よりシンプルに物事を捉えられないか?」「もっと統一された見方でこのことを説明できないか?」と考えることが、けっこう多い。
あるいは、プログラムを書いていて、「ここは共通の関数に出来ないか?」とか、いっそ「仕様を書けばそれにあったプログラムを書いてくれるプログラムを作れないだろうか?」とか考えたり。
ただ、それは目的が手段と成り果てているというか、何のために帰納を行っているのかが忘れ去られてしまってる。
「何のために帰納を行っているのか?」
一つは、共通のパターンを見出すことで、思考の効率性を上げるためだ。
例えば、りんご1個とりんご2個を合わせると、りんご3個になるし、みかん1個とみかん2個を合わせても、みかん3個になる。
これを、個別に覚えていたら、脳の容量がいくらあっても足りない。
そこで、抽象化して「1+2=3である」と覚えておけば、個々の事象を覚えておかなくて済む。
(さらに言えば、2桁以上の足し算についても、「筆算」のアルゴリズムを覚えておけば、「11+22=33である」ということを覚えていなくても「1+2=3である」ということから「11+22=33である」ということは導き出せる。
そうやって「整数の足し算」の体系が出来上がり、今度は様々な「足し算」の体系を抽象化することで「群論」という一つの理論体系が生まれていったりする。)
もう一つは、見出された共通のパターンを使うことで、個々の具体的な問題に対する解答を容易に得るためだ。
例えば、「1+2=3である」という共通のパターンを使うことで、「メロン1個とメロン2個を合わせると、いくつになろうだろう?」という問題は「メロン3個」という答えを簡単に得ることが出来る。
これは、メロンがスイカになろうがカボチャになろうが、変わらない。
抽象化のレベル
ただ、ここで気をつけたいのが、じゃあ「群論」を知っていれば「メロン1個とメロン2個を合わせると、いくつになるか?」の答えが得られるのかというと、そうではないということ。
群論まで行ってしまうと抽象化がされすぎてしまっていて、このレベルの具体的な話に対する解答を得ることは出来なくなってしまっている。
それなら、群論なんて使えないものなのかといえば、そんなことはないわけで。
群論のレベルでも有益な内容(定理)が得られるからこそ、その抽象化は意味を持っている。
一般に、抽象のレベルが上がれば上がるほど、その適用できる範囲は広がるものの、言えることは少なくなってくる。
なので、なんでもかんでも抽象化できればいいというわけではなく、議論の対象に合わせた適切なレベルの抽象化というのが大切になってくる。
例えば、先ほどのプログラムの話を考えてみる。
プログラムに関する議論をどんどん抽象化させていくと、最終的にはチューリングマシンや計算可能性という話題に行き着くことになる。
もうこの次元になると、プログラミング言語が何だとか、CPUの種類が何だとかの話は出てこなくて、出てくるのは「計算するということは、どういうことなのか?」というレベルの話になる。
(コンピュータというのは「計算機」であり、画像を表示したり音を鳴らしたりするのも「計算」の結果であることに注意)
このレベルにまで抽象化されても有益な結果が得られるというのが面白いところで、例えば有名な停止性問題の結論が得られたりする。
けど、じゃあこのレベルでプログラムが実際に書けるのかというと、そんなことはない。
実際にプログラムを書こうとしたら、より具体的なレベルで考えていく必要がある。
数学そのものについてもそうだ。
解析学、代数学、幾何学など、様々な分野があるけれど、「数学的手法」というのはどの分野も共通している。
すなわち、定義を行い、公理を定め、そこから論理的な演繹を推し進めて定理を導き出していく。
この考え方は重要で、数学をやっていくときに意識しておく必要はある。
けど、じゃあこの考え方だけで数学が出来るのかというと、そんなことはないわけで。
具体的な問題を解こうと思ったら、やはりそのレベルに合わせた理論というものが必要になってくる。
「帰納とは、演繹のためのツールを用意するためのもの」くらいに捉えておいた方が、極度の抽象化にハマることなく、今必要とされるレベルの抽象化を行えるかもしれない。
今日はここまで!