「クラスとは何かを集合論から考えなおす」を集合論から考えなおす

クラスとは何かを集合論から考えなおす」について、素朴集合論から考えると混乱するとかZFCっぽくないのは意味がないとかいう指摘を受けたので、ちゃんと考えられるように準備をしてみる。
今回は準備だけ。そして続きがあるかどうかはわからない。


さて、素朴集合論じゃなければどの集合論がいいのかといわれると、ZFCなるものがあるらしい。そして、前回の論でZFCとして致命的なのは、ZFCの公理の中で、すべての集合は要素をたどっていくと空集合にならないといけないというのがあるのだけど、これにあてはまらないということだ。ということで、今回は、集合が要素をたどると空集合になるところまでを考える。


まず、空集合をφとあらわす。空集合は、要素を含まない集合で{}のこと。そして、このφに0という数値を割り当てる。
次に、φを要素とする集合に1という数値を割り当てる。φを要素とする集合というのは{φ}のこと。展開すると{{}}ということになる。要素0の配列を要素とする配列と考えてもらえれば、これが要素0の配列とは違うことがわかると思う。
さて、つぎに0と1を要素とする集合を考えて2とする。2={0,1}={φ,{φ}}ということになる。さらに、0と1と2を要素とする集合を3とする。こんな具合に、そこまで出てきた集合をすべて含む集合を、次の数値に割り当てることで、すべての自然数をあらわせる。


これで、要素を自然数に対応させることができれば、たどっていけば必ずφにたどりつくことになった。ということで、ZFCという集合論にするために、要素を自然数に対応付けることにする。
前回は、「なにか」を考えるときに『「なにか」はなんでもいい。』とした。でも今回は「なにか」は少なくとも自然数を割り当てることができるものということにする。そうすることによって、残念ながら本物の実数は扱えなくなる。実数には自然数を割り当てることができないから。
では、自然数自然数を割り当ててしまうと他のものがあらわせなくなるのではないかという不安もあるけど、ありがたいことにすべての自然数はすべての自然数の数倍あるらしいので、すべての自然数自然数をなにか割り当てていっても、別の用途のために自然数をとっておくことができる。


さて、要素に自然数を割り当てる方法を考える。とりあえず、前回のStringという集合を考えよう。ここで、Stringという集合に5という数を割り当てる。「なにか」の集合には5から始まる素数を割り当てていく。2と3は別の用途にとっておきたい。
そして、その5を割り当てた集合の要素に、数値として5のn乗をわりあてる。ただしnは2以上の数にしておく。"aaa"なら5^2、"bbb"なら5^3、"abc"なら5^4という具合。
それから、内容をあらわす自然数を考える。たとえば"aaa"なら256進数で97・97・97とする。10進数なら6381921。"abc"なら256進数で97・98・99=6382179。
そして、この内容を表す数だけ、最初の数に2を掛ける。
要するに、さっきの"aaa"は5^2・2^6381921という数値であらわすことになる。"abc"は5^4・2^6382179という具合。こうすることで、同じ内容をあらわす別の要素が可能になった。つまり5^2・2^6381921とは別の"aaa"をあらわす要素を5^5・2^6381921として扱える。
空文字は5^6のようになる。
これで、5という集合は、5^n・2^m(nは2以上の自然数、mは0以上の自然数)を要素として持つことになった。もう少し形式的に定義できるはずだけど、とりあえずこんな感じ。


こうして、集合、集合の要素、要素の内容を数値であらわすことができた。以降は便宜上名前を使うこともあるけど、集合が扱うのはあくまでもこの数値だということにする。
このことから、ぼくのオブジェクト指向は、内容も自然数に対応付けれる必要が出てきたことにもなる。今日11時52分に目覚めたときに寝たりないと思いながら少し雲がかかった太陽をみたときの気持ちのような、なかなか自然数を割り当てれないものは扱えないということだ。


次にIntegerを考えてみる。
とりあえず、Integerという集合には7を割り当てる。そして、要素には7のn乗を割り当てる。nはさっきと同様2以上にする。で、
なので、Integerという要素に含まれる5や13や71はそれぞれ、7^2・2^5、7^3・2^13、7^4・2^71のようにあらわせる。13をあらわす7^3・2^13とは別の要素があれば、7^5・2^13のようにあらわせる。


さて、ここでIntegerはNumberという集合の部分集合だった。つまり継承関係なのだけど、要素がIntegerとNumberの両方に含まれるということも自然数としてあらわしておきたい。
ということで、Numberという集合に13という数を割り当てる。
そしたら、Integerの要素にそれぞれ、13^n(n=2,3,4・・・)を掛けていく。つまり、5や71は、7^2・13^2・2^5、7^4・13^3・2^71などとなる。Integerをあらわす7とNumberをあらわす13には別の数を乗じていい。


このようにすると、ある数nが与えられたとき、これが素数であれば「なにか」の集合をあらわすことになる。素数でなければ、素因数分解して、2以外の素因数があらわす集合の要素ということになる。そしてnが2で何回割れるかが、その要素nがあらわす内容となる。


前回は、StringやIntegerの集合をクラスとした。けどここではStringやIntegerというのは5以上の素数ということになっている。そこで、この5以上の素数の集合に1という数値を割り当てる。
問題になったのは、クラスという集合の中にクラスを入れることだった。つまり、1という集合に1という集合自体を含めたい。前回はクラスのかわりにClassという集合をつくった。そこで今回は、1という集合に対応する集合として、3という集合をつくって、1という集合の要素にしよう。ということで、1という集合は、3以上の素数の集合ということにする。
そして、前回、StringやInteger、Classに対応する要素としてString.classやInteger.class、Class.classを対応させたのだけど、集合は5や7、3という数値が割り当てられているので、その数で3を乗じた数値を対応させて、3という集合の要素とすればいい。つまり、3^5や3^7や3^3という数値にその内容を掛けたものを3という集合の要素にする。


集合3の要素の内容をどうあらわすかだけど、とりあえず集合の名前を含む方法だけ考えておく。集合の名前はStringの要素として扱える。そこで、集合の名前をあらわす数値が存在できることがわかる。その数値をsとすると、集合3の要素の内容として2^sを含めればいい。ほかの属性は3の累乗や5の累乗にしていけば、ほかの属性も同時にあつかえる。
つまり、"String"をあらわす自然数を5^7・2^aとして、"Integer"をあらわす自然数を5^8・2^bとすると、5の集合に対応する3の集合の要素は、3^5・2^(2^(5^7・2^a))と書け、7の集合に対応する3の集合の要素は3^7・2^(2^(5^8・2^b))としてあらわせる。


ということで、前回の集合は、すべて自然数の集合として定義し、集合自体も自然数に割り当てることができた。自然数の割り当て方はもうすこし考えれる気もするけど、とりあえずアイデアとしてこんな感じ。ともかく、自然数はすべて、要素をたどるとφになるので、少なくとも「要素をたどっていけばφに行き着く」という条件が満たせた。
で、なんとなく満足した。