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

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