問題の定式化

 算数では3×5と5×3は明確に区別されるべきなのか。ここで非常に限定された目的で、つまりコンピュータプログラムではどのように解釈したらより組みやすいかを考察する。
 したがって下記の問題は取り上げない。
1.学習指導要領
2.算数教育の現場
3.テストで高得点をとる方法
4.レシートなどでどうなっているのか。
5.交換法則はなぜ成り立つのかなど、純粋に数学的な問い

美しいソースコードの定義

 美しいソースコードとは他人が見ても、どういう命令を下しているかが分かるものだと定義する。
 例えば、下記の2点は品物が変わっただけで本質的に同じことである。
A.120円のコーヒーを4本買った
B.150円のペットボトル飲料を1本買った。

 ところがある場合は120×4、ある場合は4×120と書くと、混乱しないだろうか。これはどちらかに統一しないと後々、バグが起こりかない。また、Bの場合も150×1と書くだけで、混乱を未然に防ぐことができる。つまり書き漏らしの可能性を疑い、レシートを遡らなくてもよい。

意味とは何か

 数式の意味とは何だろうか。
C-1.6人の子供に、1人4個ずつみかんをまとめて与える時、みかんはいくつあればいいか。
C-2.6人の子供に、1人4個ずつみかんを順番に与える時、みかんはいくつあればいいか。
 この文章において、6×4と4×6を考えてみると、計算結果は同じである。しかし、意味を踏まえると、C-1は6×4である。
 一方、C-2なら4個を6回に分けて与えている以上は、4×6と書かなければいけない。順番に渡しているにもかかわらず、6×4という立式も誤解を招きかねないのだ。つまりどのような式を立てるのかは、どのように考えたかに大きく依存する。
 思い描いた情景を的確に数式で表せるかが大切なのだ。数式は単に無味乾燥な概念操作の道具ではなく、どのように配るかまで表現できる豊穣な言語である。だからこそ順番は厳格に守らなければいけない、と主張しているのだ。

数学の自由度と現実との対応

 またこう聞いてもいいだろう。果たして、時速60キロメートルで4時間移動するのと、時速4キロで60時間進むのとでは状況は同じなのだろうか。
 計算結果は同じでも、違うと答えるだろう。交換法則が成り立っても、現実世界に適合しなければ少なくともプログラミングをする上では意味がない。なぜなら、現実の問題を解決するために、プログラムを組むのだから。
 数学はある意味において自由度が高いとも言える。例えば、このような演算も形式的には可能だ。
D.リンゴ5個とミカン4個を掛けるといくらになるのか。
 無意味であるのは言うまでもないが、少なくともプログラムにおいては現実と関係づけて考えなければいけない。逆に現実と対応付ければ、負の余りも定義可能になる。
E.10人の子牛を3人で分ける。あと何個買えば均等に配分できるか。
 この問題は12個あれば1人4個ずつ行き渡るので、12-10で差分を出せばいい。しかし下記のように表現することも可能である。
4…-2
 あまりの定義は(商)×(割られる数)+(余り)=(もとの数)である。試しに代入すれば、4×3-2=10となり、定義に合致する。
 また余りを出して本当にいいのか、設問自体も疑わなければいけない場合もある。もし子豚が買えない場合はどうするのか。1匹あまるが、そもそも何のために分けるのか。牛乳目的なら殺害はできないし、食肉目的なら殺害して3分の1ずつ均等配分すればいい。あるいはクジなどで公平に決める方法もあるし、交換条件などで他のもので取引してもいい。

交換法則が成り立つのは偶然にすぎない

 ところでプログラミングではもちろん行列を扱える。しかし行列ではA×B≠B×Aである。
 例えば次のような問題考えてみよう。
F.以下の条件で買い物する。このとき掛かった費用とポイントの合計をそれぞれ求めよ。
 120円の缶コーヒーを4個
150円のペットボトルジュースを1本
40円の駄菓子を8つ
 買うとする。ただし、下記の条件でポイントが貰える。
缶コーヒーの場合は1本につき4ポイント
ペットボトルジュースの1本につき場合は5ポイント
駄菓子の場合は1つにつき1ポイント


費用について(120×4)+(150×1)+(40×8)=920
ポイントについては(4×4)+(5×1)+(1×8)=29ポイント

とするだろう。これは行列式で書くと、下記の通りに簡略化できる。
texclip20180116212436

 自然数では交換法則が成立していたが、行列は成立しない。
texclip20180116213850

 これは行と列の個数が一致しないため、そもそも演算はできないのである。行列は数学�Cの内容であるが、プログラミングでは覚えておくと非常に便利である。

理想の回答

 それでは具体的にどのような点に気をつけるべきなのだろうか。鶴亀算を例に取る。
G、鶴と亀が合計30匹いる。亀の足と鶴の足は合計86本である。鶴と亀はそれぞれ何匹か。

以下は説明書きである。
 全体的な方針として、連立方程式を使う。
工程1.定義
 n×mと書く時、nは1つ分の数、mは単位を表す。
 鶴をc(crane)匹、亀をt(turtle)匹と置く。cとtはともに正の整数の値である。
工程2.立式
 ここで「鶴と亀が合計30匹いる」ので、c+t=30。これを以降、式Aと呼ぶ。
 また「亀の足と鶴の足は合計86本である」。ここで鶴の足は2本なので2本×c匹、亀の足は4本なので4本×t匹と置ける。
 従って2×c+4×t=86。これを以降、式Bと呼ぶ。つまり下記の2つの式が得られる。
  式A  c+t=30
  式B 2×c+4×t=86
工程3.演算
 式Bの右辺と左辺を2で割ると
  (2×c÷2)+(4×t÷2)=86÷2
  これを計算すると、c+(2×t)=43。これを式B’と置く
 B’-Aを行なうと、
  c+  t=   30
  -c+(2×t)=43
--------------------
    t=13
 亀は13匹
 式Aに代入するとc+13=30。
 c+13=30の右辺と左辺から13を引く。つまり
 c+13-13=30-13
 これを計算して、c=17
  鶴は17匹である。
説明書き、終了。

どこを工夫しているのか

 上記の説明は、一行一行読んでいけば、どのような過程で答えにたどり着いたのかが解るようになっている。これこそがプログラミングにおいて最重要な点だと考えているのである。
1.最初に全体的な方針を書いている。
2.どのような作業を行なうのか、解るように小見出しをつけている。
3変数を連想しやすいようにしてある。一般的にはxとyで立式がなされるが、どちらが鶴でどちらが亀を現しているのか混乱しかねない。
4.cとtはともに正の整数だと明記。
5.足の数が4本なので、4×cとしたことを書いている。自明でも立式する以上は、定数の出典を明記してある。
6.どのような操作を行なっているのかを明記。移項とは書かずに、「c+13=30の右辺と左辺から13を引く」などと書く。
7.説明書きの初めと終わりを明示。

難点

 まず目的を考えてから、それに応じて数式を組み合わせている。したがって具体例的でなければ計算問題は解けないが、数学は計算技術を競うものではない。そもそも計算はコンピュータに任せておけばいいのだ。また空虚なただ論理を振り回すためのものでもない。
 数学の本質は、むしろしっかりと言葉を定義し、確実に真なる命題で問題を問いていく、論証にあるのだ。そして、僕たちはいつも具体的な問題を解かなければいけないのである。

追記:ツイッター上での指摘を受け、数学用語の誤りを修正。