Principe général : préparer 4 automates déterministes complets

publicité
Université Paris Diderot – HE01LI – 15/16
corrigé C.C. n◦ 1
1. Soit X = {a, b, c}. Proposer un automate déterministe (pas nécessairement complet) qui
reconnaît le langage sur X ∗ de tous les mots qui contiennent soit le motif ab∗ a, soit le
motif b∗ cb∗ , mais pas les deux. On n’est pas obligé de passer par les algorithmes vus en
cours.
Principe général : préparer 4 automates déterministes complets : celui des mots sur
X ∗ qui contiennent le motif ab∗ a, et celui des mots qui ne le contiennent pas (son
complément), celui des mots qui contiennent le motif b∗ cb∗ , et ce lui des mots qui
ne le contiennent pas (son complément).
w ne contient pas ab∗ a
w contient ab∗ a
b, c
b
a
a, b, c
b, c
12
20
a
10
11
a
c
a, b, c
b
a
21
22
c
w contient b∗ cb∗
a, b
w ne contient pas b∗ cb∗
a, b, c
a, b
31
40
a, b, c
c
c
30
41
Ensuite, on combine ces automates selon le raisonnement suivant : dès qu’un des
deux motifs a été reconnu, il faut entrer dans un état tel que la reconnaissance
de l’autre motif envoie dans un état puits. Voilà un exemple de ce que cela peut
donner :
a, b
b
a
11
12
a
a
0
c
b
22,41
c
a, b, c
a
31
c
a
21
b
2. Soit l’automate représenté par la table de transition :
a
→1 2
2 2
←3 4
←4 4
Proposez un automate reconnaissant le même langage mais minimal en nombre
Quel est le langage reconnu par cet automate ?
1
b c
3 1
2 4
3 3
3 4
d’états.
Université Paris Diderot – HE01LI – 15/16
corrigé C.C. n◦ 1
En appliquant l’algorithme de séparation des classes d’états, qui commence avec les
deux classes {1, 2} et {3, 4}, on aboutit à un point fixe avec trois classes : {1}, {2}
et {3, 4}. L’automate minimal est l’automate obtenu en fusionnant les états 3 et 4.
Le langage reconnu peut être décrit par l’expression rationnelle
c∗ b | a(a|b)∗ c (a|b|c)∗
3. Soit l’expression rationnelle (abc)∗ c(c∗ b|ε).
(a) Proposer un automate reconnaissant le même langage, en appliquant rigoureusement
l’algorithme vu en cours
L’algorithme vu en cours consiste à associer à chaque symbole un automate élémentaire, et à associer à chaque opération rationnelle (produit, union, étoile)
la construction d’un automate en introduisant des ε-transitions. Voici ce que
donne l’application rigoureuse de l’algorithme vu en cours. En noir les automates élémentaires, en rouge les ε-transitions ajoutées par un produit, en orange
les ε-transitions ajoutées par une étoile de Kleene, et en bleu les ε-transitions
venant d’une union.
a
2
ε
3
b
4
ε
c
5
6
7
ε
ε
ε
1
11
ε
ε
c
8
12
13
ε
ε
ε
9
b
10
14
c
15
ε
16
17
ε
(b) Éliminer les ε-transitions (on pourra commencer par éliminer les ε-transitions les plus
faciles à éliminer avant d’utiliser l’algorithme général).
On pouvait bien sûr appliquer l’algorithme vu
en cours à cet automate, ce qui est un peu
fastidieux, ou, comme suggéré dans l’énoncé,
éliminer « à la main » les ε-transitions les
plus faciles à éliminer, avant d’appliquer l’algorithme, voire tenter d’enlever à la main
toutes les ε-transitions ; dans tous les cas il
est judicieux de vérifier que l’automate résultant vous semble bien reconnaître le langage initialement donné. Ici, l’automate sans
ε-transition peut finalement ressembler à ça :
2
b
c
a
c
c
c
b
b
Université Paris Diderot – HE01LI – 15/16
corrigé C.C. n◦ 1
4. Donnez dans le pseudo-langage de votre choix l’algorithme de transformation d’une grammaire algébrique quelconque en une grammaire ε-libre.
On commence par construire l’ensemble Eff des symboles non terminaux qui s’effacent directement :
for (A → α) ∈ P :
if α == ε :
Eff = Eff ∪ {A}
On définit une fonction récursive qui produit un ensemble de chaînes correspondant
à toutes les parties droites possibles selon qu’on laisse ou qu’on enlève les symboles
qui s’effacent. La fonction suppose défini le produit des langages.
def rhs(α1 α2 . . . αk ) :
if k == 0 : return {ε}
if α1 6∈ Eff :
return {ε}.rhs(α2 . . . αk )
return {ε}.rhs(α2 . . . αk ) ∪ {α1 }.rhs(α2 . . . αk )
Pour chaque règle de la grammaire d’origine, on ajoute au nouvel ensemble de règles
P ′ les règles obtenues par l’application de la fonction rhs qui crée autant de parties
droites que nécessaires. On élimine ε par la même occasion.
for (A → β) ∈ P :
for γ in (A → β) ∈ P :
if γ 6= ε :
P ′ = P ′ ∪ {A → γ}
Enfin, on s’occupe du cas où l’axiome produit (directement ou indirectement) ε :
for (S → β) ∈ P :
if ε ∈ rhs(β) :
ajouter (si nécessaire) à P ′ : S ′ → ε | S et fixer l’axiome à S ′
3
Téléchargement