manakai//メモ//2005-02-16//1

manakai//メモ//2005-02-16//1

[1] 図: 次のような継承関係に、更に a -> b を足すところ。

[2] 推移的閉包のようなものを考えると、次の継承関係が存在していることになる。

継承関係 a -> b の追加によって新たに次の関係が生じる。

[3] つまり、 a へ向かう逆向きの木の各節点すべてに、 その節点から b の全節点への継承関係を追加すればいい (あたりまえ)。

追加する矢印の先の節点の一覧は、すなわち b の節点の継承先リストそのもの (および b 自体)。追加する矢印の前の節点の一覧は、 全節点を探索して継承先リストに a が含まれているものを見つければいい。んな悠長なことはやっていられないので、 逆方向の関係のリストも各節点に持たせれば実現できる。

[4] 継承関係 a -> b を追加するアルゴリズム:

  1. F := {a} ∪ a の継承逆方向リスト
  2. T := {b} ∪ b の継承順方向リスト
  3. F の各節点 f に対して
    1. T の各節点 t に対して
      1. f の継承順方向リストに t を追加。
      2. t の継承逆方向リストに f を追加。

ただし、循環や重複に注意すること。

継承関係の例