さて,第4章ではじめてrdfs:Classという語彙が導入され,クラス概念が定義されます.第3章で rdf:type のプロパティ外延で rdf:Property をオブジェクトとするようなサブジェクト(の表示物)は IP の元である,とされました.このときにはまだクラス概念は無いのですが,その式においてオブジェクトの rdf:Property を変数とします.そのときの変数とは何か?rdf:type のプロパティ外延においてオブジェクトになる y であるもの,それがクラスです.サブジェクト(の表示物)x のクラスです.
x ∈ ICEXT(y),iff 〈x,y〉∈ IEXT(I(rdf:type))
iff は if and only if の略で,「ならば」が両方向です.これは定義として同じであることをこう表現します.ICEXT はクラス外延写像のことです.で,ついでにこれまでの章で出てきた,IR や LV に名前を振ってしまおう.すなわち,論議の領域(universe of discouse) IR をクラス外延とするクラスは I(rdfs:Resource),リテラル値 LV をクラス外延とするクラスは I(rdfs:Literal) です.
IR = ICEXT(I(rdfs:Resource))
LV = ICEXT(I(rdfs:Literal))
それで話を戻すと,このクラス,クラス外延を構成するもの,すなわち ICEXT(y) の y ,が何であるかはオントロジストが自由に整合的に定義できるわけですが,たとえば「イヌ」,「ネコ」,「イヌフグリ」,「ネコヤナギ」,それをこれまでの議論の枠組みの中でどうあつかいましょうか,という話になります.RDF意味論で行っていることは,I(イヌ),I(ネコ) などを IR の中に入れます.だって IR は論議の枠組みですからね.そして,これら x ∈ ICEXT(y) の y を
すべて集めた集合 IC を考えます.すべてですからね.何と IR も,あっ間違えた,もとい,I(rdfs:Resource) も入れてしまうのですよ.そしてその集合をクラス外延とするものを考えます.それに rdfs:Class という名前をつけます.
IC = ICEXT(I(rdfs:Class))
それでは,このクラス集合をクラス外延とするもの I(rdfs:Class) をどう扱ったらよいだろうか.そこでRDF意味論ではこれを IC の元としてしまいます.つまり,無理やり数学的に書けば,
I(rdfs:Class) ∈ ICEXT(I(rdfs:Class))
わっ,そんなのあるわけない,ということで,これが議論の的になるのですね.自分自身を含む集合なんて,というわけです.
rdfs:Class のクラス外延がクラス rdfs:Class を含んでもよいことを注意しておく.
でもね,理屈はこうだと思います.先にサブジェクトの位置する rdf:type と プレディケイトの位置する rdf:type を区別したのと同様に,クラス外延のメンバーとなる rdfs:Class とクラス外延を構成する rdfs:Class を使用時,推論時には区別しましょうと.実際プログラム時にプログラマがこれでまごつくことはありませんからね.自分が今書き下している rdfs:Class が集合の元としてのものか,集合を構成するクラスとしてのものなのかは.それを正しくプログラム表現できるかは別としてね.たとえば,
rdfs:Class rdf:type rdfs:Class .
と言った時,最初の rdfs:Class はクラス外延のメンバーであり,後の rdfs:Class がクラス外延を生成するものですよね.言うなれば,それは文脈で分かるでしょ,ということで.
もう一つ例を挙げると,
rdfs:Resource rdf:type rdfs:Class .
rdfs:Class rdf:type rdfs:Resource .
なのですが,これも文脈を考慮しないと循環してしまいますから,普通はありえないのですが,これまでも示してきた意味論で記述すれば,
I(rdfs:Resource) ∈ ICEXT(I(rdfs:Class))
I(rdfs:Class) ∈ ICEXT(I(rdfs:Resource))
という意味ですからね.
I(rdfs:Resource) ∈ I(rdfs:Class)
I(rdfs:Class) ∈ I(rdfs:Resource)
ではありませんからね.W3C の OWL ワーキンググループでは今ようやく punning という言葉でここまでたどり着いたということらしいです.
えっと,このクラスのクラス rdfs:Class みたいなものをメタクラスと言いますが,そしてメタクラスのクラスをメタメタクラスと呼ぶとすると,UML で考えるのはメタメタクラスまでで,しかも自分自身を含む集合などというあやしいものは考えません.でもLispのリフレクション言語である3Lispでは自分自身を含む言語ということになっているし,ANSI Common Lisp のオブジェクトシステムである CLOS でも standard-class のクラスは standard-class ということになっていて,RDF と同じなのです.これに興味を持ったかたは,私の論文を読んでください.
クラス概念の次に第4章で重要なものは,定義域(rdfs:domain) と値域(rdfs:range) の導入ですね.定義域は三つ組みのサブジェクトの取り得る範囲を制限し,値域はオブジェクトの取り得る範囲を制限します.これは問題ないですね.書かれるもの(制限するもの)はクラスで,制限されるものはそのインスタンスになりますから,お間違えなく.ただし,ワインの色には赤か白かロゼしかないと言っておいて,別の場所で自家製ワインの色はピンクと言ったらどうしましょうか,という話はあります.私はRDF意味論の議論においては三つ組みの宣言はすべて大域的としていますから,その場合は充足しない,ということにしています.これは一つのトリプルは述語論理における一つの式でそれが並列に並んでいるとすれば,当然ですね.すなわち三つ組みにスコープはない.Americanワインの産地はアメリカで,カリフォルニアワインの産地はカリフォルニアという定義があったとき,ナパ製のワインは当然Americanワインかつカリフォルニアワインですね.ナパはカリフォルニアの中にあって,カリフォルニアはアメリカの中にあるという知識があるときは.大域的に宣言された値域はすべて重ね合わされます.「愛知一色うなぎ」の産地は「愛知県幡豆郡一色町」となっているのに中国産うなぎはこれを充足しないし,「愛知県岡崎市一色」も充足しません.
ですから,すべての三つ組みは大域的に重ねあわされると.したがって,
<ex:a> <ex:p> "<notLegalXML"^^rdf:XMLLiteral .
<ex:p> rdfs:range rdf:XMLLiteral .
となっていたら,
<ex:p>の値域は rdf:XMLLiteral ですが,1番目の表記は ill-formed な表記で,これは rdfs:Resource のインスタンスではあっても rdf:XMLLiteral のインスタンスではありませんから非充足です.つまりこの二つを含むいかなる三つ組み集合(グラフ)も非充足です.
ところで
"<notLegalXML"^^rdf:XMLLiteralって,SWCLOS ではどう読むんだろう.ウーン,心配になってきた.
この章の最後近くでは rdfs:subClassOf,rdfs:subPropertyOf,rdfs:domain,rdfs:range について,外延的意味条件としてより強い条件も提示しています.強いという意味は,右辺から左辺への矢印もあるからでしょうね.ある二つの集合を考えたときに,その二つの集合が包含関係にあれば,それをサブクラスやサブプロパティ関係にしてよいと.いいような気がしますけどね.「イヌ」のクラス外延がたまたま「ペット」のクラス外延を含んでいたら,「ペット」は「イヌ」のサブクラス? ウーン,そのとき限りのお話としてはいいような・・・でも真実を追究する立場としてまずいような・・・.多分だめなんでしょうね.オントロジーを追求する立場としては.