Korrektheitsbeweis
Korrektheitsbeweis
1. Was bedeutet Korrektheit?
- Ein Algorithmus heißt korrekt, wenn er für jede zulässige Eingabe in endlicher Zeit (Halteproblem) das gewünschte Ergebnis liefert (partielle bzw. totale Korrektheit).
- Es gibt somit zwei Teilaspekte der Korrektheit:
- Terminierung: Der Algorithmus muss für alle Eingaben enden (das Halteproblem).
- Partielle Korrektheit: Das ausgegebene Ergebnis muss bei Beendigung korrekt sein.
- WICHTIG: Problembeschreibung muss exakt definiert sein
Unterschied zwischen partielle und totale Korrektheit
- Partielle Korrektheit garantiert, dass das Ergebnis korrekt ist, falls der Algorithmus anhält.
- Totale Korrektheit setzt die partielle Korrektheit voraus, zeigt aber zusätzlich, dass der Algorithmus immer anhält.
2. Das Halteproblem (Terminierung)
- Ein Algorithmus, der nie anhält (z. B. in einer Endlosschleife), kann kein Ergebnis liefern und ist daher nicht korrekt.
- Beispiel: Collatz-Algorithmus – seine Terminierung ist bis heute nicht bewiesen.
- Gegenbeispiel: Algorithmus der ägyptischen Multiplikation hält für alle natürlichen Eingaben
nundm, da die Schleifenvariable in jedem Durchlauf strikt sinkt und schließlich die Schleifenbedingung verletzt wird.
Wichtige Schritte bei Terminierungsbeweisen
- Schleifenvariable identifizieren und zeigen, dass sie sich bei jedem Durchlauf in Richtung der Abbruchbedingung bewegt.
- Abbruchbedingung formulieren und beweisen, dass sie erreicht wird.
Terminierungsbeweis beim Beispiel (ägyptische Multiplikation)
- Schleifenvariable:
x(entsprichtnim Input). - Eingangsbelegung:
x0 = n. - Abbruchbedingung:
while (x >= 1). - Beobachtung:
xbleibt eine ganze Zahl.- Pro Durchlauf wird
xentweder halbiert (wenn gerade) oder(x - 1)halbiert (wenn ungerade). In beiden Fällen verringert sich der Wert garantiert. - Nach maximal
nSchritten (bzw. einer Funktion, die vonnabhängt) wirdxso klein, dass die Schleife endet.
- Ergebnis: Der Algorithmus terminiert bei jeder natürlichen Zahl
n.
3. Partielle Korrektheit
Damit der Algorithmus nicht nur anhält, sondern auch das richtige Ergebnis berechnet, muss man zeigen, dass die ausgegebene Variable tatsächlich dem gewünschten Wert entspricht. Beim Beispiel der ägyptischen Multiplikation soll das Produkt n * m berechnet werden.
4. Schleifeninvariante
Definition
- Eine Schleifeninvariante ist eine Eigenschaft (oder ein Wert), die/der vor und nach jedem Schleifendurchlauf gilt.
- Formell heißt das:
- Zu Beginn der Schleife (Initialisierung) ist die Invariante erfüllt.
- Falls die Invariante vor einem Durchlauf gilt, dann gilt sie auch nach diesem Durchlauf.
- Gilt die Invariante noch, wenn die Schleife abbricht, so liefert sie Informationen über den Endzustand.
Beispiel-Invariante bei der ägyptischen Multiplikation
- Man wählt als Schleifeninvariante den Ausdruck
Hier sind x, y und p Variablen, die im Algorithmus in jedem Schleifendurchlauf geändert werden.
- Idee:
- Durch Halbieren von
xund Verdoppeln vonybleibt das Produktx * ykonstant. - Falls
xungerade ist, wird ein passender Anteil (y) zupaddiert und gleichzeitigxdurch(x - 1)halbiert.
Dadurch gleicht sich das Produkt wieder aus. - Insgesamt bleibt
x * y + pvor und nach jedem Schleifendurchlauf gleich.
- Durch Halbieren von
Beispiel-Invariante bei der Maximumsuche
- Schleifeninvariante
- Definition:
A[max]ist ein größtes Element ausA[1..j-1]. - Abkürzung:
A[1..j-1]bezeichnet das Teilarray vonA[1]bisA[j-1].
- Definition:
- Beweis der Schleifeninvariante
- Initialisierung (vor der Schleife):
- Zu Beginn ist
j = 2. - Das Teilarray
A[1..1]enthält nur das erste Element (A[1]). - Es gilt:
max = 1, also istA[max] = A[1]. - Die Invariante gilt, da
A[max]das größte Element ausA[1..1]ist.
- Zu Beginn ist
- Erhaltung (während der Schleife):
- Angenommen, die Invariante gilt zu Beginn eines Schleifendurchlaufs für ein aktuelles j.
- Es gibt zwei Fälle:
- Fall 1:
A[j] ≤ A[max]- Die Bedingung if
A[j] > A[max]wird nicht erfüllt, und max bleibt unverändert. - Somit bleibt
A[max]das größte Element ausA[1..j].
- Die Bedingung if
- Fall 2:
A[j] > A[max]- Die Bedingung wird erfüllt, und max wird auf
jgesetzt. - Nun ist
A[max] = A[j], das größte Element ausA[1..j].
- Die Bedingung wird erfüllt, und max wird auf
- Fall 1:
- In beiden Fällen bleibt die Schleifeninvariante erhalten.
- Abbruch (nach der Schleife):
- Am Ende der Schleife gilt
j = length(A) + 1. - Die Schleifeninvariante garantiert, dass
A[max]das größte Element ausA[1..length(A)]ist. - Da max der Index des größten Elements ist, liefert der Algorithmus korrekt max.
- Am Ende der Schleife gilt
- Initialisierung (vor der Schleife):
5. Induktionsbeweis (Vollständige Induktion)
Um zu zeigen, dass die Schleifeninvariante tatsächlich zu einem korrekten Ergebnis führt, nutzt man meist einen Induktionsbeweis:
-
Induktionsbasis:
- Man zeigt, dass die Invariante vor dem ersten Schleifendurchlauf gilt (z. B.
x0 = n,y0 = m,p0 = 0, sodassx0 * y0 + p0 = n * m + 0).
- Man zeigt, dass die Invariante vor dem ersten Schleifendurchlauf gilt (z. B.
-
Induktionsschritt:
- Angenommen, die Invariante hält nach dem i-ten Durchlauf.
- Dann zeigt man, dass sie auch nach dem (i+1)-ten Durchlauf gilt.
- Man rechnet also die Änderungen von
x,yundpin den zwei Fällen (gerade/ungerade) durch und stellt sicher, dassx * y + psich nicht ändert.
-
Ergebnis nach Abbruch:
- Wenn die Schleife beendet ist, gilt
x = 0(bzw. < 1). - Die Invariante besagt:
- Also muss
p = n * msein (da die Invariante mit dem Anfangswertn*mübereinstimmt).
- Wenn die Schleife beendet ist, gilt