Il tuo assioma non è in realtà un assioma, manca di ipotesi. Presentazioni semplici della logica Hoare manipolano le formule della forma dove e sono formule logiche e è un comando. È necessario assicurarsi che sia ben formato . In linguaggi semplici come quelli spesso usati per una prima introduzione alla logica di Hoare, la buona formazione è sintattica: in genere si tratta di verificare cheP P ′ C C C{ P} C{ P'}PP'CCCè conforme a una grammatica senza contesto e, possibilmente, che le variabili libere si trovano all'interno di un insieme consentito. Se il linguaggio include costrutti che hanno una correttezza semantica, come gli accessi agli elementi dell'array, è necessario aggiungere ipotesi per esprimere questa correttezza semantica.
Formalmente, puoi aggiungere giudizi per esprimere la correzione di espressioni e comandi. Se le espressioni non hanno effetti collaterali, non hanno bisogno di postcondizioni, solo di precondizioni. Ad esempio, puoi scrivere regole di buona formazione come
e consenti solo espressioni ben nei comandi:
{P[x←E]}
{ P}E wf{ P∧ 0 ≤ E< l e n g t h ( A ) }A [ E] wf{ P}E1 wf{ P}E2 wf{ P}E1+ E2 wf
{ P[ x ← E] }E wf{ P[ x ← E] }x : = E{ P}
Un approccio diverso consiste nel considerare tutte le espressioni come ben formate, ma fare in modo che qualsiasi espressione che coinvolge un calcolo mal formato abbia un valore speciale . Nelle lingue con controllo dei limiti di runtime, significa "questo programma ha sollevato un'eccezione fatale". Tieni quindi traccia se un programma ha commesso un un predicato logico ; un programma è valido solo se si può dimostrare che la sua postcondizione implica .
e r r o r E r r o r ¬ E r r o re 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}
Ancora un altro approccio è considerare una tripla Hoare da tenere solo se il programma termina correttamente. Questo è il solito approccio per i programmi non terminali: la postcondizione vale quando termina il comando, il che potrebbe non accadere sempre. Se trattate gli errori di runtime come non terminazione, spazzate via tutti i problemi di correttezza. Dovrai comunque dimostrare la correttezza del programma in qualche modo, ma non è necessario che sia nella logica Hoare se preferisci un altro formalismo per quel compito.
A proposito, nota che esprimere ciò che accade quando una variabile composta come una matrice viene modificata è più coinvolto di ciò che hai scritto. Supponiamo era, diciamo, : la sostituzione non cambierebbe , ma l'assegnazione potrebbe invalidare . Anche se si limita la sintassi dei predicati per parlare solo di atomi, considerare l'assegnazione sotto la condizione preliminare : non è possibile effettuare una semplice sostituzione per ottenere la postcondizione corretta , è necessario valutarePI s S o r t e d (A)A [ i ] ← EPA [ i ] ← PPA [ A [ 0 ] - 1 ] : = A [ 0 ]A [ 0 ] = 2 ∧ A [ 1 ] = 3A [ 0 ] A [ 0 ] A ← A [ i ← E ]A [ 0 ] = 1 ∧ A [ 1 ] = 1A [ 0 ](che può essere difficile in generale, poiché la condizione preliminare potrebbe non specificare un singolo valore possibile per ). È necessario eseguire la sostituzione sull'array stesso: . Gli appunti delle lezioni di Mike Gordon hanno una buona presentazione Logica Hoare con array (ma senza controllo degli errori).A [ 0 ]A ← A [ i ← E]
length
aA
?