chap2.tex
10.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
\documentclass[multi={tikzpicture},crop=true,border=5pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{multirow}
\usepackage{verbatim}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,arrows.meta,petri}
\tikzset{
>=latex,
every place/.style={minimum size=6mm},
every transition/.style={minimum size=6mm},
token distance=6pt,
}
\tikzstyle{trans}=[transition]
\tikzstyle{arc}=[->,rounded corners]
\tikzstyle{state}=[draw=blue!50!gray!50!white,
fill=blue!70!gray!10!white,
line width=2pt,
cloud,cloud puffs=8,
inner sep=-3pt]
\tikzstyle{fire}=[arrows={-Straight Barb[scale=.6]},
shorten >=-2pt, shorten <=-1pt,
draw=blue!50!gray!50!white,
fill opacity=0,text opacity=1,
line width=2pt,
line cap=round,
rounded corners]
\tikzstyle{active}=[draw=green!50!gray!50!white,
fill=green!70!gray!10!white]
\tikzstyle{failure}=[draw=red!50!gray!50!white,
fill=red!70!gray!10!white]
\def\matrix #1#2#3#4#5#6#7{%
{\small$\begin{array}{c@{\hspace{12pt}}c}
\multicolumn{2}{c}{#1} \\[-6pt]
#2 & #3 \\[-6pt]
\multicolumn{2}{c}{\color{red}#4} \\[-6pt]
#5 & \color{red}#6 \\[-6pt]
\multicolumn{2}{c}{#7}
\end{array}$}}
\begin{document}
%%
%%
\begin{comment}
Les réseaux de Petri
Chapitre 2. Pourquoi ?
Où l'on apprend à quoi servent les réseaux de Petri.
\end{comment}
\begin{comment}
On utilise généralement les réseaux de Petri pour faire des modèles.
Non, pas vous monsieur, laissez-nous travailler, merci.
\end{comment}
% model.gif
\begin{comment}
Un modèle est une simplification d'un système dont l'étude n'est pas aisée.
Le modèle étant plus simple, on peut l'analyser plus facilement.
Les conclusions de l'analyse sur le modèle pourront être reportées sur le système.
\end{comment}
\begin{comment}
Par exemple, en biologie, la souris est un modèle de l'humain.
\end{comment}
% mouse.gif
\begin{comment}
On ne peut pas facilement tester de nouveaux traitements sur des humains, mais on peut plus facilement le faire sur des souris, et en tirer des conclusions quant à l'effet du traitement sur les humains.
\end{comment}
\begin{comment}
Avec des réseaux de Petri, on peut construire des modèles de systèmes très variés : systèmes critiques, protocoles de sécurité, systèmes biologiques, écosystèmes, etc.
\end{comment}
\begin{comment}
Trêve de bavardages, voici donc un système à étudier. C'est un système critique : son fonctionnement met en jeu des vies humaines.
\end{comment}
% train complet
\begin{comment}
C'est un système jouet (ah ah) très classique car il est assez simple.
Des trains circulent sur un voie qui croise une route.
Des barrières doivent se baisser au passage du train pour éviter une collision avec une voiture.
\end{comment}
\begin{comment}
Une solution facile est de toujours laisser les barrières fermées.
Mais ne cédons pas à la facilité.
\end{comment}
\begin{comment}
Voici donc un modèle des barrières.
Elles peuvent être en haut ou en bas, deux transitions se chargent de les baisser ou les lever.
C'est un modèle, on simplifie en faisant abstraction du mouvement.
\end{comment}
% gates.gif
\begin{comment}
Et voici un modèle de la voie et du train. On représente trois positions cruciales en faisant abstraction des autres.
\end{comment}
% track.gif
\begin{comment}
Dans le modèle complet, on retrouve ces deux morceaux qui communiquent via des places permettant à la voie de demander à la barrière de se lever ou de se baisser.
Regardons le fonctionner.
\end{comment}
% draft.gif
\begin{comment}
On a gagné !
On dépose un brevet et on vend notre conception à la SNCF.
On va être millionnaires.
... Vraiment ?
\end{comment}
\begin{comment}
On n'a rien oublié ?
\end{comment}
\begin{comment}
Reprenons.
Un modèle simplifie la réalité. Ça c'est fait.
Il peut être analysé. C'est fait ou pas ?
\end{comment}
\begin{comment}
Non bien sûr !
Ce qu'on a fait c'est exécuter sur le modèle une séquence d'actions correcte. On a donc juste prouvé que le modèle est capable d'avoir le comportement attendu. Pas qu'il n'a pas de mauvais comportements.
\end{comment}
\begin{comment}
Pour prouver qu'il n'existe aucun comportement fautif, on va calculer le graphe de marquages en vérifiant qu'aucun marquage découvert n'a de jeton dans la place 'dedans' sans jeton dans la place 'bas'.
\end{comment}
\begin{comment}
En effet, s'il la place 'dedans' est marquée, c'est que le train se trouve entre les barrières. Il faut alors absolument qu'elles soient fermées.
\end{comment}
\begin{comment}
Allons-y. L'état initial peut se représenter par le nombre de jeton dans chaque place comme on l'a fait dans le chapitre 1. Et en rouge, on a les deux places à surveiller ('bas' et en haut et 'dedans' est le plus extérieur... hum...).
\end{comment}
\begin{tikzpicture}
\node[state] {\matrix 1000001};
\end{tikzpicture}
\begin{comment}
Notre scénario correct donne un graphe simple:
\end{comment}
% test.gif
\begin{comment}
Mais lieu de tirer les transitions qui nous arrangent, essayons les toutes. On observe qu'au début, on peut juste tirer 'approche'. Et ensuite, on peut bien sûr tirer 'baisse' mais aussi 'entre'.
Catastrophe !
\end{comment}
\begin{tikzpicture}[scale=1.2]
\node[trans] (approach) at (0,0) {};
\node[rotate=45] at (approach) {\tiny\textsf{approche}};
\node[place] (before) at (1,0) {};
\node[below] at (before.south) {\tiny\textsf{avant}};
\node[trans] (enter) at (2,0) {};
\node[rotate=45] at (enter) {\tiny\textsf{entre}};
\node[place,tokens=1] (inside) at (3,0) {};
\node[below] at (inside.south) {\tiny\textsf{dedans}};
\node[trans] (exit) at (4,0) {};
\node[rotate=45] at (exit) {\tiny\textsf{sort}};
\node[place] (far) at (2,-1) {};
\node[below] at (far.south) {\tiny\textsf{loin}};
\draw[arc] (before) -- (enter);
\draw[arc] (enter) -- (inside);
\draw[arc] (inside) -- (exit);
\draw[arc] (exit) |- (far);
\draw[arc] (far) -| (approach);
\draw[arc] (approach) -- (before);
%
\node[place] (low) at (2,1) {};
\node[below] at (low.south) {\tiny\textsf{bas}};
\node[place,tokens=1] (high) at (2,3) {};
\node[above] at (high.north) {\tiny\textsf{haut}};
\node[trans] (down) at (1,2) {};
\node[rotate=45] at (down) {\tiny\textsf{baisse}};
\node[trans] (up) at (3,2) {};
\node[rotate=45] at (up) {\tiny\textsf{lève}};
\draw[arc] (high) -| (down);
\draw[arc] (down) |- (low);
\draw[arc] (low) -| (up);
\draw[arc] (up) |- (high);
%
\node[place,tokens=1] (godown) at (0,2) {};
\node[above] at (godown.north) {\tiny\textsf{descendre}};
\draw[arc] (approach) -- (godown);
\draw[arc] (godown) -- (down);
\node[place] (goup) at (4,2) {};
\node[above] at (goup.north) {\tiny\textsf{relever}};
\draw[arc] (exit) -- (goup);
\draw[arc] (goup) -- (up);
%
\begin{scope}[scale=2,yshift=-12mm]
\node[state] (0) at (0,0) {\matrix 1000001};
\node[state] (1) at (1,0) {\matrix 1100100};
\node[state] (2) at (2,0) {\matrix 0001100};
\node[state,failure] (5) at (1,-1) {\matrix 1100010};
\draw[fire] (0) -- node[above]{\tiny\textsf{approche}} (1);
\draw[fire] (1) -- node[above]{\tiny\textsf{baisse}} (2);
\draw[fire,failure] (1) -- node[left]{\tiny\textsf{entre}} (5);
\end{scope}
\end{tikzpicture}
\begin{comment}
Mais que s'est-il passé ?
Comment cela est-il possible ?
\end{comment}
\begin{comment}
Pour répondre, il suffit de regarder la séquence d'actions jusqu'au marquage fautif.
Le train s'est approché, a envoyé le signal de descente à la barrière, mais celle-ci n'a pas bougé avant que le train n'arrive à son niveau.
\end{comment}
\begin{comment}
Nos barrières sont-elles trop lentes ? Faut-il les forcer à descendre tout de suite ?
Non. Ce scénario peut aussi correspondre à des barrières cassées.
\end{comment}
\begin{comment}
Donc, si on ne peut pas forcer les barrières à descendre, il faut empêcher le train d'avancer tant que les barrières ne sont pas fermées.
Mais comment ? (Suspense...)
\end{comment}
\begin{comment}
Mesdames, messieurs, je vous présente : le feu rouge ! Sous vos applaudissements.
\end{comment}
% feu-rouge.jpg
\begin{comment}
On va donc ajouter un feu à notre modèle : une place 'feu' telle qu'un jeton dedans représente le feu vert, et pas de jeton le feu rouge.
\end{comment}
\begin{comment}
Quand le train approche, il met le feu au rouge.
Il ne peut entrer entre les barrières que si le feu est vert.
C'est l'arrivée des barrières en bas qui met le feu au vert.
Voilà.
\end{comment}
\begin{tikzpicture}[scale=1.2]
\node[trans] (approach) at (0,0) {};
\node[rotate=45] at (approach) {\tiny\textsf{approche}};
\node[place] (before) at (1,0) {};
\node[below] at (before.south) {\tiny\textsf{avant}};
\node[trans] (enter) at (2,0) {};
\node[rotate=45] at (enter) {\tiny\textsf{entre}};
\node[place] (inside) at (3,0) {};
\node[below] at (inside.south) {\tiny\textsf{dedans}};
\node[trans] (exit) at (4,0) {};
\node[rotate=45] at (exit) {\tiny\textsf{sort}};
\node[place,tokens=1] (far) at (2,-1) {};
\node[below] at (far.south) {\tiny\textsf{loin}};
\draw[arc] (before) -- (enter);
\draw[arc] (enter) -- (inside);
\draw[arc] (inside) -- (exit);
\draw[arc] (exit) |- (far);
\draw[arc] (far) -| (approach);
\draw[arc] (approach) -- (before);
%
\node[place] (low) at (2,1) {};
\node[below] at (low.south) {\tiny\textsf{bas}};
\node[place,tokens=1] (high) at (2,3) {};
\node[above] at (high.north) {\tiny\textsf{haut}};
\node[trans] (down) at (1,2) {};
\node[rotate=45] at (down) {\tiny\textsf{baisse}};
\node[trans] (up) at (3,2) {};
\node[rotate=45] at (up) {\tiny\textsf{lève}};
\draw[arc] (high) -| (down);
\draw[arc] (down) |- (low);
\draw[arc] (low) -| (up);
\draw[arc] (up) |- (high);
%
\node[place] (godown) at (0,2) {};
\node[above] at (godown.north) {\tiny\textsf{descendre}};
\draw[arc] (approach) -- (godown);
\draw[arc] (godown) -- (down);
\node[place] (goup) at (4,2) {};
\node[above] at (goup.north) {\tiny\textsf{relever}};
\draw[arc] (exit) -- (goup);
\draw[arc] (goup) -- (up);
%
\node[place,tokens=1] (green) at (.5,1) {};
\node[above] at (green.130) {\tiny\textsf{feu}};
\draw[arc] (green) -- (approach);
\draw[arc] (down) -- (green);
\draw[<->] (green) -- (enter);
\end{tikzpicture}
\begin{comment}
Exercice à la maison.
Dessinez le graphe de marquage de ce réseau et vérifiez que chaque état accessible vérifie la propriété de sécurité : si 'dedans' est marquée, alors 'bas' l'est aussi.
\end{comment}
\begin{comment}
Ceci clos notre chapitre 2.
J'ai plusieurs idées de chapitre 3, n'hésitez pas à me poser des question sur ce qui vous intéresserait.
\end{comment}
%%
%%
\end{document}