Begriff
Model Checking
Warum wichtig?
Dieser Begriff ist ein Knoten im SengakujiWorks-Wissensnetz. Nutze Level 0 für die erste Einordnung, Level 1 für Praxis, Level 2 für technische Struktur und Level 3 für Grenzen, Fallstricke und Expertenkontext.
Hoare Logic ist wie ein mathematischer Beweis (manuell, mit Kopf). Model Checking ist Brute Force (automatisch, mit PC). Du modellierst dein System als riesigen Graphen (Zustandsautomat). Jeder mögliche Zustand ist ein Knoten. Dann sagst du dem Computer: "Prüfe, ob es irgendeinen Pfad gibt, wo zwei Züge gleichzeitig auf dem Gleis stehen (Crash)." Der Model Checker probiert Milliarden von Pfaden aus. Findet er einen Fehler, spuckt er das "Gegenbeispiel" aus: "Wenn Zug A fährt, und Zug B wartet, und dann Signal C grün wird... CRASH."
Merksatz: Eine automatische Methode zur Verifikation von Systemen, bei der ein Algorithmus systematisch alle möglichen Zustände eines Modells durchsucht, um zu prüfen, ob es eine gegebene Spezifikation erfüllt.
Tool: TLA+ (von Leslie Lamport). Amazon (AWS) nutzt TLA+, um komplexe Algorithmen (DynamoDB, S3) zu prüfen. Sie fanden Bugs, die durch Testen (Unit Tests) nie gefunden worden wären, weil sie nur nach 35 Schritten in einer extrem unwahrscheinlichen Reihenfolge auftreten ("Race Conditions").
1. State Explosion Problem
Das Hauptproblem. Ein System mit 2 Variablen (Bool) hat 4 Zustände. Ein System mit 100 Variablen hat $2^{100}$ Zustände. Das sind mehr als Atome im Universum. Lösungen: BDDs (Binary Decision Diagrams) oder SAT-Solver, um den Suchraum gigantisch zu komprimieren.
2. Liveness vs. Safety
- Safety: "Es passiert nie was Schlimmes." (Kein Crash).
- Liveness: "Es passiert irgendwann was Gutes." (Der Aufzug kommt irgendwann an und bleibt nicht stecken). Model Checking kann beides beweisen (mit Temporaler Logik).
1. Kripke-Strukturen und BDD-State Explosion
Die pure Mathematik hinter Model Checking heißt "Kripke-Struktur" – ein finiter Zustandsautomat $\mathcal{M}= (S, I, R, L)$. Jeder Zustand erhält sein Label ($L$), ob Assertions wahr sind (z. B. "System=Ready"). Jedoch explodiert das Set der Randsysteme (Transitionsrelation $R$) exponentiell durch Threads, die sich asynchron im Millisekundentakt interleaven. Die absolute Rettung der 1990er Jahre vor brutalen CPU Out-of-Memory Fails war symbolisches Model Checking unter Einsatz massiver Arrays mittels Binary Decision Diagrams (BDDs). BDDs sind radikal gestauchte topologische Entscheidungsbäume für Boolsche Logic-Terme. Durch kanonische Isomorphismus-Ordnung kollabieren BDDs redundante Variablen-"Gabelungen" der gigantischen Wahrheitsmatrix massiv zusammen (Sharing von Teilbäumen). Ein RAM, der nur 100.000 Graphen-Nodes fassen konnte, hielt als OBDD (Ordered BDD) oft problemlos Zustandsräume mit der schockierenden Größe von $10^{20}$, wo Brute-Force RAM schlicht abraucht!
2. Temporal Logic (LTL vs. CTL)
Was fragt man eine Kripke-Matrix eigentlich an? Man füttert den Checker (wie NuSMV oder Spin) rigoros mit Temporal Logic Math.
- LTL (Linear Temporal Logic): Bezieht sich rigoros auf pure Ausführungs-Pfade. Ein Operator ist oft "G" (Globally) und "F" (Eventually). Formalisierung von Safety: $\mathbf{G} , \neg (\text{Crash})$ ("Es ist global auf allen Routen wahr, dass niemals der Crash existiert.").
- CTL (Computation Tree Logic): Setzt auf massiv parallele Baumgabelungen der Existenz. Ein wichtiges Prädikat: $\mathbf{AF} , (\text{Success})$ – "Auf ALLEN Pfaden in die Zukunft (A) wird irgendwann (F) ein Success eintreten" (Liveness). Oder $\mathbf{EG} , (\text{Wait})$. CTL kann im Branching in Hardware-Debugging (CPU-Design) unsterbliche Liveness-Garantien zertifizieren, was für ARM-Chip Designs überlebenswichtig in der Massenfertigung von ASICs ist (ein Wafer ist nicht "patchbar"!).
3. TLA+ und Die AWS DynamoDB Lücke
Im Cloud-Sektor gilt TLA+ (geschaffen durch Leslie Lamport) als absoluter Engineering Benchmark, obgleich es als prädikative Logik (keine Programmiersprache!) absolut widerwärtig für Entwickler-Gehirne zu lesen ist. AWS wendete TLA+ nach schweren Netzwerk-Partitions-Bugs rigoros beim Redesign von DynamoDB und S3 (S3 Eventual Consistency Fixes) an. Die TLA+ Maschine (TLC Checker) wird parametrisiert: "Beweise für 3 Netzwerkknoten und 5 User Messages, dass die Vector-Clock bei Disconnect-Rounds sich kreisfrei normalisiert." TLC führt eine Breadth-First-Search (BFS) im Modellraum aus. TLA+ beweist gnadenlos einen absolut kontraintuitiven 35-Schritte Trace aus Leader-Election-Race-Condition Backoffs, wo Server C eine "tote" Mutation von Node A per Crash-Reboot an Server B repliziert, die selbst Chef-Architekt-Architekten im Review am Whiteboard blind übersehen hatten.
Quick-Check
Prüft es meinen C++ Code?
Meistens nicht direkt. Es prüft das Design (das Modell). Wenn das Design Fehler hat, hilft perfekter Code nicht. Es gibt aber Tools (Java Pathfinder), die direkt Code prüfen.Unterschied zu Testing?
Testing zeigt Anwesenheit von Bugs. Model Checking beweist Abwesenheit (im Modell).Turing Award?
Ja, 2007 für Clarke, Emerson und Sifakis für Model Checking.