anderen Formulierung als Schnitt und Kompliment. Wir fragen uns,
ist das, was das System macht,
geschnitten mit dem Kompliment der Spezifikation leer?
So, und was man jetzt machen muss,
man muss jetzt erstmal das Kompliment der Spezifikation bilden.
Das sieht so aus, also ich müsste erstmal das System
der Vervollständigen mit allen, deswegen gibt es noch neun Knoten.
Das ist Punkt eins. Deterministisch ist okay,
aber es muss eben vollständig sein,
dann kann ich komplementieren.
Dazu gibt es noch
neun Knoten
So, da bleibt alles erhalten. Der Endzustand von null
ist jetzt keiner mehr. Und der Nicht-Endzustand V1 und der Nicht-Endzustand V2,
der ja neu hinzugekommen ist, die beiden sind jetzt Endzustände.
Und da sieht man, da wird eigentlich alles akzeptiert,
was sich so senden kann auf A und C.
Das Einzige, was der nicht akzeptiert, ist dieser alte, gewünschte Ablauf.
Ich sende auf A etwas und bekomme es auf C gleich ausgeliefert.
Also der Wechsel von V0 zu V1. Das ist jetzt das
Kompliment davon. Und diesen Automat mit seinen drei Zuständen,
Und den Systemautomaten mit U001 mit seinen beiden Zuständen,
da muss ich jetzt den Produktautomaten bilden.
Ja, im schlimmsten Fall erwartet man da also sechs Zustände,
die da potenziell möglich sind. Wenn wir jetzt gucken,
was passiert da tatsächlich, stellen wir fest, was wir brauchen,
ist also nur von U0V0, dass es halt möglich zu U1,
V1 zu gehen, dass es mich der Ablauf,
der da bei beiden identisch ist und von U1,
V1 komme ich auch wieder zurück.
Das ist also der gewünschte Ablauf. Da sieht man aber,
dass der gar nicht akzeptiert wird, was auch nicht schlimm ist.
Uns interessiert ja Lehrheit. Aber wir sehen schon,
es gibt die Möglichkeit, relativ schnell in den Zustand U0V2 zu gelangen.
Denn wenn ich in U0 bin, und in U1 bin,
kann ich ja wieder zurück nach U0 kommen, indem ich Bottom sende.
Also ein gestörtes Signal. Das heißt,
das System kann jetzt eine Störung machen,
wenn man jetzt in einem Kompliment der Spezifikation nachschaut,
von U1, V1, also V1,
ein gestörtes Signal auf Kanal,
C ist erlaubt und ich gelange dann zu dem neuen
vervollständigten Zustand
Das heißt,
man sieht sofort die Sprache des neuen Produktsystems ist nicht leer,
weil ja einmal zum Beispiel senden auf dem Kanal A,
gefolgt von einmal gestört empfangen auf C, ein akzeptierter Ablauf ist.
Also diese Sequenz, RAD, SC Bottom,
das ist ein akzeptierter Ablauf dieses Systems.
Also sieht man sofort, da komme ich in einen Endzustand.
Das Ganze kann gar nicht leer sein. Es gibt noch viel mehrere Worte,
ich kann ja noch zu U1V2 da immer her.
Also alles andere als leer. Deswegen kann die Inklusion nicht
Geld nehmen
Ja, man kann das jetzt temporallogisch noch ein bisschen aufpeppen,
wenn man das wollte. Man könnte also jetzt sagen,
wir wollen eigentlich so etwas haben,
wann immer ich jetzt gerade etwas empfange auf dem Kanal A,
dann möchte ich das immer gilt.
Globaly, das Lesen auf A Äquivalent ist,
das Next auch empfangen wird auf C.
Also das ist die wünschenswerte Spezifikation. Das,
was wir also eben jetzt mit den Transitionssystemen dargestellt haben,
das könnte man noch so machen.
Klar, so haben wir es aufgezogen,
dass wir das als temporallogische Formel hinschreiben
Und das wollen wir jetzt im Prinzip auch genau so machen. Wir wollen jetzt also,
nachdem wir kurz das Trocken im Kleinen mit den NFAs geübt haben,
jetzt machen, indem wir das für Büchi-Automaten genau nochmal machen.
Und bei Büchi-Automaten kann ich mir vorstellen, man weiß,
und das ist der Ausgangspunkt zu jeder temporallogischen Formel in LTL,
kriege ich einen Büchi-Automaten,
sodass ich wieder ganz analog mich fragen kann,
wenn ich eine Spezifikation habe,
dann ist die vermutlich als Formel gegeben,
aber ich kann mir immer ein Büchi-Automaten-TS Speck
dazu konstruieren und kann dessen Sprache mir ansehen
Und dann kann ich fragen, ist die Systemimplementation dessen Sprache eine Teilmenge der Spezifikationssprache.
Und ganz analog gilt wieder, das kann ich auch darstellen
als Schnitt des Systems, mit dem Kompliment der Spezifikation.
Und was da rauskommt, teste ich auf null. Da haben wir schon gesehen,
auch die Bausteine, die wir hier benötigen, also Schnittkompliment,
Lehrheitstest, sind effizient effektiv lösbar, konstruierbar für Büchi-Automaten,
sodass wir Im ersten Ansatz genau das Gleiche noch mal hinschreiben,
analog, wie wir es gemacht haben,
schon für NFAs, wir machen also wieder einen Check,
einen Inklusionsscheck für das System und die Spezifikation,
indem wir das Kompliment konstruieren, das kann man machen.
Ja, und das Komplimentsystem der Komplimentbücherautomat akzeptiert dann genau die Komplimentsprache,
dann konstruiere ich mir dieses Produktsystem, TS4. Ja,
und TS4 hat eben die Eigenschaft, auch wieder den Durchschnitt zu akzeptieren.
Und dann kann ich Das soll in diesem Fall das Gleiche sein.
Also TS4 und der Schnitt ist das Gleiche. Und jetzt frage ich,
ist durch die Sprache dieses Durchschnitts ist das leer oder nicht?
Das ist ein vollständig legitimes Verfahren,
führt doch immer zu einer korrekten Ja-Nein-Antwort nach endlicher Zeit.
Das Hauptproblem ist, warum man es nicht so macht,
ist, dass dieser Ansatz sehr naiv ist in der Laufzeit.
Nämlich genau an dieser Stelle. Dort, wo wir das
Kompliment konstruieren, haben wir ein hochgradig inneneffizienten Ansatz gewählt.
Und das Kompliment für Büchi-Automaten, Das ist noch viel schlimmer,
als wir es bei NFA schon hatten.
Bei NFAs musste ich den Potenzautomaten bilden. Der brauchte zwei
auch N-Zustände. Beim Büfi-Automaten ist es schlimmer,
dass es zumindest ohne Tricks zwei Hoch-Endquadrat, also noch schlimmer.
So, kann man sagen, wenn man nichts Besseres wüsste,
dann müsste man den sauren Apfel beißen, aber es geht cleverer an dieser Stelle.
Und wie das aussieht, naja, das gucken wir uns nochmal an,
erstmal noch zur Erinnerung, wir hatten mal einen Satz,
der sagte uns ja zu jeder LTL-Formel F,
Kann eine Kripke-Struktur in Form eines Bücherautomaten konstruiert werden,
sodass gilt, dass dieser Bücherautomat genau die FF-gültigen Folgen akzeptiert.
Also die Omega-Sprache von M ist gleich der von F generierten Omega-Sprache.
So, ich weiß also zu jeder Formel F kriege ich ein Büchi-Automaten.
Und jetzt ist es relativ schlau, mal zu gucken,
ob ich für die Negation dieser Formel F was machen kann.
Ja, eigentlich interessiert mich ja gar nicht,
wenn ich das in den Schnitt reinstecke,
ob die Formel F da gilt,
sondern eigentlich das Kompliment der Formel F
interessiert mich
Und das können wir jetzt hier ausnutzen, wir machen das einfach,
indem wir folgendes machen, wenn wir diesen Lehrheitstest machen,
dann gehen wir über von der Formel F zur Formel Negation von F.
Also wir konstruieren uns jetzt nicht den Bücherautomatens Formel F selbst, sondern zur Formel Nicht F.
Und der sollte uns das ein bisschen netter machen,
denn die Sprache, die der Automat für Nicht F akzeptiert,
Das sind genau die anderen Abläufe.
Wenn ein Ablauf die Formel F beschreibt,
und ich nehme einen Ablauf, der das nicht tut dagegen,
dann wird das ein Ablauf für die Formel Nicht F sein.
Jeder Ablauf hat mich die Eigenschaft, entweder ist er für
die Formel F oder für die Formel Nicht F, ein gültiger Ablauf.
Das heißt, auf diese Art und Weise kriegen wir,
wir vorgehoben, dargestellt, einen sehr einfachen Weg,
das Kompliment der Sprache,
der Spezifikation zu bekommen,
einfach indem wir die Negation der Formel F betrachten
Und dann sparen wir uns einfach das Komplementieren.
Wenn wir also gar nicht das System selbst als Argument haben,
wie diesen Algorithmus, der jetzt unten steht, angedeutet,
sondern die Formel F, dann geht das ein bisschen netter.
Wenn ich also überprüfen soll, ob die Sprache des Systems,
TSS, ein Modell der Formel F ist,
dann baue ich mir erstmal, dass Transitionssystem,
also dem Büchi-Automaten, zur Negation der Formel auf Speck.
Und der Aufwand, das zu tun,
ist zwei hoch konstante Malgröße der Formel
Verglichen mit zwei Hochendquadrat in den Anzahl Zuständen, ist das eigentlich
schon ganz gut. Vor allen Dingen muss man bedenken,
wenn ich das andersrum mache, erst die Formel F reinstelle,
dann kommt ein Büchi-Automat der Größe 2 hoch N raus.
Wenn ich den dann nochmal determinisiere, dann kommt da ganz
naiv gemacht, zwei hoch, zwei hoch N quadriert.
Das kriege ich also zwei hoch, zwei hoch, irgendwas.
Das wird dann gar nicht mehr lustig. Das heißt,
dieser naive Ansatz, das unheimlich aufzublähen, zweimal nämlich,
den spare ich mir da komplett
Gut, was ich dann habe,
ist also ein Transitionssystem für Migration der Formel,
das Transitionssystem für das System habe ich ja schon gegeben.
Und jetzt bilde ich, wie gehabt, das Produkt,
TS4, jetzt aber für die Negation der Formel und für das System.
Fantastisch wieder, ob das null ist.
Er hat immer noch eine relativ hohe Komplexität,
aber irgendwo ist das Problem auch gar nicht mal so einfach.
Das kann man noch genauer sagen,
gar nicht mal so einfach, indem man feststellt,
dass es unter dem Peace-Space-Problem
ein vollständiges
Und da wissen wir schon, das ist mindestens so schlimm
wie NPV-ständige Probleme, die ja auch schon ganz schön komplexitätsschwer sind.
In dieser Grafik sieht man jetzt das normal,
was man da im Prinzip macht, die Teilschritte zusammengefasst in den verschiedenen Einzelschritten.
Auf der linken Seite sieht man, man programmiert sich so ein System.
Hat dann ein Modell davon, also ein Süss.
Und was geht da noch rein? Eine Eigenschaft,
die ich gerne hätte und deren Negation, also nicht Vieh.
Und das geht jetzt in die großen grauen Kasten namens Modelchecker
Und der Modelchecker macht folgendes. Der macht dann noch ein paar Tricks.
Der nimmt mich nicht die Formel nicht viel selbst, sondern normalisiert die.
Bildet also eine Normalform. Das kennen wir auch schon.
konjunktive Normalformen bei Aussagenlogik oder so Sachen. Die Normalformen,
die hier gewählt wird, das eine,
bei der alle Negationen auch vor den atomaren Symbolen stehen müssen.
Also die kann man auch wieder reintreiben. Wenn man das hat,
dann kann man nach einem Transformationsschritt daraus einen generalisierten Büchi-Automaten erhalten.
Also einen, der eine ganze Menge von Endzustandsmengen hat,
wo ich jede einzelne Eimer unendlich oft treffen muss mit einem Zustand.
Aber für den können wir ein Verfahren, um da wieder ein Büchi-Automaten draus zu machen.
Einfach durch mehrfaches Kopieren dieses Automaten und zyklisches Durchlaufen.
Diese ganzen Verfahren hatten wir schon. Und jetzt nehme ich den Büchi-Automaten,
der mir das System beschreibt, den Büchi-Automaten,
der mir die Negation der Formel Fi beschreibt und bilde mit beiden
zusammen den Produktautomaten aus dem System und der Negation und überprüfe ob die Sprache,
die dieses Produktsystem hat, leer ist.
Und da kommt entweder raus Yes, dann weiß ich, die Eigenschaft gilt.
Das ist ja schön, dann freue ich mich.
Oder die Antwort ist nein und es gibt ein Gegenbeispiel zurück. Und da gibt es verschiedene Tools,
die das so machen können, ein sehr prominentes Spin,
Spin kann so verschiedene Dinge machen, Spin,
es hat eine eigene Programmiersprache, sowas wie zäh mit Nebenläufigkeit und Nachrichtenverkehr,
also Hardware ganz gut und dann kann man verschiedene Diagramme damit generieren,
hier sieht man zum Beispiel einen verteilten Algorithmus,
verschiedene Prozesse, ganz unten steht ganz rechts.
Fünf ist Lieder, also es ist ein verteilter Algorithmus.
Leader Election, also einer wird ausgewählt als ausgezeichneter Knoten.
Hier wird also gerade verifiziert, ob eine Implementation eines Protokolls
korrekt ist. Und typischerweise, ich würde mal vermuten,
wenn hier irgendwas passiert, etwas visualisiert wird,
macht man das, weil es ein Gegenbeispiel zur Spezifikation ist.
So kann man sich also ein Gegenbeispiel animieren,
visualisieren lassen und jetzt herausfinden,
wo liegt der Fehler in der Spezifikation oder einer Implementation
Gut, so kann man damit ungefähr umgehen. Jetzt wollen
wir noch mal überlegen, wie teuer ist das Ganze?
Also wie teuer ist es, so Model-Checking zu betreiben?
Wo steckt da die Komplexität drin?
Also wir machen ja im Prinzip drei Aktionen.
Einmal konstruieren wir uns ein Transitionssystem für die Negation der Formel 11.
Wir konstruieren uns das Produktsystem. TS Schnitt. Und wir
überprüfen dann, ob die Sprache des Produktsystems leer ist.
So, und wie groß ist die Komplexität dieses Verfahrens?
Ja,
die Summe der Teilkomplexitäten
Also die Summe dieser drei Schritte im Wesentlichen. Und das
kann man abschätzen aus den Teilergebnissen, die wir schon kennen.
Wir wissen, zu jeder LTL-Formel F kriegen wir einen äquivalenten
Bücherautomaten M. Zeit- und Platzkomplexität dieses Verfahrens ist zwei hoch.
O von F. Also zwei hochkonstante Mal F ist so
eine Abschätzung. Und die Tatsache liegt daran,
dass der Bücherautomat, der da konstruiert werden muss,
zwei Hochofernbetrag von F viele Zustände hat.
Um diesen Automaten einfach hinzuschreiben,
brauche ich also zwei O von F viele Schritte und
auch so viel Platz wohl
Das ist also schon mal nicht ganz wenig. Das ist also
exponentiell in der Größe der Formel F. Der nächste Schritt,
Produktautomat, da wissen wir, na wie groß wird der?
Der hat Triple als Zustände. Der hat nämlich Zustand des
ersten Zustand des zweiten Systems und dennoch diese Signalvariable 1,
2, mit der wir zählen,
dass wir immer brav zwischen den Systemen und endlich oft hin und her wechseln.
Deswegen hat der zweimal für die dritte Komponente und dann Anzahl
der Zustände des Einmalanzahl der Zustände des anderen Systems.
Viele. Zustände
So, die Formel M hat also schon zwei Hochofen App,
viele Zustände, okay. Und das Transitionssystem hat auch Betrag
von TS, viele Zustände. Der dritte Algorithmus,
der testet, ob die Sprache leer ist,
der muss feststellen, ob wir einen erreichbaren Zustand finden,
der auf einem Zyklus liegt.
Das kann man, Algorithmen und Datenstrukturen lässt hier grüßen,
mit einem Algorithmus machen,
der die strengen Zusammenhangskomponenten berechnet
Also eine strenge Zusammenhangskomponente eines Graphens ist eine Teilmenge von Knoten,
die ich nicht mehr vergrößern kann, die die Eigenschaft hat,
dass jeder Knoten in dieser Teilmenge von jedem anderen zu erreichen ist.
Das ist also ein in sich schön zyklischer Bereich,
den ich immer wieder durchlaufen kann.
Und das Schöne an dieser Sache ist,
den kann ich linear in der Anzahl der Zustände in der
Zeit dann auch berechnen, diese strengen Zustandskomponenten.
Also in Linearzeit. So, wenn ich das so zusammenzähle,
ich brauche einen ersten Schritt,
zwei hoch o von
Im zweiten Schritt zweimal, zwei Euro von F-Mail-Betrag von TS.
Und dennoch einmal genau das Gleiche wie im zweiten Schritt.
So, das kann ich jetzt in der O-Lotation verstecken,
indem ich sage, das gibt also die Gesamtkomplexität ofern,
Größe des Transitionssystems mal zwei Hochgröße der Formel.
Man sieht also die Größe des Transitionssystems,
also die Implementation darstellt,
geht hier linear ein und
die Formel F geht Exponential ein
In praktischen Fällen ist das oftmals gar nicht so schlimm,
weil das Transitionssystem um ein Vielfaches größer sein wird als die Formel und typischerweise
ist so das Transitionssystem sowieso größer als zwei Hochgröße der Formel.
Das heißt,
dieses zwei O von F sieht gewaltig exponentiell schlimm aus,
ist es für viele praktische Fälle gar nicht,
weil die Größe ist Transitionssystems praktisch gesehen
hier dominieren wird
Von daher muss man mal gucken, wenn die Spätsituationen klein sind,
dann ist das gar nicht mal so ein großer Beitrag im
Vergleich zum Transitionssystem und dann wird man feststellen,
dass der Zustandsraum eines Systems hier das ganze Verfahren dominieren wird.
Gut, das ist also das prinzipielle Vorgehen für LTL-Model-Checking.
Die eine Variante. Und jetzt, auf der anderen Seite wollen wir mal gucken,
wie sieht das aus, wenn ich zu CTL übergehe?
CTL, Einer der großen Eigenschaften, positiven Eigenschaften und CTL ist wie Effizienz.
Wollen wir mal gucken, warum ist CTL-Model-Checking jetzt einfacher?
Woran liegt das? Dass wir dort nicht,
es wird rauskommen, es wächst nicht exponentiell in der Formelgröße.
Ja, woran liegt das? Was wir machen wollen,
ist wieder genau das Gleiche wie vorher.
Wir wollen gegeben eine Kryptostruktur, die wir explizit als Graf
haben und eine CTL-Formel. Die Menge der Zustände berechnen,
die diese Formel erfüllen
Und das Ganze für eine CTL-Formel F als Algorithmus formulieren.
Und wie machen wir das jetzt? Wir machen es folgendermaßen,
wir nehmen an, wir haben einen Algorithmus,
einen Algorithmus für eine CTL-Formel, der für die verschiedenen Operationen eine Faltenunterscheidung macht.
Also die Idee ist folgendes, wir arbeiten uns rekursiv ab
an den Teilformeln der Formel F. Und was machen wir bei
diesen Rekursionsschritten? Man kann jetzt nicht so vorstellen,
dass wir an jeden Zustand alle Teilformeln annotieren werden, dieser Zustand gültig sind.
Kann man ein bisschen effizienter machen, ja,
aber gedanklich ist es genau das, was wir machen.
Wir schreiben jetzt an jedem Zustand die Menge der von effgültigen Teilformeln auf.
Und dass diese Menge, die wir schrittweise erweitern,
dass es die Menge Label von S, die Menge der Anschriften des Zustands ist.
Und jetzt hat man im Prinzip zwei Möglichkeiten,
entweder ich fange von den Blättern an,
also mit den Atomen und arbeite mich zur Formel F empor oder so wie hier gemacht,
ich formuliere das als rekursives Verfahren,
fange also bei F an und rufe mich denn rekursiv für
die Teilformeln auf
Und genau so macht das dieser Algorithmus,
der für jede Möglichkeit, wie so eine Formel aussehen kann,
da eine, If the and Else-Konvention hat.
Und was hier noch ausgenutzt wird, ist, wir wissen,
wir brauchen ja von den CTL-Operatoren nicht alle zu haben.
Viele lassen sich ja mit den anderen ausdrücken. Wir verwenden jetzt den Satz EXG,
also es gibt einen Pfad, das im nächsten Schritt gegelt.
EGG, das heißt, es gibt einen Pfad,
auf dem immer kleingegelt und EG1 an Till G2. Das heißt,
es gibt einen Pfad, auf dem gilt G1 bis irgendwann.
Und letztens ist es garantiert G2 gelten wird.
So diese drei Unterprozeduren gibt es, wobei,
eigentlich sind alle einfach, bis auf zwei Nicht-elementare Dinge.
Also EG und EU, die sind nicht so einfach.
Dafür gibt es Subprozeduren, Check-EU und Check-EG.
Ja, Check-EU hat zwei Teilformeln, F1,
F2 als Argument und Check-EG einen.
Bei Operatoren zwei und einen Teilformeln
Der Algorithmus gibt jetzt folgendermaßen vor,
wenn er aufgerufen wird, Check, mit einer Formel F.
Er wird getestet, ist F vielleicht eine atomare Proposition.
Ja, wenn das der Fall ist, dann macht er folgendes.
Er geht alle Zustände, Klein-S durch. Guckt nach,
ist diese atomare Propos F? Ich hätte von S bereits
drin. Ja, da stehen nämlich in den Etiketten,
stehen genau die gültigen atomaren Formen da drin.
Wenn das der Fall ist, es steht also schon drin,
dann packe ich doch einfach die Formel F zum Labeling hinzu
Also habe ich nichts weitergemacht, als eigentlich die Intikettem E-Index S,
die ich schon hatte, zum Labeling hinzuzupacken für atomare Form.
Okay, ganz einfach. Wenn die Formel F die Negation einer
irgendwie andersartigen Formel F1 ist, dann mache ich Folgendes.
Ich gehe davon aus, dass ich für die Formel F1
das Ganze schon durchberechnet habe.
Also das steckt da schon drin. Ich frage nämlich an
, steckt F1 im Label von S?
So, und dazu muss das ausgerechnet werden.
Also da wird das implizit reingestopft
Wenn er also entschieden hat,
ob F1 für diesen Zustand S im Label vorkommt,
ja oder nein, dann drehe ich das genau um,
wenn F1 nicht im Label von S vorkommt,
dann packe ich es jetzt bei diesem Zustand,
packe ich das F hinzu, also genau die Negation.
Das ist klar, wenn F1 nicht vorkommt,
dann ist die Negation von F1 also hier gültig.
Bei einer Dissuktion läuft das nach der gleichen Melodie für
jeden Zustand klein S, teste ich, gilt F1,
ist das im Label von F und ist F2 im Label
vom F1 von beiden mindestens
Wenn das der Fall ist,
dann packe ich F zum Label von S hinzu.
So, jetzt kommen die temporal logischen Operatoren.
Der Einfachste ist, E-X-F1. Also gibt es einen nächsten Zustand,
in dem F1 gilt. Ja, und da gucken wir
genau nach. Für jeden Zustand S überprüfe ich jetzt,
gibt es einen Zustand Tee, sodass ich ST in Relation habe.
Also es gibt eine Kante von S nach Tee.
Und F1 ist eine gültige Formel für Tee.
Also F1 ist im Label von Tee
Also ich habe einen Nachfolgezustand, Tee und die Eigenschaft in ihm
gibt F1. Wenn das der Fall ist, weiß ich,
in meinem jetzigen Zustand S, gilt im nächsten Schritt,
habe ich eine Möglichkeit, die Formel F1 wahrzumachen.
Und deswegen packe ich jetzt für den Zustand S,
diese Formel F hinzugehen zum Label. So, das sind
die ganz einfachen, die ich sofort ad hoc lösen kann.
Wenn ich das schon mal rekursiv für alle Teilformeln ausgerechnet habe,
bleiben noch die Fälle,
wenn die Formel F die Gestalt EF1,
Antel F2 habe,
dann rufe ich eben die Prozedur Scheck EU
F1 F2 auf
Und wenn die Formel F die Gestalt E-GF1 hat,
dann rufe ich, check E-GF1 auf. Das können wir
uns jetzt mal, Schritt für Schritt nochmal klar machen.
Also wenn ich eine atomare Formel F habe,
und dann nehme ich mir einen Zustand, S raus.
Und ich finde F, also diese atomare schon in der Beschriftung von S,
also der Etikette, dann packe ich es im Labeling hinzu.
Da gucken wir mal. Wenn ich rekursiv losgehe für die Teilformeln,
dann stelle ich ja fest, die Formel F EX,
A oder nicht B.
Und in der S2 soll A gelten und in S3B,
dann packe ich schon mal das A als interessante Teilformel zur S2 hinzu.
Da gilt das ja. Ra ist eine Teilformel von F,
deswegen muss ich das irgendwann mal ausrechnen, das weiß ich.
Und jetzt gucke ich nicht B, wo packe ich das hin?
Das packe ich in den Zustand S1 und S2,
denn dort gilt es nicht.
Vers 3
muss ich
nichts machen
So, das heißt, so würde ich mit atomaren bzw. Negationen von Atomaren umgehen.
Also für die Formel F ist nicht der F1,
da gucke ich mir überall, wo kommt es bislang noch nicht
vor im Labeling und setze es dort dann genau zur Menge hinzu.
Wenn ich das also gemacht habe in der S1 und S2,
nicht B als Anschrift zu wählen und in der S2A,
dann ist es die nächste Operation, die ich machen muss, EX.
Und für EX Wenn ich das jetzt hier hinzugepackt habe,
da frage ich mich jetzt, wie sieht das aus?
Ah nee, erstmal ist das O da dran, Entschuldigung.
In welchen Zuständen gilt also jetzt A oder nicht B?
Das kann ich ganz schnell ablesen. In der S1 nicht,
in der S2, ja, in der S3, weder noch.
In der S1 gilt es, weil ich dann nicht B, Entschuldigung.
Und das zwei gilt es auch. Beide sind Wahlen,
S3 ist keins von beiden. So. Das heißt,
den Fall, Dass ich eine Dissuktion habe von F1F2,
da gucke ich eben nach, wie sieht es aus in den Einzelfällen.
Und werde jetzt genau zuerst zwei das hinzupacken und zur S1. Aber nicht zur S3.
Dann weiß ich also schon, diese Formel gilt da.
Jetzt habe ich das schrittweise erweitert und jetzt kommt der Operator EX.
Ich frage mich also für einen gegebenen Zustand, was hast du für einen Nachfolgezustand?
Ich habe den aktuellen Zustand, Äste, den ich betrachte,
Schnapp mir einen Tee, das Nachfolgezustand von Es ist.
Und gucke jetzt nach, gilt in diesem Zustand die Teilformel F1.
Ich suche also eine solche Situation,
wenn ein Tee bereits F1 gilt,
dann gilt auch in S-E-X-F1. Ich laufe also, kannten gewissermaßen rückwärts.
Eigentlich suche ich einen Knoten-Tee, stell fest,
der gilt F1 und die jetzt kannten rückwärts und einen
direkten Vorgänger beschrifte ich jetzt mit E-X
Algorithmisch ist es sinnvoller, sich das Ganze rückwärts vorzustellen,
also nach Zuständen zu suchen, in denen sowohl,
also ich suche gerade EX, F-1, das steht gerade an.
Naja, dann gucke ich mal,
wo gilt überall F-1 und wir jetzt kannten rückwärts.
Und wie sieht das hier aus für unsere Situation?
Wenn wir es mal so machen, wie es da steht,
ich nehme mir mal als Zustand S, dem Zustand S-1.
Der hat jetzt genau einen Nachfolgezustand,
der als Tee gehen könnte,
also ich nehme S-1 als S und S
2 als Tee
Und ich stelle fest, die Formel A oder nicht B
ist schon im Labeling von Tee enthalten. Das heißt,
als Konsequenz muss ich gleich EX A oder nicht B zu S1 hinzupacken.
Vers 2 mache ich das Gleiche, da habe ich S3-Nachfolgezustand,
stelle dort aber fest, da gilt F1 gar nicht.
Also kommt EX F1 nicht zu S2 hinzu.
Und, was mache ich noch? Ich gucke mir das
bei S3 an, da gibt es den Nachfolger S1,
in dem gilt auch A oder nicht B.
Also parke ich es
auch für S3 hinzu
Also einmal zu S3en zu packen und einmal zu S1 hin zu packen.
Und dann weiß ich, jetzt bin ich mit der ganzen Formel fertig,
habe mich so langsam von den Teilformeln hochgearbeitet zu Formel F selbst.
Und habe jetzt an den Knoten S1 und S3 die Gesamtformel F stehen.
Weiß also, das sind die beiden Zustände, in denen gilt die Formel F. So,
und wenn ich jetzt noch wissen will,
sind das alle Endzustände, beispielsweise könnte ich jetzt feststellen,
S1 ist der Staatszustand, Der einzige,
hätte ich jetzt festgestellt, dass diese Formel F gilt,
denn sie gilt ja im Staatszustand ist eins.
So, das heißt,
wir sind schon in der Lage für alle Formeln,
die nicht zu kompliziert sind, nämlich die interessanten Operatoren nicht benutzen.
Können wir schon mal Model Checking machen. Wie sieht das
jetzt aus, wenn wir die interessanten Operatoren noch hinzupacken?
Also den Operator für den fünften Fall,
es gibt einen Pfad, auf dem F1,
Antil F2 gilt.
Jetzt können wir
Folgendes machen
Nehmen das, was wir eben hatten,
die Formel EXA oder nicht B, und sagen jetzt,
es gibt einen Pfad, auf dem gilt immer B,
Antill, diese alte Formel gilt.
Da wissen wir ja schon, wo das Ganze gilt.
Wir haben das noch ein bisschen erweitert, jetzt im anderen Fall.
So, wie könnte das denn jetzt aussehen?
Wo soll das gelten? Wir stellen fest,
S1 soll jetzt mal der einzige Zustand sein,
in dem EXA oder nicht Begelt.
Welche Zustände muss ich jetzt
mit F markieren
In welchem gilt die Formel? E-B-Antel, die EX-Teilform?
Würde ich auch sagen, also die Zustände ist eins,
S3 ist 4 ist 5 und warum diese?
Wie kriege ich das raus
Okay, der erste Fall ist, wir gucken uns nach,
wo gilt diese F2-Formel. Alle Zustände,
wo ich schon sage, okay, F2 gilt schon.
Da habe ich ja nichts mehr zu zeigen, denn wenn ich sage,
F1 an Til F2 und F2 gilt jetzt schon,
naja, da muss F1 ja nie gelten.
Denn die Forderung ist ja nur, F1 gilt,
solange F2 noch nicht gilt. Wenn F2 aber schon gilt,
und das ist in diesem Fall S1,
das ist der Zustand,
in dem F2 bereits gilt,
dann gilt offensichtlich
die Gesamtformel in der S1 schon
Sondern das ist der Fall, dass F2 sofort gilt.
Jetzt kommt der Fall, F2 gilt irgendwann später.
Wie kommen wir jetzt in den anderen Zuständen? Naja,
wir suchen Vorgänger und gucken nach der Optive 1 gilt.
Wir nehmen jetzt nicht jeden Vorgänger, sondern wie gehen wir vor?
Ja, also wir streichen jetzt gewissermaßen alle Knoten raus,
in denen nicht F1 dransteht. So können wir uns das
vorstellen. Wir laufen also nur noch rückwärts über Knoten.
Also erstmal laufen wir rückwärts. Also die kannten in die
andere Pfeilrichtung durchlaufen und wir nehmen nur Knoten zum Durchsuchen,
die mit einem B beschriftet sind.
Alle anderen haben ja irgendwann das B nicht,
deswegen dürfen wir die eigentlich nicht durchlaufen. Alle Knoten,
die wir durch dieses Rückwärtssuchen bekommen können, nur über B-Zustände laufen,
all diese, die packen wir jetzt zusammen.
Da hätten wir mich starten dürfen, wären dann über lauter B-Knoten
Hätten wir mal eine Chance gehabt, hin zu dem F2-Knoten
zu kommen. Und das Ganze passt jetzt wunderbar,
weil er ja der Operator eh da vorne steht.
Das ist ja die Aussage, es gibt einen Pfad.
Würde das stehen für alle Pfade, wird das so nicht klappen.
Aber dadurch, dass da nur steht,
es gibt einen, kann ich dieses Suchen machen,
denn wann immer ich einen Zustand erreiche durch die Suche,
gibt es ja einen Pfad.
Okay, das ist also die Grundidee, der einzige Zustand,
den es also nicht gilt, ist Zustand S2.
Wenn wir nicht da rückwärts gehe, Es ist in der Zwei-Gild-B halt nicht.
Und es muss sofort gelten. Das ist die Ausnahme.
Ansonsten gilt in allen Zuständen das. Was jetzt noch passieren könnte,
es könnte Bereiche geben, in denen zwar B gilt,
aber die durch rückwärts laufen nicht erreichbar sind.
Wenn wir also einen anderen Zustand hätten, Zustand 25,
der jetzt irgendwie außerhalb da liegt,
der nicht durch rückwärts laufen mehr zu erreichen ist,
dann gilt zwar in dem B,
aber es gibt keinen direkten Pfad hin zur S1,
dann ist der auch irrelevant
Wenn wir also diese Formel E F1, Until F2
analysieren wollen durch dieses Anschriften, machen wir das folgendermaßen.
Wir gucken uns einen Zustand S an. Was machen wir
für alle Zustände S, die die Eigenschaft haben,
dass F2 schon als Anschrift vorkommt?
Also die irgendwann zu erfüllende Formeln. Wenn das da schon steht,
sagen wir, dann setzen wir das zum Label von,
genauso haben wir es eben gemacht.
Denn wir haben gesagt, wenn F2 schon gilt,
dann gilt die ganze E an Till-Formel auch.
Und jetzt müssen wir rückwärts laufen.
Wir gucken also nach
Gibt es einen Zustand, Tee und Tees direkter Vorgänger von S?
Und in S, also dem Vorgänger,
gilt die Formel F1. Habe ich also einen Rückwärtsschritt gemacht?
Ich bin also von S zurück zu Tee gegangen.
In S gilt F2 und in Tee gilt F1.
Dann weiß ich also, aha, von Tee gestartet,
gilt die Formel, es gibt einen Pfad,
auf dem F1 an Till F2 gilt
Denn und wenn ich S betrachte, weiß ich sofort,
naja, da gilt die gesamte Formel.
Und wenn ich die betrachte, weiß ich es auch,
weil ich ja durch lauter F1-Zustände zu S kommen kann.
Was ich jetzt machen muss, ist im Prinzip dieses Argument, öfter mal anzuwenden.
Das heißt, nicht nur einmal so ein Zustand,
Tee zu suchen, sondern das jetzt als Grafensuche fortzusetzen.
Das heißt, wir fahren jetzt fort,
starten das Ganze im Prinzip beim Zustand Tee erneut.
Und zwar das Ganze in Gegenrichtung der Transitionsfeile. Wir laufen also
rückwärts und setzen jetzt die Formel F in die Labelmenge dazu.
Wenn wir von S rückwärts laufen können, zu einem Zustand S-Strich.
Und wir wissen, F2 gilt in S-Strich.
Nee, andersrum. Es gibt ein anders rückwärts. Von
S-Strich komme ich rückwärts zu S. Und in erst Strich gilt F2.
Und alle zuständig dazwischendurch habe, also alle Zustände Tee,
die tragen das Labeling von
Das heißt, das Argument von ihm, ich starte in S,
gehe dann zu Tee und gehe immer weiter rückwärts.
Das kann ich jetzt fortsetzen. Also ich starte hier. Und alles,
was ich jetzt rückwärts erreichen kann, über F1 erfüllende Zustände,
das label ich jetzt mit dem EU-Operator für diese TIE-Formel.
Das ist die Grundidee. Das müssen wir gleich nochmal in Algorithmen fassen.
Das können wir jetzt hier nochmal machen für das Beispiel von eben.
Da haben wir festgestellt, die Formel F, zwei,
also das EXA oder nicht B, das gilt nur in S1.
Das heißt, in diesem Zustand gilt es auf jeden Fall schon die Gesamtformel F.
Da packe ich jetzt die hinzu. Es gibt einen Pfad,
in diesem Fall ein Pfad der Länge null,
der mich hinführt zu einem Pfad, der die zweite Teilformel F2 erfüllt.
Und jetzt muss ich rückwärts laufen und stell fest,
der einzige Vorgänger ist es drei in dem Bild, auch die Formel F.
Von dort laufe ich auch weiter rückwärts,
habe ich auch keine Wahl und da gilt auch B,
deswegen gilt auch dort
die Formel
Ich laufe noch weiter rückwärts. Auch da gilt B. Deswegen gilt auch da
die Formel 11. Jetzt könnte ich rückwärts zur S2 laufen.
Aber da gilt B nicht mehr. Deswegen terminiert diese Breitensuche.
Ich habe alle direkten Vorgänger gemacht. Bin ich also fertig.
Wobei es egal ist, ob ich Tiefen oder Breitensuche nehme.
Ich muss nur alle Vorgänger irgendwie erwischen. Die muss ich
alle abklappern auf diese Art und Weise. So,
und das kann ich jetzt, diese Unterprozedur kann ich jetzt
auch im Pseudocode fassen. Das sieht dann so aus,
genau die Idee, wie die wir eben hatten,
Wenn ich also Check EU F1 F2 bilden will,
dann sage ich, okay,
ich betrachte erst mal als interessante Teilmenge Umstände die Menge Großtee.
Das sind alle Zustände. Es ist das F2 im Labeling des Zustands S vorkommt.
Also alle, die bereits die Formel F2 erfüllen,
also da, wo ich hin will,
habe ich schon mal Fahrt der Länge Null erschlagen.
Jetzt mache ich folgendes. Ich gehe alle Knoten,
die in Tee kommen, durch und sage,
jeder Knoten, der in Großtee vorkommt,
in dem gilt schon mal die gesamte Formel,
die packt nicht
die Labellänge hinzu
Klar. Und jetzt mache ich folgendes.
Ich iteriere jetzt über die aktuellen noch zu bearbeitenden Knoten.
Am Anfang die Menge Tee. Also solange die Menge Tee
nicht leer ist, mache ich folgendes. Ich picke mir
ein Knoten-ess aus Tee raus und entferne ihn aus Tee.
Also billig Tee ohne S. Und jetzt sage ich folgendes für alle Zustände Tee,
die die Eigenschaft haben, direkter Vorgänger von S zu sein.
Mache ich folgendes. Wenn das eh nicht schon drin ist,
Also dieser Knoten schon mal angefasst wurde, also E-F-1,
Antil-F-2, ist nicht schon im Labeling drin.
Das kann nur passiert sein, weil ich das schon mal ausgerechnet habe.
Da muss ich normal ausrechnen, dann ist dieser Knoten langweilig.
Oder der Knotentee kann uninteressant sein, weil in ihm F-1 gilt.
Ja, diese beiden Fälle, die schließe ich aus, dann Knoten wegschmeißen.
Entweder habe ich ihn schon mal besucht oder er ist irrelevant
für die Betrachtung. Wenn er also relevant ist,
ich habe also eh Antil noch nicht ausgerechnet,
das ist also noch nicht im Labeling drin und
die erste Formel F-1 kommt auch tatsächlich drin vor
Denn es ist dieser positive Füll eingetreten.
Dann packen wir nämlich zum Labeling von Tee,
die Formel EF1, Anti-F2 hinzu und sagen jetzt, okay,
jetzt habe ich neun Knoten, denen ich betrachten muss.
Das Verfahren soll ja wieder auch bei Tee beginnen.
Und damit das passieren kann, sage ich,
zur Menge Tee packe ich jetzt die neuen Knoten kleinen Teeen zu.
Das heißt, das ist auch ein Knoten, den ich
noch explorieren muss. Wenn das also der Fall ist,
dann habe ich ein Knoten-S gerade herausgepickt, habe einen Vorgänger gefunden,
nämlich kleinen Tee, Und wenn der die richtigen Bedingungen erfüllt,
dann packe ich jetzt Tee zu dieser Menge.
Das heißt, einen raus, einen rein. So,
aber das Spiel kann ich nur endlich lange treiben,
denn entweder habe ich irgendwann mal alle Knoten angefasst.
Und angefasst heißt, gibt es zwei Varianten. Entweder es ist
ein positiv zu bewertender Knoten, dann kommt das Labeling irgendwann dran.
Der Knoten ist uninteressant, weil der F1 nicht da drin gilt,
dann wird er auch nicht mehr angepackt.
So, das heißt, die werden nie mehr neu generiert,
das heißt, irgendwann kommen keine neuen Knoten,
kleinen Themen mehr hinzu
Auf diese Art und Weise wird dann die Menge Tee irgendwann mal
leer und wir springen aus dieser gesamten Schleife raus und sind dann fertig.
Durch dieses Grafensuchverfahren, das rückwärts läuft, habe ich denn alle markiert.
Ich habe also rückwärts alles gesucht, was nur übers Eins läuft.
Frage? Ja, wenn ich den ersten Vorgänger gefunden habe,
dann ist das ja ein kleinen Tee.
Das kleinen Tee erfüllt F1, wird also reingepackt,
ist dann in eine Menge Tee drin
So, wenn das der Einzige war,
dann springen wir sowohl aus dem End-If,
also da sind wir dann, springen da raus.
Und wenn es der Einzige war,
dann springen wir aus dem For-All raus, also End for-All.
Springen dann wieder in die Wai-Schleife rein. So,
wenn durch Zufall der Knoten S, wie im Beispiel eben der Einzige war,
dann wird der rausgenommen, dann ist die Menge leer.
Damit der Knoten Tee eingesetzt, ist jetzt wieder der einzige
Zustand in der Menge Großtee. Und für den Knoten Tee,
den wir da vorhin reingepackt haben, da sagen wir jetzt,
wir chusen einen klein S aus dieser Menge Großtee.
Dieses kleine S ist dann das,
was wir vorher als Tee bezeichnet haben
Und da geht das Spiel wieder los. Und zwar so
lange, bis wir dann alle mal am Wickel hatten.
Klar. Okay. So, also diesen Unteralgorithmus haben wir auch,
das iteriert sich da einmal munter durch den Grafen.
Das ist eigentlich auch noch ganz einfach als Prozedur konzeptionell.
Fehlt also nur noch unsere Unterprozedur für EGF. Was suchen wir
eigentlich? Wir suchen für den sechsten Operator Hier irgendwie,
was, wie können wir denn nachweisen, in welchen Zuständen EGF gilt?
Also wir können da jetzt ein bisschen basteln,
aber wir brauchen auf einen Fahrt müssen wir,
der immer nur mit F beschriftet ist.
Also es gibt einen Pfad, auf dem immer F gilt.
Gut, da kann man sich natürlich so ein paar ausdenken.
Zum Beispiel, wenn ich den Staatszustand links da bin,
und dann könnte ich sowas machen wie,
ich gehe direkt in den kleinen Knoten rechts da unten und gleich wieder zurück.
Und in dieser Schleife bleibe ich unendlich lange.
Das könnte ich also feststellen
Also das wäre so eine Variante. Oder ich gehe mal
nach unten und habe hier die Möglichkeit, hier,
hier, hier und da so ein bisschen lang zu laufen.
Ja, da habe ich auch eine Möglichkeit.
Oder wie sieht es bei oben aus? Hier rein,
da, da, da, da, da,
da und wieder von vorne.
Okay, also in diesem Beispiel sehe ich das ganz gut,
da ist diese Eigenschaft gilt.
Das ist auch nur Wie kann man das allgemein machen?
Da braucht man ja irgendwie ein Verfahren, das einem hilft,
jetzt zu bestimmen. Ob es überhaupt einen Pfad gibt,
auf dem immer F gilt. Was müsste ich da eigentlich machen?
Was könnte ich da algorithmisch tun? Ja, das ist
so eine Grundidee. Also wir gucken uns den Grafen an,
in dem eigentlich nur noch die Knoten vorkommen,
in dem jetzt schon F gilt
Also die anderen Knoten können wir gedanklich wegschmeißen,
die brauchen wir gerade nicht. Also wir brauchen den nicht,
den nicht, den ich, die können wir alle rausschmeißen.
Jetzt bleibt ein Teilgraf übrig. Was machen wir jetzt?
Wir versuchen irgendwie, weil das ja ganz so eine endlich ist,
zu einem Knoten zu kommen und dann möglichst in einen Kreis zu laufen.
Wenn um einen endlich langen Fahrt in einer Kryptostruktur zu laufen und die Kryptostruktur,
wenn sie denn endlich ist,
und das nehmen wir fürs Modelchecking gerade an im Moment,
dann erzwingt das, unendlich lange heißt der,
ich muss eh in einem Kreis laufen,
mit endlich vielen Zuständen kriege ich ihn nur endlich langen Partner und dann hin,
wenn ich irgendwo in Kreisen mich befinde.
So, und es wird jetzt reichen,
wenn ich die Chance habe, mit diesem reduzierten Grafen,
also die anliegenden Kanten schmeiße ich natürlich auch weg,
wenn ich in diesen Grafen einen Kreis finde,
dann wird er mich automatisch erreichbar sein.
Und das ist unsere Grundidee, wir versuchen jetzt irgendwie einen Kreis zu finden.
Ja, gut, wir können das jetzt aussehen?
Also hier nochmal, versuchen wir es noch einfacher,
ein bisschen zu gestalten
Vielleicht sieht man das denn langsam. Ist ein bisschen weg.
So, jetzt sieht das Ganze schon ein bisschen einfacher aus.
Und jetzt versuche ich, das Ganze zu zerlegen,
in sogenannte strenge Zusammenhangskomponenten. Also, das hatten wir schon mal,
um Kreise zu finden, ist das so ein Standardwerkzeug.
Eine strenge Zusammenhamtskomponente ist das, also ein Bereich,
in dem ich die Chance habe, jedem Knoten von jedem zu erreichen.
Und Kreise sind nun mal solche,
wenn Knoten auf dem Kreis liegen,
da kann jeder jeden erreichen,
durch hinreichend langes durchlaufen
Wenn ich mir diesen Grafen angucke, der schon so gemalt,
dass das ungefähr klar ist, in diesem reduzierten Grafen,
habe ich diesen Kleinen mit dem Staatszustand hier an der Seite,
die können sich erreichen, aber sobald ich den mal verlasse,
sieht man sofort optisch in diese kleine Box,
in Violett komme ich nie wieder zurück.
Das heißt, wenn ich den Bereich mal verlassen habe,
da komme ich nicht wieder rein. Das heißt,
ein externer Knoten,
wenn ich irgendeinen Knoten jetzt hinzunehmen würde,
dann hat der die Eigenschaft,
dass von dem neuen Knoten kein Pfad wieder
in die alte Box sind zurückführt
So in dem Sinne ist dieser Bereich hier ganz links mit
den Zweien der größtmögliche Bereich, der diese beiden Knoten enthält.
Ich kann die nicht vergrößern, dann ist nämlich keine Zusammenhangskomponente mehr.
Und genauso jetzt kann man oben gucken, die beiden großen Boxen,
die haben auch keine Pfeile untereinander mehr.
Deswegen darf ich sie nicht mehr zusammenschmeißen. Und untereinander,
da finde ich, die liegen im Wesentlichen auf dem Kreis.
Also da sieht man, hier habe ich die Möglichkeit,
einmal im Kreis zu laufen oder hier.
Das heißt, jeder Knoten kann jeden erreichen
Und hier unten sieht man auch,
dass ich da eine Möglichkeit habe. Hier, hier,
hier, hier und da wieder zurück zu der Stelle.
Das heißt, auch die liegen kreisförmig anordnenbar. Es ist
nicht direkt ein Kreis, aber ich kann mir da so
einen Durchlauf generieren, bei dem ich wieder zum Startknoten zurückkomme.
Das heißt, die liegen alle zusammen. So,
wenn ich den noch anders zerlege, es kann auch so aussehen,
wenn ich da noch einen Knoten rausstreichen würde,
es kann auch
solche strenge Zusammenhangskomponenten geben
Ich habe hier einfach noch eine paar Knoten rausgenommen.
Neues Beispiel. Dann habe ich diese beiden kleinen minimalen,
strengen Zusammenhangskomponenten, weil die bestehen nur aus einem Knoten und
der letzte Knoten hat sogar die Eigenschaft,
da geht gar keine Kante mehr raus.
Das heißt, dass wir etwas, was man triviale strenge Zusammenhangskomponente nennt,
die besteht nur aus einem Knoten und ich kann keinen Kreislauf bilden.
Noch nicht mal, indem ich sage,
ich kehre zu mir selbst zurück,
wenn da so eine Selbstschleife hätte,
dann könnte er wenigstens
nur endlich langen Fahrt bilden
So, und die anderen mit mehreren Knoten oder wenigstens selbst schleifen,
das sind ja nicht triviale SZKs, strenge Zusammenhangskomponenten.
So, strenge oder starke Zusammenhangskomponenten kann man auch formal definieren.
Wenn ich einen gerichteten Graf G habe,
der aus Knoten besteht und eine Relation hat raus,
also eine Relation, die die Kanten beschreibt,
Knoten K-Relation R, benennen wir jetzt eine Teilmenge der Knoten,
eine Teilmenge Art Zusammenhangskomponente,
falls Folgendes gilt
Für zwei Knoten A und A-Strich aus A gilt,
dass es einen Pfad von A nach A-Strich gilt.
Also ich komme mit R Sternen, R Sternen heißt,
die kannten, beliebig häufig hintereinander hängen, auch nullmal,
reflexiv transitiver Abschluss einer Relation.
Man erinnere sich. Ja, es gibt also einen Pfad,
der auch die Länge null haben kann von A nach A-Strich.
Deswegen kann es nie eine leere Menge als Zusammenhangskomponent geben,
denn ein Knoten kann sich selbst immer mit einem Pfad
der Länge null erreichen
Das heißt, ein elementige Mengen sind immer Zusammenhangskomponenten.
Kleiner geht gar nicht. Und jetzt machen wir das Nächste,
naja, vielleicht ist gar nicht diese Menge interessant,
sondern ich suche nach der größtmöglichen.
Also ich möchte so groß wie möglich die Bereiche clustern.
Sonst könnte ich mich sagen, wenn ich nur einen Zusammenhangskomponenten,
einen Grafen zerlegen will, dann sage ich,
jeder einzelne Knoten ist eine Zusammenhangskomponente.
Das ist zwar richtig, aber hilft uns nicht.
Wir sind also interessiert nach den Drängen oder starken Zusammenhangskomponenten.
Im Englischen heißt das Strongly Connected Component SCC
Einen deutschen SCK. Und eine Zusammenhangskomponente ist eben streng oder
stark zusammenhängend, wenn sie maximal ist. Das heißt,
es ist nicht der Fall, dass es einen Knoten K gibt,
der die Eigenschaft hätte, erstmal nicht in A zu liegen.
Also er liegt im Kompliment von A, K, Ohne A.
Und er hat die Eigenschaft,
dass ich von diesem Knoten K zu jedem Knoten kleinen A
aus Großa komme und von jedem Knoten kleinen A aus Großart zu diesem Knoten komme.
Denn wenn es einen solchen Knoten K gäbe, Ja,
dann könnte ich diese Komponente vergrößern.
Denn jeder kann jetzt plötzlich jeden erreichen und K auch.
Jeder Knoten A kann K erreichen und K kann jeden Knoten A erreichen.
Wenn das also nicht der Fall ist,
dass ich einen Knoten hinzunehmen könnte und hinterher hätte ich immer noch eine Zusammenhangskomponente,
dann habe ich eine strenge Zusammenhangskomponent.
Also eine, die ich nicht mehr größer machen kann.
Und an denen sind wir interessiert. Und dann sind wir
noch an solchen Zusammenhangskomponenten interessiert, die wir nicht trivial nennen wollen.
Und nicht trivial sind welche
Die mindestens zwei Zustände haben. Ja,
wenn ich mich zwei Zustände habe und die können sich beide erreichen,
dann kann ich da auch munter eine Endlosschleife laufen.
Denn der eine Knoten kann den anderen erreichen und der andere den einen.
Das heißt, da habe ich schon mal so einen
richtig echten Kreis, den ich laufen kann.
Oder ich kann Folgendes machen. Ich habe einen Knoten A
in dieser Zusammenhangskomponente. Ja, und der andere Fall,
der eintreten kann, ist, er hat eben die Größe 1.
Also es gibt da einen Knoten, Und diese eine Knoten
erlauft einen echten Pfad, der mindestens die Länge eins hat.
Also hier steht er plus. Das heißt,
der transitive Abschluss, aber nicht reflexiv.
Das heißt, Pfade der Länge Null sind hier ausgeschlossen.
Das heißt, es gibt einen echten Pfad von A nach A.
Einen Pfad der Länge eins wäre eine Schleife, eine Kante,
die auf sich selbst zeigt. Wenn ich eine solche Situation habe,
dann habe ich auch die Möglichkeit, unendlich lange da was zu tun,
indem ich einfach diese Schleife immer durchlaufe.
Das heißt, nicht triviale Zusammenhangskomponenten sind für uns genau die Dinger,
die uns erlauben und endlich lange Sequenzen zu bilden
So, jetzt wissen wir also schon, wie die violetten Boxen
zu definieren sind. Und jetzt machen wir noch Folgendes,
wir definieren uns, was ist der Graf,
der übrig bleibt, wenn ich die Nicht-F-erfüllten Knoten wegstreiche.
Da kommt wieder Graf raus, nämlich ein Untergraf. Und den Untergraf,
den nennt man Einschränkung auf eine Formel F. Also wenn wir die Formel EGF1 betrachten,
dann wollen wir jetzt nur noch die Knoten betrachten aus S,
die die Eigenschaft haben, das in den F1 gilt.
Und das steht hier, ich betrachte die Knotenmenge erst Strich,
Also es ist die Menge aller Zustände, Kleiness,
die die Eigenschaft haben, dass in diesem Zustand erst die Formel F1 gilt.
Oder anders ausgedrückt, F1 kommt im Labeling dieses Zustandes erst vor.
Und jetzt mache ich Folgendes, ich schmeiße auch alle Kanten,
die ich jetzt nicht mehr brauche, weg.
Und das drücke ich formal so aus,
dass ich mir eine neue Relation erstrich bilde,
die ich bekomme, wenn ich die Relation eher jetzt einschränke,
dafür steht dieser gerade Strich,
auf die Grundmenge S-Strich-Kreuz-S-Strich
Also nur noch solche Elemente hinzunehme oder übrig lasse,
bei denen beide Zustände in der Strich sind.
Also nur noch Kanten, übrig lasse,
die von übrig gebliebenen Zuständen zu übrig gebliebenen Zuständen auch führen.
Wenn einer der beiden oder beide ein Zustand sind,
die eben F1 nicht erfüllen,
dann schmeiße ich die Kante gleich mit weg.
Ja, und Etiketten von Zuständen, die es nicht mehr gibt,
brauche ich auch nicht. Also das Labeling der Krypke-Struktur,
das schränke ich jetzt auch ein,
auf das Labeling der Zuständen S-Strich
Was das Labeling von den anderen Zuständen ist, soll mir jetzt egal sein.
Denn die Zustände gibt es nicht mehr. So, was da rauskommt,
ist jetzt eine neue Kryptostruktur im Strich und diese Kryptostruktur im Strich,
nenne ich die Einschränkung von M,
auf die Zustandsmenge in der F1 gilt.
So, und damit habe ich die Basiskomponenten jetzt,
ein folgendes Lämmer zu formulieren, denn mich interessiert ja,
ob eine gegebene Krippestruktur M und ein Zustand S,
die Formel EGF1 erfüllt.
Und das Lämmer sagt jetzt, das ist genau dann
der Fall, wenn zwei Bedingungen erfüllt sind
Erstens, der aktuelle Zustand S muss in S-Strich drin sein,
was nichts weiter heißt, als dass im Moment schon F1 gelten muss.
Denn Neststrich sind genau die Zustände, in denen F1 gilt.
Wenn mein Zustand einer ist, in dem gerade schon nicht F1 gilt,
dann schaffe ich es auch nicht,
einen Pfad dort beginnen zu lassen, auf dem immer F1 gilt.
Und die zweite Bildung, die ist spannender, die sagt,
und jetzt muss es in einem Strich einen Pfad geben,
wohlgemerkt in einem Strich, nicht in M,
der von S ausgeht und dann zu einer nicht trivialen,
starken Zusammenhangskomponente in einem Strich führt
Und zwar im Strich betrachtet jetzt als Graf.
Das heißt, als Struktur-S-S-S-R-S-Strich, das Labeling ist also egal.
Es muss also ungefähr so aussehen, ich zerlege mir den Grafen,
meine strengen Zusammenhangskomponenten. Erst musste auch irgendwo drin liegen. Ja,
aber ich komme von S, und das ist ein Zustand,
in dem F1 gilt, in eine strenge Zusammennahmskomponente.
Und das heißt ja nichts weiter, als dass ich die Möglichkeit habe,
ich beginne in einem Zustand, in dem F1 gilt,
kommen dann in eine strenge Zusammenhangskomponente.
Und dahin zu kommen heißt ja, ich laufe in einem Strich,
also laufe nur über Zustände, in denen auch F1 gilt.
Also ich habe so ein Anfangsstück gerade von Zuständen,
in denen nur F1 gilt.
Und dann bin ich in einer strengen Zusammenhangskomponente.
Da kann ich also munter und endlos, unendlich lange rumlaufen.
Und das sind ja strengen Zusammenhangskomponenten von einem Strich.
Also alle Zustände, die da drin sind, erfüllen.
F1. Das heißt, wie immer ich da auch munter in
der Gegend umherlaufe, es gilt immer F1.
Auf diese Art und Weise kann ich mir also ein unendlich langen Fahrt bauen,
denn S beginnt und auf dessen Knoten sämtlich die Formel F1 gilt.
In dem Beispiel von eben müsste ich also nur gucken,
komme ich von meinem Staatszustand, dem dicken, linksaußen,
hin in eine nicht triviale, starke Zusammenhangskomponente.
Der Knoten rechts unten hier, der ist nach Definition trivial,
denn er enthält nur einen Knoten und es gibt
keine Schleife daran
So, der ist also langweilig. So, da will
ich nicht hinkommen. Den zweite strenge Zusammenhang kommenden,
die hier enthält einen Knoten und es gibt auch keine Schleife dahin.
Das ist also auch nicht so relevant. Bleiben also die drei
übrig. Und da sieht man ja, was komme ich da?
Ich komme auf einem Pfad der Länge Null zum Beispiel in diese strenge Zusammenhangskomponente.
Das heißt, da gibt es eine Pfad.
Oder es gibt noch viel mehr. Also ich könnte
auch dahin gehen und da dann drin bleiben oder ich kann
auch in dem großen Block da drunter gehen.
Das heißt, es gibt verschiedene Wege, die nach oben führen.
Eine strenge Zusammenhangskomponente hat aber gereicht
Es hätte zum Beispiel diese Kleine gereicht,
die hier immer nur in Schleifen geht.
Die hätte es auch getan. Für diese spezielle Krypto-Struktur kriegen
wir jetzt also auch mit dem Algorithmus nochmal nachgewiesen,
ja, EGF1 würde gelten hier.
Wenn das der reduzierte Graf ist, die Einschränkung im Strich.
So, das kann man jetzt ein bisschen veralgorithmisieren.
Genau dieses Lämmer, da steckt jetzt drin,
was wir machen müssen.
Wenn ich jetzt mich EGF1 entscheiden will,
mache ich Folgendes
Konstruiere mir im Strich. Das ist nicht so aufwendig.
Im Prinzip muss ich jeden Zustand einmal anfassen, gucken,
gilt der Vereins oder nicht. Die Guten ins Töpfchen,
die Schlechten ins Kröpfchen und so weiter.
Also einmal in Linearzeit drüberlaufen. Das Zweite,
da haben wir Glück, wir konstruieren uns alle Strengen,
Zusammenhangskomponenten dieser neuen Struktur im Strich.
Und der klassische Algorithmus von Thajan macht das linear in
der Anzahl der Knoten und Kanten.
Also linear in der Größe der Krypke-Struktur
Und jetzt gucke ich nach, was sind meine nicht trivialen,
strengen Zusammenhangskomponenten? Und all diese Zustände nehme ich
und suche jetzt rückwärts Zustände, die mich dorthin führen.
Das kann ich jetzt breiten, suche, tiefensuchartig machen,
da muss ich auch nur jeden Knoten anfassen.
Das heißt, ich habe also vier Schritte in jedem Schritt
jeder Knoten im Wesentlichen einmal angefasst, wenn ich Zyklenkontrolle mache,
meinetwegen auch zweimal.
Das heißt, jeder Knoten wird eine konstante Anzahl mal angefasst
und jede Kante auch.
Also läuft das Ganze in Ofern
Anzahl der Zustände, Anzahl der Kanten, also linear in der Größe,
der Krip-Gestruktur, die ich da behandeln muss.
Das Ganze kann ich auch um Pseudokut gießen, dann sieht das
wieder so aus. Ich habe also wieder die Prozedur,
jetzt die Prozedur Check, EGF 1 und sagt,
naja, ich setze erstmal die Menge S-Strich zu der Menge,
in der alle, in der auf jeden Fall immer die Formel F1 geht.
Also F1 ist im Label von S, diese Einschränkung,
diesen eingeschränkten Grafen mache ich. Und jetzt berechne ich die Menge aller,
nicht trivialen SCCs, also streng Zusammenhangskomponenten bezüglich dieser Zustandsmenge S-Strich.
Gut, dann habe ich die. Und jetzt packe ich alle Zustände,
die da vorkommen in den Nicht-Trivialen, SCCs zusammen,
und nenne die Menge, die da rauskommt, Tee,
und sage jetzt, okay, für alle,
die ich jetzt in den strengen Zusammenhangskomponenten schon habe,
wenn ich da ein Zustand schon bin, da drin,
dann gilt da natürlich offensichtlich EGF 1. Denn wenn ich in der strengen Zusammenhangskomponente bin,
dann habe ich da Natürlich die Möglichkeit,
einen unendlich langen Fahrt zu laufen,
in dem immer F1 gilt.
So, in denen allen kann ich das spontan sagen,
in all diesen Knoten gilt das schon mal.
Jetzt kommt also der spannende Fall, wir gehen aus den strengen Zusammenhangskomponenten raus.
Und da laufen wir wieder rückwärts. Und dann machen wir
wieder ein Suchverfahren. Also wir nehmen den Graphen,
starten in einem Knoten-Ess aus dieser Menge Großtee und entfernen den
aus Tee und machen jetzt eine Grabsuche rückwärts.
Indem wir für alle Knoten Tee die auch in Essstrich liegen, ja.
Und die ein Vorgängerknoten von Ess sind, machen wir folgendes.
Wenn wir ihn nicht schon angefasst haben, also wir haben
schon das Labeling überprüft. Und wenn wir es überprüft haben,
weil es in Essstrich drin liegt, gilt es ja.
Dann machen wir folgendes, dann sagen wir, okay,
dann packen wir EGF1 hin zu diesem Knotentee und sagen,
von diesem Knotentee müssen wir auch noch weitersuchen.
Deswegen kommt er in die Menge Großtee der Suchmenge wieder hinzu.
So, das heißt, Knoten S rausnehmen,
alle direkten Vorgänger hinzunehmen
Frauen, das Ganze mit Zyklen, Kontrolle bereits behandelte Knoten nicht wieder hinzupacken.
Und wenn ich da dieses If und for all alles durch habe und die Wildschleife irgendwann feststellt,
die Menge Tee ist leer geworden, das heißt,
kein Knoten ist mehr zu überprüfen, dann bin ich fertig.
Dann habe ich alle Knoten einmal betrachtet und habe mich rückwärts
durchgesucht und jetzt sind alle Knotenbeschriften, so wie ich das gern hätte.
Und jetzt gilt, wenn ich diesen Algorithmus mir anschaue,
der bekommt eine Kryptostruktur M und er kommt mit CTL Formel F,
Denn es dessen Zeitkomplexität, der diese Menge der Zustände,
in denen das erfüllt oder allgemeiner, kann ich auch nur sagen,
mich interessiert nur Guild F in dieser Krypto-Struktur,
also in einen Staatszuständen.
Dieser Algorithmus, der läuft in einer Laufzeit,
die ist linear zur Größe der Formel,
und linear zur Größe der Krypto-Struktur, also Größe von F mal,
und der Ausdruck, Anzahl der Zustände im Anzahl der Kanten,
das ist die Größe der Krypto-Struktur.
Warum das so ist, gucken wir beim nächsten Mal an,
wir halten hier aber mal fest,
das ist jetzt auf dem ersten Blick auf jeden Fall besser als LTL-Model-Checking.
Bei meinem LTL-Model-Checken stand da fast das Gleiche, nur,
nur in Anführungszeichen, da stand nicht Betrag von F,
sondern zwei hoch, O von F. Also hier steht linear in der Größe der Formel.
Beim LTL-Model-Checking war es exponentiell in der Größe davor.
Also erst mal ein gewaltiger Unterschied, wobei ich gesagt hatte,
praktisch muss man das immer relativieren.
Woran das liegt, schauen wir jetzt beim nächsten Mal
noch und damit bis Donnerstag