見出し画像

関数としてのテーブル - 写像と命題関数

拙著の一つに『おうちで学べるデータベースのきほん』というデータベース初心者向けの入門書がある。2015年刊行なのでそれなりに年月が経っているのだが、ありがたいことに今でもコンスタントに読んでいただいている。

この本の中で「リレーショナルデータベースのテーブルは関数として捉えられる」という話をしているのだが、ある読者の方からそこがよく分からなかった、という質問をいただいた。ちょうどよい機会なので、少しこの点を補足説明しておきたいと思う。


テーブルが関数だと言うとき、二つの含意がある。一つは集合から集合への写像としての意味、もう一つが述語論理における命題関数としての意味である。一般的にテーブルが関数だという場合は、前者の意味で言われることが多い。こちらは関数従属性や正規形の概念にも繋がっていくから、関係モデルの理解という点でも広がりのあるオーソドクスな解釈だ。拙著でもこの意味で説明している。しかし、リレーショナルモデルの源流の一つである述語論理においては、述語、すなわち命題関数が決定的な役割を果たす。こちらの意味でもテーブルは関数としての顔を見せる。

本稿では、この二つについてそれぞれ解説していこうと思う。

対応関係(写像)としてのテーブル

テーブルを見せて「これが関数です」と言われても、普通の人は首をひねると思う。関数というのはたとえば「y = 5x + 2」みたいな数式の形をしているものではないだろうか。あるいはxy座標にグラフとして表されているものではないだろうか。確かに、テーブルはどう見ても関数っぽい見た目はしていない。

実際、昔は数学においても関数というのは何らかの数式によって表されるものだと考えられていた。18世紀の数学者オイラーは、関数は変数や定数を組み合わせた式によって表されるものだという考えを持っていた。しかし、徐々にこの関数の捉え方に変化が起きていく。一言でいうと、定義が拡張されていくのだ。19世紀に入ると、数学者ディリクレがyとxの間に数式で表せるような規則的な対応はなくてもかまわないという考え方を支持する。つまり、出力と入力の間に何らかの対応関係があればその関係そのものを関数とみなしてよいのではないか、ということである。これは、現代の用語で言えば写像(mapping)である。

集合Aから集合Bへの写像のイメージ図

すなわち、二つの集合が与えられたときに、一方の集合の各元に対し、他方の集合のただひとつの元を指定して結びつける対応が写像である。この時のポイントは、対応規則は別に式や文章で表される必要はないという点だ。場当たり的な規則でもかまわない。20世紀に入ると集合論の発展もあり、こうした関数理解が一般化していく。より抽象度が高く、広義になっていったのが分かる。

関数を写像だと考えれば、テーブルというのはキー列から非キー列への写像なので、まさに関数そのものである。テーブルが関数だという意味の一つ目はこういうことである。

こちらの理解は、それほど難しくないと思う。問題は二つ目である。少し(言語)哲学的な議論が必要になる。

命題関数(述語)としてのテーブル

命題関数(Propositional function)というのは、個体を入力にとって、真偽の定まる命題を返す関数である(論者によっては真偽そのものを返すとする場合もあるが、今はその違いは重要ではない)。この用語はバートランド・ラッセルによって名づけられた。しかし、テーブルが命題関数だというのは一体どういうことだろうか。

具体的に考えるために、以下のようなごく単純なペットのテーブルを考えてみたい。

犬猫判定テーブル

このテーブルは、ペットの名前を代入するとそれが猫か犬かを言明する文を出力するような関数として働いてくれる。たとえば、

Pets(タマ, cat) = タマは猫である

といった具合だ。これで真偽をはっきりさせることの可能な言明=命題が得られた。あとは列がどれだけ増えても基本的な考え方は変わらない。Petsテーブルには、ペットの体長、体重などの情報を列として付け加えることができるが、そうすることで真偽判定の条件が増えていくだけである(タマは猫であり、かつ、体長35cmであり、かつ、体重10kgであり・・・)。テーブルの列は「属性」と呼ばれることもあるが、これはタマが「猫性」という属性を持っているかどうかを表現しているからである。このように、テーブルではキーとなる列が表す個体が、非キー列の属性を持つことを言明する命題を構成する。Wikipediaのrelationの項目にはこの点について次のように書かれている。

Thus, an n-ary relation is interpreted, under the Closed-World Assumption, as the extension of some n-adic predicate: all and only those n-tuples whose values, substituted for corresponding free variables in the predicate, yield propositions that hold true, appear in the relation.

n項の関係は閉世界仮説の下において、ある種のn次の述語の拡張として解釈される。すなわち、述語の対応する自由変項に代入された値が真となる命題をもたらすn個の行のすべてが、そしてそのタプルのみが、関係に現れる。

Relation (database)

これがテーブルが関数であるという二つ目の意味である。どうだろう。すんなり理解できただろうか。

文脈原理という謎

このようなことを聞く理由は、この命題関数という考え方には一つ捻りが入っている、言い換えると素直でない考え方に基づいているからである。というのは、普通私たちが文の意味を考えるとき、「~は猫である」という述語を取り出して考えるだろうか。どちらかというと、「タマは猫である」という文を見たら、「タマ、は、猫、である」というように単語に分解して、それぞれの単語の意味を考えるというやり方をしないだろうか。しかる後にそれらの意味を足してやることで、文の意味ができあがる。こんなイメージだ。

タマは猫である = タマ + は + 猫 + である

この考え方はとても自然だ。自然言語処理においても形態素解析という方法論があるが、これも文を単語へ還元する手法である。しかし、命題関数の考え方はこれとは逆の道を行っている。すなわち、まず最初に文があって、そこから固有名の部分だけを変項(変数みたいなものだが、数以外も代入するので変「項」と呼ぶ)に置き換えることで述語=命題関数を作り出している。語の意味を文との関連から考えようとしており、基本単位の比重が文の方にあるのだ。関係モデルのテーブルもこの考えを踏襲している。

この考え方を最初に編み出したのは述語論理の創始者であるドイツの哲学者ゴットロープ・フレーゲであり、この大胆な転換を行った彼の考え方は「文脈原理」と呼ばれている。文脈原理は、彼の著書『算術の基礎』の序文にはっきりと述べられている。

語の意味は、命題という脈絡において問われなければならず、語を孤立させて問うてはならない。

『算術の基礎』

文を単語にバラしても分析は捗らないぞと警告しているのである。実際その通りなのだが、しかし、困ったことにフレーゲはどういう筋道を通ってこのようなある意味ひっくり返った文の分析方法にたどり着いたのか、その理路をはっきりとは語ってくれていない。そうした説明不足も手伝って、フレーゲの著作はしばらくの間学界でも注目されず、その偉大な仕事も過小評価されていた。ただ、フレーゲが幸運だったのは、当代一流の哲学者や数学者(ペアノ、ヒルベルト、ラッセル、ウィトゲンシュタイン、フッサールなど)が彼の仕事の重要性を見抜き、高く評価してくれたことだった。これらの人々が「フレーゲ、マジ凄い。みんな読まなきゃダメ!」と強く推してくれたことで、フレーゲの仕事は広く知られることになった。特にウィトゲンシュタインはフレーゲを師と仰ぎ、その影響は前期の著作『論理哲学論考』に顕著にみられる。

ともあれ、フレーゲによって文を述語(命題関数)と変項に分解して分析していくという方法論、今でいう述語論理が創始され、量化や高階論理など高度な概念も次々に生み出されていく。SQLが扱うのは一階述語論理までなので論理学的にそれほど複雑な操作をするわけではないが、EXISTS述語で存在量化を扱えるのは、フレーゲのおかげである。

さて、少し話が逸れてしまったが、これが「テーブルは関数である」という意味の二つ目、命題関数である。

ちょうどいまは新入社員の諸君がテーブルとは何か、とかSQLとは何か、というあたりを勉強している頃ではないかと思う。諸君の参考になれば幸いである(かえって混乱させてしまったら申し訳ない、一笑に付して忘れていただきたい)。

いいなと思ったら応援しよう!