Exercice 2 : Automates de recherche et expressions régulières
🌐 Énoncé du problème / Cadre d’étude
Section titled “🌐 Énoncé du problème / Cadre d’étude”Le traitement de texte et l’analyse de flux de données reposent fondamentalement sur la théorie des automates et des expressions régulières. Dans ce problème, on s’intéresse à la construction d’automates finis déterministes (AFD) à partir d’expressions régulières simplifiées sur un alphabet fini .
On rappelle qu’une expression régulière sur décrit un langage formel. On se restreint ici aux opérateurs suivants :
- Le symbole de base (reconnaissant le mot de longueur 1 constitué de ).
- La concaténation, notée par juxtaposition ().
- L’alternative (ou union), notée ().
- L’étoile de Kleene, notée ().
L’objectif du problème est d’étudier la construction de Thompson pour transformer une expression régulière en automate fini non déterministe avec -transitions (AFNE), puis de formaliser la table de transitions pour l’évaluation algorithmique en temps linéaire par rapport à la longueur du texte.
❓ Questions progressives (incluant une analyse critique du modèle)
Section titled “❓ Questions progressives (incluant une analyse critique du modèle)”- Définitions préliminaires : Rappeler formellement ce qu’est un AFNE (Automate Fini Non Déterministe avec -transitions) sur un alphabet . Préciser la notion de -clôture d’un état.
- Construction de Thompson (Base) : Donner schématiquement et formellement les briques de base de la construction de Thompson pour :
- Un symbole .
- La concaténation de deux expressions de langages respectifs et .
- Implantation des structures de données : Proposer une représentation en langage OCaml ou Python des structures de données permettant de stocker un automate (états, transitions, état initial, états acceptants).
- Algorithme de simulation : Écrire une fonction en OCaml ou Python qui, étant donné un AFD et un mot , détermine si est accepté par l’automate en temps .
- Analyse critique et complexité : Lors de la conversion d’un AFNE en AFD par la construction des sous-ensembles (déterminisation), quelle est la complexité en pire cas sur la taille de l’automate obtenu par rapport au nombre d’états de l’AFNE ? Discuter l’impact de ce phénomène sur l’évaluation des expressions régulières en pratique (e.g., politique de moteurs de recherche textuelle).
💡 Pistes & Indications méthodologiques
Section titled “💡 Pistes & Indications méthodologiques”- Pour la question 1, veillez à bien inclure la fonction de transition sous forme relationnelle .
- Pour la construction de Thompson (Question 2), chaque sous-automate construit doit posséder un unique état initial et un unique état acceptant, ce qui simplifie grandement l’emboîtement des opérateurs.
- Pour la simulation de l’AFD (Question 4), l’absence de -transitions dans un AFD garantit un parcours déterministe direct sans besoin de maintenir un ensemble d’états actifs à chaque étape.
📋 Corrigé détaillé pas à pas
Section titled “📋 Corrigé détaillé pas à pas”1. Définitions préliminaires
Section titled “1. Définitions préliminaires”Un Automate Fini Non Déterministe avec -transitions (-AFN) est un quintuplet où :
- est un ensemble fini d’états.
- est l’alphabet d’entrée.
- est la fonction de transition.
- est l’ensemble des états initiaux.
- est l’ensemble des états acceptants (finaux).
Pour tout sous-ensemble d’états , la -clôture (notée ) est le plus petit ensemble d’états contenant et fermé par la relation de transition :
2. Construction de Thompson (Briques élémentaires)
Section titled “2. Construction de Thompson (Briques élémentaires)”La méthode de Thompson associe à toute expression régulière un -AFN ayant exactement un état initial et un unique état acceptant .
- Pour un symbole : On crée deux états avec une unique transition .
- Pour la concaténation : Soient (états ) et (états ). On fusionne l’état acceptant de avec l’état initial de (ou on ajoute une -transition de vers ). L’état initial devient et l’état final .
3. Représentation des données en OCaml
Section titled “3. Représentation des données en OCaml”type state = int
(* Une transition est soit étiquetée par un caractère, soit par None (epsilon) *)type transition = | Transition of state * char * state | EpsilonTransition of state * state
type afne = { states : state list; initial : state; accepting : state list; transitions : transition list;}4. Algorithme de simulation d’un AFD
Section titled “4. Algorithme de simulation d’un AFD”Dans le cas d’un Automate Fini Déterministe (AFD), la fonction de transition est une application partielle . La simulation pour un mot s’écrit de manière très efficace :
(* Supposons un AFD représenté par une table de hachage ou une fonction de transition *)let run_afd (delta : state -> char -> state option) (initial : state) (accepting : state list) (word : string) : bool = let rec aux current_state idx = if idx = String.length word then List.mem current_state accepting else match delta current_state word.[idx] with | None -> false | Some next_state -> aux next_state (idx + 1) in aux initial 0La complexité temporelle de cette fonction est clairement et la complexité spatiale est (hors stockage de l’automate).
5. Analyse critique et complexité
Section titled “5. Analyse critique et complexité”Lors de la conversion d’un -AFN à états en un AFD par l’algorithme de construction des sous-ensembles (Powerset Construction), l’AFD résultant peut posséder jusqu’à états dans le pire des cas.
- Impact pratique : Cette explosion exponentielle (souvent appelée “explosion des états”) rend la conversion naïve en AFD prohibitive pour des expressions régulières complexes ou imbriquées.
- Alternatives industrielles : Des moteurs de recherche textuelle modernes (comme ceux utilisés dans les bibliothèques d’expressions régulières de type PCRE ou RE2) évitent de construire l’AFD complet en mémoire. Ils simulent directement l’AFNE en maintenant l’ensemble des états actifs (via les -clôtures) ou construisent l’AFD de manière paresseuse (lazy DFA construction), c’est-à-dire en ne calculant que les sous-états effectivement atteints lors de la lecture du texte.