Informasjon

Frist Ingen frist
Innleveringsgrense Ingen begrensning

Logg inn

[3.2] Assertion la plus forte

La plus forte postcondition (\(sp\))

Chercher l'assertion \(Q\) la plus forte dans un triplet de Hoare \(\{P\}\ S\ \{Q\}\), c'est appliquer la méthode progressive. On calcule la plus forte postcondition \(sp(S, P)\) en partant de la précondition \(P\) et en évaluant les instructions de \(S\) une par une, ce qui donne la postcondition la plus restrictive garantie après l'exécution de \(S\) quand on part d'un état qui vérifie \(P\).

Une assertion plus restrictive est correcte si elle reste vraie pour toutes les exécutions possibles et la plus forte si elle n'exclut aucune valeur pourtant atteignable.

Les règles de calcul

Type d'instruction Règle formelle Intuition
Affectation (\(x = e\)) \(sp(x = e, P) = P[x/x'] \land x = e[x/x']\) Après l'affectation, on renomme l'ancienne valeur de \(x\) en \(x'\) dans la précondition et on ajoute que la nouvelle valeur de \(x\) vaut l'expression \(e\).
Séquence (\(S_1; \dots; S_n\)) \(sp(S_1; \dots; S_n, P) = A_n\) où \(A_0 = P\) et \(A_i = sp(S_i, A_{i-1})\) On calcule la plus forte postcondition de chaque instruction, dans l'ordre où elles apparaissent.
Condition (\(\texttt{if (B) \{S1\} else \{S2\}}\)) \(sp(\texttt{if (B) \{S1\} else \{S2\}}, P) = sp(S1, P \land B) \lor sp(S2, P \land \neg B)\) On suit les deux branches : la \(sp\) de la branche then avec \(B\) vraie, disjonctée avec celle de la branche else avec \(B\) fausse.
Assignation tabulaire (\(a[s] = e\)) \(sp(a[s] = e, P) = P[a/a'] \land a[s[a/a']] = e[a/a'] \land \forall i \neq s[a/a'] : a[i] = a'[i]\) Même principe que l'affectation simple mais adapté aux tableaux : seule la case d'indice \(s\) change, les autres cases restent inchangées.
Boucle (\(\texttt{while (B) \{S\}}\)) \(sp(\texttt{while (B) \{S\}}, P) = I \land \neg B\) où \(I\) est un invariant de la boucle tel que \(P \Rightarrow I\) Le nombre d'itérations est inconnu, mais un invariant vrai avant la boucle reste vrai après chaque itération. A la sortie, il est donc encore vérifié, accompagné de la condition d'arrêt \(\neg B\).

Spørsmål 1:

Sachant que x est un int, quelle est l'assertion \(Q\) la plus forte telle que l'assertion suivante soit vraie :

\begin{equation*} \{x > 5\} \; \texttt{x = x - 1;} \; \{Q\} \end{equation*}
Spørsmål 2:

Sachant que i, j et k sont des int, quelle est l'assertion \(Q\) la plus forte telle que l'assertion suivante soit vraie :

\begin{equation*} \{0 < i \land j < 100 \land k \geq 0\} \; \texttt{i = i + j;} \; \{Q\} \end{equation*}
Spørsmål 3:

Sachant que a et b sont des int initialisés et \(a_0\) et \(b_0\) désignent leurs valeurs initiales, quelle est l'assertion \(Q\) la plus forte telle que l'assertion suivante soit vraie :

\begin{equation*} \{a = a_0 \land b = b_0\} \; \texttt{a = a+b; b = a-b; a = a-b;} \; \{Q\} \end{equation*}
Spørsmål 4:

Sachant que x et y sont des int, quelle est l'assertion \(Q\) la plus forte telle que l'assertion suivante soit vraie :

\begin{equation*} \{0 \leq x \leq y + 10\} \; \texttt{if (x <= 10) \{ x = x + 10; \} else \{ y = y + x; \}} \; \{Q\} \end{equation*}