==== Détermination de la sémantique de Programmes ====
=== Exercice 1 ===
Déterminer la sémantique du programme
while n > 0 do
n := n-1
pour n∈N.
Pour cela, on construit la suite des programmes (Wi) et leur fonction sémantique (wi)
^ i+1 | Wi+1 = | if n>0 then |
^ i | | { n:= n-1; if n>0 then { |
^ i-1 | | { n:= n-1; if n>0 then { |
^ ... | | |
^ 0 | | { n:= n-1; bottom }... }}}}} | avec i accolades fermantes |
wi+1(s) = non-définie si \left[\!| n |\!\right]_s > i et (s| n-> 0) si \left[\!| n |\!\right]_s \leq i
La limite de cette suite (wi) est la fonction définie par w(s) = (s | n-> 0). Donc le programme est équivalent à ''n:=0''.
=== Exercice 2 ===
Déterminer la sémantique due programme
k := 0; x := 0;
while k < n do {
k := k+1; x:= x + k;
}
Procédons en deux temps, la sémantique des premières affectations, puis du corps de l'itération.
\left[\!| k:=0, x:=0 |\!\right]\left(s\right) = \left(s|_{x\rightarrow 0, k\rightarrow 0}\right)
Une itération de la boucle :
\begin{eqnarray}
\left[\!| k:=k+1; x:=x+k |\!\right] & = & \left[\!| x:=x+k |\!\right]\left( \left[\!| k = k+1 |\!\right] \left(s\right)\right) \\
& = & \left[\!| x:=x+k |\!\right]\left(s\prime|_{k\rightarrow s\left(k \right)+1}\right) \\
& = & \left(s\prime | k\rightarrow s\left(k\right)+1, x\rightarrow s\left(x\right)+s\left(k\right) +1\right)\\
\left[\!| k:=k+1; x:=x+k |\!\right]^{i}\left(s\right) & = & \left(s | k\rightarrow s\left(k\right)+i, x\rightarrow s\left(x\right)+\left(s\left(k\right)+1\right)+\left(s\left(k\right)+2\right)+\ldots +\left(s\left(k\right)+i\right)\right)
\end{eqnarray}
* Wi+1 = if ki+1 = non-définie si \left[\!|k |\!\right]_{s} < \left[\!|n |\!\right]_{s} - i
* = ( s | k->s(n), x->s(x)+(s(k)+s(k)+1+s(k)+2...+s(k)+s(n)) ) si \left[\!|k |\!\right]_{s} = \left[\!|n |\!\right]_{s} - i
* = ( s | k->s(n), x->s(x)+s(n)) si \left[\!|k |\!\right]_{s} = \left[\!|n |\!\right]_{s} - 1
La limite de cette suite (wi) est la fonction w définie par
* si \left[\!|k |\!\right]_{s} < \left[\!|n |\!\right]_{s} : w\left(s\right) = \left( s | k\rightarrow s\left(n\right), x\rightarrow s\left(x\right)+s\left(k\right)+\left(s\left(k\right)+1\right)+\left(s\left(k\right)+2\right)+\ldots + s\left(n\right)\right)
* si \left[\!|k |\!\right]_{s} \geq \left[\!|n |\!\right]_{s} : s
Appliquée à l'état (s | k->0, x->0) on obtient l'état final :
* (s|k->s(n), x->1+2+...s(n)) si \left[\!|n|\!\right]_s > 0
* (s | k->0, x->0 ) si \left[\!|n|\!\right]_s = 0
----
[[semantics-4a|]] ou [[semantics_5|]]?