Wir initialisieren Rocq und widerholen die Definition of Listen.
lia
für numerische GoalsIn Rocq stellt x <= y
die Aussage "x ist kleiner oder gleich y" dar.
Wenn numerische Aussagen zu beweisen sind, z.B. kleiner-gleich-Aussagen, können wir die Taktik
lia
benutzen. Diese Taktik versucht
die zu zeigende numerische Aussage aus den Annahmen zu beweisen. Für unsere Fälle reicht diese Taktik aus.
Später werden wir Funktionen schreiben, in denen wir eine Fallunterscheidung machen müssen, ob eine Zahl
keiner als eine andere ist. Dies können wir mit dem folgenden if-then-else Konstrukt machen.
is_leq
ist eine Funktion, die entscheidet ob x <= y
. Wir gehen hier nicht darauf
ein, wie das funktioniert und warum das nötig ist.
Um in einem Beweis diese Fallunterscheidung dann durchzuführen, verwenden wir die Taktik
case_analysis_is_leq x y
.
Wenn wir eine Aussage X zu zeigen wollen und ein Lemma lem haben, dass X aussagt, können wir mit der
Taktik apply lem
dieses Lemma anwenden. Die Taktik erzeugt dann Goals für alle Annahmen, die
lem aufführt um X zu zeigen.
Jetzt geht's an das Beweisen eines "richtigen" Algorithmus! Wir beweisen die Korrektheit von Insertion Sort.
Definiere eine Funktion sort vom Typ list -> list
, die Insertion Sort implementiert!
Definiere ein Funktion sorted vom Typ list -> Prop
, die eine Aussage erzeugt, die
Sortiertheit einer Liste ausdrückt.
Beweise, dass die Implementierung von Insertion Sort eine sortierte Liste zurück gibt. Noch ein paar Hinweise:
simpl
nicht in der zu beweisenden Aussage sondern in einer Annahme H benutzen
möchtet, könnt ihr dies mit simpl in H
tun.
apply
anzuwenden.
IH: X -> Y
bekommen. Dies stellt eine Implikation da: wenn X gilt, dann gilt auch Y.
Wenn ihr nun Y zeigen sollt, könnt ihr mit apply IH
die Induktionshypothese (wie ein Lemma)
anwenden. Nun müsst ihr X zeigen.
Im vorherigen Abschnitte haben wir bewiesen, dass Insertion Sort sortierte Liste erzeugt. Jedoch fehlt hier noch was! Diese Aufgabe bearbeiten wir aus Zeitgründen nicht in Rocq.
Gebt ein Beispiel für einen "Sortieralgorithmus", der immer eine sortierte Liste zurück gibt, aber offensichtlich nicht das tut, was wir von einem Sortieralgorithmus erwarten.
Formulierteine weitere Eigenschaft von sort
, die der "Sortieralgorithmus" aus Aufgabe 4.1
nicht erfüllt.
Überleget, ob eine Funktion, die eine sortierte Liste zurück gibt und eure Eigenschaft aus 4.2 erfüllt,
schon eindeutig spezifiziert ist. Falls nein, wie könnte eine Funktion aussehen, die dies alles erfüllt,
aber andere Ergebnisse als sort
liefert? Ihr müsst diese nicht unbedingt in Rocq implementieren.
Versucht eine weitere Aussage zu definieren, die unseren Sortieralgorithmus eindeutig spezifiziert. Jeder
andere Algorithmus, der diese Spezifikation erfüllt, muss immer die selben Ergebnisse wie sort
liefern. Es kann sein, dass ihr Hilfsfunktionen definieren müsst. Auch diese Aufgabe müsst ihr nicht in Rocq
lösen.
JsCoq's homepage is at github https://github.com/jscoq/jscoq ¡Salut!