Ihr Axiom ist nicht wirklich ein Axiom, es fehlen Hypothesen. Einfache Darstellungen der Hoare-Logik manipulieren Formeln der Form wobei P und P ′ logische Formeln sind und C ein Befehl ist. Sie müssen sicherstellen, dass C gut geformt ist . In einfachen Sprachen, wie sie häufig für eine erste Einführung in die Hoare-Logik verwendet werden, ist Wohlgeformtheit syntaktisch: In der Regel muss überprüft werden, ob C.{ P.} C.{ P.'}}P.P.'C.C.C.entspricht einer kontextfreien Grammatik und möglicherweise, dass sich die freien Variablen innerhalb einer zulässigen Menge befinden. Wenn die Sprache Konstrukte enthält, die eine semantische Korrektheit aufweisen, z. B. Zugriffe auf Array-Elemente, müssen Sie Hypothesen hinzufügen, um diese semantische Korrektheit auszudrücken.
Formal können Sie Beurteilungen hinzufügen, um die Korrektur von Ausdrücken und Befehlen auszudrücken. Wenn Ausdrücke keine Nebenwirkungen haben, benötigen sie keine Nachbedingungen, sondern nur Vorbedingungen. Sie können beispielsweise wohlgeformte Regeln wie { P } schreiben.
und erlauben nur wohlgeformte Ausdrücke in Befehlen:
{P[x←E]}
{ P.}}E. wf{ P.∧ 0 ≤ E.< l e n g t h (A)}A [ E.] wf{ P.}}E.1 wf{P.}}E.2 wf{P.}}E.1+ E.2 wf
{P.[x ← E.] }E. wf{P.[ x← E.]]}x : =E.{P.}}
e r r o re r r o rE r r o r¬ E r r o r
{P.[ x ← E.] }x : = E.{P.∨ E r r o r }P.[ x ← E.]]⟹E.↛ e r r o r{P.[ x ← E.] }x : = E.{P.}}
Ein weiterer Ansatz besteht darin, ein Hoare-Triple nur dann zu halten, wenn das Programm korrekt beendet wird. Dies ist der übliche Ansatz für nicht endende Programme: Die Nachbedingung gilt, wenn der Befehl beendet wird, was möglicherweise nicht immer der Fall ist. Wenn Sie Laufzeitfehler als Nichtbeendigung behandeln, kehren Sie alle Korrektheitsprobleme unter die Haube. Sie müssen immer noch die Richtigkeit des Programms irgendwie beweisen, aber es muss nicht in der Hoare-Logik sein, wenn Sie einen anderen Formalismus für diese Aufgabe bevorzugen.
Beachten Sie übrigens, dass das Ausdrücken, was passiert, wenn eine zusammengesetzte Variable wie ein Array geändert wird, mehr involviert ist als das, was Sie geschrieben haben. Angenommen, war beispielsweise I s S o r t e d ( A ) : Die Substitution A [ i ] ← E würde P nicht ändern , aber die Zuweisung A [ i ] ← P könnte P ungültig machen . Auch wenn Sie die Syntax von Prädikaten so einschränken, dass nur über Atome gesprochen wird, berücksichtigen Sie die Zuordnung A [ A [ 0P.I s S o r t e d (A)A [ i ] ← E.P.A [ i ] ← P.P. unter der Voraussetzung A [ 0 ] = 2 ∧ A [ 1 ] = 3 : Sie können keine einfache Substitution vornehmen, um die korrekte Nachbedingung A [ 0 ] = 1 ∧ A [ 1 ] = zu erhalten In 1 müssen Sie A [ 0 ] bewerten(was im Allgemeinen schwierig sein kann, da die Vorbedingung möglicherweise keinen einzigen möglichen Wert für A angibtA[A[0]−1]:=A[0]A[0]=2∧A[1]=3A[0]=1∧A[1]=1A[0] ). Sie müssen die Ersetzung für das Array selbst durchführen: A ← A [ i ← E ] . Mike Gordons Vorlesungsunterlagen enthalteneine gute Präsentation der Hoare-Logik mit Arrays (jedoch ohne Fehlerprüfung).A[0]A←A[i←E]
length
in Ihrem BeispielprogrammA
?length
wurde umbenanntA_length
.) Zweitens brauchen wir Array "Schöpfung" Axiome wieint[] a = int[length] {a_length==length}
. Ich denke das sollte reichen.