Daß die transitive Hülle existiert und eindeutig bestimmt ist, läßt sich am einfachsten über den Relationsgraphen einsehen: <a,b> R bedeutet: es gibt einen Pfeil von a nach b; und die Transitivitätsbedingung sagt aus: wenn es einen Pfeil von a nach b und einen von b nach c gibt, also einen Weg von a nach c über b, so gibt es auch einen Pfeil von a nach c. Im Graphen einer transitiven Relation gibt es also für jeden Weg einen Pfeil vom Anfangspunkt zum Endpunkt, und um die transitive Hülle zu bilden, betrachtet man alle Wege und nimmt die genannten Pfeile dazu, sofern sie nicht schon vorhanden waren, und keine weiteren.
Um die transitive Hülle zu berechnen, kann man also für jedes Tripel <a,b,c> in der Transitivitätsbeziehung die Pfeile von a nach c ergänzen, etwa folgendermaßen:
Dies ist der berühmte Algorithmus von Warshall, und man möchte glauben, daß man ihn mehrmals ablaufen lassen müßte, bis sich nichts mehr ändert. Überraschenderweise ist das aber nicht nötig, weil bei jedem Schritt in der äußeren Schleife die Ergebnisse früherer Schritte mit verwendet werden. Das sieht man am besten aus einem Beispiel (ausprobieren!); der Beweis ist etwas schwieriger. Wer ihn nachlesen möchte, findet ihn in:TYPE knoten = 1 .. n; TYPE vorgaenger = SET OF knoten; TYPE relation = ARRAY [knoten] OF vorgaenger; PROCEDURE Trans(rel: relation; VAR trel: relation); VAR i, k: knoten; BEGIN trel := rel; FOR i := 1 TO n DO FOR k := 1 TO n DO IF i IN trel[k] THEN trel[k] := trel[k] + trel[i]; END; END; END; END Trans;
ACM Journal 9/1, 11 - 12 (1962)