2008年12月 1日 「技術編-17 null 値と対照表」 を読む >> 目次にもどる
2017年 9月15日 補遺  


 

 ヌル (null) は、慣例として 「ヌル 値 (null-value)」 と言いかたをしますが、「値 (value) ではない」 ことを注意して下さい。ヌル は、「充足していない状態」 のことです。ヌル が起こるのは、以下のときです。

 (1) undefined
 (2) unknown

 ふたつの集合のあいだの 「関係」 R を考えるときに──言い換えれば、「写像」 f を考えるときに──、ふつう、まず、「全域関数」 を考えます。すなわち、ふたつの集合のあいだでは、それぞれの元が すべて 対応しているというふうに考えます。「全域関数」 において、集合 (定義域) X の元 x に対して、集合 (値域) Y の元 y [ すなわち、f (x) ] が存在することを 「定義されている」 と云います。そして、もし、x に対して y [ 言い換えれば、f (x) ] が存在しないとき、「定義されていない (undefined)」 と云います──この対応状態を 「部分関数」 と云います。「全域関数」 を前提にしたほうが モデル を構成しやすいので、集合間の対応では、まず、「全域関数」 を考えますが、「部分関数」 になる状態のときに、ヌル が起こります。

 さらに、ふたつの集合のあいだで 「直積」 を考えたときに──たとえば、「氏名」 と 「年齢」 との直積集合を考えたときに──、以下の組が構成されます。

    { 佐藤正美, 1 歳 }, { 佐藤正美, 2 歳 }, ・・・, { 佐藤正美, 55歳 }, ・・・.

 これらの組に対して 「F-真」 を考えてみれば、{ 佐藤正美, 55歳 } が 「真」 です。そして、「真」 とされた組を ソリューション と云います。さて、この直積集合において、私は、じぶんの年齢を公表するのを嫌がって年齢を記述しなかったとすれば、年齢は存在しても値は未知数になります。この状態のことを unknown と云います。このときにも、ヌル が起こります。

 以上に述べたように、ヌル は、意味論的には、undefined と unknown の 2つの状態を示します。したがって、ヌル を、もし、演算の対象にするのであれば、4 値 ロジック (true, false, undefined および unknown の 4 値を扱う ロジック) を使わなければならない──ちなみに、コッド 氏は、4 値 ロジック を使っています。あるいは、2 値 ロジック (true および false の 2 値を前提にした ロジック) であれば、ヌル を除去しなければならないでしょう (すなわち、ヌル を 「対象外」 にしなければならないでしょう)。

 3 値 ロジック で ヌル を扱うときには、「ヌル の論理否定」 に対して注意しなければならない。というのは、「赤本」 の 81 ページ に 「3 値 ロジック における真理値表」 を記載しておきましたが、3 値 ロジック では、null の論理否定 (¬null) は、null と同値になります。たとえば、p → q (if p, then q) という推論は、¬p ∨ q と同値なので、もし、p に対して ¬null を代入すれば、同値式では、¬p は つねに null として扱われるので──たとえ、p が null であれ、¬null であれ──、unexpected な アウトプット を生じることになるでしょう (具体的には、SQL において、not exist や not in などの演算をしないようにして下さい)。 □

 



[ 補遺 ] (2017年 9月15日)

 「佐藤正美さんは ヌル にこだわりすぎる」 とか 「佐藤正美さんは 『ヌル 撲滅主義者』 である」 というような くだらない意見が WWW 上に記載されているそうです (私は、或る人から それらを聞いたので、私自身が それらを直接に読んではいないので念のため)。そして、「現実には、ヌル は生じる」 と私を非難している人がいるそうです。ヌル が生じるのは当たり前です、「任意入力」 があるのだから。「モデル (形式的構造) のなかに ヌル を持ち込むな」 と私は注意しているだけです。

 システム・エンジニア (および プログラマ) が ヌル にこだわるのは当たり前でしょう。寧ろ ヌル を注意しない システム・エンジニア のほうが無責任だと私は思います。プログラム を作成して納品する時に、「この プログラム は (ヌル を配慮しなかったので) 予期しない結果が出ることもありますが、事業の基幹 システム で使ってください」 と言うような システム・エンジニア (および プログラマ) は、およそ職業人であれば、元から いないでしょう。

 ヌル を演算対象にしないように、ヌル を 「0 (ゼロ)」 で置換しているって!? その置換が、意味論上、いったい どういう意味を持つというのかしら──システム・エンジニア なら、もっと丁寧に考えて下さい。






  << もどる HOME すすむ >>
  目次にもどる