4.3.5.1. トポロジカルソート
トポロジカルソートは、 S_C
の中にあるクラスをC
としたとき、 C
ではない他のクラスがR
内で対応する要素に先行するものが無いような クラスC
を検索する処理によって行われます。 クラスC
は結果の最初に配置されます。 S_C
からC
を削除し、 D
がS_C
に含まれるもののとき(C,D)
の全てのペアを削除します。 この処理を繰り返し、 結果の最後の、先行するものがないものとしてクラスを追加します。 先行するものを持たない要素が見つからなかったときに停止します。
もしS_C
が空でないときに処理が停止したら、集合R
には矛盾があります。 もし有限のクラスの集合である全てのクラスが 他のものによって先行されていたら、R
にはループが含まれています。 つまり、クラスC1,...,Cn
の繋がりに対して、 Ci
がCi+1
ただし1<=i<n
に先行し、Cn
がC1
に先行しています。
ときにはS_C
に先行するものがないクラスが存在することがあります。 このような場合は、これまでに計算されたクラス優先順位リストで もっとも右にあるダイレクトスーパークラスを持つものを選択します (そのような候補クラスがないときはR
は部分順序を生成できず、 C
がS_C
に含まれるときのR_C
は矛盾しています)。
より正確な言葉であらわすと、 {N1,...,Nm}
, m>=2
をS_C
に先行するものがないクラスとします。 (C1,...,Cn)
, n>=1
をこれまでに構築したクラス優先順位リストとします。 C1
はもっとも特定的なクラスであり、 Cn
はもっとも特定的ではないクラスです。 ここで1<-j<=n
のもっとも大きな数
1<=j<=n
を、1<=i<=m
でNi
がCj
のダイレクトスーパークラスである i
が存在するような最大の数とします。 このときNi
は次に配置されるものになります。
先行するものがないクラスの集合から選択するというこのルールの効果は、 単純なスーパークラスのつながりであるクラスが クラス優先順位リストで隣接しており、 相対的に分離した各サブグラフのクラスが クラス優先順位リストで隣接するようになります。 例えば、T1
とT2
をクラスJ
のみを共通要素とするサブグラフとします。 J
のスーパークラスはT1
とT2
のいずれにも現れず、 J
はT1
とT2
の両方のクラスのスーパークラス内にあるとします。 T1
の底をC1
とし、 T2
の底をC2
とします。 あるクラスのダイレクトスーパークラスにC1,C2
という順番で 現れているようなクラスをC
としたとき、 C
のクラス優先順位リストはC
で始まり、 T1
のJ
を除くすべてのクラスが続きます。 クラスT2
のすべてのクラスが次に続きます。 クラスJ
とそのスーパークラスは最後に現れます。