前回、メタモデルやメタメタモデルの言語仕様は、ほとんど同じだけれども、異なるレイヤーとして定義している、というお話をしました。
それでは、事実上同じ性質なのに、なぜクラスのクラスはクラスではなくメタクラスと呼ぶのでしょうか?
メタ構造
UMLの最終仕様書には全く振れられていませんが、言語設計の段階での設計者のコメントが、彼らの本音をかいま見せています。
仕様書の裏に見え隠れする事情について振れてみます。
クラスの集まり
以前クラスのインスタンスはオブジェクトである、つまりクラスはオブジェクトの集まりであるというお話をしました。
そして、オブジェクトとクラスは違う性質を持つために混同することはないと思います。
ところが、メタクラスとクラスは共に集まりの概念であり、基本的に全く同じ文法上のルールに従った振舞いと構造を持ちます。
従って、わざわざメタクラスなどと言う大仰なものを定義しなくてもいいではないかと言う疑問が湧いてきます。
そこで、今度は仮に、クラスの集まりもクラスである、つまりクラスはクラスのインスタンスであると仮定するとどうなるでしょうか?
すべての集合の集合
この場合、クラスはクラスに属することになります。
これを、集合論のアナロジーで考えてみたいと思います。
ここで、集合Aを{すべての集合の集合}とすると考えた場合、クラスがクラスに属する状態と同じ現象が発生し、A∈Aとなります。
ところが、自分自身を要素として含む集合は、論理的に矛盾を引き起こしてしまい、数学的に許されません。(☆:簡略版の証明を本日の投稿の末尾に掲げました)
ラッセルのパラドックス(集まり、集合に関する逆理)
集合論は、抽象的な事柄を議論するには非常に便利なツールであり、現代数学の基礎となっています。
しかし、そこには強い劇薬も含まれています。
そして、その影響は、様々な要素を集めて巨大な集合を作る際に顕著に表れてきます。
先ほど、述べましたように集合は、自分自身を要素として含むことが許されません。
そこで今度は、自分自身を含まない集合の集合を考えてみましょう。
ここでは、この集合をRと呼ぶことにします。
そうしますと、今度は「Rは自分自身を含むか?」と言う疑問がわいてきます。かりに、もし含まないとすると、定義からRは自分自身を含まない集合の集合ですから、Rは自分自身を含んでしまうことになります。
今度は逆に、Rは自分自身を含むとすると、定義からRは自分自身を含まないものの集合ですから、Rは自分自身を含まないことになり矛盾します。
この矛盾はいったいどこから来るのでしょうか?
実は、Rを集合だと考えたことに問題があったのです。
集合がどんどん大きくなると(例えばすべての集合の集合など)、もう集合ではなくなってしまうのです。
集合を超えた集まり
メタクラスもこのアナロジーが働きます。
すべてのクラスを集めてしまうと、もはやクラスではなくなってしまいます。
メタは、メタフィジックス(形而上学)のメタと同根で、「〜を超えた」「超越した」という意味があります。
メタモデルとメタメタモデルの関係も同様です。メタモデルを超越したモデルがメタメタモデルです。
そして、UMLの言語仕様には、データレイヤー→メタデータレイヤー→メタモデルレイヤー→メタメタモデルレイヤーという厳密なレイヤー構造が適用されます。
UML設計者たちは、これらの構造を集合の濃度の階梯に例えています。これについては、また後日解説したいと思います。
☆カントールのパラドックス
A={x : x=x} (Aはすべての集合の集合)とする。
すると、Aのベキ集合P(A)が存在し、 Aの濃度 < P(A)の濃度 となる。
しかし、P(A)の要素はすべて集合なので、 P(A) ⊂ A であり、Aの濃度 ≧ P(A)の濃度 となり、これは矛盾。
より詳しくは、集合論の本を参照してください。(例: 「数学のロジックと集合論」培風館 )