Korrektheit
Korrektheit
Korrektheit
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
3<br />
Ein Programm p ist korrekt, wenn es für alle Eingabewerte x und y den ggT( x, y ) berechnet bzw.<br />
ausgibt.<br />
Für die Programmiersprache ℒ können wir etwas formaler sagen: Ein Programm p ∈ ℒ entspricht genau<br />
dann der intendierten Logik bzw. der intendierten Funktion f, wenn bei jeder Berechnung mit einer<br />
Belegung σ ∈ Σ gilt:<br />
ℳ ⟦ p ⟧ ( σ [ a / x, b / y , c / 0 ] ) = σ' ⇒ σ ( c ) = f ( x , y )<br />
Anmerkung<br />
Das Problem bei der begrifflichen Trennung von semantischen und logischen Fehlern entsteht durch<br />
den Begriff der Semantik. Bei einem semantischen Fehler fehlt die Zuordnung, bei einem logischen<br />
Fehler stimmt die Zuordnung nicht. Aber in beiden Fällen hat man es mit der Semantik zu tun. Man<br />
kann also auch die falsche Zuordnung als Fehler der Semantik verstehen, wenn man die korrekte<br />
Zuordnung im Hinterkopf hat. Dann handelt es auch natürlich auch bei einem logischen Fehler um<br />
einen semantischen Fehler, nur ist dieser dann in den Bereich der Sprache gewandert.<br />
Partielle und totale <strong>Korrektheit</strong><br />
Semantische und logische Fehler sind deutlich zu trennen. Das liegt zum einen an der zumindest in einer<br />
Richtung vorliegenden inneren Abhängigkeit: Programme müssen semantisch fehlerfrei sein, um sinnvoll<br />
auf logische Fehlerlosigkeit hin untersucht werden zu können. Die semantische <strong>Korrektheit</strong> geht der<br />
logischen also vorher.<br />
Anmerkung<br />
Ein Programm, das wegen einer Division durch 0 kein Ergebnis liefert, kann nicht auf logische<br />
<strong>Korrektheit</strong> hin untersucht werden, da ja eben kein Ergebnis vorliegt. Das gleiche gilt für<br />
Endlosschleifen. Wiederum fehlt ein Ergebnis.<br />
Darüber hinaus ist der Nachweis der Terminiertheit eines Programms häufig einfacher, als Beweis der<br />
logischen <strong>Korrektheit</strong>. Zum anderen verlangen beide <strong>Korrektheit</strong>snachweise andere Beweistechniken.<br />
Damit ergibt sich eine Definition der <strong>Korrektheit</strong> von Programmen, die auf den Grundbegriffen der<br />
Prädikatenlogik basiert:
5<br />
Eine andere Definition der <strong>Korrektheit</strong> basiert auf den Belegungen des Speichers. Denn mit Σ als der Menge<br />
aller Speicherbelegungen ist φ ⇒ ψ gleichbedeutend mit { σ : ⊨ σ φ } ⊆ { σ : ⊨ σ ψ }. Definieren wir zunächst<br />
eine abkürzende Schreibweise:<br />
DEFINITION<br />
Geg. sei Prädikat φ. Dann ist { σ : ⊨ σ φ } die Menge aller Zustände, die φ erfüllen und wir schreiben<br />
für sie kurz: { φ }.<br />
Nun können wir die <strong>Korrektheit</strong> auch wie folgt definieren:<br />
DEFINITION <strong>Korrektheit</strong> (Mengendefinition)<br />
Geg. sind zwei Prädikate φ, ψ, die Menge Σ aller Speicherbelegungen und ein Programm p.<br />
p heißt total korrekt, falls ℳ ⟦ p ⟧ total und ℳ ⟦ p ⟧ ( { φ } ) ⊆ { ψ }.<br />
p heißt partiell korrekt, falls ℳ ⟦ p ⟧ ( { φ ∧ ℳ ⟦ p ⟧ terminiert } ) ⊆ { ψ } gilt.<br />
Anmerkung<br />
Diese <strong>Korrektheit</strong>sdefinition basierend auf Mengen von Speicherbelegungen erleichtert einige<br />
Beweise. Sie ist aber zur ersten Definition äquivalent.<br />
Anmerkung<br />
Die Mengendefinition deckt auch ab, dass jedes Programm p unter der Vorbedingung ⊥ wahr ist.<br />
Diese Definiton der <strong>Korrektheit</strong> ist jedoch zu allgemein. Nach ihr sind Ausdrücke wie:<br />
oder:<br />
{ F } p { φ }<br />
{ φ } p { T }<br />
in jedem Fall korrekt. Das führt aber ggf. zu sinnlosen Aussagen; sinnlos im Sinne von: Sie sind korrekt,<br />
ohne etwas inhaltliches zu sagen. Daher wird nach Einschränkungen der Prädikate gesucht, die den Bereich<br />
der Vor- bzw. Nachbedingungen korrekter Programme sinnvoll begrenzen. Dh. ausgehend von dem in jedem<br />
Fall gültigen Ausdruck { F } p { φ }, werden Prädikate ψ gewählt, die einerseits schwächer sind als F, aber<br />
das Programm mit die Nachbedingung φ nach wie vor erfüllen:<br />
{ F } → { ψ }, { ψ } p { φ }<br />
Offenbar ergeben sich Ketten von Prädikaten:
{ F } → { ψ1 } → … → { ψn }, { ψn } p { φ }<br />
Diese Idee führt zum Begriff der schwächsten Vorbedingung:<br />
DEFINITION schächste Vorbedingung<br />
Gegeben sind ℳ, ℑ, Σ, ℒ und ein Prädikat φ.<br />
6<br />
Ein Prädikat ψ heißt schwächste, freie Vorbedingung des Programms p zur Nachbedingung φ, falls:<br />
⊨ℑ ψ ( σ ) ⇔ ℳ ⟦ p ⟧ ( σ ) terminiert ∧ φ ( ℳ ⟦ p ⟧ ( σ ) ) ]<br />
Ein Prädikat ψ heißt schwächste Vorbedingung des Programms p zur Nachbedingung φ, falls:<br />
Anmerkung<br />
⊨ℑ ψ ( σ ) ⇔ φ ( ℳ ⟦ p ⟧ ( σ ) )<br />
Die schwächste Vorbedingung ist keineswegs eindeutig. So sind zB. zur Bedingung φ alle Bedingungen<br />
φ ∧ T bzw. φ ∨ F gleichwertige Vorbedingungen.<br />
Anmerkung<br />
Der Begriff der stärksten Vorbedingung ist der Bezeichnung von α stärker als β falls α ⇒ β gilt.<br />
Zur Vorbedingung gibt es in einer ganz analogen Herleitung eine dann stärkste Nachbedingung. Dh.<br />
ausgehend von dem in jedem Fall gültigen Ausdruck { φ } p { T }, werden Prädikate ψ gewählt, die<br />
einerseits stärker sind als T, aber das Programm p und die Vorbedingung φ nach wie vor als<br />
Nachbedingung erfüllen:<br />
{ ψ } → T, { φ } p { ψ }<br />
Hier ergeben sich wiederum Ketten von Prädikaten:<br />
{ ψ1 } → … → { ψn } → { T }, { φ } p { ψ1 }<br />
mit ψ1 als dem stärksten der Kette. Diese Idee führt zum Begriff der stärksten Nachbedingung:<br />
DEFINITION stärkste Nachbedingung<br />
Ein Prädikat ψ heißt stärkste Nachbedingung des Programms p unter dem Prädikat φ, falls:<br />
⊨ℑ φ ( σ ) ⇔ ψ ( ℳ ⟦ p ⟧ ( σ ) )
Beispiel<br />
Beispiel<br />
7<br />
Zum Programm i ≔ i +1 und der Nachbedingung i ≤ 1 ist i ≤ 0 die schwächste Vorbedingung. i ≤ −1<br />
wäre eine stärkere Vorbedingung. i ≤ −2 noch stärker usw bis zu F, der stärksten Vorbedingung.<br />
Zum Programm i ≔ i +1 und der Vorbedingung i ≥ 0 ist i ≥ 1 die stärkste Nachbedingung. i ≥ 2 ist<br />
wiederum schwächer, i ≥ 3 noch etwas mehr und T schließlich die schwächste.