明らかに状況が変わってきている今日のプログラミングとは?

増16.プログラマが見た「かけ算の順序」

»

●今回の発端

 先日、設計者と仕様について少々議論をしました。その際、「かけ算の順序」(Wikipedia 日本語版「かけ算の順序問題」など)の問題が話題になりました。

 Wikipediaの説明では、「『6人のこどもに、1人4こずつみかんをあたえたい。みかんはいくつあればよいでしょうか』という設問に対する、6 × 4 = 24 という式と答えを不正解にすべきか」という話です。わりと、有名な話だと思います。

 もちろん、筆者がその問題の理非を問う資格とかはないですし、当コラムではそれについて一切述べません。そうではなく、自分たちの中で話題になったのは、「この問題の起こり方が、仕様書を介した設計者とプログラマの間の悶着(もんちゃく)の起こり方と瓜二つだ」という点です。

 このところ、連投気味ですが、これについて意見をご披露いたします。

●原因は

 今回の議論は、

  • 値の範囲を整数と指定された。
  • しかし、その「整数」とはどう考えても1以上の整数のことを言っているとしか思えない。

というものです。それに対して、

  • やっぱりこれは「自然数」であり、言っていることが変ではないか?

という(出るべくして出た)反論が起きました。

 要するに、“数学の言葉を再定義している”のが原因です。そして、「かけ算の順序」も同じことが原因だと思います(「×」の再定義が原因だと思います)。

●「間違いである。以上!」では何が問題か?

 まだ、小学校の授業のやり方は柔軟な対応が可能で、「こちらのやり方がだめならあちら」というふうにできるかも知れませんが、IT分野の設計者の作る仕様の場合、そうもいかないことがあります。

 たとえば「NULL」という言葉ですが、

  • RDBでいうNULLを表す(試験での正解はこれだと思います)
  • RDBでいうNULLまたは、空文字を表す(MSAccessなどで、テーブルを表示した場合、NULLが意図せず空文字に更新されてしまうことがあり、またテーブルをCSVを介して移動した場合にも、NULLが空文字になってしまう場合があるので、両方を同一視したい。VARCHAR2とかならこの問題はクリアされる)。
  • RDBでいうNULLまたは、空文字または、半角全角スペースのみの文字列を表す(画面などで、左記3つは同じに見えるため、それらは同一視したい)。

というふうに、場合によって再定義しなければならない場合が頻繁に出ます。

 ここで「数学の言葉の再定義はあり得ない」とされてしまうと、設計者は動きが取れなくなりますし、プログラマも自由を奪われることになります。

●解法の自然な拡張なら……。

 これが「再定義」でなく、「解法の自然な拡張」なら何の問題もありません。

  • 応答日を考慮した、日付と月数の足し算。

とか

  • 月末日を考慮した、日付と月数の足し算。(Oracleの“ADD_MONTHS 関数”のような)

とかなら、単なる「+」と共存できると思います。

ただ、そのためには

  • 名前を別の(もっと限定的な)ものにする

とか

  • 引数の型で区別する

とか複雑になります。プログラミングではもちろん常套手段としてやりますが、設計段階ではかえって分かりにくくなるので、やらないと思います。小学生に教える際にも同じような配慮がいるのかもしれません。

●プログラマの一員として

 プログラマの一員としては、

  • 自治の範囲で数学の言葉の再定義は認める。
  • その際、責任者はその再定義について十分な配慮をする。

程度の落としどころにしていただけると、本当に助かります。ITをなりわいとしている他の人も、そうだと筆者は思います。

まぁ、今回はこんなところです。

●コラムのコメント欄の方針

コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。

ですので、このコラムで、

  • わたしは基本的にコメントに答えない
  • コメントを書く人は、回答がない前提で議論を進めていただく

とさせていただきます。

Comment(2)

コメント

Jitta

> 値の範囲を整数と指定された。
> しかし、その「整数」とはどう考えても1以上の整数のことを言っているとしか思えない。
それはおかしい。「自然数」というと、上限はない。
コンピュータに入力するなら、上限がある。
「値の範囲」に上限が指定されていないなら、仕様に不備がある。
もちろん、「「100未満の自然数」という書き方が出来るだろ」ということは、ある。

> 「かけ算の順序」も同じことが原因だと思います(「×」の再定義が原因だと思います)。
「×」の再定義ではなく、かけ算という式で、「演算数」「被演算数」に意味を持たせるかどうか、ではなかったかなぁ?

> たとえば「NULL」という言葉ですが、
> RDBでいうNULLを表す(試験での正解はこれだと思います)
 わからん。。。。なぜ、「NULL」から、「RDB でいう NULL」なんだ?
「(void*)0」じゃないのか?
いつの間に RDB の話になった?
なぜ RDB の定義になった?
ってか、RDB って何だ?
(いや、この中ではリレーショナル データベースだってのはわかるけど)

> RDBでいうNULLまたは、空文字または、半角全角スペースのみの文字列を表す(画面などで、左記3つは同じに見えるため、それらは同一視したい)。
ええ!!そうなの?空文字列と半角全角スペースのみの文字列が同じに見えるから同一視したいですって?
じゃぁ、"A\08"は?
いくつかのコントロールコードは、「見た目」は「なにもない」よね。
でも、それが違うものだって事は、プログラマなら、意識するよね。

仲澤@失業者

プログラマが前提とすべき立場を言うのであれば、まず、

「一部の例外を除けば、コンピュータには、純粋に数学的な演算はできない」

事を忘れないようにすることですね(笑)。
他のことは「推して知るべし」ですよね。

コメントを投稿する