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