はじめに
これは技術的な証明をしている記事ではなく、自分なりに感じたことを書いたエッセイ的なものですので、軽い気持ちで読んでいただければ幸いです。
6×0=0
まずは以下を考えてみます。複雑に考えず直感で見ていきましょう。
x \times y = z であれば x = z \div y が成立する
たとえば x = 6, y = 3 のとき、z = 18 になります。
6 \times 3 = 18
x = z \div y は、6 = 18 \div 3 で成立します
では、x=6, y=0のときはどうか
6 \times 0 = 0 となり、zは0になります。これは特に問題ありません
ところが、x = z ÷ y を考えると
6 = 0 \div 0
あれ・・・?となりますね。0 ÷ 0 は 6 になるの?
0とは?
小学生のころだったかインド文明で「0が発見された」という教科書の説明を聞いて、「どういうこと?」と感じた記憶があります。0が発見されるってどういう意味だよとツッコミ入れたくなりました。
小さいときから当たり前のように使っている0という数字、でも実はあまり分からないまま感覚的に使用しているのではないでしょうか。
0と無の関係
「何も無い」という意味の無について考えてみましょう。
「何も無い」ものをあたかも「存在する」ように考えることはできるのでしょうか?
変な言い方ですが、たとえば「空白文字」というのは、文字が無いということで「無」を表します。
古代文献では実際、無を表現するのに空白を使っていた文明もあるそうです。
ところが空白では分かりにくい。
そこで「何も無い」という概念を記号として表すのに、0が使われるようになったわけです。
ところが、この記号化をすることで矛盾も生じました。0が数字として使われたからです。
「0は数字だろ!」と言われそうですが、そもそも数字というのは「数えられるもの」という意味があります。
たとえば「林檎がお皿に5個あります」と言われれば
🍎 \times 5 = 5個の林檎
ということになります。5個のリンゴがお皿に実際に存在するわけです。
ではこれが0になるとどうでしょうか?
🍎 \times 0 = 0個の林檎
となりますね。0個と数えることもできますが、同時に「林檎は存在しない」という意味にもなります。
🍎 \times 0 = 林檎は無い
「お皿の上の林檎を数えることはできない」ということです。
そもそも「無」というのは数えることができないものであり、「数字の0」は数えることができるものとして取り扱われているわけです。
普段私たちが使っているのは、数字としての0であって、「無」としての0ではないんですね。0は無という概念のすべてを表しているのではなく、無という概念の一部を数字として表しているに過ぎないということです。
0が無を表すパターン
数字としての0ですが、無という使われる場合があります。それが先ほどの0除算です。
0の掛け算は数字としても無としても扱うことができます。
🍎 \times 0 = 林檎は存在しない/林檎は0個
それに対し、0除算は存在としての無として考えます
🍎 \div 0 = 林檎は存在しない
やや屁理屈っぽいですが、「無」をどうやって記号化することができるか、その一つの答えが0ですが、無の概念すべてを網羅していないため限界があるということです。
実は、この「無い」ということをどのように表現するかは、現代でもプログラミングでは頻繁に出てきます。
null
存在しないものを表す記号という、矛盾した状態を表すことが必要なわけですが、nullはまさしく無の表現の一つです。
誰もがプログラミングをしていると出会うエラーがあります。ヌルポ(NullPointerException)ですね。
初心者がつまづきやすいところです。
宣言したけどインスタンス化されていない状態とかいろいろありますが、要するに無の概念を記号化していると言えます。
0は数字としても使われていて無として使うことはできないので、代わりに発明されたのがnullなわけです。だからnullは数えることができません。
どこかで、nullは作らない方が良かったとかなんとかいう話を聞いたことがありますが、そのくらい実はややこしいものです。
他の言語では、Nothing, None, Undefinedといったものがその類と言えます。
静的型付け言語と動的型付け言語
C#やJavaといった静的型付け言語では、変数の型を最初から決めてコーディングをします。
それに対しJavaScriptやPythonなどは動的型付け言語と呼ばれ、実際に動作するときに、変数の型が類推されて決定されます。
実はここに無の概念というものがあります。動的ということは、最初はすべて無ということです。記号としてはそこにあるけど、実際は無いものという感じですね。
だから、UndefinedとかNoneという型が実はあてられるわけです。
もしnullや無という概念がプログラミングに導入されなかったら、動的型付け言語も誕生することはなかったかもしれません。
攻殻機動隊
話しは飛んで攻殻機動隊のワンシーンを紹介します。
Stand Alone Complexでのタチコマのセリフです。「神ってやつの存在も近頃は何となくわかる気がしてきたんだー。もしかしたらだけどさ、数字の0に似た概念なんじゃないかなーって、ようするに体系を体系たらしめるために要請される、意味の不在を否定するための記号なんだよ」
存在しないはずのものを存在たらしめる記号、それが0だと。それを神と比較するわけです。面白いセリフですね。
0というのはそのくらい奥深い概念ですし、単に数えられる数字ではないということです。
だから、0除算や0乗算というのは、数字として取り扱うだけではなく、存在論的に考える必要がある数式ということになります。(存在論なのか実在論や実存論なのかという議論は他所でしましょう)
まとめ
身近な0という数字ですが、考えると数学や概念論としてだけの話ではなく、実はプログラミングにおいても似たような概念が取り入れられていることが分かりました。
nullとは何かを説明するのは、0とは何かを説明するのととても近いということになります。特にJavaはnullの取り扱いに結構苦労している印象があります。C#はそのあたりうまい具合にやっているなぁというのが個人的な感覚です。
「無」は人類が誕生して現在に至るまでいまだ未解決の概念です。
新しい無の概念を表す記号がこれからも誕生すると思います。それを楽しみに、今日もプログラミングを楽しみましょう!