Testen kann nicht alles ausprobieren
In einem Spiel können zwei Spieler im selben Augenblick das letzte Ticket greifen. Du testest tausendmal, und es klappt. Der Fehler braucht eine ganz bestimmte Reihenfolge von Ereignissen und zeigt sich beim tausendundersten Mal. Eine formale Methode probiert keine Fälle aus. Sie lässt eine Maschine alle ansehen.
Am Ende dieser Lektion
Notiz
Ich kann sagen, was ein Solver und ein Modellprüfer zurückgeben, wenn eine Eigenschaft falsch ist.
Schlüsselwörter
- Eigenschaft: eine Aussage über ein System, die immer wahr sein soll.
- Solver: ein Programm, das Werte findet, die zu Regeln passen.
- Modellprüfer: ein Programm, das alle Zustände durchprobiert, die ein Modell erreichen kann.
- Invariante: eine Eigenschaft, die in jedem Zustand gelten muss.
- Gegenbeispiel: ein Ablauf, der zeigt, dass die Eigenschaft falsch ist.
- Modell: eine kleine Beschreibung eines Systems, die Einzelheiten weglässt.
Zum Einstieg: was du schon weißt
Notiz
Antworte im Kopf. 1. Was ist eine Variable? 2. Was ist eine Bedingung in einem if? 3. Was kann schiefgehen, wenn zwei Programme gleichzeitig dasselbe ändern? Die dritte Antwort brauchst du gleich.
Bevor du anfängst
Notiz
Drücke oben in der Leiste dieser Lektion auf Lab starten. Dieses Lab ist eine ganze Ubuntu-Maschine nur für dich, sie braucht also etwas länger zum Starten als ein Container. Jede Schaltfläche Ausführen tippt ihren Befehl ins Terminal der Maschine, einen nach dem anderen in derselben Sitzung. Meldet einer, dass die Maschine noch startet, warte ein paar Sekunden und drücke erneut. Der erste Lauf eines Java-Werkzeugs dauert einige Sekunden. Um zuzusehen oder eigene Befehle zu tippen, drücke in der Leiste auf Terminal öffnen.
Ein Solver findet Werte oder beweist, dass es keine gibt
Z3 ist ein Solver. Du gibst ihm Regeln, und er antwortet sat (erfüllbar: es gibt passende Werte) mit einem Beispiel oder unsat (kein Wert passt). Der erste Befehl zeigt die Version. Der zweite fragt nach einer Zahl x über 3 und unter 6: Z3 sagt sat und gibt für x die 4. Der dritte fragt nach einer Zahl über 5 und unter 3: Z3 sagt unsat. So beweist es: Um eine Behauptung zu beweisen, frage nach einem Fall, in dem sie scheitert, und erhalte unsat.
z3 --versionHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
echo '(declare-const x Int) (assert (and (> x 3) (< x 6))) (check-sat) (get-model)' | z3 -inHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
echo '(declare-const x Int) (assert (and (> x 5) (< x 3))) (check-sat)' | z3 -inHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Prüfe dich
Tipp
Z3 sagt unsat zu den Regeln eines Stundenplans. Hat es einen Stundenplan gefunden? Antwort: nein. unsat heißt, dass kein Stundenplan alle Regeln erfüllt, die Regeln widersprechen sich also.
Ein Modellprüfer findet die schlechte Reihenfolge
SPIN prüft Modelle, die in Promela geschrieben sind. Dein Lab hat eines: Zwei Arbeiter addieren 1 zu einem gemeinsamen Zähler, mit einem Lock, das noch nichts tut. spinrun baut den Prüfer und lässt ihn über alle Reihenfolgen laufen, die die Arbeiter nehmen können. Er gibt assertion violated (inside==1) und errors: 1 aus und behält einen Ablauf. Der zweite Befehl spielt diesen Ablauf Schritt für Schritt ab: Beide Arbeiter haben inside = (inside+1) ausgeführt, bevor einer wieder draußen war.
spinrun formal/spin/main.pmlHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
spin -t -p formal/spin/main.pmlHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele glauben, ein Modellprüfer beweise, dass ein Programm korrekt ist. Er beweist, dass das Modell die Eigenschaft hat, die du aufgeschrieben hast, und nicht mehr. Eine Invariante TRUE wird nie verletzt, der Prüfer lässt sie sofort durch und sagt dir nichts. Die Eigenschaft muss etwas aussagen, das ein kaputtes System nicht erfüllen würde.
Eine Invariante kann für ein gutes System falsch sein
TLA+ beschreibt ein System als Zustände und Schritte, und TLC prüft es. Die Lock.tla des Labs hat zwei Prozesse, die jeweils idle, wait oder cs (im kritischen Abschnitt) sein können. Diese Invariante sagt, dass nie beide warten. Das ist selbst für ein korrektes Lock falsch: TLC gibt Invariant NotBothWaiting is violated und ein Gegenbeispiel aus drei Zuständen aus, das damit endet, dass beide Prozesse bei wait stehen. Die eigentliche Aufgabe des Labs ist eine andere Invariante.
tlc formal/tla/Lock NotBothWaitingHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Gegenbeispiel kann ein Bild von Personen sein
Alloy beschreibt Dinge und die Verbindungen zwischen ihnen und sucht dann ein kleines Beispiel, das eine Behauptung bricht. Hier sind die Dinge Personen und wer mit wem befreundet ist. alloy führt beide Befehle der Datei aus. check Symmetric gibt SAT aus: Alloy hat ein Gegenbeispiel gefunden, zwei Personen, von denen die eine die andere als Freundin zählt und nicht umgekehrt, dargestellt als Person$1->Person$0. run Meet gibt ebenfalls SAT aus: Es hat ein Beispiel zum Ansehen gefunden. Bei einem check heißt SAT, dass die Behauptung falsch ist.
alloy formal/alloy/model.alsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Jetzt das Lab machen
Tipp
Du hast einen Solver, einen Ablauf, ein Gegenbeispiel und eine Instanz gesehen. Dein Lab verlangt, dass du die Regeln, das Lock, die Invariante und die Reparatur schreibst, und dann prüft jedes Werkzeug sie. Öffne die README.md in deinem Home-Ordner mit cat README.md im Terminal.
Abschlusscheck
Tipp
Antworte, ohne zurückzuschauen. 1. Was sagt Z3, wenn kein Wert zu den Regeln passt? 2. Was ist ein Gegenbeispiel? 3. Was ist an einer Invariante TRUE falsch? 4. Was bedeutet SAT bei einem Alloy-check? Antworten: unsat; ein Ablauf, der zeigt, dass die Eigenschaft falsch ist; sie wird nie verletzt und beweist daher nichts; ein Gegenbeispiel wurde gefunden.
Für Lehrkräfte
Tipp
Diese Lektion wird in einem VM-Lab durchgeführt: Jede Person hat eine eigene Ubuntu-Maschine mit vier Verifikationswerkzeugen, und eine Schaltfläche Ausführen tippt in deren Terminal und zeigt, was ausgegeben wurde. Kernpunkte: 1. Ein Solver antwortet sat mit einem Beispiel oder unsat ohne eines. 2. Ein Modellprüfer probiert alle Reihenfolgen von Ereignissen durch und liefert ein Gegenbeispiel, wenn eine Eigenschaft scheitert. 3. Eine Invariante TRUE beweist nichts. 4. Ein Gegenbeispiel ist der Beleg des Werkzeugs, und es kann zeigen, dass die Eigenschaft die falsche war. Häufiger Fehler: zu glauben, ein Bestehen heiße, das System sei korrekt. Ausstattung: das Lab und ein Browser; TLC und Alloy brauchen eine angemeldete VM, die GitHub erreichen kann. Tipp: Lassen Sie die Klasse vor spinrun die schlechte Reihenfolge von Hand suchen. Das Lab selbst hat eine Prüfung, die jedes Werkzeug ausführt.