増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をなりわいとしている他の人も、そうだと筆者は思います。
まぁ、今回はこんなところです。
●コラムのコメント欄の方針
コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。
ですので、このコラムで、
- わたしは基本的にコメントに答えない
- コメントを書く人は、回答がない前提で議論を進めていただく
とさせていただきます。
コメント
Jitta
> 値の範囲を整数と指定された。
> しかし、その「整数」とはどう考えても1以上の整数のことを言っているとしか思えない。
それはおかしい。「自然数」というと、上限はない。
コンピュータに入力するなら、上限がある。
「値の範囲」に上限が指定されていないなら、仕様に不備がある。
もちろん、「「100未満の自然数」という書き方が出来るだろ」ということは、ある。
> 「かけ算の順序」も同じことが原因だと思います(「×」の再定義が原因だと思います)。
「×」の再定義ではなく、かけ算という式で、「演算数」「被演算数」に意味を持たせるかどうか、ではなかったかなぁ?
> たとえば「NULL」という言葉ですが、
> RDBでいうNULLを表す(試験での正解はこれだと思います)
わからん。。。。なぜ、「NULL」から、「RDB でいう NULL」なんだ?
「(void*)0」じゃないのか?
いつの間に RDB の話になった?
なぜ RDB の定義になった?
ってか、RDB って何だ?
(いや、この中ではリレーショナル データベースだってのはわかるけど)
> RDBでいうNULLまたは、空文字または、半角全角スペースのみの文字列を表す(画面などで、左記3つは同じに見えるため、それらは同一視したい)。
ええ!!そうなの?空文字列と半角全角スペースのみの文字列が同じに見えるから同一視したいですって?
じゃぁ、"A\08"は?
いくつかのコントロールコードは、「見た目」は「なにもない」よね。
でも、それが違うものだって事は、プログラマなら、意識するよね。
仲澤@失業者
プログラマが前提とすべき立場を言うのであれば、まず、
「一部の例外を除けば、コンピュータには、純粋に数学的な演算はできない」
事を忘れないようにすることですね(笑)。
他のことは「推して知るべし」ですよね。
絵本のまち有田川
≪…“数学の言葉を再定義している”…≫について、⦅自然数⦆を[絵本]「もろはのつるぎ」のように観るのはどうでしょう。
ちいさな駅美術館 Ponte del Sogno (JR 藤並駅) に
令和二年一月七日~令和二年一月二十四日
で・・・
式神自然数
時間軸の数直線は、『幻のマスキングテープ』に生る。
「かおすのくにのかたなかーど」から
令和2年5月23日~6月7日 の間だけ
射水市大島絵本館で
『HHNI眺望』で観る自然数の絵本あり。
有田川町電子書籍「もろはのつるぎ」
御講評をお願い致します。