Exercice 1 : Expressions rationnelles
🌐 Énoncé du problème / Étude de cas
Section titled “🌐 Énoncé du problème / Étude de cas”Dans le cadre de la conception d’un système embarqué de supervision pour un réseau de capteurs industriels, on s’intéresse à l’analyseur lexical (lexer) chargé de valider des trames de télémesure. Ces trames sont représentées sous forme de chaînes de caractères sur un alphabet fini .
Pour des raisons de bande passante et de consommation énergétique, les capteurs émettent des messages compressés dont la structure syntaxique est modélisée par des langages réguliers. On cherche à manipuler, normaliser et optimiser les expressions rationnelles décrivant ces protocoles de communication. L’alphabet de travail est .
Dans ce problème, on étudie les propriétés algébriques des expressions rationnelles, leur traduction sous forme d’automates finis non déterministes (AFN), ainsi que l’impact de la taille des représentations sur les ressources mémoires limitées des microcontrôleurs cibles (hypothèse de mémoire vive disponible : ).
❓ Questions progressives
Section titled “❓ Questions progressives”-
Définitions et manipulation syntaxique Soit un alphabet. Rappeler la définition inductive de l’ensemble des expressions rationnelles sur et le langage associé pour chaque expression .
-
Élimination de l’ambiguïté et normalisation On considère l’expression rationnelle . Décrire précisément le langage en français. Proposer une expression rationnelle équivalente décrivant le complémentaire de sur l’alphabet .
-
Construction de Thompson et complexité spatiale Rappeler le principe de la construction de Thompson pour transformer une expression rationnelle en un automate fini non déterministe avec -transitions (AFN-). Évaluer majoritairement le nombre d’états et de transitions de l’automate obtenu en fonction de la longueur | de l’expression (nombre de symboles de l’alphabet et d’opérateurs).
-
Analyse critique et limites du modèle pour les systèmes embarqués Supposons que l’on souhaite convertir l’AFN- précédent en un automate fini déterministe (AFD) minimal pour l’embarquer sur un microcontrôleur disposant de de RAM. Si l’expression rationnelle a une longueur , donner un ordre de grandeur théorique du nombre d’états de l’AFD issu de la construction par sous-ensembles. Discuter des limites de cette approche pour des protocoles industriels complexes et proposer une contre-mesure logicielle.
-
Implémentation en Python Écrire une fonction Python
contiene_a(e: str) -> bool(ou fonction récursive similaire) qui prend une structure représentant une expression rationnelle et détermine si le langage associé contient au moins un mot contenant le caractère .
💡 Pistes & Indications
Section titled “💡 Pistes & Indications”- Q1 : Penser aux cas de base (mot vide , mot vide , lettres de l’alphabet) et aux trois opérations fondamentales (union, concaténation, étoile de Kleene).
- Q2 : Le langage représente l’ensemble des mots de contenant au moins une occurrence de la lettre . Le complémentaire correspond donc aux mots ne contenant aucune occurrence de .
- Q3 : Pour chaque opérateur de l’induction, dessinez les fragments d’automates avec un unique état initial et un unique état acceptant pour éviter l’explosion combinatoire des transitions.
- Q4 : Rappelez-vous que le passage d’un AFN à un AFD peut induire une explosion exponentielle du nombre d’états ( dans le pire des cas). Mettez cela en regard avec la contrainte des .
- Q5 : Utilisez le typage algébrique de données (ou des classes en Python) pour représenter l’arbre syntaxique de l’expression rationnelle, puis procédez par induction structurelle.
📋 Corrigé détaillé et analyse des résultats
Section titled “📋 Corrigé détaillé et analyse des résultats”Corrigé de la question 1
Section titled “Corrigé de la question 1”L’ensemble des expressions rationnelles sur l’alphabet est défini inductivement par :
- et .
- .
- Si , alors et sont dans .
Les langages associés sont définis par :
- pour tout
Corrigé de la question 2
Section titled “Corrigé de la question 2”- Le langage avec correspond à l’ensemble de tous les mots de qui comportent au moins une lettre .
- Le complémentaire de ce langage sur l’alphabet est l’ensemble des mots ne contenant aucune occurrence de , c’est-à-dire les mots formés exclusivement de et de . Une expression rationnelle simple pour ce complémentaire est : (Note : si l’on exclut le mot vide, ou selon la définition exacte du complémentaire par rapport à , on peut aussi l’écrire rigoureusement, mais englobe tous les mots sur .)
Corrigé de la question 3
Section titled “Corrigé de la question 3”La construction de Thompson associe à toute expression de longueur un AFN- possédant :
- Un nombre d’états borné par (généralement au plus états).
- Un nombre de transitions également borné par . Cette linéarité fait de la construction de Thompson un outil très efficace en termes d’allocation mémoire initiale.
Corrigé de la question 4 : Analyse critique et limites du modèle
Section titled “Corrigé de la question 4 : Analyse critique et limites du modèle”Si , l’AFN de Thompson possède au maximum états. Lors de la déterminisation (construction par sous-ensembles), l’AFD obtenu peut théoriquement contenir jusqu’à états dans le pire des cas. Même si les structures de protocoles réels n’atteignent pas ce pire cas pathologique, le nombre d’états peut facilement dépasser plusieurs dizaines de milliers.
Analyse des limites et ordres de grandeur :
Un automate sous forme de table de transition stockée en mémoire (par exemple une matrice etat x symbole -> etat) représentant états sur un alphabet de taille (avec des entiers sur 16 bits) consommerait :
Cette valeur s’approche dangereusement de la limite stricte des du microcontrôleur, sans compter la pile d’exécution du système d’exploitation et le code applicatif.
Contre-mesure logicielle : Plutôt que de stocker un AFD pré-calculé complet, on privilégie l’évaluation à la volée (Lazy DFA) ou l’interprétation directe de l’AFN- par un algorithme de type Thompson simulé (glouton sur les ensembles d’états actifs), dont l’empreinte mémoire reste bornée et proportionnelle à , garantissant le respect de la contrainte matérielle.
Corrigé de la question 5
Section titled “Corrigé de la question 5”Voici une implémentation élégante en Python utilisant le typage algébrique (via des classes ou des dataclasses) pour représenter et analyser l’expression rationnelle :
from dataclasses import dataclassfrom typing import Union
@dataclassclass Epsilon: pass
@dataclassclass Symbol: char: str
@dataclassclass Concat: left: 'Expr' right: 'Expr'
@dataclassclass UnionExpr: left: 'Expr' right: 'Expr'
@dataclassclass Star: expr: 'Expr'
Expr = Union[Epsilon, Symbol, Concat, UnionExpr, Star]
def contient_a(e: Expr) -> bool: """Détermine si l'expression rationnelle peut générer un mot contenant 'a'.""" match e: case Epsilon(): return False case Symbol(char=c): return c == 'a' case Concat(left=l, right=r): return contient_a(l) or contient_a(r) case UnionExpr(left=l, right=r): return contient_a(l) or contient_a(r) case Star(expr=sub): return contient_a(sub) return False