15 ZYKLENERKENNUNG 15 67 Zyklenerkennung Die Aufgabenstellung fur dieses Kapitel lautet: Gegeben sei ein endlicher gerichteter Graph G = (A, E). Es soll entschieden werden, ob G einen Zyklus enthalt. Das hat zahlreiche Anwendungen. Beispielsweise mu in Java der Vererbungsgraph der Klassen zyklenfrei sein. 15.1 Formale Spezifikation Definition 1 1. Einen Pfad heit zyklisch, wenn er mindestens eine Kante hat und sein Anfangs- und Endknoten gleich sind. 2. Ein Graph heit azyklisch, wenn er keinen zyklischen Pfad enthalt, und zyklisch sonst. 3. Der echte Pfadabschlu einer Kantenmenge E ist die Menge aller Pfade mit mindestens einer Kante, [ gegeben durch + ∗ ∗ n E =df E o nE = E o nE = E , n>0 wobei der Stern in PAT(A) gebildet wird. Allgemein setzt man in KA a+ =df a · a∗ = a∗ · a . • Die Menge aller zyklischen Pfade von G ist dann cyc (G) =df [ xo n E+ o nx. x∈A • Vor- bzw. Nachmultiplikation o n mit x schrankt dabei wieder auf diejenigen Pfade ein, die mit x beginnen bzw. enden. • Insbesondere ist x o n E+ o n x die Menge aller Pfade von x nach x, also aller zyklischen Pfade, die mit x beginnen und enden. • Der Graph G ist daher genau dann zyklisch, wenn cyc (G) 6= 0. • Wir wollen einen Algorithmus herleiten, der diese Eigenschaft entscheidet. 15.2 Erste rekursive Lösung • Die Spezikation cyc (G) 6= 0 ist nicht direkt ausf uhrbar; dazu mute man erst die Bestimmung (eines + relevanten Anteils) von E bzw. cyc (G) ausprogrammieren. • Ganz E+ bzw. cyc (G) kann man i.a. nicht bestimmen, da diese Mengen im Fall eines zyklischen Graphen unendlich sind (ein Zyklus kann ja beliebig oft durchlaufen werden). • Aber selbst wenn G azyklisch ist, kann E+ sehr gro werden, so da die direkte Auswertung von cyc (G) 6= 0 nicht ezient ware. • Die Pr ufung auf Zyklen mu also auf die Untersuchung eines \kleineren" Objekts zuruckgespielt werden. • Hierzu erinnern wir uns an das Schubfachprinzip: Verteilt man ≥ n + 1 Elemente auf n Schubfacher, so mu mindestens eines der Facher 2 Elemente enthalten. Algebraische Semantik c B. Moller 2008 15 ZYKLENERKENNUNG 68 • Nehmen wir nun als Elemente die Positionen in Pfaden und als Schubfacher die Knoten in A. • Dann folgt, da in jedem Pfad w mit ≥ |A| Kanten mindestens ein Knoten doppelt auftritt, also w einen zyklischen Teilpfad enthalt. • Ist also E|A| 6= 0, so ist G zyklisch. • Ist umgekehrt G zyklisch, so sei etwa w ∈ cyc (G) ein zyklischer Pfad. • Da head (w) = last (w), lat sich w mit sich selbst verkleben, d.h. 0 6= w o n w ⊆ cyc (w). • Iteration ergibt 0 6= wn ∈ cyc (w) f ur alle n. • Da w mindestens eine Kante hat, hat wn mindestens n Kanten. Insbesondere ist also E|A| 6= 0. Insgesamt ist damit gezeigt: Lemma 2 Der Graph G = (A, E) ist zyklisch genau dann, wenn E|A| 6= 0. • Auch E|A| ist noch ein \groes" Objekt. • Die Eigenschaft E|A| 6= 0 kann aber aus dem Vor- oder Nachbereich von E|A| abgelesen werden: • Allgemein gilt ja in V/N-Halbringen a = 0 ⇔ pa = 0 ⇔ aq = 0 . • Wir wollen nun ein ezientes Berechnungsverfahren f ur (E|A| )q herleiten (die Betrachtung von p(E|A| ) lat sich ganz symmetrisch dazu verfolgen). • Dazu betrachten wir in allgemeinen N-Halbringen den Ausdruck pn =df (an )q und versuchen, aus der induktiven Denition der Potenzen eine induktive Berechnungsmoglichkeit fur die pn abzuleiten. Induktionsanfang: p0 = (a0 )q = 1q = 1. Induktionsschritt: pn+1 = (an+1 )q = (an · a)q = ((an )q · a)q = (pn · a)q = ha|| pn . (∗) Dabei ist der Schritt (∗) nur moglich, wenn der betrachtete N-Halbring modal ist; dies ist in PAT der Fall. Damit lat sich also nun insbesondere (E|A| )q als p|A| in PAT bestimmen. 15.3 Effiziente Iteration Um eine weitere Ezienzverbesserung zu erreichen, beobachten wir, da wir die Iteration u.U. gar nicht bis zum Index |A| durchfuhren mussen. Ist der Graph azyklisch und sind alle Wege \kurz", d.h. haben hochstens i < |A| Kanten, so wird bereits pi+1 = 0. Dann gilt wegen der Striktheit der Bildoperation auch fur alle weiteren j > i, da pj = 0, und man kann die Iteration abbrechen. Wie sieht es im allgemeinen Fall aus? Wir beobachten zunachst, da die Iterationsfunktion fa (x) =df ha|| x isoton ist. Fur solche Funktionen lat sich ein zu dem Verfahren aus Abschnitt 12.2 analoger Iterationsalgorithmus angeben. Algebraische Semantik c B. Moller 2008 15 ZYKLENERKENNUNG 69 Lemma 3 (Fixpunktiteration II) F ur eine partiell geordnete Menge (M, ≤), eine isotone Funktion f : M → M und ein p ∈ M wird die Folge der pi deniert durch p0 =df p und pi+1 =df f(pi ); weiter sei K =df {pi : i ∈ IN}. 1. Wird p0 von f kontrahiert, so auch alle anderen pi ; auerdem bildet K eine Kette, d.h. es gilt pi+1 ≤ pi fur alle i. 2. Ist (M, ≤) noethersch, d.h. hat jede Kette ein kleinstes Element, so gibt es ein i0 mit pi0 +1 = pi0 . 3. Ist p0 grotes Element von M, so ist pi0 = νf der grote Fixpunkt von f. Beachte, dass M nicht unbedingt ein grotes Element haben muss. Beweis: 1. Die Rechnungen sind vollig analog zu denen in Abschnitt 12.2. 2. Hier argumentieren wir ahnlich wie im Beweis zu Knaster/Tarski I. Das kleinste Element von K sei q. Da nach 1. alle Elemente von K von f kontrahiert werden, gilt auch f(q) ≤ q. Andererseits gilt f(q) ∈ K, so da q ≤ f(q) gelten mu, da q kleinstes Element von K ist. Insgesamt folgt q = f(q). 3. Wenn p0 grotes Element ist, gilt trivialerweise f(p0 ) ≤ p0 , d.h. p0 wird von f kontrahiert. Nun argumentiert man symmetrisch zu Abschnitt 12.2. t u Eine Iteration kann immer dann abgebrochen werden, wenn sie stationar wird, d.h. wenn ein Fixpunkt entsteht, da sich dann ohnehin nichts mehr andert. Die Aussage 2. besagt nun, da unter den angegebenen Voraussetzungen die Iteration stets stationar wird. In PAT(A) ist bei endlicher Knotenmenge A auch die Testmenge endlich und damit trivialerweise noethersch, so da unser Lemma anwendbar ist. Unter den Voraussetzungen des letzten Lemmas fuhrt also das folgende Iterationsverfahren stets zu einem Fixpunkt: iter (f, x) = if f(x) = x then x else iter (f, f(x)) mit Aufruf iter (f, p). Speziell fur die Zyklenerkennung konnen wir (E|A| )q als cyciter (A) berechnen, wobei cyciter (x) = if hE|| x = x then x else cyciter (hE|| x) . Beweis: Die Bildoperation ist isoton, und 1 ist der gr ote Test. Weiter hat eine echt absteigenden Kette von Tests in PAT hochstens die Lange |A|. t u Also wird nach spatestens |A| Schritten ein Fixpunkt q erreicht, fur den dann auch q = p|A| = (E|A| )q gilt. Hier ist der grote Fixpunkt interessant, da der kleinste Fixpunkt von fa (x) = ha|| x die 0 ist. 15.4 Effizienzverbesserung durch Fortschaltung Nun konnen wir die Ezienz weiter verbessern, indem wir ausnutzen, da die pi eine absteigende Kette bilden. Anstatt hE|| x berechnen wir, analog zu Abschnitt 12.4, die Dierenz x − hE|| x. Algebraische Semantik c B. Moller 2008 15 ZYKLENERKENNUNG 70 Dann gilt hE|| x = x ⇔ x − hE|| x = 0. Was bedeutet die Menge x − hE|| x = x ∩ ¬(hE|| x)? Das sind alle Knoten, die nicht direkte Nachfolger von Knoten in x sind, also keine einlaufenden Kanten haben, die von x-Knoten ausgehen. Diese Knoten werden auch als relative Quellen von x bezeichnet (vgl. auch Abschnitt 8.4), und wir setzen daher rsrc (x) =df x − hE|| x . Nun gilt hE|| x = x − rsrc (x) und unser Verfahren wird zu cyciter (x) = if rsrc (x) = 0 then x else cyciter (x − rsrc (x)) . Wir haben so ein klassisches Verfahren zur Zyklenerkennung entwickelt, das fortgesetzte Entfernen von relativen Quellen. Entsteht schlielich ein nichtleerer Graph ohne relative Quellen, so war der Ausgangsgraph zyklisch, andernfalls nicht. Symmetrisch dazu kann man ein Verfahren entwickeln, das fortgesetzt relative Senken entfernt. Eine weitere Ezienzverbesserung erhalt man, wenn man die relativen Eingangsgrade der Knoten in x mitfuhrt; relative Quellen sind genau die Knoten mit relativem Eingangsgrad 0. Dieses Verfahren wurde auch schon in Abschnitt 12.4 erwahnt. Auf die streng formale Behandlung mussen wir aus Zeitgrunden verzichten. Algebraische Semantik c B. Moller 2008