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