平田智剛のブログ

立法、行政、司法、報道、そして科学

F.ism.does_harm_to(!F);

努力しても数学ができるようにならない人の中にはこんな奴もいる

お久しぶりです。

今日はオブジェクト指向のクラス図を生成するアルゴリズムについて考えていました。

「子クラスを持たないクラス」すべての先祖クラスを辿れば、完全なクラス図(クラスAの先祖BがAの子孫でもあるといったおかしな「循環継承」がない限り)が生成できることに気がつきました。

(数学的帰納法による証明:
すべてのクラスは「子クラスを持つクラス」と「子クラスを持たないクラス」に分けられる。
任意の「子クラスを持つクラス」P1は何かしらのクラスC1の親クラスである。
またP1の先祖は必ずC1の先祖だ。ゆえにC1の先祖が完全に分かるとき、P1の先祖も完全に分かる。
C1が子クラスを持つクラスの場合、P2=C1として、P2の任意の子クラスC2を考える。これを繰り返すと、循環継承がないという仮定より、いつか必ずCiが子クラスを持たないクラスになる。Ci=Pi+1の先祖が分かっていれば、Piの先祖が分かる。これを帰納的に繰り返せば、P1の先祖もわかる。逆順にたどれば当然P1の子孫クラスもわかる)

 いやぁ自分で証明を書いててびっくりしました。
こんなに煩雑なこと考えた覚えないんです。

結局ひらめきというか、無根拠に「これできそう」と考え、後付けで論理的に確認するだけなんですよね。

 

僕は高校時代、いくら努力しても一向に数学ができるようにならなかったんですが、
教科書や演習教材の問題を解いて、解説を読み、苦労して理解するだけだったんです。
次似たような問題解いても一切解けない。教科書レベルならともかく、入試対策とかは本当にそうでした。当時は「2つの問題が似ている」ことにすら気が付けなかったです。

 

数学の問題解くのって、無根拠ひらめきに対する証明を書くのと逆だなって思っていました。論理展開して、一つの答えを導く必要があるから、まず先に論理展開する必要があるわけです。

「この論理で答えへたどり着けそう」という無根拠ひらめきが浮かべば、数学の問題は解けることでしょう。ここにまで根拠を求めてしまうのが、「努力しても数学ができない」人の一部です。

解説書に「余弦定理より~」とか書いてあって、数学のできるほとんどの人は「そうか。こういう時は余弦定理を使うのか」と納得し、覚えます。教師が「数学は暗記じゃない」といっていようと、結局は覚えているはずです。
それこそ論理的に考えてください。どうして昨日の彼が解けなかった問題が、今日の彼は解けるのでしょうか。それはきっと解き方が頭に入っているからです。頭の中をプログラミングに例えるなら、「変数」のような形では覚えていないでしょう。それは確かに丸暗記であり、応用が利かないと思います。でも解き方というプログラムを暗記しているはずなんです。チューリングマシンで考えれば、変数もプログラムもメモリに保存される「覚えておくもの」です。コンピュータだろうと脳だろうと、チューリングマシンでモデル化して説明する限り、次の結論を得ます。
昨日できなかったことが今日できるのは、昨日から今日の間に、何かがメモリに書き込まれたからにほかなりません。(厳密にはメモリというより「テープ」ですがね笑)

つまり、論理展開の根拠は暗記した内容でいいはずなんです。

 

一方、「どうしてそこで余弦定理が出てくるのか」を、さらに基本的な原理に立ち返って考えてしまう人は悲惨です。

 

「論理展開の根拠」を求めてしまうと、ドツボにはまります。

論理展開の論理展開というか。メタ論理に苦しみます。

せっかく定理という「クラス」にまとめられているのだから、定理の内容と使い道を覚え、「呼び出す」べきです。

オブジェクト指向でメインメソッドの可読性が増すように、定理を積極的に使えば、論理展開が簡単になるはずなんです。

それをわざわざ手続き型言語に書き換えようとしているのが、「論理展開の根拠」を求めるということです。

確かに、機械語に近いコードを確かめるかの如く、「問題の本質を理解したい」のであれば、自主的な勉強としてこれをやるのはありでしょう。

しかし、毎回毎回論理展開の根拠を追い、定理とその使い方の定着そのものを疎かにしてしまうようでは本末転倒です。

 

いくつかの役立つクラスが定義済みで、オブジェクト指向
「この機能を10行以内のコードで30分以内に実装しなさい」
と問題が出ているところを、クラスを無視して機械語でプログラミングして解答しているようなものです。

 

これでは、勉強時間当たりの演習量そのものが激減してしまいます。


高校生の時は、「他の奴らよりもずっと本質的な勉強を、他の奴らよりも長い時間やってるはずなのに、どうして他の奴らよりも自分は数学が苦手なんだろう」と思っていましたが、今考えれば至極当然のことでした。

 

「他の奴らよりもずっと機械の本質に迫った機械語プログラムを、他の奴らよりも長時間書いているはずなのに、javaでコーディングしてる奴らよりも自分はプログラムがたくさん書けないのだろう」といっているようなものです。

どうしてこう解けるの?はもうやめましょう。怒られようと、理解の上で暗記しましょう。