• Aucun résultat trouvé

4.3.1 Présentation de la règle

La fermeture de Kleene est un opérateur qui permet de modéliser l’exécution d’un astd un nombre arbitraire de fois (ce nombre pouvant être zéro). Lorsque l’astd

S1.2 S1.3 S1.1 S1 t1 t2 * S1.2 S1.1 S1 t1 t2

figure 4.3 – Une première intuition de la réécriture d’une fermeture de Kleene

S1.2 S1.3 S1.1 S1 t1 t2 * S1.2 S1.3 S1.1 S1 t1 t2 t1

figure 4.4 – Deuxième solution proposée pour la réécriture de la fermeture de Kleene

arrive dans état final, il peut être exécuté une nouvelle fois en partant de son état initial. Nous ne traitons ici que les cas de fermeture de Kleene s’appliquant à un au-tomate. Une première règle de réécriture est proposée : les états finaux sont fusionnés avec l’état initial. Un exemple d’application de cette règle est présenté à la figure 4.3. Ici, la règle ne fonctionne que parce les états initiaux et finaux sont tous des états élémentaires.

Pour permettre de transformer une fermeture de Kleene dont les états initiaux et finaux ne sont pas tous élémentaires, la règle est modifiée : les états de l’automate ne changent pas, mais des transitions sont ajoutées pour simuler le fonctionnement de la fermeture de Kleene. On ajoute au départ de tous les états finaux toutes les transitions qui partent de l’état initial en gardant leur état de destination. Pour modéliser le fait que l’astd peut ne jamais être exécuté, l’état initial devient final. L’application de cette règle sur le mêmeastd que celui de la figure 4.3 est illustrée à la figure 4.4.

Cependant, puisque l’état initial devient final, cette règle ne fonctionne que si dans l’automate passé en paramètre de la fermeture de Kleene, aucune transition n’arrive à l’état initial. La figure 4.5 illustre le problème. Dans l’astd de départ, il est possible de sortir soit avant d’avoir exécuté la moindre transition, soit après être arrivé à l’état S1.3. Dans l’automate résultant de la réécriture, il est possible de sortir après avoir exécuté la transitiont3 puis la transitiont4. Les deux spécifications ne sont donc pas équivalentes. Cependant, la règle décrite à la section 4.2 permet

S1.2 S1.3 S1.1 S1 t1 t2 * S1.4 t4 t3 S1.2 S1.3 S1.1 S1 t1 t2 S1.4 t4 t3 t1 t3

figure 4.5 – Réécriture d’un astd dont au moins une transition arrive à l’état initial

de transformer un automate dont au moins un transition arrive à l’état initial en un automate dans lequel aucune transition n’arrive à l’état initial. En effectuant d’abord cette transformation puis la transformation décrite ci-dessus, on obtient la transformation de la figure 4.6. Cette réécriture illustre d’ailleurs parfaitement la remarque introductive : l’astd obtenu n’est pas plus simple à lire, cependant sa traduction en B permettra d’écrire des invariants plus simples à prouver.

4.3.2 Formalisation de la règle

Soit unastdA=h?,nameKl,haut,name,Σ, N, ν, δ,SF,DF, n0ii. La règle ne peut s’appliquer que si l’état initial de l’automate fermé par la fermeture de Kleene est un état élémentaire. On ne peut donc transformer l’automateAque siν(n0)∈ASTDElem. Dans la section précédente, nous avons vu qu’il n’était possible de réécrire que les automates dont aucune transition n’arrive à l’état initial. Nous distinguons donc les deux cas pour la définition de la règle.

Aucune transition n’arrive à l’état initial (δ{n0} =)

Les transitions partant de l’état initial sont ajoutées à l’ensemble des transitions, en les faisant partir de tous les état finaux. Pour chaque état final, si l’état final est un état final profond, la transition doit être de type final. Si l’état final est un état final de type non profond (Shallow Final), la transition est doit être de type non final. Enfin, l’état initial est ajouté à l’ensemble des états finaux non profonds (puisque

S1 * S1 S1.2 S1.3 S1.1 t1 t2 S1.4 t4 t3 S1.2 S1.3 S1.1 t1 t2 S1.4 t4 t3 t1 t3 S1.1.2 t3 t1

figure 4.6 – La bonne réécriture de l’automate de la figure 4.5

l’état initial est élémentaire, il peut être indifféremment dans les états profonds ou non profonds).

Formellement, le nouvel ensemble de transitions δ0 est donné par :

δ0 =δ [ niDF {((ni)(n0δ))[final? :=true]} [ njSF {((nj)(n0δ))[final? :=false]}

Et le nouvel astd remplaçant la fermeture de Kleene est l’astd :

haut,name,Σ, N, ν, δ0,SFn0,DF, n0i

Au moins une transition arrive à l’état initial (δ{n0} 6=)

Dans le cas où au moins une transition arrive à l’état initial, on applique la trans-formation de la section 4.2 puis on se ramène au cas décrit ci-dessus.

4.3.3 Esquisse de la preuve

Soit un astd A1 =h?,name, A01i vérifiant les conditions pour appliquer la trans-formation présentée ci-dessus. Soit l’astd A2 résultat de la transformation. Il faut

montrer que A1 simule A2 et que A2 simule A1. Pour cela, il est faut exhiber une relation entre les états admis par A1 et les états admis par A2.

L’état d’une fermeture de Kleene est décrit sous la forme suivante :h?0,started?, si. L’état s est l’état du sous-astd passé en paramètre de la fermeture de Kleene et la mention started? est une valeur booléenne qui est vraie si la fermeture de Kleene est commencée. Dans ces conditions, la relationRest définie de la manière suivante : Pour tout s, R(h?0,true, si, s) et R(h?0,false,init(A1)0i,init(A2)). Sur le reste des états, la relationR est la relation identité.

A1 simule A2

Il y a six règles d’inférence pour les transitions dans les automates, donc six possibilités d’exécuter une transition (voir Annexe A.1). Ici nous les résumons en deux catégories : (1) la transition est une transition de l’automate A2 et (2) la transition est une transition d’un sousastd deA2. De plus, il y a deux règles d’inférence pour la fermeture de Kleene (voir Annexe A.4) : (1) la transition part de l’état initial, et elle peut être exécutée si l’astd A01 est dans un état final (ou si la fermeture de Kleene n’a jamais commencé) et (2) la transition part d’un autre état et elle peut être exécutée si elle peut être effectuée dans A01

La transition est une transition de A2 : Les transitions de A01 sont incluses dans les transitions deA2. On distingue donc les deux cas : (1) la transition est dans δ (l’ensemble des transitions de A01) et (2) la transition n’est pas dansδ

Si la transition est dans δ, elle peut être exécutée dans A01. Donc elle peut être exécutée dansA1.

Si la transition n’est pas dansδ, elle fait partie des transitions ajoutées et part d’un état qui était un état final de A01. D’après la première règle d’inférence de la fermeture de Kleene, une transition peut être exécutée depuis un état final si elle part d’un état initial. Or les transitions ajoutées à l’ensemble des transitions sont celles partant de l’état initial.

La transition est une transition d’un sous-astd de A2 : A2 contient

sous-astd deA01 toutes les transitions qu’il est possible de faire dans un sous-astd deA2.

On vérifie également que les conditions pour l’état initial et les états finaux sont vé-rifiées. L’étath?0,false,init(A01)iest initial pourA1etR(h?0,false,init(A01)i,init(A2)). La fermeture de Kleene a deux types d’états finaux : (1) la fermeture de Kleene n’a jamais commencé et (2) le sous-astd est dans un état final. Les états finaux de A2 sont les états finaux de A01 auxquels on a ajouté l’état initial de A2. Si l’état final de A2 est un des états de A01 on est dans le cas (2), si on est dans l’état initial de A2, l’état h?0,false, init(A01)i est final pour la fermeture de Kleene et vérifie la relation.

A2 simule A1

Il y a deux règles d’inférence pour décrire l’exécution d’un transition dans une fermeture de Kleene : (1) la transition est une transition qui peut être exécutée dans le sous-astd ou (2) la transition peut être exécutée depuis l’état initial et le sous-astd est dans un état final ou la fermeture de Kleene n’a jamais commencé (started? =false).

La transition peut être exécutée dans A01 : Soit c’est une transition de A01 et puisque l’ensemble des transitions deA01 est un sous ensemble des transitions deA2, elle peut être exécutée dansA2. Soit c’est une transition d’un sous-astd deA01 et puisque les états de A2 sont identiques aux états deA01, elle peut être exécutée dans A2.

La transition peut être exécutée si l’état est final ou que la fermeture

de Kleene n’a jamais commencé : Si la fermeture de Kleene n’a jamais

commencé, on peut exécuter une transition qui part de l’état initial deA01. Les transitions deA01 sont dansA2, doncA2 peut exécuter la transition. Si l’état est final, on peut exécuter toutes les transitions qui partent de l’état initial. Or ce sont ces transitions qui ont été ajoutées dans l’ensemble des transitions deA2. L’état initial de A1 est l’état h?0,false,init(A01)i qui est en relation avec init(A2). Il y a deux états finaux à une fermeture de Kleene : l’état où la fermeture n’a jamais commencé (started? = false) et l’état où le sous-astd est dans un état final. Si elle n’a jamais commencé elle correspond à l’état initial de A2, et l’état initial de A2 est

S2 S3 S1 S1 t1 t2 | S5 S6 S4 t3 t4 S1 S2 S3 S1 t1 t2 S5 S6 t3 t4

figure 4.7 – Intuition pour la réécriture du choix

final. Les états finaux de A01 sont inclus dans les états finaux de A2 donc si A01 est final, A2 l’est aussi.