• Aucun résultat trouvé

Motifs, automates et expressions

N/A
N/A
Protected

Academic year: 2022

Partager "Motifs, automates et expressions"

Copied!
24
0
0

Texte intégral

(1)

Motifs, automates et expressions

2015-W42-6

1 Recherche de motifs dans un texte

Comment vérifier :

— Qu’une suite de caractères est un entier naturel ?

— Qu’une suite de caractères est un entier éventuellement précédé d’un signe ?

— Qu’une suite de caractères est une URL ?

— Qu’une suite de caractères est une adresse courriel ? Et si possible en lisant chaque caractère une et une seule fois.

Ce n’est pas si simple que ça en a l’air. Pour les naturels : l e t est_chiffre c = match c with

| ‘ 0 ‘ | ‘ 1 ‘ | ‘ 2 ‘ | ‘ 3 ‘ | ‘ 4 ‘ | ‘ 5 ‘ | ‘ 6 ‘ | ‘ 7 ‘ | ‘ 8 ‘ | ‘ 9 ‘ −> true

| _ −> false

l e t est_naturel s =

l e t n = string_length s in

(∗ ( c h i f f r e s i ) d i t s i t o u s l e s c a r a c t è r e s à p a r t i r de l ’ i n d i c e i s o n t d e s c h i f f r e s ∗)

l e t rec chiffres i =

i >= n | | (est_chiffre s. [i] && chiffres (i+1)) in

(∗ s d o i t ê t r e non−v i d e e t ne c o n t e n i r que d e s c h i f f r e s ∗) n > 0 && loop 0

; ;

(2)

Pour les nombres avec signe éventuel, ça se complique. Il est plus simple d’expliquer l’algorithme avec un petit dessin que de donner le programme :

Pour les URL, il est même difficile de décrire ce qu’on attend : comment spécifier les URL légales ?

2 Expressions rationnelles

2.1 Mots, Langages 2.1.1 Mots

Définition 1 On appelle alphabet un ensemble fini Σ. On appelle mot sur l’alphabet Σ toute suite finie d’éléments de Σ, c’est-à-dire tout n-uplet u = (a0, . . . , an−1), noté a0a1. . . an−1, d’éléments de Σ. La longueur de ce mot u est notée |u|et vaut n.

On note Σ l’ensemble des mots sur Σ : [

n∈N

Σn

Σ1 = Σ et Σ0 ne contient qu’un élément : le mot vide, généralement noté (parfois 1).

La lettre de rangi du mot(a0, . . . , an−1) est ai1.

La concaténation de deux mots a0. . . ap−1 et v = b0. . . bq−1 est notée u.v, voire uv.

C’est le mot a0, . . . , ap−1b0. . . bq−1.

On appelle nombre d’occurrences d’une lettre adans le mot u et on note (parfois)|u|a le nombre dei∈[[0,|u|[[ tels que la lettre numéro i deu soit a.

1. Attention, certains commencent à numéroter les lettres à partir de1.

(3)

Enfin, on note parfois u˜=an−1. . . a0 le mot miroir de u=a0. . . an−1. On dit que u est :

— un préfixe de v si∃u0 ∈Σ v =uu0;

— un suffixe dev si∃u0∈Σ v=u0u;

— un facteur de v si ∃u0, u00∈Σ v=u0uu00;

— un sous-mot de v si v s’écrit sous la forme v0u1v1. . . unvn avec ui, vi ∈ Σ pour touti etu=u1u2. . . un.

Proposition 1 Pour tout (u, v)∈Σ et tout a∈Σ, on a

||a= 0

|uv|a=|u|a+|v|a

|u|=X

α∈Σ

|u|α

Proposition 2 Σ, muni de l’opération de concaténation, est un monoïde. En effet : 1. La concaténation est une loi de composition associative.

2. Et elle possède un élément neutre : .

On l’appelle le monoïde des mots sur Σ ou monoïde libre engendré par Σ.

L’application |.|: Σ→ Nest un morphisme (surjectif ) du monoïde (Σ, .) sur (N,+) car

∀(u, v)∈Σ |u.v|=|u|+|v|

C’est même l’unique morphisme de(Σ, .) vers (N,+) tel que pour tout a∈Σ,|a|= 1.

NB : le terme monoïde libre vient du fait que tout motu s’écrit d’une et seule façon sous la formea0. . . an−1 où lesai sont tous des lettres.

2.1.2 Langages

Définition 2 On appelle langage toute partie deΣ.

Exemples :

1. L’ensemble des mots sur l’alphabet latin qui apparaissent dans mon dictionnaire.

2. L’ensemble des mots sur l’alphabet{0,1}qui codent un nombre premier en binaire.

3. L’ensemble des mots sur l’alphabet {0,1} qui codent un multiple de trois en bi- naire.

4. L’ensemble des mots sur l’alphabet latin dont les voyelles apparaissent pour la première fois dans l’ordre de l’alphabet («bateau» en est un mais pas «binaire»).

5. L’ensemble des mots sur l’alphabet latin codant un programme Caml qui boucle indéfiniment.

∅ etΣ sont deux langages : le langage vide et le langage plein.

Attention : ∅ 6={}.

(4)

2.1.3 Opérations sur les langages Soit L1 etL2 deux langages deΣ.

On peut construire de nouveaux langages à l’aide :

1. des opérations ensemblistes :L1∩L2,L1∪L2\L1,L1\L2; 2. de la concaténation : on note

L1.L2=def {u.v|u∈L1 etv∈L2}

NB : la concaténation de langages est associative, distributive par rapport à l’union et a un élément neutre :{}.

Attention : L1.∅=∅.

Itération : pour L∈Σ, on définit :

L0 ={} Ln+1=Ln.Lpour n∈N L = [

n∈N

Ln L+= [

n∈N

Ln

NB :

L1=L

∀(p, q)∈N2 Lp.Lq=Lq.Lp

L+=L.L=L.L L=L+∪ {}

2.2 Expressions rationnelles

Certains langages peuvent être décrits par des expressions rationnelles.

Définition 3 SoitΣun alphabet etS ={(,),+, .,∗,0,1}un ensemble de7éléments dis- joint de Σ. on appelle ensemble des expressions rationnelles (ou expressions régulières), l’ensemble des mots sur Σ∪S défini par :

1. 0, 1 eta sont des expressions rationnelles, pour tout a∈Σ;

2. si E et F sont des expressions rationnelles alors (E+F), (E.F) et(E) aussi.

On noteE l’ensemble des expressions rationnelles.

NB : on trouve parfois la notation|à la place de +.

Définition 4 (Langage associé) Étant donné une expression rationnelleE, on appelle langage associé à E le langageL(E) où L:E → P(Σ) est l’application définie par :

L(0) =∅ L(1) ={}

L(a) ={a} pour tout a∈Σ

L((E+F)) =L(E)∪ L(F) L((E.F)) =L(E).L(F) L((E)) =L(E)

(5)

Un langage est rationnel s’il existe une expression rationnelle à laquelle il est associé.

On note Rat(Σ) (voireRat(Σ)) l’ensemble des langages rationnels sur l’alphabetΣ :

Rat(Σ) ={ L(E)|E expression rationnelle}

Deux expressions rationnelles E et R sont dites équivalentes si et seulement L(E) = L(F).

NB :

1. On enlève en général les parenthèses s’il n’y a pas d’ambiguïté sur le langage asso- cié :a+b+cau lieu de(a+ (b+c))ou((a+b) +c).

2. On enlève également en général les «.».

3. On prend la convention que∗est prioritaire sur., lui-même prioritaire sur+pour réduire le nombre de parenthèses.

4. On confond parfois langage rationnel et expression rationnelle.

5. L’intérêt de différencier les deux est de permettre de raisonner par induction struc- turelle pour les expressions rationnelles.

2.2.1 Appartenance de ?

Définition 5 SiE est une expression rationnelle, on définit c(E), le terme constantde E comme l’expression rationnelle définie par :

c(1) = 1 c(0) = 0

c(a) = 0 pour a∈Σ

c(E+F) =c(E) +c(F) c(E.F) =c(E).c(F) c(E) = 1

avec la convention que dans toutes les expressions ci-dessus, on simplifie 0 +G, G+ 0, 1.G et G.1 en Get 0.G etG.0 en0.

Proposition 3 Pour toute expression rationnelle E, on a 1. c(E) = 1 si ∈ L(E);

2. c(E) = 0 si /∈ L(E).

Exercice : soit L1 etL2 deux langages.

Résoudre l’équation d’inconnueL∈ P(Σ) L=L.L1+L2

Exercice : les langages ci-dessous sont-ils rationnels ?

1. L’ensemble des mots sur l’alphabet {0,1} qui codent un multiple de trois en bi- naire. On notera les lettres de cet alphabet0et1pour les distinguer des expressions rationnelles 0et1.

(6)

2. L’ensemble des adresses e-mail valides.

Pour le premier point, on pourra s’intéresser aux langages L0, L1 etL2 des mots qui codent en binaire des nombres congrus respectivement à 0,1et2 modulo3.

Lignes extrait du RFC 5322 :

addr-spec = local-part "@" domain

local-part = dot-atom / quoted-string / obs-local-part domain = dot-atom / domain-literal / obs-domain dot-atom = [CFWS] dot-atom-text [CFWS]

dot-atom-text = 1*atext *("." 1*atext) 2.2.2 Expressions rationnelles étendues

On définit les expressions rationnelles étendues comme les expressions rationnelles en ajoutant deux opérations :

— l’intersection (E∩F);

— la différence (E\F).

On peut alors étendreL aux expressions rationnelles étendues en posant : L((E∩F)) =L(E)∩ L(F)

L((E\F)) =L(E)\ L(F)

Questions :

1. Quel rapport y a t-il entre les langages associés aux expressions rationnelles et ceux associés aux expressions rationnelles étendues ?

2. Y a t-il des langages qui ne peuvent être décrits par des expressions rationnelles ? Réponse

1. Ce sont les mêmes langages (preuve dans quelques temps).

2. Oui :P(Σ)n’est pas dénombrable alors que l’ensemble des expressions rationnelles l’est. Mais on peut être plus explicite : siΣ ={a, b},{anbn|n∈N}n’est pas ra- tionnel (exercice : montrer par induction que{anbn|n∈I}ne peut être rationnel siI est un sous-ensemble infini de N).

2.3 Une application : grep Variante utilisée : egrep.

Permet de chercher dans un fichier les lignes dont un facteur est dans un langage rationnel.

(7)

Exemples2 egrep ’a*b’

egrep ’^(0|1(01*0)*1)+$’

egrep ’\b[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}\b’

3 Automates finis

Les expressions rationnelles sont pratiques pour décrire un langage rationnel. En re- vanche, elles ne donnent pas de moyen opérationnel pour tester qu’un mot appartient à un langage rationnel donné.

Nous introduisons un dispositif opérationnel pour décrire certains langages : les auto- mates finis (finite state machine). On verra ensuite le lien entre langages rationnels et les langages reconnaissables par un automate.

3.1 Automates finis déterministes

Définition 6 (Automate fini déterministe) Un automate fini déterministe sur un alphabet Σest un quadruplet A= (Q, q0, F, δ) où

1. Qest un ensemble fini, appelé ensemble des états; 2. q0 est un élément de Q, appelé état initial ;

3. F est une partie de Q appelée ensemble des états terminaux (ou acceptants, ou finals, ou finaux).

4. δ est une fonction définie sur une partie de Q×Σ et à valeurs dans Q, appelée fonction de transition.

Pourq,a,q0 tels queδ(q, a) =q0, on dit que l’automate passe (ou effectue une transition) de l’état q à l’étatq0 à la lecture de la lettre a. On note parfois q·a=q0 ou q−→a q0.

Lorsque q·an’est pas défini, on dit qu’il y a blocage de l’automate.

On représente en général les automates par un dessin. Exemple d’automate sur l’al- phabet Σ :

2. Source pour l’adresse mail :http://ryanstutorials.net/linuxtutorial/cheatsheetgrep.php

(8)

Définition 7 (Automate fini déterministe (suite)) On dit que l’automate est : complet si l’ensemble de définition de la fonction de transition est Q×Σtout entier.

standard si aucune transition n’arrive sur l’état initial.

NB : l’automate fini dessiné précédemment est déterministe. De plus, il est complet et standard.

Définition 8 (Automate fini déterministe (suite)) On généralise la notation q ·a pour a∈Σà q·u pour u∈Σ en posant :

∀q∈Q q·=q

∀q ∈Q∀u∈Σ∀a∈Σ q·(u.a) = (q·u)·a

On dit qu’un mot u est accepté par l’automate A si q0·u ∈ F. Le langage reconnu par un automate A est l’ensembleL(A) des mots acceptés par A.

On note Rec(Σ) (voire Rec(Σ) l’ensemble des langages reconnaissables par un auto- mate.

NB : pour tout (u, v)∈Σ et toutq ∈Q,q·(u.v) = (q·u)·v.

Exercice : quel langage reconnaît cet automate ?

(9)

4 Langages et automates locaux

On aimerait voir quels langages peuvent être reconnus par des automates. Pour cela, on va commencer par s’intéresser à des langages, appeléslangages locaux ayant la propriété d’être (presque) caractérisés par trois informations :

1. Les lettres qui sont des premières lettres des mots du langage ; 2. Les lettres qui sont les dernières lettres des mots du langage ; 3. Les facteurs de longueur 2des mots du langage.

Plus précisément, soitL un langage sur un alphabetΣ, on définit : P1(L) ={a∈Σ|aΣ∩L6=∅ }={a∈Σ| ∃u∈Σ a.u∈L} S1(L) ={a∈Σ|Σa∩L6=∅ }={a∈Σ| ∃u∈Σ u.a∈L} F2(L) =

u∈Σ2

Σ∩L6=∅

=

u∈Σ2

∃v ∈Σ∃w∈Σ v.u.w∈L

Proposition 4 En posant P =P1(L),S =S1(L) et F =F2(L) on a nécessairement

L\ {} ⊂(PΣ∩ΣS)\ Σ Σ2\F Σ

(1) Démonstration : exercice.

Définition 9 (Langage local) On dit qu’un langage L est local s’il existe P ⊂ Σ, S⊂Σet F ⊂Σ2 vérifiant

L\ {}= (PΣ∩ΣS)\ Σ Σ2\F Σ

(2) Proposition 5 Un langage est local si et seulement si, en posantP =P1(L),S =S1(L) etF =F2(L), on a l’égalité (2). Autrement dit, les langages locaux sont exactement ceux pour lesquels l’inclusion (1) est une égalité.

(10)

Démonstration :

Il découle de la définition que si on a l’égalité (2) en posant P =P1(L),S =S1(L)et F =F2(L), le langage Lest local.

Réciproquement, supposons qu’il existe P, S et F tels que l’égalité (2) soit vérifiée.

Alors posonsP0 =P1(L),S0 =S1(L) etF0 =F2(L). On sait déjà qu’on a l’inclusion L\ {} ⊂ P0Σ∩ΣS0

\ Σ Σ2\F0 Σ Montrons l’inclusion réciproque.

Pour cela, remarquons qu’on a P0 ⊂P : en effet, on a successivementP0 =P1(L) = P1(L\ {})⊂P1(PΣ) =P carL\ {} ⊂PΣ.

De même, on a S0 ⊂S.

Enfin si ab ∈ F2(L), alors il existe u de la forme vabw dans L, donc ab /∈ Σ2\F , donc ab∈F. On a donc F0⊂F.

On a donc, par croissance des opérations ∩ et . et par décroissance du passage au complémentaire :

P0Σ∩ΣS0

\ Σ Σ2\F0 Σ

⊂(PΣ∩ΣS)\ Σ Σ2\F Σ

⊂L\ {}

Proposition 6 Tout langage local est associé à une expression rationnelle étendue.

Démonstration : les ensembles P,S et F étant finis, ils sont associés à des expressions rationnelles. Le résultat est alors immédiat.

En revanche, il n’est pas immédiat que les langages locaux sont en fait rationnels. Cela vient du fait, qu’on verra plus loin, que les langages associés aux expressions rationnelles étendues sont en fait rationnels, donc tout langage local est en fait rationnel.

NB : Il existe des langages rationnels non locaux. Par exempleL(aba) n’est pas local.

Pour montrer queL=L(aba)n’est pas local on peut par exemple calculerP1(L),S1(L) etF2(L) et comparerL\ {} et(P1(L)Σ∩ΣS1(L))\ Σ Σ2\F2(L)

Σ . Calcul de P1,S1 etF2 pour les langages rationnels.

Se fait par induction sur la structure des expressions rationnelles (on identifie E et L(E)) :

P1(0) =∅ P1(1) =∅

P1(a) ={a} pour tout a∈Σ

P1((E+F)) =P1(E)∪P1(F)

P1((E.F)) =P1(E) si c(E) = 0

P1((E.F)) =P1(E)∪P1(F) si c(E) = 1 P1((E)) =P1(E)

(11)

Le calcul se fait de la même manière pourS1 (attention au casE.F).

Pour celui deF2, on préfère en général calculer une fonctionSucc(E, a) ={b∈Σ|ab∈F2(L(E))}:

Succ(0, i) =∅ Succ(1, i) =∅

Succ(a, i) =∅ pour tout a∈Σ

Succ((E+F), i) =Succ(E, i)∪Succ(F, i)

Succ((E.F), i) =Succ(E, i)∪Succ(F, i)∪P1(F) si i∈S1(E) Succ((E.F), i) =Succ(E, i)∪Succ(F, i) si i /∈S1(E) Succ((E), i) =Succ(E, i)∪P1(E) si i∈S1(E) Succ((E), i) =Succ(E, i) si i /∈S1(E) Exercice : en utilisant ce qui précède, montrer queL(aba)n’est pas local.

Intérêt des langages locaux : pour vérifier qu’un mot non-vide appartient à un langage localL, il suffit de vérifier que sa première lettre appartient àP1(L), sa dernière àS1(L) et que tous ses facteurs de longueur2 sont dans F2(L). On voit que, si l’appartenance à ces ensembles peut être testée en temps constant (on suppose queΣ est petit), alors on peut tester en temps linéaire l’appartenance àL.

Proposition 7 Tout langage L local est reconnaissable par l’automate A= (Q, , F, δ), où Q est un ensemble contenant un état distinct qa pour chaque lettre de l’alphabet Σ, plus un état q, défini comme suit :

δ(q, a) =qa pour a∈P1(L) δ(qa, b) =qb pour ab∈F2(L)

F ={qa|a∈S1(L)} si /∈L F ={qa|a∈S1(L)} ∪ {q} si∈L si /∈L

Démonstration : exercice.

Proposition 8 L’automate construit ci-dessus comporte un nombre d’état égal à 1 + card Σ = Θ(card Σ).

Définition 10 (Automate local) Un automate fini déterministe est dit local si pour toute lettre a∈Σ, toutes les transitions étiquetées par aaboutissent dans un même état qa. Autrement dit, si pour toute lettrea∈Σ, il existe qa tel que pour tout q,q·aest égal à qa ou n’est pas défini.

Proposition 9 L’automate précédemment donné pour reconnaître un langage local est lui-même local. De plus, il est standard.

(12)

Proposition 10 SoitL un langage. Les trois propositions suivantes sont équivalentes : 1. L est un langage local ;

2. L est reconnu par un automate local standard.

3. L est reconnu par un automate local.

Démonstration : on a vu(1)⇒(2),(2)⇒(3)est trivial. Il reste à montrer (3)⇒(1).

Notons A= (Q, q0, F, δ) un automate fini déterministe local. Pour toute lettre x, on noteqx un état auquel tel que pour toutq,q·x vautqx ou n’est pas défini. Notons Lle langage reconnu parA. NotonsP l’ensemble des lettres étiquetant une transition partant de l’état initialq0,S l’ensemble des lettres étiquetant une transition arrivant sur un état final etF l’ensemble desabpour(a, b)∈Σ2 tel queqa·bsoit bien défini. Alors on montre qu’on a

L\ {}= (PΣ∩ΣS)\ Σ Σ2\F Σ

Proposition 11 Soit L et M deux langages locaux sur des alphabets disjoints. Alors L∪M, LM et L sont des langages locaux.

Démonstrations : on introduit AL etAM, des automates locaux reconnaissant respecti- vementL etM et on montre qu’on peut construire des automates locaux reconnaissant L∪M,LM etL.

Dessins

4.1 Expressions rationnelles linéaires

On peut maintenant reconnaître certains langages rationnels par automates et même par automates locaux.

Définition 11 Une expression rationnelle eest dite linéaire si tout lettre présente dans en’apparaît qu’une et une seule fois.

Exemple : sur l’alphabet latin, (ab)+cdeest linéaire. (ab)+cdea ne l’est pas.

Proposition 12 Tout langage dénoté par une expression rationnelle linéaire est local.

Démonstration : par induction structurelle.

On a vu précédemment :

1. Comment calculerP1(L),F1(L) etS2(L) pour un langage rationnel.

2. Comment construire un automate reconnaissant un langage local L.

On peut donc construire un automate reconnaissant tout langage rationnel linéaire.

exemple

(13)

5 Théorème de Kleene (et réciproque)

5.1 Automates non déterministes

Définition 12 (Automate fini (non déterministe)) Un automate finisur un alpha- bet Σ est un quadrupletA= (Q, I, F, δ) où

1. Qest un ensemble fini, appelé ensemble des états;

2. I est une partie de Q, appelé ensemble des états initiaux;

3. F est une partie de Q appelée ensemble des états terminaux (ou acceptants, ou finals, ou finaux).

4. δ est une application Q×Σ→ P(Q), appelée fonction de transition.

NB :

1. Il peut y avoir plusieurs états initiaux ;

2. Pour tout couple(q, a)∈Q×Σ,δ(q, c) est bien défini mais peut être vide.

3. On identifiera les automates finis déterministes et les automates finis pour lesquels I est un singleton{q0} et pour tout(q, a)∈Q×Σ,cardδ(q, a)≤1.

4. Pourq,a,q0tels queq0 ∈δ(q, a), on dit que(q, a, q0)est une transition de l’automate et on noteq −→a q0.

5. On notera aussiq·al’ensembleδ(q, a), pour(q, a)∈Q×Σ.

La bonne façon de comprendre les calculs effectués par un automate fini non-déterministe est de le voir comme une machine pouvant être dans plusieurs états à la fois. On peut ainsi généraliser l’application δ en l’application P(Q)×A→ P(Q) définie par :

∀E∈ P(Q)∀a∈Σ δ(E, a) = [

q∈E

q·a

On généralise alors δ en l’application δ : P(Q)×Σ → P(Q), également notée ·, définie par :

∀E∈ P(Q) E·=E

∀E ∈ P(Q)∀a∈Σ∀u∈Σ E·(u.a) = (E·u)·a

La deuxième ligne peut s’écrire :(·(u.a)) = (·a)◦(·u)si on convient d’écrire(·a) :E 7→E·a et(·u) :E 7→E·u.

Pour tout étatq et tout motu, on noteraq·u l’ensemble d’états{q} ·u.

On généralise la notation −→ au cas des mots : on écrira q −→u q0 s’il existe q0 ∈q·u, c’est-à-dire si us’écrita0. . . an−1 et qu’il existe des états q1, . . . , qn−1 tels que

q −→a0 q1 −→ · · ·a1 −−−→an−2 qn−1 an−1

−−−→q0

Pour tous (u, v)∈(Σ)2 et toutq,

q·(u.v) = [

q0∈q·u

q0·v

(14)

On dit qu’un mot u est accepté par l’automate (ou donne lieu à un calcul réussi) si I ·u∩F 6= ∅, autrement dit, s’il existe q ∈ I tel que q·u contienne au moins un état final. Ou encore : si et seulement s’il existeq ∈I,q0∈F tels queq −→u q0.

Le langage L(A) reconnu par un automateA est l’ensemble des mots donnant lieu à un calcul réussi.

On peut définir un automate par son ensemble de transitions plutôt que par la fonction de transition. Étant donné δ : Q×Σ → P(Q), l’ensemble de transitions associé à δ est {(q, a, q0)∈Q×Σ×Q|q0 ∈δ(q, a)} et pour tout sous-ensemble T de Q×Σ×Q, l’applicationδ : (q, a)→ {q0∈Q|(q, a, q0)∈T }est l’unique application Q×Σ→ P(Q) dont l’ensemble des transitions estT.

Définition 13 On dit qu’un automate non-déterministe A= (Q, I, F, δ) est complet si pour tout état q, et toute lettre a, il existe au moins un état q0 tel que A admette la transition q−→a q0, c’est-à-dire si pour tout(q, a)∈Q×Σ, on a cardδ(q, a)≥1.

5.2 Langage miroir et afnd

Un des intérêts des automates finis non déterministes est la symétrie, dans la définition, entre états initiaux et états finaux. Cette symétrie permet par exemple de montrer des résultats sur les miroirs de langages reconnaissables.

Étant donné un langageL, on note L˜ le langage miroir, c’est-à-dire{u˜|u∈L}.

Étant donné un automate fini non-déterministeA= (Q, I, F, δ), on appelle automate miroir de Al’automate A˜= (Q, F, I,δ)˜ où ˜δ est la fonction de transition telle que pour tout (q, a, q0) ∈ Q×Σ×Q, (q, a, q0) est une transition deA˜si et seulement si (q0, a, q) est une transitionA.

On en déduit :

∀(q, q0)∈Q2∀u∈Σ q0 ∈δ˜(q, u) ⇐⇒ q∈δ(q0,u)˜

D’où :

L( ˜A) =L(A)]

En particulier le langage miroir d’un langage reconnaissable par un afnd est reconnais- sable par un afnd.

5.3 Déterminisation d’un automate

Tout automate fini déterministe est un cas particulier d’automate fini non-déterministe.

Donc tout langage reconnaissable par un automate fini est reconnaissable par un auto- mate fini non-déterministe.

La réciproque est également vraie :

Théorème 1 Soit A un automate fini non déterministe. Il existe un automate fini dé- terministe reconnaissant le même langage.

(15)

Démonstration :

Soit (Q, I, F, δ) un afnd. On pose alors : Q0=P(Q)

q0=I

F0={E ∈ P(Q)|E∩F 6=∅ } δ0: Q0 × a→Q0

a 7→ δ(Q, a) A0= (Q0, q0, F0, δ0)

Les états deA0 sont donc tous les ensembles d’états deAetA0 est un automate complet.

Pour toutq ∈Q0 =P(Q), et tout motu ∈Σ, on montre aisément par induction sur u qu’on a :

δ0∗(q, u) =δ(q, u)

En particulier, pour tout u∈Σ, on a

δ(I, u)∩F 6=∅ ⇐⇒ δ0∗(I, u)∩F 6=∅

⇐⇒ δ0∗(I, u)∈F0 u∈ L(A) ⇐⇒ u∈ L(A0)

D’oùL(A0) =L(A).

Exemple

Problème : cet algorithme de déterminisation transforme un automate à n états en automate à 2n états. Peut-on faire mieux ?

En pratique, on peut parfois améliorer les choses en ne construisant pas tous les états du déterminisé mais uniquement les états accessibles.

Cependant :

Proposition 13 Pour toutnil existe un afnd àn+2 états tel que tout afd reconnaissant le même langage possède au moins 2n états.

Exercice : le démontrer.

Indication : considérer le langage L sur {a, b} formé des mots de la forme uav où u est un mot de longueur quelconque et v un mot de longueur n−1. Trouver un afnd reconnaissant L de longueur n+ 2. Montrer que pour tous mots distincts u et v de longueur n, l’exécution de ces mots par un automate fini déterministe reconnaissant L aboutit dans des états distincts. Conclure.

5.4 Automate de Glushkov d’une expression rationnelle On va maintenant pouvoir montrer :

Théorème 2 (Kleene) On a Rat(Σ)⊂Rec(Σ). Autrement dit, tout langage ration- nel est reconnaissable par un automate fini.

(16)

On va démontrer le résultat de façon effective, c’est-à-dire qu’on va donner une pro- cédure de construction d’un automate A reconnaissant une expression rationnelle E, appelée procédure de Berry-Sethi.

La procédure est la suivante : 5.4.1 Linéarisation

On linéarise E : pour cela, on note n le nombre de lettres apparaissant dans E et on pose Σ0 = Σ×[[0, n[[. On note alorsE0 l’expression obtenue en indiçant chaque lettre ak deE par un élémentkde[[0, n[[distinct. Indicerapark, c’est la remplacer par le couple (a, k) (qu’en pratique on notera ak). Σ0 est un alphabet et l’expression E0 obtenue est une expression régulière surΣ0.

Par exemple, pour E = aa(a|ab)∗b qui est une expression régulière sur {a, b}, on obtient E0 =a0a1(a2|a3b4)∗b5, qui est une expression régulière sur {a, b} ×[[0,6[[ (et même en fait sur l’alphabet plus restreint{a0, a1, a2, a3, b4, b5} comportant exactement 6 lettres).

Cette expression régulière E0 est linéaire par construction.

5.4.2 Calcul de l’automate local associé

On peut donc calculer l’automate local A0 associé : on calcule comme précédemment l’ensemble P1 des préfixes de longueur1,S1 l’ensemble des suffixes de longueur1 etF2

l’ensemble des facteurs de longueur 2. On détermine de plus si appartient ou non à L(E0).

Avec E0=a0a1(a2|a3b4)∗b5, on trouve P1=a0

S1=b5

F2={a0a1, a1a2, a1a3, a1b5, a3b4, a2a2, a2a3, b4a2, b4a3, a2b5, b4b5}

et /∈ L(E0). L’automate associé est donc :

5.4.3 Effacement des indices

On efface, dans l’automate obtenu, les indices sur les lettres des transitions, pour obtenir un automateA= (Q, I, F, δ)reconnaissant un langage deΣ. On garde cependant le même ensemble d’états. L’automate obtenu n’est a prioripas déterministe. L’automate obtenu est appeléautomate de Glushkov de l’expression rationnelleE.

(17)

Pour l’automate précédent, on trouve :

5.4.4 Déterminisation

On déterminise l’automate Aen un automate A00.

Une déterminisation brutale de l’automate précédent, donnerait 27 = 128 états. Ce- pendant, si on se contente de construire les états accessibles, on obtient un automate à 6 états, ce qui est très raisonnable :

5.4.5 Justification de la procédure

On sait que l’automate localA0 associé à l’expression rationnelle linéaire E0 reconnaît le langageL(E0) et par ailleurs queL(A) =L(A00). Il reste à montrer queL(E) =L(A).

Pour cela, notons f : Σ0 → Σ l’application d’effacement des indices, c’est-à-dire véri- fiant pour tout(a, k)∈Σ0,f(a, k) =a.

Notons f : Σ0∗ → Σ le morphisme de monoïde induit par f, c’est-à-dire l’unique application vérifiant : f() =et pour tout(a, u)∈Σ0×Σ0∗,f(a.u) =f(a).f(u).

NotonsfLl’applicationP(Σ)→ P(Σ)induite parf : pour toutL∈ P(Σ),fL(L) = {f(u)|u∈L}.

Proposition 14 Pour tous langages L1 et L2, on a

fL(∅) =∅ fL({}) ={}

fL(L1∪L2) =fL(L1)∪fL(L2) fL(L1.L2) =fL(L1).fL(L2)

fL(L1) =fL(L1)

(18)

Démonstration : Les deux premières égalités sont évidentes. La troisième est une pro- priété connue des images directes.

Pour la quatrième, soit u∈Σ. On a

u∈fL(L1.L2) ⇐⇒ ∃v∈L1.L2 u=f(v)

⇐⇒ ∃(v1, v2)∈L1×L2 u=f(v1v2)

⇐⇒ ∃(v1, v2)∈L1×L2 u=f(v1)f(v2)

⇐⇒ ∃(u1, u2)∈fL(L1)×fL(L2) u=u1.u2

⇐⇒ u∈fL(L1).fL(L2)

On en déduit fL(L1.L2) =fL(L1).fL(L2)et par une récurrence immédiate, pour tout n∈N,fL(Ln1) =fL(L1)n. D’où

fL(L1) =fL([

n∈N

Ln1) = [

n∈N

fL(Ln1) = [

n∈N

fL(L1)n=fL(L1)

Notons pour toute expression rationnelle E0 surΣ0, notonsfE(E0) l’expression ration- nelle surΣobtenue en remplaçant chaque lettre ade E0 parf(a).

Alors, en utilisant la proposition précédente, on montre immédiatement par induction surE0 qu’on a l’égalité :

L(fE(E0)) =fL(L(E0))

Proposition 15 Pour tout automate fini non déterministe A0 = (Q0, I0, F0, δ0) sur Σ0, notons fA(A0) l’automate fini non déterministeA= (Q0, I0, F0, δ) sur Σ où δ est obtenu par remplacement de chaque transition (q, a, q0) par une transition (q, f(a), q0).

Alors le langage reconnu par fA(A0) estfL(L(A0)) :

L(fA(A0)) =fL(L(A0))

Démonstration :

Pour tout (q, a, q0)∈Q0×Σ×Q0, on a la transitionq−→a q0 dansAsi et seulement s’il existe a0 ∈Σ0 tel qu’on a la transitionq −a0 q0 dansA0 etf(a0) =a.

On en déduit par récurrence que pour tout(q, u, q0)∈Q0×Σ×Q0, on a q−→u q0 dans Asi et seulement s’il existe u0 ∈Σ0∗ tel qu’on a q−u0 q0 dansA etf(u0) =u.

En particulier, u est accepté par fA(A0) si et seulement s’il existe u0 ∈ Σ tel que u=f(u0) etu0 est accepté parA0, d’où le résultat.

On peut donc déduire de ces résultats que dans la procédure de Berry-Sethi, on a L(E) =fL(L(E0)) =fL(L(A0)) =L(fA(A0)) =L(A) =L(A00)

L’automate construit par cette procédure reconnaît donc exactement le langage rationnel associé à l’expression rationnelleE.

On a donc montré le théorème de Kleene : tout langage rationnel est reconnaissable par un automate fini (déterministe).

(19)

5.5 Résultats sur les automates finis

On présente ici quelques résultats supplémentaires sur les automates finis.

5.5.1 Émondage

Définition 14 Soit A = (Q, I, F, δ) un afnd. On dit qu’un état q de A est accessible, s’il existe u∈Σ tel que q∈δ(I, u), autrement dit s’il existe qI ∈I telqI

−→u q.

On dit qu’un automate A est accessiblesi tous ses états le sont.

On dit qu’un état q deA est co-accessible, s’il existe u∈Σ etqF ∈F tel que q−→u qF. On dit qu’un automate est co-accessiblesi tout ses états le sont.

On dit qu’un automate est émondé si et seulement s’il est accessible et co-accessible.

On peut calculer l’ensemble des états accessibles. En effet pour tout ensemble d’étatE, on peut calculerφ(E)l’ensemble obtenu comme union deEet des étatsq0 tels qu’il existe une transition (q, a, q0) avec q ∈ E et a ∈ Σ. Alors l’ensemble des états accessibles est S+∞

n=0φn(I)qu’on peut calculer en initialisant une variableEàIet en itérant l’instruction E ←φ(E) tant que la taille deE augmente. En pratique, cela peut se produire au plus cardQ−cardI fois, donc l’ensemble des états accessibles est en faitScardQ−cardI

n=0 φn(I).

On peut calculer de la même façon l’ensemble des états accessibles.

NB : on verra plus tard qu’on peut présenter ce calcul comme un parcours de graphe, dont la complexité est dominée par la somme du nombre d’états et de transitions.

Proposition 16 Pour tout afndA= (Q, I, F, δ), il existe un afnd émondéA0 = (Q0, I0, F0, δ0) reconnaissant le même langage. Si aucun état de A n’est accessible ni co-accessible, cet automate est vide. Dans le cas contraire, si de plusAest déterministe,A0l’est également.

Dans tous les cas A0 est toujours plus petit queA au sens où il possède moins d’états, moins d’états initiaux, moins d’états finaux, et moins de transitions (au sens large).

Démonstration :

On note Q0 l’ensemble des états à la fois accessibles et co-accessibles dans Q.A0 est défini comme l’automate(Q0, I0, F0, δ0)oùI0 =Q0∩I,F0 =Q0∩F etδ0 est la fonction de transition associé à l’ensemble des transitions(q, a, q0)tel que(q, a, q0)soit une transition de Aetq ∈Q0 etq0 ∈Q0.

Pour tout mot u = a0. . . an−1 reconnu par A0, il existe des états q0, . . . , qn dans Q0 ⊂Q, avec q0 ∈I0 ⊂I etqn ∈F0 ⊂F, tels que pour tout i∈[[0, n[[,(qi, ai, qi+1) soit une transition de A0 donc de A, donc u est reconnu parA.

Réciproquement, soitu=a0. . . an−1 un mot reconnu parA, il existe des étatsq0, . . . , qn dansQ, avec q0 ∈I etqn∈F, tels pour touti,(qi, ai, qi+1) soit une transition deA.

Pour touti∈[[0, n+ 1[[, on aq0

a0···ai−1

−−−−−→qi dansAetq0 ∈I, donc l’étatqi est accessible dansA. De plus, qi −−−−−→ai···an−1 qn et qn∈ F, donc qi est co-accessible dans A. On a donc qi ∈Q0. Donc on a q0 ∈I0,qn∈F0 et pour touti∈[[0, n[[,(qi, ai, qi+1)est une transition de A0. Doncu est reconnu parA0.

Pour tout (q, a) ∈ Q0×Σ, cardδ0(q, a) ≤ δ(q, a) ≤ 1 donc si A est déterministe, A0 également.

(20)

5.5.2 Complétion

Proposition 17 Soit A = (Q, I, F, δ) un afnd. Alors on peut construire un automate A0 = (Q0, I, F, δ0) complet reconnaissant le même langage que A, possédant un état de plus que A et ayant le même état initial et les mêmes ensembles d’états finaux.

Si A est déterministe, alorsA0 l’est également.

Démonstration :

NotonsqP un nouvel état, n’appartenant pas àQ, qu’on appellera étatpuits et posons Q0 =Q∪ {qP }.

Pour tout couple(q, a)∈Q×Σ vide, on poseδ0(q, a) =δ(q, a) siδ(q, a) est non-vide etδ0(q, a) ={qP }sinon.

On pose égalementδ0(qP, a) ={qP } pour touta∈Σ.

Soituun mot etE ⊂Q. On montre, par récurrence sur la longueur deuqueδ0∗(E, u)\ {qP }=δ(E, u).

CommeqP ∈/F, on en déduit queδ0∗(E, u)etδ(E, u)ont avecF la même intersection.

En particulier soit δ0∗(I, u)etδ(I, u)sont tous deux disjoints de F, soit aucun ne l’est.

Doncu∈ L(A) ⇐⇒ u∈ L(A0).

DoncL(A) =L(A0).

5.5.3 Complémentaire d’un langage reconnaissable

Proposition 18 Le complémentaire d’un langage reconnaissable par un automate fini est reconnaissable par un automate fini.

Démonstration : Sans perte de généralité, on peut supposer qu’il s’agit d’un automate déterministe etcomplet A= (Q, q0, F, δ).

Notons alors A0 = (Q, q0, Q\F, δ).

A0 est également complet et déterministe.

Pour tout u∈Σ,q0·u est bien défini et on a u∈ L(A) ⇐⇒ q0·u∈F

⇐⇒ q0·u /∈(Q\F)

⇐⇒ u∈ L(A0)

DoncL(A0) = Σ\ L(A).

5.5.4 Automates produits

Définition 15 Soit A1= (Q1, I1, F1, δ1) et A2 = (Q2, I2, F2, δ2) deux automates finis.

On appelle produit de ces deux automates, et on note A1× A2 l’automate A= (Q1× Q2, I1×I2, F1×F2, δ) oùδ la fonction de transition telle qu’on a la transition(q1, q2)−→a (q01, q20) dans A si et seulement si on a les transitions q1 −→a q10 dans A1 et q2 −→a q20 dans A2.

Par ailleurs, on note A1 ⊗ A2 l’automate obtenu de la même façon que A mais en remplaçant l’ensemble des états finaux par (Q1×F2)∪(F1×Q2).

(21)

Proposition 19 SoitA1 etA2deux automates finis. AlorsL(A1×A2) =L(A1)∩L(A2).

Démonstration

Soit u=a0. . . an−1 ∈ L(A1× A2), alors on a dansA1× A2 des transitions (q01, q02)−→ · · ·a0 −−−→an−1 (q1n, q2n)

avec (q01, q20)∈I1×I2 et(qn1, qn2)∈F1×F2.

Donc, pouri∈ {1,2}, on a dansAi les transitions q0i −→ · · ·a0 −−−→an−1 qni

Orqi0∈Ii etqin∈Fi, donc u∈ L(Ai) pouri∈ {1,2}.

Réciproquement supposonsu=a0. . . an−1∈ L(A1)∩ L(A2). Alors pour i∈ {1,2}, il existe des transitions

q0i −→ · · ·a0 −−−→an−1 qni avec q0i ∈Ii etqni ∈Fi.

D’où

(q01, q02)−→ · · ·a0 −−−→an−1 (q1n, q2n) avec (q01, q20)∈I1×I2 et(qn1, qn2)∈F1×F2.

Doncu∈ L(A1× A2).

Corollaire 1 La différence de deux langages reconnaissables par des automates finis est reconnaissable par un automate fini.

Corollaire immédiat mais dont l’énoncé n’aurait pas paru évident à première vue : Corollaire 2 On peut décider3 si deux automates finis reconnaissent le même langage.

Démonstration :

On peut construire un automate reconnaissant la différence des deux langages. On peut émonder l’automate résultant. La différence est vide si et seulement si l’automate émondé est vide.

Proposition 20 Soit A1 et A2 deux automates finis complets et d’ensembles d’états initiaux non-vides. Alors L(A1⊗ A2) =L(A1)∪ L(A2).

Démonstration :

Soit u=a0. . . an−1 ∈ L(A1⊗ A2), alors on a dansA1⊗ A2 des transitions (q01, q02)−→ · · ·a0 −−−→an−1 (q1n, q2n)

avec (q01, q20)∈I1×I2 et(qn1, qn2)∈(F1×Q2)∪(Q1×F2).

Alors, qni ∈Fi pouri= 1 ou pouri= 2.

3. C’est-à-dire donner un algorithme pour tester

(22)

On a donc dans Ai

q0i −→ · · ·a0 −−−→an−1 qni Orqi0∈Ii etqin∈Fi, donc u∈ L(Ai)⊂ L(A1)∪ L(A2).

Réciproquement supposons u=a0. . . an−1 ∈ L(A1)∪ L(A2).

Supposonsu∈ L(A1)(le cas u∈ L(A2) est similaire). Alors il existe des transitions q01−→ · · ·a0 −−−→an−1 q1n

avec q01∈I1 etq1n∈F1.

Comme I2 6=∅, on peut choisirq20 ∈I2, et commeA2 est complet, il existe également des transitions

q02−→ · · ·a0 −−−→an−1 q2n avec q02∈I2 etq2n∈Q2. D’où

(q01, q02)−→ · · ·a0 −−−→an−1 (q1n, q2n)

avec (q01, q20)∈I1×I2 et(qn1, qn2)∈F1×Q2⊂(F1×Q2)∪(Q1×F2).

Donc u ∈ L(A1 ⊗ A2). On en déduit que l’union de deux langages reconnaissables non-vides est reconnaissable. Donc l’union de deux langages reconnaissables est recon- naissable.

5.5.5 Réciproque du théorème de Kleene

Théorème 3 On a Rec(Σ)⊂Rat(Σ). Autrement dit, tout langage reconnaissable par un automate fini est rationnel.

Démonstration : Soit A= (Q, I, F, δ) un afnd. Montrons queL(A) est rationnel.

Première démonstration (idée) : À tout étatq, on associeAql’automate(Q,{q}, F, δ) etLq le langage reconnu par Aq.

Soit u∈Σ. On a u ∈Lq si et seulement si q∈F ou u s’écrita.v avec a∈Σ,v∈Σ et qu’il existeq0 tel que q−→a q0 etv∈Lq0.

Donc on a l’égalité, pour toutq ∈Q :

Lqq∪ [

(a,q0)∈Σ×Q qa

−→q0

a.Lq0

où λq={}si q∈F etλq =∅ sinon.

On obtient donc un système, à cardQ inconnues, qu’on peut résoudre, de la façon suivante :

1. On choisit une équation. SiLq apparaît des deux côtés de l’équation, on l’isole du côté gauche à l’aide du lemme d’Arden. On remplace alorsLq par le membre droit de l’équation obtenue dans chacune des autres équations.

2. On résout alors le système formé des autres équations.

(23)

3. On en déduitLq.

Lemme 1 (d’Arden) Soient A et B deux langages. Le langage L = AB est le plus petit langage (pour l’inclusion ensembliste) qui est solution de l’équation

X = (A.X)∪B

De plus, si Ane contient pas le mot vide , le langage AB est l’unique solution de cette équation.

Deuxième démonstration :

On suppose, sans perte de généralité, queQest un intervalle[[0, n[[. Pour(i, j)∈[[0, n[[2 et k ∈ [[0, n+ 1[[, on note Lkij l’ensemble des mots u = a0. . . ap−1 tel qu’il existe des transitions i−→a0 q0 −→a1 . . .−−−→ap−2 qp−2

ap−1

−−−→ j allant de l’état ià l’état j telles que tous les états intermédiaires éventuelsq0, . . . , qp−2 appartiennent tous à[[0, k[[.

On montre alors, pour tout k∈[[0, n[[, tout(i, j)∈[[0, n[[2 : Lk+1ij =Lkij ∪Lkik

Lkkk

Lkkj

Par ailleurs, pour tout (i, j) ∈ [[0, n[[2, L0ij est le langage contenant le mot vide si et seulement i=j, et toute lettrea telle quei−→a j soit une transition.

On montre alors aisément par récurrence surkque pour tout(i, j),Lkij est un langage rationnel. Or on a

L(A) = [

(i,j)∈I×F

Lnij

Corollaire 3 Toute intersection de deux langages rationnels est un langage rationnel, tout complémentaire d’un langage rationnel est un langage rationnel et toute différence de deux langages rationnels est un langage rationnel.

Démonstration : le théorème de Kleene permet de montrer que les langages dont on considère l’intersection, le complémentaire ou la différence sont tous reconnaissables par automates finis. Les résultats précédents permettent de conclure que les intersections, complémentaires et différences le sont également et la réciproque du théorème de Kleene permet de conclure.

Corollaire 4 Les langages associés aux expressions rationnelles étendues sont donc les mêmes que ceux associés aux expressions rationnelles : ce sont les langages rationnels.

Démonstration : par induction immédiate sur la structure des expressions rationnelles étendues en utilisant les résultats déjà connus sur les langages rationnels ainsi quel le corollaire précédent.

(24)

5.6 Quelques langages non rationnels

Lemme 2 (de pompage/de l’étoile) Soit L un langage rationnel. Alors il existe un entier N tel que tout mot u de L vérifiant |u| ≥ N s’écrive pvs où p, v et s sont des mots vérifiant :

1. v6=; 2. |v| ≤N;

3. et ∀n∈N pvns∈L.

Démonstration : exercice. Indication : considérer un automate fini déterministeArecon- naissant L, noter N son nombre d’état et regarder la suite des états par lesquels passe l’automate en reconnaissant un motw. Combien y en a t-il ?

Exercice d’application directe : montrer que le langage {anbn|n∈N} n’est pas ra- tionnel.

Exercice : soit L⊂ {(,)} le langage des expressions bien parenthésées, c’est-à-dire le langageLdes mots sur l’alphabet{(,)}tel queu∈ {(,)}appartient àLsi et seulement si l’algorithme consistant à supprimer du mot une succession d’une parenthèse ouvrante et d’une fermante tant que c’est possible finit par donner le mot vide. Montrer que L n’est pas rationnel.

Exercice : le langage constitué des expressions algébriques bâties à partir de 0, 1, +,

×et les parenthèses n’est pas rationnel.

Généralisation du lemme de pompage :

Proposition 21 Soit L un langage rationnel. Alors il existe un entier N tel que pour tout mot u1u2u3 de L vérifiant |u2| ≥ N, u2 s’écrive pvs où p, v et s sont des mots vérifiant :

1. v6=; 2. |v| ≤N;

3. et ∀n∈N u1pvnsu3 ∈L.

Démonstration : exercice.

Exercice d’application : on poseL={u∈ {a, b} | |u|a=|u|b}. Montrer queLn’est pas rationnel. NB : on peut aussi résoudre cet exercice sans cette généralisation. Com- ment ?

Exercice : on note L l’ensemble des palindromes sur l’alphabet {a, b}. Montrer que L n’est pas rationnel. NB : on doit aussi pouvoir le montrer sans cette généralisation.

Comment ?

Exercices : les langages des mots contenant strictement moins de aque deb, des mots de la formeuu, des mots de la formeap pourp premier.

Attention : la propriété de l’étoile est nécessaire pour qu’un langage soit rationnel mais n’est pas suffisante. Un exemple est donné par l’exercice suivant :

Exercice : On poseΣ ={a, b}, etL={(aab)n(baa)n|n∈N}∪Σ{aaa}Σmontrer queL vérifie la propriété de l’étoile (N = 8 convient) mais n’est pas rationnel.

Références

Documents relatifs

Pour calculer algorithmiquement une expression rationnelle pour chacun d’eux, il suffit donc d’utiliser récursivement le procédé d’élimination basé sur le lemme

* pour les inscriptions faites en ligne avant le 30/09/21 pour un montant égal ou supérieur à 60 € par enfant Le tarif indiqué sur le site lors de votre inscription tient

Mais la circonspection dans laquelle la devise «Je me souviens», inscrite sur celles du Québec, l’a jeté lorsqu’il s’est installé chez nous, l’a conduit à

mais pas à une chaîne vide, ni b , ni ae ; Entre ces crochets, un intervalle de caractères peut être indiqué en donnant le premier et le dernier?. caractère, séparés par un tiret

Cela vient du fait, qu’on verra plus loin, que les langages associés aux expressions rationnelles étendues sont en fait rationnels, donc tout langage local est en fait rationnel.. NB

Cela vient du fait, qu’on verra plus loin, que les langages associés aux expressions rationnelles étendues sont en fait rationnels, donc tout langage local est en fait rationnel.. NB

Ceci permet d'utiliser le pipe |, ou, à défaut, de donner la main à l'utilisateur pour entrer des lignes de texte, où grep recherchera le motif.. Dans ce dernier cas, l'utilisateur

Imaginons que nous vivions dans un monde idéal où le PATH serait codé avec la règle suivante : pour chaque caractère deux-points présent dans un nom de dossier, il doit être écrit