Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Grundlagen der formalen Methoden

Die ganze Lektion steht hier zum Lesen. Erstellen Sie ein kostenloses Konto, um sie in einem Live-Lab auszuführen.

Ubuntu-VM-Lab10 Min. Lesezeit7 Befehle

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.

Befehl
z3 --version

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Befehl
echo '(declare-const x Int) (assert (and (> x 3) (< x 6))) (check-sat) (get-model)' | z3 -in

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Befehl
echo '(declare-const x Int) (assert (and (> x 5) (< x 3))) (check-sat)' | z3 -in

Hier 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.

Befehl
spinrun formal/spin/main.pml

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Befehl
spin -t -p formal/spin/main.pml

Hier 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.

Befehl
tlc formal/tla/Lock NotBothWaiting

Hier 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.

Befehl
alloy formal/alloy/model.als

Hier 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.

Über dieses Lab und seinen Quellcode: Lab für formale Methoden: Z3, SPIN, TLA+ und Alloy in einer VM

Sie unterrichten eine Klasse? Weisen Sie diese Lektionen Ihren Lernenden zu, mit Bewertung und einem Lab für jede lernende Person.