こんにちは、本日はオブジェクト指向を集合論の概念を用いて、独断と偏見で記述していきたいと思います。
本稿はこちらで紹介した児玉さんの「UMLモデリングの本質」を参考しています。
1)集合論における「関係」
まず集合論上の「関係」について。A,Bを空でない集合とします。このとき二項関係Rとは、
R⊂A×B
なる直積A×Bの部分集合Rが存在するときをいい、a∈A,b∈Bに対して、aRbやR(a,b)等で表記します。二項関係のよく知られている例は、不等号「<」で、a<bと表記します。
(不等号は小学生のときから使っている記号でかなり見慣れているもので今更感満載ですが、典型的な二項関係の1種になります。)
さて、関係のうち特別な関係である「同値関係」について定義します。一言で言えば、反射的かつ対称的かつ推移的な二項関係は同値関係と呼ばれます。
集合M上の二項関係Rについて考えます。a,b,c∈Mとすると
・反射律:aRa
・対称律:aRbならばbRa
・推移律:aRb & bRcならばaRc
を満たす時、Rは同値関係と呼び、∼で表すことが多いです。
同値関係の例は、三角形の合同「≡」や等号「=」があります。
集合Mに何かしらの同値関係「∼」与えられると、「∼」でMを分類することができます。これを∼における商集合といい、M/∼で表します。
M/∼の元は「同値類」とよばれ、
[a]≡{m∈M∣m∼a}∈M/∼
で定義します。このときaを代表元といい、[a]を同値類もしくはクラスと呼びます。
簡単な図でいうと以下のようなイメージです。

ちなみに同値類はMを直和分解するとも見ることができます。同値類の集合を
{[a]∈M/∼∣a={a1,a2,..,an}}
とすれば、
M=n⋃i=1[ai]
が成立することになります。これは同値類がMの元を追加したり、消したりせず、ただ分類のみ行うイメージでしたから、分類したものを全て合わせればまたMになる、という意味合いです。
同値類というとなにやら難しい感がありますが、例えば割り算の余りを使って同値類を作ることができます。ある自然数n∈Nを3で割った余りnmod3を考えると、これは
0,1,2のいずれかになります。余りnmod3=0となる自然数は0,3,6,9,12,….となりますが、これらを余り0という点で同一視することができます:[0]=0,3,6,9,12,..。余り1,2のときも同様に[1]=1,4,7,10,13,….、[2]=2,5,8,11,14,….とできます。したがって自然数全体はN=[0]∪[1]∪[2]と分類することができます。直感的には当たり前かもしれませんが、これが3で割った余りで同値類を作ることになります。同値類について少しイメージできたでしょうか。
以上集合論の関係について、お話しました。これらを使って、オブジェクト指向の話をしていきます。
2)オブジェクト指向と集合論
まずオブジェクト指向のオブジェクトですが、システム化する対象全般のことをいいます。なんかひどく抽象的な言い回しですが、そうせざるを得ません。なぜならシステム化するモノないしコトすべてに対して成立させるものなので、抽象的にしないと適用範囲が限られてしまうからです。
こういう抽象的な事柄を扱う論理体系は数学と相性がいいです。特に集合論は現代数学の全ての分野で基礎となっている分野なので、抽象度が非常に高いです。(だから汎用性も高い。)
オブジェクト全てを集めてきた集合をMとします。Mが空集合だと、オブジェクトは存在しないことになり、それで終了となるので、Mは空でない集合とします。
Mに何かしらの同値関係∼が与えられたとします。すると上の議論から、∼による同値類が定義できます。この同値類ないしクラスが、オブジェクト指向における「クラス」と同じ意味になります。クラスの元を「インスタンス」とよびます。
したがってオブジェクト指向プログラミングにおいて、新しいクラスを定義することは、新しい同値関係を決めることと等価になります。
このあたり、巷の本だと初心者になんとかわかってもらおうと、ふんだんに例を用いて説明しているのですが、例が多すぎて、逆に本質がなかなかわかりづらかったりします。例を用いて説明することは重要ですが、最後に抽象度をあげて説明することも必要かと思います。本来オブジェクト指向自体が抽象度の高い話だからです。
さて、オブジェクト指向モデリングに、クラスに対して特化や汎化という概念がありました。これは集合論的には同値類の部分集合をとったり上位集合を考えたりすることにあたります。
ある同値類[a]に、さらにある同値関係∼‘を追加するとします。
[x1]={m∈M∣m∼a & m∼‘x1}
このとき同値類[x1]は[a]の部分集合となりますが、これを特化といいます。[x1]は[a]を継承したクラスとも言います。
逆に、まず[x1]があってそこから同値関係を削除して、大きな同値類を得ることを汎化といいます。上の例でいうと[a]は[x1]の親クラス(基底クラス)とも言います。
簡単な図でいうと以下のイメージです。

[xi],i=1,2,3は元々[a]の部分集合でしたので、[a]の同値関係は引き継いでいることになります。[xi],i=1,2,3は[a]を継承しており、[a]は[xi],i=1,2,3の汎化である、と言えます。
本日はここまでにします。
最後まで読んでいただきありがとうございます。
質問等はコメント欄かお問い合わせにてよろしくおねがいいたします。
「集合論的にオブジェクト指向を考える」への1件のフィードバック