Table des matières

Sémantique Dénotationnelle d'un langage de programmation

Consiérons maintenant un langage de programmation impérative simplifié (que nous appellerons “L”) comportant :

Remarque
On s'dresse ici seulement à la sémantique des instruction : sémantique dite dynamique –par opposition à la sémantique statique – et pas aux déclarations de variable qui p…FIXME2) ttrait un contrôle de type des expressions sémantique dites statique.

Nous avons déjà vu que la sémantique d'un programme impératif est une fonction mathématique qui représente l'effet du programme sur un état mémoire :

f: ensemble des états mémoire ensemble des états mémoire

Cette fonction pren en argument un état mémoire avant exécution et retourne en résultat l'état mémoire après exécution (état initial, état final). Le domaine sémantique du langage “L” est dont l'ensemble des fonctions de S dans S où S est l'ensemble des états mémoire. Donc pour toute instruction “A” de langage “L” :

où s et s' sont des états mémoire, et où un état mémoire est une application de l'ensmeble des identificateurs dans un ensemble de valeurs.

Dans la suite, on notera :

On peut alors établir ces définitions sémantiques :

l'affectation \forall s\in S,\quad \left[\!| x := expr |\!\right]\left( s \right) = \left(s | x \rightarrow \left[\!| expr|\!\right]_{s}\right)
l'instruction vide \forall s \in S,\quad \left[\!| skip |\!\right]\left(s\right) = s

Exercice

Déterminer la sémantique des programmes :

\begin{eqnarray} \forall s \in S & \left[\!| P_1 |\!\right]_s & = & \left[\!| a:=0;b:=1 |\!\right]\left( s\right) \\ & & = & \left[\!| b:=1 |\!\right]\left( \left[\!| a:=0 |\!\right]\left( s \right)\right) \\ & & = & \left[\!| b:=1 |\!\right]\left( s| a \rightarrow 0\right) \\ & & = & \left(\left( s | a \rightarrow 0\right) | b \rightarrow 1 \right) \\ & & = & \left( s | a \rightarrow 0, b \rightarrow 1 \right) \\ \end{eqnarray}
\begin{eqnarray} \forall s \in S & \left[\!| P_2 |\!\right]_s & = & \left(\left( s | b \rightarrow 1 \right) | a \rightarrow 0\right) \\ & & = & \left( s | a \rightarrow 0, b \rightarrow 1 \right) \\ \end{eqnarray}
Donc, \left[\!| P_1 |\!\right] = \left[\!| P_2 |\!\right]

Grande Parenthèse

La sémantique dénotationnelle est une des approches qui permettent de formaliser un programme en utilisant les mathématiques. D'autres approches sont la sémantique opérationnelle, où un programme est vu comme un système de transitions d'états (dont nous dirons quelques mots), et la sémantique axiomatique, où un programme est vu comme une transformation de prédicats, et nous la développerons plus loin dans ce cours.

En sémantique dénotationnelle, on s'intéresse à l'effet du programme et pas à la manière de l'exécuter (ou dont c'est réalisé). Par exemple, \left[\!| P_1 |\!\right] = \left[\!| P_2 |\!\right], les deux programmes ont un même effet sur un état mémoire.

En sémantique opérationnelle, on s'intéresse à la manière don se font les calculs. La signification d'un programme est la suite des états mémoire de la machine qui exécute le programme. Par exemple, nos programmes ont les sémantique opérationnelles :

deux sémantiques différentes.

Remarques
P1 et P2 ne sont pas opérationnellement équivalentes, mais deux programmes qui ne sont pas opérationnellement équivalentes peuvent aboutir au même état final.
Ces trois sémantiques (dénotationnelle, opérationnelle, axiomatique) ne sont pas complètement indépendente les unes des autres.
* 2 programmes syntaxiquement équivalentes le sont opérationnellement,
* 2 programmes opérationnellement équivalentes le sont dénotationnellement,
* deux programmes dénotationnellement équivalentes le sont axiomatiquement;
mais les réciproques sont fausses.

fin Grande parenthèse

Suite des dénotations de nos instructions :

Etude de la suite des programmes w

Ainsi, on observe que généralement w_{i+1}\left( s \right) = w_{i}\left(\left[\!| A |\!\right] \left( s \right) \right) si \left[\!| b |\!\right] = vrai, et s si \left[\!| b |\!\right] = faux. Lorsqu'on passe i → ∞,

w_{\infty}\left( s \right) = w_{\infty}\left(\left[\!| A |\!\right] \left( s \right) \right) si \left[\!| b |\!\right] = vrai
s si \left[\!| b |\!\right] = faux.

De là on conclut que

qui est une propriété que l'on démontre à partir de la définition sémantique de l'itération.

Détermination de la sémantique de Programmes : Exemples de détermination de la sémantique de programmes par la construction de la suite de programmes.

1) NOP, mais dans la litterature c'est généralement skip
2) manque un bout de mot