Le sujet. - dept

Transcription

Le sujet. - dept
Année Universitaire 2013/2014
Session de Printemps 2014
Parcours : Master 1 Informatique
Code UE : J1IN8W14
Épreuve : Conceptions Formelles
Date : Lundi 28 avril 2014
Durée : 1 heure 30
Documents : autorisés
Épreuve de M. Alain Griffault
Heure : 8 heures 30
Collège
Sciences
et
Technologies
Code d’anonymat :
Avertissement
– La plupart des questions sont indépendantes.
– L’espace laissé pour les réponses est suffisant
(sauf si vous utilisez ces feuilles comme brouillon, ce qui est fortement déconseillé).
Question
Points
Modélisation en AltaRica
13
Vérification de modèles avec ARC
7
Total:
20
Score
Le but de l’exercice est la conception et la vérification de quelques propriétés de circuits électriques utilisant
différents types d’interrupteurs.
Exercice 1 : Modélisation en AltaRica
(13 points)
Les circuits électriques utilisent des générateurs identiques à ceux utilisés en cours, et dont la sémantique
est donnée par la figure 1.
node Generator
state ok : bool;
init
ok := true;
flow
plus, minus : [0,1];
event failure, repair;
trans ok |− failure −> ok := false;
˜ok |− repair −> ok := true;
assert plus = 1;
ok = (minus=0);
edon
ok = true, minus = 0
failurerepair
ok = false, minus = 1
Generator
Figure 1 – La sémantique du nœud Generator
J1IN8W14 : Conceptions Formelles
Année 2013/2014
(a) (2 points) Les lampes utilisées sont différentes de celles du cours. Elles s’éteignent et s’allument instantanément, et réagissent en cas de court circuit en grillant.
Dessiner la sémantique du code AltaRica suivant.
node Lamplight
state ok : bool;
init
ok := true;
flow
light : bool;
f1, f2 : [0,1];
event reaction, repair;
trans ok & (f1=1) & (f2=1) |− reaction −> ok := false;
˜ok |− repair −> ok := true;
assert light = (ok & (f1+f2=1));
edon
Page 2 sur 8
J1IN8W14 : Conceptions Formelles
Année 2013/2014
(b) Le premier circuit.
i. (2 points) Un interrupteur va-et-vient possède trois fils. Suivant les appuis sur l’interrupteur, il
connecte deux d’entre eux et laisse le troisième libre.
Compléter la rubrique assert du code AltaRica du nœud Switch afin de respecter les indications
du schéma, et d’obtenir pour sémantique la figure 2
f = 0, fw = 0, sw in [0, 1], firstWay = true
f = 1, fw = 1, sw in [0, 1], firstWay = true
pushpush
f = 0, fw in [0, 1], sw = 0, firstWay = false
f = 1, fw in [0, 1], sw = 1, firstWay = false
Switch/Q (2 classes)
Figure 2 – Sémantique du nœud Switch
/∗
|−−−−−− |
|−−−−−− |
∗
|
/−− |−−− fw
push
|
−− |−−− fw
∗
f −−−− |−−/
|
<−−−−−−−−>
f −−−− |−−\
|
∗
|
−− |−−− sw
push
|
\−− |−−− sw
∗
|−−−−−− |
|−−−−−− |
∗/
node Switch
state firstWay : bool;
init
firstWay := true;
flow
f, fw, sw : [0,1];
event push;
trans true |− push −> firstWay := ˜firstWay;
assert
edon
Page 3 sur 8
J1IN8W14 : Conceptions Formelles
Année 2013/2014
ii. (2 points) Le code AltaRica du premier circuit utilise deux interrupteurs dits va-et-vient, placés
entre le générateur et la lampe.
node Circuit1
sub G : Generator;
L : Lamplight;
S : Switch[2];
assert
// wires
G.plus = S[0].f;
G.minus = L.f2;
S[0].fw = S[1].fw;
S[0].sw = S[1].sw;
S[1].f = L.f1;
// directed flow from generator to switch
(S[0].fw + S[0].sw)<=1;
edon
Dessiner le schéma du premier circuit électrique, en faisant apparaı̂tre les différents composants,
et les noms des variables de flux.
(c) (3 points) Le second circuit.
Si votre modèle d’interrupteur est correct, la sémantique obtenue avec la commande quot() du nœud
Circuit1 correspond à la figure 3.
G.minus = 0, L.ok = false, S[1].f = 0, L.light = false, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = true, S[0].firstWay = false, S[1].firstWay = true
G.minus = 0, L.ok = false, S[1].f = 0, L.light = false, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = true, S[0].firstWay = true, S[1].firstWay = false
S[0].push
S[1].push S[0].push S[1].push
G.minus = 0, L.ok = false, S[1].f = 1, L.light = false, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = true, S[0].firstWay = false, S[1].firstWay = false
G.minus = 0, L.ok = false, S[1].f = 1, L.light = false, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = true, S[0].firstWay = true, S[1].firstWay = true
G.failure G.repair
G.failure G.repair
G.minus = 1, L.ok = false, S[1].f = 1, L.light = false, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = false, S[0].firstWay = false, S[1].firstWay = false
G.minus = 1, L.ok = false, S[1].f = 1, L.light = false, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = false, S[0].firstWay = true, S[1].firstWay = true
L.repair
L.repair
L.repair
L.reaction
G.minus = 1, L.ok = true, S[1].f = 1, L.light = false, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = false, S[0].firstWay = false, S[1].firstWay = false
G.minus = 1, L.ok = true, S[1].f = 1, L.light = false, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = false, S[0].firstWay = true, S[1].firstWay = true
G.repair
S[0].push
S[0].push
S[1].push
S[1].push
G.minus = 1, L.ok = false, S[1].f = 0, L.light = false, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = false, S[0].firstWay = false, S[1].firstWay = true
G.minus = 1, L.ok = false, S[1].f = 0, L.light = false, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = false, S[0].firstWay = true, S[1].firstWay = false
G.failure
G.minus = 0, L.ok = true, S[1].f = 1, L.light = true, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = true, S[0].firstWay = false, S[1].firstWay = false
G.minus = 0, L.ok = true, S[1].f = 1, L.light = true, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = true, S[0].firstWay = true, S[1].firstWay = true
S[1].push S[0].push S[1].push S[0].push
L.repair S[0].push
S[0].push S[1].push S[1].push
G.minus = 0, L.ok = true, S[1].f = 0, L.light = false, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = true, S[0].firstWay = false, S[1].firstWay = true
G.minus = 0, L.ok = true, S[1].f = 0, L.light = false, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = true, S[0].firstWay = true, S[1].firstWay = false
G.failure
G.repair
G.minus = 1, L.ok = true, S[1].f = 0, L.light = true, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = false, S[0].firstWay = false, S[1].firstWay = true
G.minus = 1, L.ok = true, S[1].f = 0, L.light = true, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = false, S[0].firstWay = true, S[1].firstWay = false
Circuit1/Q (8 classes)
Figure 3 – Sémantique quotient du nœud Circuit1
D’après la sémantique, avec le modèle Circuit1, si le générateur tombe en panne, il est possible qu’un
utilisateur appuie sur l’interrupteur ou bien que la réparation soit faite, avant que la lampe n’ait eue
le temps de réagir.
Compléter les rubriques event, trans et sync du code du nœud AltaRica Circuit2 afin de modifier
certains comportements :
– En cas de panne du générateur, s’il est possible, l’événement reaction de la lampe est toujours tiré
avant qu’un nouvel événement push ou repair soit possible.
– Le technicien répare toujours en une seule fois (simultanément) le plus possible de composants en
panne, et au moins un à chaque réparation.
Page 4 sur 8
J1IN8W14 : Conceptions Formelles
Année 2013/2014
node Circuit2
sub G : Generator;
L : Lamplight;
S : Switch[2];
assert
// wires
G.plus = S[0].f;
G.minus = L.f2;
S[0].fw = S[1].fw;
S[0].sw = S[1].sw;
S[1].f = L.f1;
// directed flow from generator to switch
(S[0].fw + S[0].sw)<=1;
event
trans
sync
edon
Si votre modèle Circuit2 est correct, la sémantique obtenue avec la commande quot() correspond à
la figure 4.
G.minus = 0, L.ok = true, S[1].f = 0, L.light = false, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = true, S[0].firstWay = false, S[1].firstWay = true
G.minus = 0, L.ok = true, S[1].f = 0, L.light = false, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = true, S[0].firstWay = true, S[1].firstWay = false
(push, S[1].push)
(push, S[0].push)
(push, S[1].push) (push, S[0].push)
G.minus = 0, L.ok = true, S[1].f = 1, L.light = true, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = true, S[0].firstWay = false, S[1].firstWay = false
G.minus = 0, L.ok = true, S[1].f = 1, L.light = true, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = true, S[0].firstWay = true, S[1].firstWay = true
G.failure
G.failure
(repair, G.repair, L.repair)
(repair, G.repair)
G.minus = 1, L.ok = true, S[1].f = 0, L.light = true, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = false, S[0].firstWay = false, S[1].firstWay = true
G.minus = 1, L.ok = true, S[1].f = 0, L.light = true, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = false, S[0].firstWay = true, S[1].firstWay = false
(push, S[0].push)
(push, S[1].push)
G.minus = 1, L.ok = true, S[1].f = 1, L.light = false, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = false, S[0].firstWay = false, S[1].firstWay = false
G.minus = 1, L.ok = true, S[1].f = 1, L.light = false, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = false, S[0].firstWay = true, S[1].firstWay = true
(reaction, L.reaction)
G.minus = 1, L.ok = false, S[1].f = 1, L.light = false, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = false, S[0].firstWay = false, S[1].firstWay = false
G.minus = 1, L.ok = false, S[1].f = 1, L.light = false, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = false, S[0].firstWay = true, S[1].firstWay = true
(push, S[1].push)
(push, S[0].push) (push, S[0].push)
(push, S[1].push)
G.minus = 1, L.ok = false, S[1].f = 0, L.light = false, S[0].fw = 0, S[0].sw = 1, G.plus = 1, G.ok = false, S[0].firstWay = false, S[1].firstWay = true
G.minus = 1, L.ok = false, S[1].f = 0, L.light = false, S[0].fw = 1, S[0].sw = 0, G.plus = 1, G.ok = false, S[0].firstWay = true, S[1].firstWay = false
Circuit2/Q (6 classes)
Figure 4 – Sémantique quotient du nœud Circuit2
Page 5 sur 8
(repair, G.repair, L.repair)
J1IN8W14 : Conceptions Formelles
Année 2013/2014
(d) Le troisième circuit.
i. (2 points) Un interrupteur croisé possède quatre fils. Suivant les appuis sur l’interrupteur, il connecte parallèlement, ou bien en croix deux couples de fils.
Compléter la rubrique assert du code AltaRica du nœud SwitchCross afin de respecter les
indications du schéma, et d’obtenir pour sémantique la figure 5
f1 = 0, f2 = 0, g1 = 0, g2 = 0, cross = true
f1 = 0, f2 = 1, g1 = 1, g2 = 0, cross = true
f1 = 1, f2 = 0, g1 = 0, g2 = 1, cross = true
f1 = 1, f2 = 1, g1 = 1, g2 = 1, cross = true
pushpush
f1 = 0, f2 = 0, g1 = 0, g2 = 0, cross = false
f1 = 0, f2 = 1, g1 = 0, g2 = 1, cross = false
f1 = 1, f2 = 0, g1 = 1, g2 = 0, cross = false
f1 = 1, f2 = 1, g1 = 1, g2 = 1, cross = false
SwitchCross/Q (2 classes)
Figure 5 – Sémantique du nœud SwitchCross
/∗
|−−−−−−− |
∗
|
|
∗
f1 −−− |−\
/− |−−− g1
∗
| \ / |
push
∗
|
X
|
<−−−−−−−−>
∗
| / \ |
push
∗
f2 −−− |−/
\− |−−− g2
∗
|
|
∗
|−−−−−−− |
∗/
node SwitchCross
state cross : bool;
init
cross := true;
flow
f1, f2, g1, g2 : [0,1];
event push;
trans true |− push −> cross := ˜cross;
assert
edon
Page 6 sur 8
|−−−−−−− |
|
|
f1 −−− |−−−−−−− |−−− g1
|
|
|
|
|
|
f2 −−− |−−−−−−− |−−− g2
|
|
|−−−−−−− |
J1IN8W14 : Conceptions Formelles
Année 2013/2014
ii. (2 points) Le troisième circuit ajoute au second circuit un interrupteur croisé entre les deux interrupteurs va-et-vient.
Compléter les rubriques event, trans et sync du code AltaRica du nœud Circuit3 afin que sa
sémantique corresponde à la figure 6, figure très similaire à la figure 4.
G.minus = 0, L.ok = true, S[1].f = 0, L.light = false, S[0].sw = 0, S[1].sw = 0, S[1].fw = 1, S[0].fw = 1, G.plus = 1, G.ok = true, SC.cross = false, S[0].firstWay = true, S[1].firstWay = false
G.minus = 0, L.ok = true, S[1].f = 0, L.light = false, S[0].sw = 0, S[1].sw = 1, S[1].fw = 0, S[0].fw = 1, G.plus = 1, G.ok = true, SC.cross = true, S[0].firstWay = true, S[1].firstWay = true
G.minus = 0, L.ok = true, S[1].f = 0, L.light = false, S[0].sw = 1, S[1].sw = 0, S[1].fw = 1, S[0].fw = 0, G.plus = 1, G.ok = true, SC.cross = true, S[0].firstWay = false, S[1].firstWay = false
G.minus = 0, L.ok = true, S[1].f = 0, L.light = false, S[0].sw = 1, S[1].sw = 1, S[1].fw = 0, S[0].fw = 0, G.plus = 1, G.ok = true, SC.cross = false, S[0].firstWay = false, S[1].firstWay = true
(push, S[0].push)
(push, SC.push)
(push, S[1].push)
(push, S[0].push) (push, SC.push) (push, S[1].push)
G.minus = 0, L.ok = true, S[1].f = 1, L.light = true, S[0].sw = 0, S[1].sw = 0, S[1].fw = 1, S[0].fw = 1, G.plus = 1, G.ok = true, SC.cross = false, S[0].firstWay = true, S[1].firstWay = true
G.minus = 0, L.ok = true, S[1].f = 1, L.light = true, S[0].sw = 0, S[1].sw = 1, S[1].fw = 0, S[0].fw = 1, G.plus = 1, G.ok = true, SC.cross = true, S[0].firstWay = true, S[1].firstWay = false
G.minus = 0, L.ok = true, S[1].f = 1, L.light = true, S[0].sw = 1, S[1].sw = 0, S[1].fw = 1, S[0].fw = 0, G.plus = 1, G.ok = true, SC.cross = true, S[0].firstWay = false, S[1].firstWay = true
G.minus = 0, L.ok = true, S[1].f = 1, L.light = true, S[0].sw = 1, S[1].sw = 1, S[1].fw = 0, S[0].fw = 0, G.plus = 1, G.ok = true, SC.cross = false, S[0].firstWay = false, S[1].firstWay = false
G.failure
G.failure
(repair, G.repair, L.repair)
(repair, G.repair)
G.minus = 1, L.ok = true, S[1].f = 0, L.light = true, S[0].sw = 0, S[1].sw = 0, S[1].fw = 1, S[0].fw = 1, G.plus = 1, G.ok = false, SC.cross = false, S[0].firstWay = true, S[1].firstWay = false
G.minus = 1, L.ok = true, S[1].f = 0, L.light = true, S[0].sw = 0, S[1].sw = 1, S[1].fw = 0, S[0].fw = 1, G.plus = 1, G.ok = false, SC.cross = true, S[0].firstWay = true, S[1].firstWay = true
G.minus = 1, L.ok = true, S[1].f = 0, L.light = true, S[0].sw = 1, S[1].sw = 0, S[1].fw = 1, S[0].fw = 0, G.plus = 1, G.ok = false, SC.cross = true, S[0].firstWay = false, S[1].firstWay = false
G.minus = 1, L.ok = true, S[1].f = 0, L.light = true, S[0].sw = 1, S[1].sw = 1, S[1].fw = 0, S[0].fw = 0, G.plus = 1, G.ok = false, SC.cross = false, S[0].firstWay = false, S[1].firstWay = true
(push, S[0].push) (push, SC.push) (push, S[1].push)
G.minus = 1, L.ok = true, S[1].f = 1, L.light = false, S[0].sw = 0, S[1].sw = 0, S[1].fw = 1, S[0].fw = 1, G.plus = 1, G.ok = false, SC.cross = false, S[0].firstWay = true, S[1].firstWay = true
G.minus = 1, L.ok = true, S[1].f = 1, L.light = false, S[0].sw = 0, S[1].sw = 1, S[1].fw = 0, S[0].fw = 1, G.plus = 1, G.ok = false, SC.cross = true, S[0].firstWay = true, S[1].firstWay = false
G.minus = 1, L.ok = true, S[1].f = 1, L.light = false, S[0].sw = 1, S[1].sw = 0, S[1].fw = 1, S[0].fw = 0, G.plus = 1, G.ok = false, SC.cross = true, S[0].firstWay = false, S[1].firstWay = true
G.minus = 1, L.ok = true, S[1].f = 1, L.light = false, S[0].sw = 1, S[1].sw = 1, S[1].fw = 0, S[0].fw = 0, G.plus = 1, G.ok = false, SC.cross = false, S[0].firstWay = false, S[1].firstWay = false
(reaction, L.reaction)
G.minus = 1, L.ok = false, S[1].f = 1, L.light = false, S[0].sw = 0, S[1].sw = 0, S[1].fw = 1, S[0].fw = 1, G.plus = 1, G.ok = false, SC.cross = false, S[0].firstWay = true, S[1].firstWay = true
G.minus = 1, L.ok = false, S[1].f = 1, L.light = false, S[0].sw = 0, S[1].sw = 1, S[1].fw = 0, S[0].fw = 1, G.plus = 1, G.ok = false, SC.cross = true, S[0].firstWay = true, S[1].firstWay = false
G.minus = 1, L.ok = false, S[1].f = 1, L.light = false, S[0].sw = 1, S[1].sw = 0, S[1].fw = 1, S[0].fw = 0, G.plus = 1, G.ok = false, SC.cross = true, S[0].firstWay = false, S[1].firstWay = true
G.minus = 1, L.ok = false, S[1].f = 1, L.light = false, S[0].sw = 1, S[1].sw = 1, S[1].fw = 0, S[0].fw = 0, G.plus = 1, G.ok = false, SC.cross = false, S[0].firstWay = false, S[1].firstWay = false
(push, SC.push) (push, S[0].push)
(push, SC.push) (push, S[1].push) (push, S[0].push) (push, S[1].push)
G.minus = 1, L.ok = false, S[1].f = 0, L.light = false, S[0].sw = 0, S[1].sw = 0, S[1].fw = 1, S[0].fw = 1, G.plus = 1, G.ok = false, SC.cross = false, S[0].firstWay = true, S[1].firstWay = false
G.minus = 1, L.ok = false, S[1].f = 0, L.light = false, S[0].sw = 0, S[1].sw = 1, S[1].fw = 0, S[0].fw = 1, G.plus = 1, G.ok = false, SC.cross = true, S[0].firstWay = true, S[1].firstWay = true
G.minus = 1, L.ok = false, S[1].f = 0, L.light = false, S[0].sw = 1, S[1].sw = 0, S[1].fw = 1, S[0].fw = 0, G.plus = 1, G.ok = false, SC.cross = true, S[0].firstWay = false, S[1].firstWay = false
G.minus = 1, L.ok = false, S[1].f = 0, L.light = false, S[0].sw = 1, S[1].sw = 1, S[1].fw = 0, S[0].fw = 0, G.plus = 1, G.ok = false, SC.cross = false, S[0].firstWay = false, S[1].firstWay = true
Circuit3/Q (6 classes)
Figure 6 – Sémantique quotient du nœud Circuit3
node Circuit3
sub G : Generator;
L : Lamplight;
S : Switch[2];
SC : SwitchCross;
assert
// wires
G.plus = S[0].f;
G.minus = L.f2;
S[0].fw = SC.f1;
S[0].sw = SC.f2;
S[1].fw = SC.g1;
S[1].sw = SC.g2;
S[1].f = L.f1;
// directed flow from generator to switch
(S[0].fw + S[0].sw)<=1;
event
trans
sync
edon
Page 7 sur 8
(repair, G.repair, L.repair)
J1IN8W14 : Conceptions Formelles
Année 2013/2014
Exercice 2 : Vérification de modèles avec ARC
(7 points)
L’objectif de ces propriétés est de montrer pour ces circuits :
– qu’ils sont tous sans blocage ;
– qu’ils sont tous réinitialisables ;
– que le premier peut être distingué des deux autres par deux propriétés.
(a) (1 point) Écrire une propriété permettant de savoir si les circuits sont sans blocage.
with Circuit1, Circuit2, Circuit3
deadlock :=
do
done
(b) (1 point) Écrire une propriété permettant de savoir si les circuits sont réinitialisables.
with Circuit1, Circuit2, Circuit3
notResetable :=
do
done
(c) (2 points) Écrire une propriété permettant de savoir s’il existe des situations à partir desquelles il est
possible d’une part d’appuyer sur un interrupteur ou bien de faire des réparations ; d’autre part que la
lampe réagisse. Cela revient à savoir si des conflits sont possibles entre ces deux types d’événements.
with Circuit1,
reactions :=
failures :=
actions
:=
conflicts :=
Circuit2, Circuit3 do
(any t − self epsilon) & (epsilon | label L.reaction);
(any t − self epsilon) & label G.failure;
(any t − self epsilon) − (reactions | failures);
(d) (3 points) Écrire une propriété permettant de savoir si, lorsque la lampe est allumée, dès que le
générateur tombe en panne, la lampe réagit avant que toute action humaine soit possible. Cela revient à savoir si la réaction de la lampe est prioritaire par rapport aux actions.
with Circuit1,Circuit2, Circuit3
notLampReacts :=
do
done
Page 8 sur 8

Documents pareils