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

Behauptungen mit dem Z3-Solver beweisen

Nach dieser Lektion: Ich kann Z3 fragen, ob eine Behauptung immer gilt.

Lektion, 50 Min.6 BefehleLab für formale Methoden: Z3, SPIN, TLA+ und Alloy in einer VM

Wie viele DVDs darf man höchstens leihen?

Ein Solver ist ein Programm, das zu einer Menge von Regeln Werte findet, die alle Regeln erfüllen, oder meldet, dass es keine gibt. Damit lässt sich eine Behauptung beweisen, ohne einen einzigen Fall durchzuprobieren.

Eine Hochschulbibliothek erlaubt höchstens 5 Medien zugleich und verlangt mindestens 2 Bücher. Folgt daraus, dass niemand mehr als 3 DVDs hat? Der Solver Z3 beantwortet das in einem Augenblick.

Am Ende dieser Lektion

Notiz

Ich kann Z3 fragen, ob eine Behauptung immer gilt.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Solverein Programm, das Werte für eine Menge von Regeln suchtZ3
Behauptungeine Aussage, die aus den Regeln folgen soll
Erfüllbar (sat)es gibt Werte, die alle Regeln erfüllen
Unerfüllbar (unsat)es gibt keine solchen Werte
Negationdas Gegenteil einer Aussagenot (y > 3)
Modelldie Werte, die der Solver bei sat nennt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Z3 sucht Werte, die alle Regeln erfüllen

Sie beschreiben Z3 ein Problem in drei Schritten. declare-const legt eine Zahl an, assert fügt eine Regel hinzu, check-sat fragt, ob es Werte gibt.

Z3 schreibt Rechnungen mit dem Zeichen zuerst: (> x 3) heißt x > 3. Antwortet Z3 mit sat, kann get-value die gefundenen Werte zeigen.

So liest man die Eingabesprache von Z3

In Z3GewohntBedeutung
(> x 3)x > 3x ist größer als 3
(<= (+ x y) 5)x + y <= 5zusammen höchstens 5
(not (> y 3))nicht y > 3das Gegenteil
(declare-const x Int)x ist ganze Zahllegt x an

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Gibt es ein x zwischen 3 und 5?

Befehl
printf '(declare-const x Int)\n(assert (> x 3))\n(assert (< x 5))\n(check-sat)\n(get-value (x))\n' | 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.

Gibt es ein x zwischen 3 und 4?

Befehl
printf '(declare-const x Int)\n(assert (> x 3))\n(assert (< x 4))\n(check-sat)\n' | 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.

Eine Behauptung beweist man über ihr Gegenteil

Um zu beweisen, dass eine Behauptung aus den Regeln folgt, fragen Sie Z3 nach dem Gegenteil. Gibt es Werte, die alle Regeln erfüllen und die Behauptung brechen?

Antwortet Z3 unsat, gibt es keine, und die Behauptung ist bewiesen. Antwortet es sat, zeigt das Modell ein Gegenbeispiel.

Bücher x und DVDs y in der Bibliothek

SchrittBehauptung: höchstens 3 DVDsBehauptung: höchstens 2 DVDs
Regelnx >= 2 und x + y <= 5x >= 2 und x + y <= 5
Gegenteil dazuy > 3y > 2
Antwort von Z3unsatsat mit x = 2 und y = 3
Ergebnisbewiesenwiderlegt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Das Gegenteil von höchstens 3 DVDs

Befehl
printf '(declare-const x Int)\n(declare-const y Int)\n(assert (>= x 2))\n(assert (<= (+ x y) 5))\n(assert (> y 3))\n(check-sat)\n' | 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.

Das Gegenteil von höchstens 2 DVDs

Befehl
printf '(declare-const x Int)\n(declare-const y Int)\n(assert (>= x 2))\n(assert (<= (+ x y) 5))\n(assert (> y 2))\n(check-sat)\n(get-value (x y))\n' | 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.

Ein häufiger Fehler

Warnung

Viele denken: unsat heißt, die Behauptung ist falsch. Beim Gegenteil einer Behauptung ist es umgekehrt. unsat sagt dort: Das Gegenteil ist unmöglich, also stimmt die Behauptung.

Zwei Fallen: widersprüchliche Regeln und leere Behauptungen

Widersprechen sich die Regeln, ist jedes Gegenteil unsat, denn nichts erfüllt sie. Dann ist jede Behauptung „bewiesen“, auch eine absurde. Fragen Sie deshalb einmal nur nach den Regeln: Antwortet Z3 dort mit sat, passen sie zusammen.

Eine Behauptung, die immer stimmt, beweist ebenso nichts. Ihr Gegenteil ist auch ohne Regeln unsat.

Regeln, die sich widersprechen

Befehl
printf '(declare-const x Int)\n(declare-const y Int)\n(assert (>= x 2))\n(assert (<= x 1))\n(assert (> y 100))\n(check-sat)\n' | 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.

Eine Behauptung, die immer stimmt

Befehl
printf '(declare-const y Int)\n(assert (not (or (> y 3) (<= y 3))))\n(check-sat)\n' | 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.

Weiterführend

Schreiben Sie die Regeln einer eigenen Ausleihe, etwa für Laptops und Ladekabel in einem Rechenzentrum, als Z3-Eingabe. Fragen Sie erst nach den Regeln allein. Formulieren Sie dann zwei Behauptungen, eine wahre und eine falsche.

Prüfen Sie beide. Lesen Sie bei der falschen das Modell als Gegenbeispiel.

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

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.