所在表現と所有表現

これは、 位置の外延的表現・内包的表現の区別と考察ノート の続きのような話で、数学とプログラミングは、ときに、あるいみでは、物事をまったくあべこべに捉えているのではないだろうか? という話を書く。

前回の話について簡単に説明すると、プログラミングでは、位置を表現する方法には「外延的表現」と「内包的表現」があるという話をした。JSONで書けば { "8": { "4": "王将" } } が「外延的表現」、 { "王将": [4, 8] } が「内包的表現」で、その間にどういう違いがあるか簡単に考察を行なっている。

話をより一般的にすると、位置の表現に限らず、情報の表現全般には、位置を使った「所在表現(外延的表現)」と、属性を使った「所有表現(内包的表現)」が考えられる。コンピューターであれば、メモリアドレスによって表現される位置と、その位置であらわされるセルに格納された電荷などの属性の組み合わせを使って情報を表現しているのだから、表したい情報のいくらかは位置によって、残りの情報は属性によって、表現されている。

情報の表現には所在表現と所有表現がある考えると、次の図を2通りに、所在と所有それぞれの解釈で読み解けることに気づく。

flowchart LR subgraph A direction TB subgraph B direction RL C end end

この図は、オイラー図であるように見える。それは「*Xは*Bである」という命題を「XがBにある」図形で表す、所在表現だ。そして、Aの内部にBを、Bの内部にCを配置することで「*Cならば*Bであり、*Bならば*Aである」ことを表現する。(ここで、Aと書いたのは図の領域のことで、*Aと書いたのは、領域が表す物事だ。ここでのアスタリスク記号「*」は、記号のデノテーションを表すものだと考えてほしい。)

しかし、この図を逆さまに所有表現として読んで、「XがBをもつ」図形が「*Xは*Bである」という命題を表すと見ればどうか。Aの内部にBを、Bの内部にCを配置することで「*Aならば*Bであり、*Bならば*Cである」ことを表現している、と読める。これでも、つじつまはあっている。また、これは、プログラミングにおけるオブジェクトの表現によく似ている。

type A = { b: B }
type B = { c: C }
type C = {}
const p: (a: A) => B = (a) => a.b
const q: (b: B) => C = (b) => b.c
const r: (a: A) => C = (a) => a.b.c

日常生活で考えれば、「*Xである」という情報を「Xがある」という形で表現することは多い。「私は弁護士である」という情報を「私は弁護士バッジを持っている」という形で示すことがあるだろうし、「きのこに投票する」という情報を「投票用紙に『きのこ』と書く」という形で示すことがあるだろう。もちろん、「*Xである」という情報を「Xにある」という形で表現することも多くあり、「私の名前は弁護士会の名簿にある」とか「『きのこ』と書いてある枠にシールを貼る」という例が考えられる。

ここまでの話は抽象的だが、UIデザインやデータの可視化においては、考慮すべきことに思える。たとえば散布図などはまさに属性を位置に変換して表現するものだと言える。人間にとって理解しやすい表現を行うためには、どのように両者の変換を行うのかの考察は重要になるだろう。