名前の参照関係のグラフ構造:これは物凄く大事
こういう絵になる。
NSは名前空間の略称。NSコンテナはいくつかの名前空間を保持する入れ物。NSソートは名前空間の種別。
- NSコンテナにNSソート指定=名前空間=束縛セット=置換=コンテキスト
色々な用語が使われているが同じこと。束縛セット(単に束縛ともいう)と置換は用途が違うので呼び方も変えている。
上の絵で:
- 四角い枠が名前空間=束縛セット=置換(substitution)
- 黒丸が名前
- 枠内の黒丸は内部の名前
- 枠の外の黒丸は外部の名前
- 白い丸(楕円っぽい)は、名前の定義体(definition body)、値、式、項とか。
- 黒丸→白丸 の矢印は、束縛、定義、宣言などを表す。
- 白丸→黒丸 の矢印は、名前による参照。
- 枠内は黒丸グループと白丸グループからなる二部ブラフと考えるとよい。
- 下側に、名前ごとの可達性が書いてある。
- 「名前 => 可達な内部名の集合 => 可達な外部名の集合
Catyの名前構造では、再帰(サイクル)のスコープは名前空間に限定されるので、外部に出た参照の矢印が戻ってくることはない。名前空間(四角い枠)内のサイクルだけを考えればよい。また、サイクルは必ず「1つ以上の黒丸と1つの以上の白丸」を通る。よって、最短でも長さ2以上となる。(白丸を無視すると自己ループもあるが、黒丸と白丸の両方を考える。黒丸→黒丸 はエイリアス。)
内部の黒丸の集合に、次の関係「〜」を入れる。x〜y とは:
- xからyに至るパス(長さ2以上)がある。
- yからxに至るパス(長さ2以上)がある。
つまり、「互いに行ったり来たり出来る」こと。この定義より:
- x〜y ならば、 y〜x (対称律)
- x〜y かつ y〜z ならば、x〜z (推移律)
しかし、x〜x (反射律)は成立しない。x〜x のとき、その黒丸(名前)はサイクルに含まれるので再帰的となる。再帰的な名前だけを選んだ部分集合上では、関係「〜」は、反射的/対称的/推移的 となるので同値関係。この同値関係のよる分割の成分を、再帰的連結成分と呼ぶことにする。
四角枠=名前空間=束縛セット=置換 の黒丸の集合(名前の集合)に関して、再帰的連結成分を完全に求めることは非常に重要である。再帰的連結成分を単一のノード(例えば二重枠の白丸とか)にして、名前と定義体を結ぶ矢印を加工すると、再帰的定義の解釈ができる。
再帰的定義では、ツリーではなくて、サイクルを持つグラフそのものの不動点(の成分)を定義体と考えることになる。多変数の不動点演算子μと成分を取る(名前による射影)演算子πxを組み合わせればよい。