03.09.2013 Aufrufe

Korrektheit

Korrektheit

Korrektheit

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!