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

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