]> AND Private Git Repository - hdrcouchot.git/blob - modelchecking.tex
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
une version de plus
[hdrcouchot.git] / modelchecking.tex
1
2 Sur des petits exemples, l'étude de convergence de systèmes
3 dynamiques discrets est simple à vérifier 
4 pratiquement pour le mode synchrone. Lorsqu'on introduit des stratégies 
5 pseudo-périodiques pour les modes unaires et généralisés, le problème 
6 se complexifie. C'est pire encore lorsqu'on traite des itérations asynchrones 
7 et mixtes prenant de plus en compte les délais. 
8
9 Des méthodes de simulation basées sur des stratégies et des délais générés aléatoirement 
10 ont déjà été présentées~\cite{BM99,BCV02}.
11 Cependant, comme ces implantations ne sont pas exhaustives, elles ne donnent un résultat 
12 formel que lorsqu'elles fournissent un contre-exemple. Lorsqu'elles exhibent une convergence,  
13 cela ne permet que de donner une intuition de convergence, pas  une preuve.
14 Autant que nous sachions, aucune démarche de preuve formelle automatique 
15 de convergence n'a jamais été établie. 
16 Dans le travail théorique~\cite{Cha06}, Chandrasekaran a montré que les itérations asynchrones sont convergentes 
17 si et seulement si on peut construire une fonction de Lyaponov décroissante, mais il ne donne pas de méthode 
18 automatique pour construire cette fonction.
19
20 Un outil qui construirait automatiquement toutes 
21 les transitions serait le bienvenu. 
22 Pour peu qu'on établisse la preuve de correction et de complétude de la 
23 démarche, la convergence du réseau discret ne reposerait
24  alors que sur le verdict 
25 donné par l'outil. 
26 Cependant, même pour des réseaux discrets à peu d'éléments, 
27 le nombre de configurations induites explose rapidement.
28 Les \emph{Model-Checkers}~\cite{Hol03,nusmv02,Blast07,MCErlang07,Bogor03}  
29 sont des classes d'outils qui adressent le problème de détecter automatiquement
30 si un modèle vérifie une propriété donnée. Pour traiter le problème d'explosion 
31 combinatoire, ces outils appliquent des méthodes d'ordre partiel, d'abstraction,
32 de quotientage selon une relation d'équivalence.
33
34 Ce chapitre montre comment nous simulons 
35 des réseaux discrets  pour établir 
36 formellement leur convergence (ou pas).
37 Nous débutons par un exemple et faisons quelques rappels sur 
38 le langage PROMELA qui est le langage du model-checker 
39 SPIN~\cite{Hol03} (\Sec{sec:spin:promela}).
40 Nous présentons ensuite la démarche de traduction 
41 de réseaux discrets dans PROMELA (\Sec{sec:spin:translation}).   
42 Les théorèmes de correction et de complétude de la démarche
43 sont ensuite donnés à la \Sec{sec:spin:proof}. 
44 Des données pratiques comme la complexité et des synthèses d'expérimentations
45 sont ensuite fournies (\Sec{sec:spin:practical}). 
46 Ce chapitre a fait l'objet du rapport~\cite{Cou10:ir}.
47
48
49
50
51
52
53 %\section{Exemple jouet}
54
55
56 \begin{figure}[ht]
57   \begin{center}
58     \subfigure[Fonction à itérer]{
59       $ F(x)= \left \{
60         \begin{array}{rcl}
61           f_1(x_1,x_2,x_3) & = & x_1.\overline{x_2} + x_3  \\
62           f_2(x_1,x_2,x_3) & = & x_1 + \overline{x_3} \\
63           f_3(x_1,x_2,x_3) & = & x_2.x_3
64         \end{array}
65       \right.
66       $        
67       \label{fig:map}
68     }
69     \hfill
70     \subfigure[Graphe d'intéraction]{
71       \includegraphics[width=4cm]{images/xplCnxMc.eps}
72       \label{fig:xplgraph:inter:mc}
73     }
74   \end{center}
75   \caption{Exemple pour SDD $\approx$ SPIN.}
76 \end{figure}
77
78
79
80 \begin{xpl}
81   On considère un exemple à trois éléments dans $\Bool$. 
82   Chaque configuration est ainsi un élément de $\Bool^3$, \textit{i.e.}, 
83   un nombre entre 0 et 7. 
84   La \Fig{fig:map} précise la fonction $f$ considérée et 
85   la \Fig{fig:xplgraph:inter:mc} donne son graphe d'intéraction.
86   
87
88
89
90
91
92
93 On peut facilement vérifier que toutes les itérations parallèles 
94 synchrones initialisées 
95 avec $x^0 \neq 7$ soit $(111)$ 
96 convergent vers $2$ soit $(010)$; celles initialisées avec 
97 $x^0=7$ restent en 7.
98 Pour les  modes unaires ou généralisés  avec  une 
99 stratégie pseudo-périodique, on a des comportements qui dépendent 
100 de la configuration initiale:
101 \begin{itemize}
102 \item initialisées avec 7, les itérations restent en 7;
103 \item initialisées avec 0, 2, 4 ou 6 les itérations convergent vers 2;
104 \item initialisées avec 1, 3 ou 5, les itérations convergent vers un des 
105 deux points fixes 2 ou 7.
106 \end{itemize}   
107 \end{xpl}
108
109
110
111
112
113 \section{Rappels sur le langage PROMELA}
114 \label{sec:spin:promela}
115
116 Cette section  rappelle les éléments fondamentaux du langage PROMELA (Process Meta  Language).
117 On peut trouver davantage de détails dans~\cite{Hol03,Wei97}.
118
119
120
121
122 \begin{figure}[ht]
123 \begin{tiny}
124 \begin{lstlisting}
125 #define N 3
126 #define d_0 5
127
128 bool X [N]; bool Xp [N]; int mods [N];
129 typedef vals{bool v [N]};
130 vals Xd [N];  
131
132 typedef a_send{chan sent[N]=[d_0] of {bool}};
133 a_send channels [N];
134
135 chan unlock_elements_update=[1] of {bool};
136 chan sync_mutex=[1] of {bool};
137 \end{lstlisting}
138 \end{tiny}
139 \caption{Declaration des types de la traduction.}
140 \label{fig:arrayofchannels}
141 \end{figure}
142
143
144 % Les types primaires de PROMELA sont \texttt{bool}, \texttt{byte},
145 % \texttt{short} et  \texttt{int}.
146 Comme en C,
147 on peut déclarer des tableaux à une dimension 
148 ou des nouveaux types de données (introduites par le mot clef 
149 \verb+typedef+). % Ces derniers sont utilisés
150 % pour définir des tableaux à deux
151 % dimensions.
152
153 \begin{xpl}
154 Le programme donné à la {\sc Figure}~\ref{fig:arrayofchannels} correspond à des 
155 déclarations de variables qui servent dans l'exemple de ce chapitre. 
156 Il définit:
157 \begin{itemize}
158 \item les constantes \verb+N+ et \verb+d_0+ qui précisent respectivement le nombre
159  ${\mathsf{N}}$ d'éléments et le délai maximum $\delta_0$;
160 \item les deux tableaux  (\verb+X+ et \verb+Xp+) de \verb+N+ variables booléennes; 
161 les cellules \verb+X[i]+ et \verb+Xp[i]+ sont associées à la variables $x_{i+1}$
162 d'un système dynamique discret;
163 elles  mémorisent les  valeurs de $X_{i+1}$ respectivement avant et après sa mise à jour; 
164 il suffit ainsi de comparer  \verb+X+ et \verb+Xp+ pour constater si $x$ a changé ou pas;
165 \item le tableau \verb+mods+ contient les éléments qui doivent être modifiés lors de l'itération 
166 en cours; cela correspond naturellement à l'ensemble des éléments $s^t$;
167 \item le type de données structurées \verb+vals+ et le tableau de tableaux 
168  \verb+Xd[+$i$\verb+].v[+$j$\verb+]+ qui vise à mémoriser $x_{j+1}^{D^{t-1}_{i+1j+1}}$
169  pour l'itération au temps $t$. 
170 %(en d'autres termes, utile lors du calcul de $x^{t}$).
171 \end{itemize}
172
173
174 % Puisque le décalage d'un indices ne change pas fondamentalement 
175 % le comportement de la version PROMELA par rapport au modèle initial
176 % et pour des raisons de clarté, on utilisera par la suite la même 
177 % lettre d'indice entre les deux niveaux (pour le modèle: $x_i$ et pour  PROMELA: 
178 % \texttt{X[i]}). Cependant, ce décalage devra être conservé mémoire.
179
180 Déclarée avec le mot clef \verb+chan+, 
181 une donnée de type \texttt{channel} permet le 
182 transfert de messages entre processus dans un ordre FIFO.
183 % Elles serait  suivi par sa capacité 
184 % (qui est constante), son nom et le type des messages qui sont stockés dans ce canal.
185 Dans l'exemple précédent, on déclare successivement:
186 \begin{itemize}
187 \item un canal \verb+sent+ qui vise à mémoriser \verb+d_0+ messages de type
188  \verb+bool+; le tableau nommé \verb+channels+ de \verb+N+*\verb+N+
189  éléments de type \verb+a_send+ est utilisé pour mémoriser les valeurs intermédiaires $x_j$;
190  Il permet donc de temporiser leur emploi par d'autres éléments $i$.
191 \item les deux canaux  \verb+unlock_elements_update+ et  \verb+sync_mutex+ contenant 
192 chacun un message booléen et sont utilisés ensuite comme des sémaphores.
193 \end{itemize}
194 \end{xpl}
195
196 %\subsection{PROMELA Processes} 
197 Le langage PROMELA exploite la notion de \emph{process} pour modéliser la concurrence
198 au sein de systèmes. Un process est  instancié soit immédiatement
199 (lorsque sa déclaration est préfixée 
200  par le mot-clef  \verb+active+) ou bien au moment de l'exécution de l'instruction 
201 \texttt{run}.
202 Parmi tous les process,  \verb+init+ est le process  initial qui permet 
203 d'initialiser les variables, lancer d'autres process\ldots
204
205
206 Les instructions d'affectation sont interprétées usuellement.
207 Les canaux sont concernés par des instructions particulières d'envoi et de
208 réception de messages. Pour un canal  
209 \verb+ch+,  ces instructions sont respectivement notées
210 \verb+ch ! m+ et \verb+ch ? m+.
211 L'instruction de réception consomme la valeur en tête du canal \verb+ch+
212 et l'affecte à la variable \verb+m+ (pour peu que  \verb+ch+ soit initialisé et non vide).
213 De manière similaire, l'instruction d'envoi ajoute la valeur de \verb+m+ à la queue du canal
214 \verb+ch+ (pour peu que celui-ci soit initialisé et pas plein).
215 Dans les cas problématiques, canal non initialisé et vide pour une réception ou plein pour un envoi,
216 le processus est bloqué jusqu'à ce que les  conditions soient  remplies.
217
218 La structures de contrôle   \verb+if+   (resp.   \verb+do+)   définit un choix non déterministe 
219  (resp.  une boucle non déterministe). Que ce soit pour la conditionnelle ou la boucle, 
220 si plus d'une des conditions est établie, l'ensemble des instructions correspondantes 
221 sera choisi aléatoirement puis exécuté.
222
223 Dans le process \verb+init+ détaillé à la {\sc Figure}~\ref{fig:spin:init}, 
224 une boucle de taille ${\mathsf{N}}$ initialise aléatoirement la variable  globale de type tableau \verb+Xp+.
225 Ceci permet par la suite de vérifier si les itérations sont  convergentes pour n'importe  
226 quelle configuration initiale $x^{0}$.
227
228
229
230 Pour chaque  élément $i$, si les itérations sont asynchrones
231 \begin{itemize}
232 \item on stocke d'abord la valeur de \verb+Xp[i]+ dans chaque \verb+Xd[j].v[i]+ 
233 puisque la matrice $s^0$ est égale à $(0)$,
234 \item puis, la valeur  de $i$ (représentée par  \verb+Xp[i]+) devrait être transmise 
235   à $j$  s'il y a un arc de $i$ à   $j$ dans le graphe d'incidence. Dans ce cas,
236   c'est la fonction  \verb+hasnext+ (détaillée à la~\Fig{fig:spin:hasnext})  
237   qui   mémorise ce graphe
238   en fixant à  \texttt{true} la variable \verb+is_succ+, naturellement et à 
239   \texttt{false} dans le cas contraire. 
240   Cela permet d'envoyer la valeur de $i$ dans le canal au travers de \verb+channels[i].sent[j]+.
241 \end{itemize}
242
243 \begin{figure}[t]
244   \begin{minipage}[h]{.32\linewidth}
245 \begin{tiny}
246 \begin{lstlisting}
247 init{
248  int i=0; int j=0; bool is_succ=0;
249  do
250  ::i==N->break;
251  ::i< N->{
252    if
253    ::Xp[i]=0;
254    ::Xp[i]=1;
255    fi;
256    j=0;
257    do
258    ::j==N -> break;
259    ::j< N -> Xd[j].v[i]=Xp[i]; j++;
260    od;
261    j=0;
262    do
263    ::j==N -> break;
264    ::j< N -> {
265      hasnext(i,j);
266      if
267      ::(i!=j && is_succ==1) -> 
268      channels[i].sent[j] ! Xp[i];
269      ::(i==j || is_succ==0) -> skip; 
270      fi;  
271      j++;}
272    od;
273    i++;}
274  od;
275  sync_mutex ! 1;
276 }
277 \end{lstlisting}
278 \end{tiny}
279 \caption{Process init.}\label{fig:spin:init} 
280 \end{minipage}\hfill
281  \begin{minipage}[h]{.32\linewidth}
282 \begin{tiny}
283 \begin{lstlisting}
284 active proctype scheduler(){ 
285  do
286  ::sync_mutex ? 1 -> {
287    int i=0; int j=0;
288    do
289    :: i==N -> break;
290    :: i< N -> {
291      if
292      ::skip;
293      ::mods[j]=i; j++;
294      fi;
295      i++;}
296    od;
297    ar_len=i; 
298    unlock_elements_update ! 1;
299    }
300  od
301 }
302 \end{lstlisting}
303 \end{tiny}
304 \caption{Process scheduler pour la stratégie pseudo-périodique.
305  \label{fig:scheduler}}
306 \end{minipage}
307 \begin{minipage}[h]{.30\linewidth}
308 \begin{tiny}
309 \begin{lstlisting}
310 inline hasnext(i,j){
311   if
312     :: i==0 && j ==0 -> is_succ = 1
313     :: i==0 && j ==1 -> is_succ = 1
314     :: i==0 && j ==2 -> is_succ = 0
315     :: i==1 && j ==0 -> is_succ = 1
316     :: i==1 && j ==1 -> is_succ = 0
317     :: i==1 && j ==2 -> is_succ = 1
318     :: i==2 && j ==0 -> is_succ = 1     
319     :: i==2 && j ==1 -> is_succ = 1
320     :: i==2 && j ==2 -> is_succ = 1
321   fi
322 }
323 \end{lstlisting}
324 \end{tiny}
325 \caption{Codage du graphe d'intéraction de $f$.
326  \label{fig:spin:hasnext}}
327 \end{minipage}
328
329 \end{figure}
330
331
332
333 \section{Du système booléen au modèle PROMELA}
334 \label{sec:spin:translation}
335 Les éléments principaux des itérations asynchrones rappelées à l'équation 
336 (\ref{eq:async}) sont  la stratégie, la  fonctions et la gestion des délais.
337 Dans cette section, nous présentons successivement comment chacune de 
338 ces notions est traduite vers un modèle PROMELA.
339
340
341 \subsection{La stratégie}\label{sub:spin:strat}
342 Regardons comment une stratégie pseudo-périodique peut être représentée en PROMELA.
343 Intuitivement, un process \verb+scheduler+ (comme représenté à la {\sc Figure}~\ref{fig:scheduler}) 
344 est itérativement appelé pour construire chaque $s^t$ représentant 
345 les éléments possiblement mis à jour à l'itération $t$.
346
347 Basiquement, le process est une boucle qui est débloquée lorsque la valeur du sémaphore
348 \verb+sync_mutex+ est 1. Dans ce cas, les éléments à modifier sont choisis
349 aléatoirement  (grâce à  ${\mathsf{N}}$ choix successifs) et sont mémorisés dans le tableau
350 \verb+mods+,  dont la taille est  \verb+ar_len+.   
351 Dans la séquence d'exécution, le choix d'un élément mis à jour est directement
352 suivi par des mises à jour: ceci est réalisé grâce à la modification de la valeur du sémaphore
353  \verb+unlock_elements_updates+.
354
355 \subsection{Itérer la fonction $f$}\label{sub:spin:update}
356 La mise à jour de l'ensemble  $s^t=\{s_1,\ldots, s_m\}$  des éléments qui constituent la stratégie
357 $(s^t)^{t \in \Nats}$ est implantée à l'aide du process  \verb+update_elems+ fourni à la 
358 {\sc Figure}~\ref{fig:proc}.  
359 Ce processus actif attend jusqu'à ce qu'il soit débloqué par le process
360 \verb+scheduler+  à l'aide du sémaphore \verb+unlock_elements_update+.
361 L'implantation se déroule en cinq étapes:
362
363 \begin{figure}[t]
364 \begin{minipage}[b]{.32\linewidth}
365 \begin{tiny}
366 \begin{lstlisting}
367 inline update_X(){      
368   int countu;
369   countu = 0;
370   do
371     :: countu == N -> break ;
372     :: countu != N ->
373        X[countu] = Xp[countu];
374        countu ++ ;
375   od
376 }
377 \end{lstlisting}
378 \end{tiny}
379 \caption{Sauvegarde de l'état courant}\label{fig:spin:sauve}
380 \end{minipage}\hfill%
381 \begin{minipage}[b]{.32\linewidth}
382 \begin{tiny}
383 \begin{lstlisting}
384 active proctype update_elems(){
385  do
386  ::unlock_elements_update ? 1 ->
387    {
388     atomic{
389      bool is_succ=0;
390      update_X();
391      fetch_values();
392      int count = 0;
393      int j = 0;
394      do
395      ::count == ar_len -> break;
396      ::count < ar_len ->
397        j = mods[count];     
398        F(j);
399        count++;
400      od;
401      diffuse_values(Xp);
402      sync_mutex ! 1
403     }
404    }
405  od
406 }
407 \end{lstlisting}
408 \end{tiny}
409 \caption{Mise à jour des éléments}\label{fig:proc}
410   \end{minipage}\hfill%
411 %\end{figure}
412 %\begin{figure}
413   \begin{minipage}[b]{.33\linewidth}
414 \begin{tiny}
415 \begin{lstlisting}
416 inline F(){
417  if
418  ::j==0 -> Xp[0] = 
419       (Xs[j].v[0] & !Xs[j].v[1]) 
420      |(Xs[j].v[2])
421  ::j==1 -> Xp[1] =  Xs[j].v[0] 
422                  | !Xs[j].v[2]
423  ::j==2 -> Xp[2] =  Xs[j].v[1] 
424                  &  Xs[j].v[2]
425  fi
426 }
427 \end{lstlisting}
428 \end{tiny}
429 \caption{Application de la fonction $f$}\label{fig:p}
430   \end{minipage}
431 \end{figure}
432
433
434 \begin{enumerate}
435 \item elle commence en mettant à jour la variable \texttt{X} avec les valeurs de \texttt{Xp} dans la fonction \texttt{update\_X},~\Fig{fig:spin:sauve}
436 \item elle mémorise dans  \texttt{Xd} la valeur disponible pour chaque élément  grâce à  la fonction \texttt{fetch\_values}; cette fonction est détaillée 
437 dans la section suivante;
438 \item  une boucle %sur les  \texttt{ar\_len} éléments qui peuvent être modifiés
439   met à jour itérativement la valeur de $j$ (grâce à l'appel de fonction \texttt{f(j)})
440   pour peu que celui-ci doive être modifié,  \textit{i.e.},   pour peu qu'il soit renseigné dans
441   \texttt{mods[count]}; le code source de \texttt{F} est donné en {\sc Figure}~\ref{fig:p} et est une 
442   traduction directe de l'application $f$;
443 \item les nouvelles valeurs des éléments \texttt{Xp} sont symboliquement
444   envoyés aux autres éléments qui en dépendent grâce à la fonction 
445   \texttt{diffuse\_values(Xp)}; cette dernière fonction est aussi détaillée 
446   dans la section suivante; 
447 \item finalement, le process informe le scheduler de la fin de la tâche 
448   (au travers  du sémaphore \texttt{sync\_mutex}).
449 \end{enumerate}
450
451
452
453
454
455
456
457
458 \subsection{Gestion des délais}\label{sub:spin:vt}
459 Cette  section montre comment les délais inhérents au mode asynchrone sont 
460 traduits dans le modèle  PROMELA  grâce à deux 
461 fonctions \verb+fetch_values+  et   \verb+diffuse_values+.   
462 Celles-ci sont données en {\sc Figure}~\ref{fig:val} et~\ref{fig:broadcast}. 
463 Elles récupèrent et diffusent respectivement les valeurs des éléments.
464
465 \begin{figure}[t]
466   \begin{minipage}[h]{.475\linewidth}
467 \begin{tiny}
468 \begin{lstlisting}
469 inline fetch_values(){
470  int countv = 0;
471  do
472  :: countv == ar_len -> break ;
473  :: countv < ar_len ->
474     j = mods[countv];
475     i = 0;       
476     do
477     :: (i == N) -> break;
478     :: (i < N && i == j) -> {
479         Xd[j].v[i] = Xp[i] ;
480         i++ }   
481     :: (i < N && i != j) -> {
482         hasnext(i,j);
483         if
484         :: skip
485         :: is_succ==1 &&
486     nempty(channels[i].sent[j]) ->
487             channels[i].sent[j] ?
488                         Xd[j].v[i];
489         fi; 
490         i++ }
491     od;
492     countv++
493  od
494 }
495 \end{lstlisting}
496 \end{tiny}
497 \caption{Récupérer les valeurs des elements\label{fig:val}}
498   \end{minipage}\hfill%
499   \begin{minipage}[h]{.475\linewidth}
500 \begin{tiny}
501 \begin{lstlisting}
502 inline diffuse_values(values){   
503  int countb=0;
504  do
505  :: countb == ar_len -> break ;
506  :: countb < ar_len ->
507     j = mods[countb];
508     i = 0 ;
509     do
510     :: (i == N) -> break;
511     :: (i < N && i == j) -> i++;   
512     :: (i < N && i != j) -> {
513         hasnext(j,i);
514         if
515         :: skip
516         :: is_succ==1 && 
517      nfull(channels[j].sent[i]) ->
518             channels[j].sent[i] ! 
519                          values[j];
520         fi;
521         i++ }
522     od;
523     countb++
524  od
525 }       
526 \end{lstlisting}
527 \end{tiny}
528 \caption{Diffuser les valeurs des elements}\label{fig:broadcast}
529   \end{minipage}
530 \end{figure}
531
532 La première fonction met à jour le tableau   \verb+Xd+ requis pour les éléments
533 qui doivent être modifiés.
534 Pour chaque élément dans  \verb+mods+, identifié par la variable 
535 $j$, la fonction récupère les valeurs  des autres éléments  (dont le libellé est $i$)
536 dont $j$ dépend. 
537 Il y a deux cas.
538 \begin{itemize}
539 \item puisque $i$ connaît sa dernière valeur (\textit{i.e.},  $D^t_{ii}$ est toujours $t$)
540   \verb+Xd[i].v[i]+ est donc  \verb+Xp[i]+;
541 \item sinon, il y a deux sous-cas qui peuvent peuvent potentiellement modifier la valeur 
542   que $j$ a de $i$ (et qui peuvent être choisies de manière aléatoire):
543   \begin{itemize}
544   \item  depuis la perspective de $j$ la valeur de  $i$ peut ne pas avoir changé  (c'est l'instruction \verb+skip+) ou n'est pas utile; ce dernier cas apparaît 
545     lorsqu'il n'y a pas d'arc de  $i$ à $j$ dans le graphe d'incidence, \textit{i.e.}, lorsque
546     la valeur de \verb+is_succ+ qui est calculée par  \verb+hasnext(i,j)+ est 0;
547     dans ce cas, la valeur de \verb+Xd[j].v[i]+ n'est pas modifiée;
548   \item sinon,  on affecte à \verb+Xd[j].v[i]+ la valeur mémorisée
549     dans le canal \verb+channels[i].sent[j]+  (pour peu que celui-ci ne soit pas vide).
550   \end{itemize}
551 \end{itemize}
552
553 Les valeurs des éléments sont ajoutées dans ce canal au travers de la fonction  \verb+diffuse_values+. L'objectif de cette fonction 
554 est de stocker les valeurs de $x$  (représenté
555 dans le modèle par \verb+Xp+) dans le canal  \verb+channels+.
556 Il permet au model-checker SPIN  d'exécuter 
557 le modèle PROMELA   comme s'il pouvait y avoir des délais entre processus.
558 Il y a deux cas différents pour la valeur de $X_{j}$:
559 \begin{itemize}
560 \item soit elle est \og perdue\fg{}, \og oubliée\fg{} pour permettre à $i$ de ne pas tenir compte d'une 
561 des valeurs de  $j$; ce cas a lieu soit lors de l'instruction  \verb+skip+ ou lorsqu'il 
562 n'y a pas d'arc de $j$ à $i$ dans le graphe d'incidence;
563 \item soit elle est mémorisée dans le canal \verb+channels[j].sent[i]+ (pour peu que celui-ci ne soit pas plein).
564 \end{itemize}
565
566 L'introduction de l'indéterminisme  à la fois dans les fonctions \verb+fetch_values+ 
567 et \verb+diffuse_values+ est nécessaire dans notre contexte. Si celui-ci n'était 
568 présent que dans la fonction \verb+fetch_values+, nous ne pourrions pas par exemple récupérer 
569 la valeur $x_i^{(t)}$ sans considérer la valeur $x_i^{(t-1)}$.  
570 De manière duale, si le  non déterminisme  était uniquement
571 utilisé dans la fonction \verb+diffuse_values+, alors chaque fois qu'une valeur serait 
572 mise dans le canal, elle serait immédiatement consommée, ce qui est contradictoire avec la notion de 
573 délai.
574
575 % \subsection{Discussion}
576 % A  coarse approach  could consist  in providing  one process  for  each element.
577 % However, the  distance with  the mathematical model  given in  \Equ{eq:async} of
578 % such a translation would be larger  than the method presented along these lines.
579 % It induces  that it would be harder  to prove the soundness  and completeness of
580 % such a translation.   For that reason we have developed a  PROMELA model that is
581 % as close as possible to the mathematical one.
582
583 % Notice furthermore that PROMELA is an  imperative language which
584 % often results in generating  intermediate  states 
585 % (to  execute  a matrix assignment  for
586 % instance). 
587 % The  use  of  the  \verb+atomic+  keyword  allows  the  grouping  of
588 % instructions, making the PROMELA code and the DDN as closed as possible.
589
590 \subsection{Propriété de convergence universelle}
591 Il reste à formaliser dans le model checker SPIN le fait que les 
592 itérations d'un système 
593 dynamique à ${\mathsf{N}}$ éléments est universellement convergent.
594
595 Rappelons tout d'abord que les variables \verb+X+  et \verb+Xp+ 
596 contiennent respectivement la valeur de $x$ avant et après la mise à jour. 
597 Ainsi, si l'on effectue une initialisation  non déterministe de 
598 \verb+Xp+  et si l'on applique une stratégie pseudo-périodique,  
599 il est nécessaire et suffisant
600 de prouver la formule temporelle linéaire (LTL) suivante:
601 \begin{equation}
602 \diamond  (\Box  \verb+Xp+ = \verb+X+)
603 \label{eq:ltl:conv}
604 \end{equation}
605 où les opérateurs  $\diamond$ et  $\Box$ ont
606 la sémantique usuelle, à savoir
607 respectivement {\em éventuellement} et {\em toujours} dans les chemins suivants.
608 On note que cette propriété, si elle est établie, garantit
609 la stabilisation du système.
610 Cependant elle ne donne aucune métrique quant à
611 la manière dont celle-ci est obtenue.
612 En particulier, on peut converger très lentement ou le système peut même 
613 disposer de plusieurs points fixes.
614
615
616
617 \section{Correction et complétude de la démarche}\label{sec:spin:proof}
618
619 Cette section présente les théorèmes
620 de correction et de  complétude de l'approche
621 (Théorèmes~\ref{Theo:sound} et~\ref{Theo:completeness}). 
622 Toutes les preuves sont déplacées en 
623 annexe~\ref{anx:promela}.
624
625
626 \begin{restatable}[Correction de la traduction vers Promela]{theorem}{promelasound}
627 \label{Theo:sound}
628 %
629   Soit $\phi$ un modèle de système dynamique discret et $\psi$ sa traduction PROMELA.  
630   Si $\psi$ vérifie
631   la propriété  LTL  (\ref{eq:ltl:conv})  sous hypothèse d'équité faible,  alors
632   les itérations de $\phi$ sont universellement convergentes.
633 \end{restatable}
634
635
636 \begin{restatable}[Complétude de la traduction vers Promela]{theorem}{promelacomplete}
637 \label{Theo:completeness}
638 %
639   Soit $\phi$ un modèle de système dynamique discret et $\psi$ sa traduction.  Si $\psi$ ne vérifie pas 
640   la propriété LTL (\ref{eq:ltl:conv}) sous hypothèse d'équité faible,
641   alors les itérations de  $\phi$ ne sont pas universellement convergentes.
642 \end{restatable}
643
644
645
646
647
648
649 \section{Données pratiques}
650 \label{sec:spin:practical}
651 Cette section donne tout d'abord quelques mesures de complexité de l'approche 
652 puis présente ensuite les expérimentations issues de ce travail.
653
654 \begin{theorem}[Nombre d'états]
655   Soit  $\phi$  un modèle de système dynamique discret à  ${\mathsf{N}}$ éléments, $m$ 
656   arcs dans le graphe d'incidence
657   et $\psi$ sa traduction en PROMELA.  Le nombre de configurations 
658   de l'exécution en SPIN de $\psi$ est borné par $2^{m(\delta_0+1)+n(n+2)}$.
659 \end{theorem}
660 \begin{proof}
661   Une configuration est une évaluation des variables globales.
662   Leur nombre ne dépend que de celles qui ne sont pas constantes.
663
664   Les  variables  \verb+Xp+ et \verb+X+ engendrent  $2^{2n}$ états.
665   La variable
666   \verb+Xs+ génère $2^{n^2}$ états.  
667   Chaque canal de \verb+array_of_channels+
668   peut engendrer $1+2^1+\ldots+2^{\delta_0}=  2^{\delta_0+1}-1$  états. 
669   Puisque le nombre d'arêtes du graphe d'incidence  est $m$,  
670   il y a  $m$ canaux non constants,  ce qui génère approximativement $2^{m(\delta_0+1)}$ états. 
671   Le nombre de configurations est donc borné par $2^{m(\delta_0+1)+n(n+2)}$.
672   On remarque que cette borne est traitable par SPIN pour des valeurs raisonnables de  ${\mathsf{N}}$, 
673   $m$ et $\delta_0$.
674   %\JFC{Donner un ordre de grandeur de cet ordre de grandeur}
675   
676 \end{proof}
677
678 La méthode détaillée ici a pu être appliquée sur l'exemple
679 pour prouver formellement sa convergence universelle.
680
681 On peut remarquer que SPIN n'impose l'équité faible qu'entre les process
682 alors que les preuves des deux théorèmes précédents reposent sur le fait que 
683 cette équité est établie dès qu'un choix indéterministe est effectué.
684 Naïvement, on pourrait considérer comme hypothèse la formule suivante 
685 chaque fois qu'un choix indéterministe se produit entre $k$ événements
686 respectivement notés $l_1$, \ldots $l_k$:  
687 $$
688 \Box \diamond (l == l_0) \Rightarrow 
689 ((\Box \diamond (l== l_1)) \land  \ldots \land (\Box \diamond (l == l_k)))
690 $$
691
692 où le libellé $l_0$ dénote le libellé de la ligne précédent 
693 le choix indéterministe.
694 Cette formule traduit exactement l'équité faible.
695 Cependant en raison de l'explosion de la taille du produit entre 
696 l'automate de Büchi issu de cette formule et celui issu du programme  PROMELA,
697 SPIN n'arrive pas à vérifier si la convergence universelle est établie 
698 ou non sur des exemples 
699 simples.%\JFC{faire référence à un tel exemple}. 
700
701 Ce problème a été pratiquement résolu en laissant SPIN 
702 générer toutes les traces d'exécution,
703 même celles qui ne sont pas équitables, 
704 puis ensuite vérifier la propriété de convergence sur toutes celles-ci. 
705 Il reste alors à interpréter les résultats qui peuvent être de deux types. Si la convergence est 
706 établie pour toutes les traces, elle le reste en particulier pour les traces équitables.
707 Dans le cas contraire on doit analyser le contre exemple produit par SPIN.
708
709 % \begin{xpl}
710 % \JFC{Reprendre ce qui suit}
711 % Experiments have shown that all the iterations of the running example are 
712 % convergent for a delay equal to 1 in less than 10 min.
713 % The example presented in~\cite{abcvs05} with five elements taking boolean 
714 % values has been verified with method presented in this article.   
715 % Immediately, SPIN computes a counter example, that unfortunately does not
716 % fulfill fairness properties. Fair counter example is obtained
717 % after few minutes.
718 % All the experimentation have been realized in a classic desktop computer.
719 % \end{xpl}
720
721
722 La méthode détaillée ici a été appliquée sur des exemples pour prouver formellement 
723 leur convergence ou leur divergence (\Fig{fig:exp:promela}) 
724 avec ou sans délais.
725 Dans ces expériences, les délais ont été bornés par $\delta_0=10$.
726 Dans ce tableau,  $P$ est vrai ($\top$) si et seulement si la convergence 
727 universelle 
728 est établie et faux ($\bot$) sinon. Le nombre $M$ est 
729 la taille de la  mémoire consommée (en MB) et 
730 $T$ est le temps d'exécution sur un  Intel Centrino Dual Core 2 Duo @1.8GHz avec 2GB de mémoire vive
731 pour établir un verdict.
732
733
734 \begin{figure}[ht]
735   \begin{center}
736     \begin{tiny}
737       \subfigure[Sans délais]{
738         \begin{tabular}{|*{7}{c|}}
739           \cline{2-7}
740           \multicolumn{1}{c|}{ }
741           &\multicolumn{3}{|c|}{Synchrones} & \multicolumn{3}{|c|}{Généralisées} \\
742           \cline{2-7}
743           \multicolumn{1}{c|}{ }& 
744           P & M & T&
745           P & M & T \\
746           \hline %\cline{2-7}
747           \textit{RE}  &
748           $\top$ & 2.7 & 0.01s & 
749           $\bot$ & 369.371 & 0.509s \\ 
750           \hline %\cline{2-7}
751           \cite{RC07} &
752           $\bot$ & 2.5 & 0.001s & % RC07_sync.spin
753           $\bot$ & 2.5 & 0.01s \\ % RC07_sync_chao_all.spin
754           \hline
755           \cite{BM99} &
756           $\top$ & 36.7 & 12s & % BM99_sync_para.spin
757           $\top$ &  &  \\ % BM99_sync_chao.spin
758           \hline
759         \end{tabular}
760         \label{fig:sync:exp}  
761       }
762     
763       \subfigure[Avec délais]{
764         \begin{tabular}{|*{13}{c|}}
765           \cline{2-13}
766           \multicolumn{1}{c|}{ }
767           &\multicolumn{6}{|c|}{Mode Mixte} & \multicolumn{6}{|c|}{Seulement borné} \\
768           \cline{2-13}
769           \multicolumn{1}{c|}{ }
770           &\multicolumn{3}{|c|}{Synchrones} & \multicolumn{3}{|c|}{Pseudo-Périodique} &
771           \multicolumn{3}{|c|} {Synchrones} & \multicolumn{3}{|c|}{Pseudo-Périodique} \\
772           \cline{2-13}
773           \multicolumn{1}{c|}{ }
774           &P & M & T &
775           P & M & T &
776           P & M & T&
777           P & M & T \\
778           \hline %cline{2-13}
779           \textit{RE} & 
780           $\top$ & 409 & 1m11s&
781           $\bot$ & 370 & 0.54 &
782           $\bot$ & 374 & 7.7s&
783           $\bot$ & 370 & 0.51s \\
784           \hline %\cline{2-13}
785           \cite{RC07}
786           &$\bot$ & 2.5 & 0.001s  % RC07_async_mixed.spin
787           &$\bot$ & 2.5 & 0.01s   % RC07_async_mixed_all.spin
788           &$\bot$ & 2.5 & 0.01s   % RC07_async.spin
789           &$\bot$ & 2.5 & 0.01s  \\ % RC07_async_all.spin 
790           \hline %\cline{2-13}
791           \cite{BM99}
792           &$\top$ &  &   %BM99_mixed_para.spin 
793           &$\top$ &  &    % RC07_async_mixed_all.spin
794           &$\bot$ &  &    % RC07_async.spin
795           &$\bot$ &  &   \\ % RC07_async_all.spin 
796           \hline %\cline{2-13}
797         \end{tabular}
798         \label{fig:async:exp}
799       }
800     \end{tiny}
801   \end{center}
802   \caption{Résultats des simulations Promela des SDDs}\label{fig:exp:promela}
803 \end{figure} 
804
805
806
807 L'exemple \textit{RE} est l'exemple de ce chapitre,
808 \cite{RC07} concerne un réseau composé de deux gènes
809 à valeur dans $\{0,1,2\}$ et
810 \cite{BM99} consiste en  10 process
811 qui modifient leurs valeurs booléennes dans un graphe d'adjacence proche 
812 du graphe complet.
813
814
815 L'exemple  \textit{RE} a été prouvé comme universellement convergent.
816 %\JFC{statuer sur AC2D}
817 Comme la convergence n'est déjà pas établie pour les itérations synchrones
818 de~\cite{RC07}, il en est donc 
819 de même pour les itérations asynchrones.
820 La {\sc Figure}~\ref{fig:RC07CE} donne une trace de la sortie de SPIN  menant à la violation 
821 de la convergence. Celle-ci correspond à une stratégie périodique qui répète
822 $\{1,2\};\{1,2\};\{1\};\{1,2\};\{1,2\}$ et débute avec $x=(0,0)$.
823 En raison de la dépendance forte entre les éléments
824 de~\cite{BM99}, 
825 $\delta_0$ est réduit à 1. Cela aboutit cependant à $2^{100}$ 
826 configurations dans le mode des itérations asynchrones, montrant les limites de
827 l'approche.
828
829 \begin{figure}
830 \centering
831 \includegraphics[scale=0.6]{images/RC07ce.eps}   
832 \caption{Contre exemple de convergence pour~~\cite{RC07}} \label{fig:RC07CE}
833 \end{figure}
834
835
836
837
838
839
840
841 % \begin{tabular}{|*{19}{c|}}
842 % % \hline 
843 % % e \\
844 % % 
845 % \hline
846 % & \multicolumn{6}{|c|}{Synchronous} & \multicolumn{12}{|c|}{Asynchronous}\\
847 % \cline{8-19}
848 % Delay &  \multicolumn{6}{|c|}{ }
849 % & \multicolumn{6}{|c|}
850 % {Only Bounded}
851 % & \multicolumn{6}{|c|}
852 % {Bounded+Mixed Mode}\\
853 % Strategy&
854 % \multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Chaotic} &
855 % \multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Chaotic} &
856 % \multicolumn{3}{|c|}{Parallel} & \multicolumn{3}{|c|}{Chaotic} \\
857
858
859 %  \end{tabular}
860
861  
862 \section{Conclusion}
863 \label{sec:spin:concl}
864
865 L'idée principale de ce chapitre est que l'on peut, 
866 pour des réseaux booléens à délais bornés de  petite taille, obtenir 
867 une preuve de la convergence ou de sa divergence et ce
868 de manière automatique.  
869 L'idée principale est de traduire le réseau en PROMELA et de laisser 
870 le model checker établir la preuve.
871 Toute l'approche a été prouvée: le verdict rendu par l'approche 
872 a donc valeur de vérité.
873 L'approche a cependant ses limites et ne peut donc pas être 
874 apliquée qu'à des modèles simplifiés de programmes.
875 La suite de ce travail consiste à se focaliser sur les systèmes qui ne 
876 convergent pas.
877
878
879
880
881