Vous êtes sur la page 1sur 9

Langages formels

Corrigé – Laboratoire 2

Exercice 1
a) (b*a* + a)*b : •

* b

• a

* *

b a

b) a + b + cd* = (a + b) + cd* : +

+ •

a b c *

d
Exercice 2
Le langage accepte les nombres décimaux divisibles par 4, c’est-à-dire :
{m | ∀ k ∈ N+, m = 4k}.

Une manière de vérifier si un nombre est multiple de 4 (ou divisible par 4) est
d’en calculer le « modulo 4 ». On trouve alors les cas suivants :
Cas 1 : m = 4k ⇒ %4 = 0
Cas 2 : m = 4k + 1 ⇒ %4 = 1
Cas 3 : m = 4k + 2 ⇒ %4 = 2
Cas 4 : m = 4k + 3 ⇒ %4 = 3
Cas 5 : m = 4k + 4 = 4(k + 1) ⇒ %4 = 0 ≡ Cas 1

Il y a donc 4 cas différents (les cas 1 et 5 étant équivalents). Nous pouvons


utiliser ces cas distincts comme 4 états de l’automate. Nous les nommerons
0, 1, 2 et 3, d’après le résultat du %4. Les nombres du type 1 (%4 = 0) sont
ceux qui doivent être acceptés par notre automate, donc l’état final sera
l’état 0. Comme l’automate n’a lu initialement aucun symbole, on considère
qu’il contient la valeur 0 et l’état initial sera donc l’état 0.

Cédric Bastien – Automne 2005 (Modifié : Aut2008)


Il reste à encore à ajouter les transitions à l’automate, mais voyons en quoi
consiste le fonctionnement de l’automate que nous avons construit jusqu’à
maintenant. Il y a tout d’abord 4 états :

L’état initial est l’état 0 car nous considérons que la valeur initiale est 0 et 0
% 4 = 0. Dans cet automate, on considère que « se trouver dans un état »
correspond au fait que si l’on calcul le % 4 du nombre lu jusqu’à présent, le
résultat doit correspondre au nom de l’état courant. Si par exemple
l’automate veut valider le nombre ‘37’, alors 37 % 4 = 1, ce qui veut dire
qu’après avoir lu les symboles ‘3’ puis ‘7’, l’automate doit se trouver dans
l’état 1.

La prochaine étape consiste à trouver les transitions. Comme il est possible à


tout moment de lire n'importe quel chiffre en entrée, il faut une transition qui
sort de chaque état sur chaque symbole. On peut trouver ces transitions une
par une, à l'aide d'exemples concrets. Tel que mentionné, après avoir lu le
symbole '3' on se retrouve visiblement à l'état 3, car 3 % 4 = 3. De l'état 3, si
l'on lit le symbole '7', on se retrouve à l'état 1 car 37 % 4 = 1. Ceci permet
d'ajouter 2 transitions: t(0, 3) = 3 et t(3, 7) = 1.

Cette approche pour construire l'automate repose cependant sur le fait que
l'affirmation suivante est vraie :

Si l'on connait le modulo d'un nombre particulier n, on peut trouver directement le


modulo du nombre formé par n auquel on accole un chiffre supplémentaire à son
extrémité droite, sans avoir à connaitre la valeur particulière de n.

Cette phrase résume un peu le fonctionnement de l'automate tel que défini


jusqu'ici, c'est-à-dire qu'en connaissant l'état courant (donc le modulo du
nombre lu jusqu'à présent) et le symbole d'entrée, on peut trouver le modulo
du nombre résultant. Je mentionne également “sans connaitre la valeur
particulière de n”, car du point de vue de l'automate, lorsqu'il se trouve dans
un état, il n'a aucune connaissance du nombre n qui a été réellement lu, tout
ce qu'il connait c'est le modulo de ce nombre.

Il faut donc prouver que cette affirmation est vraie avant de pouvoir utiliser
cette méthode pour construire l'automate. Pour ce faire, nous allons utiliser
les 2 propriétés suivantes :

Cédric Bastien – Automne 2005 (Modifié : Aut2008)


• (a + b) % n = (a % n + b % n) % n
• (a * b) % n = (a % n * b % n) % n

Aussi, définissons l'expression 'Aa' tel que 'A' représente tous les chiffres d'un
nombre, sauf le dernier qui lui est représenté par 'a'. Par exemple, Aa = 2517
implique que A = 251 et a = 7. Ainsi, on peut représenter les transitions de
notre automate par: t(A % n, a) = Aa % n. Autrement dit, si jusqu'à présent
on a lu le nombre A, on doit se trouver dans l'état A % n. À partir de cet état,
si on lit en entrée le symbole a, on doit se retrouver dans l'état Aa % n.

Il importe aussi de comprendre que mathématiquement, accoler 'a' à la


droite de 'A', pour former 'Aa' consiste à faire:

A * 10 + a = Aa

Par exemple, pour A = 251 et a = 7, on a:

251 * 10 + 7 = 2510 + 7 = 2517

Notez que ceci est vrai lorsque l'on travaille en base 10 (nombre décimaux).
Si l'on est en binaire par contre, il faut faire * 2, en base 8 on fait * 8, etc... En
généralisant à toutes les bases, on pourrait écrire:

A * base + a = Aa

Maintenant, montrons qu'il est possible de trouver la valeur de Aa % n à


partir des valeurs de A % n et a (sans avoir besoin de connaitre la valeur
particulière de A):

Aa % n = (A * base + a) % n
= ((A * base) % n + a % n) % n
= ((A % n * (base % n)) % n + a % n) % n
= ((A % n * (base % n)) + a) % n
Parmis toutes ces variables, voyons ce que nous connaissons:
• A % n → état de départ de la transition
• base → la base utilisée, par exemple la base 10 pour les nombres
décimaux
• n → le modulo utilisé
• a → le symbole d'entrée de la transition

Pour simplifier davantage, on peut réécrire l'équation ainsi:

((Ecourant * (base % n)) + symboleentrée) % n = Earrivée

Bref, à partir de l'état courant, du symbole d'entrée et connaissant la base et


le modulo n utilisé, on peut trouver directement avec cette formule l'état
d'arrivée. Ceci fonctionne peu importe l'état de départ, le symbole d'entrée,
la base et le modulo.

Pour reprendre l'exemple du nombre 2517, dans le cadre de l'exercice 3,


c'est-à-dire en utilisant la base 10 et le modulo 4, on obtient:

Cédric Bastien – Automne 2005 (Modifié : Aut2008)


((0 * (10 % 4)) + 2) % 4= 2 ⇔ t(0, 2) = 2
((2 * (10 % 4)) + 5) % 4= 1 ⇔ t(2, 5) = 1
((1 * (10 % 4)) + 1) % 4= 3 ⇔ t(1, 1) = 3
((3 * (10 % 4)) + 7) % 4= 1 ⇔ t(3, 7) = 1

Nous avons trouvé formellement 4 transitions de notre automate. Nous


pouvons trouver aisément les autres en suivant la même méthode. Notez
que vous n'avez pas à utiliser cette méthode formelle pour créer vos
automates, l'objectif n'était que de prouver qu'il est possible de créer un
automate fonctionnel qui utilise le reste du modulo pour représenter chaque
état. Maintenant que nous savons que c'est toujours possible de le faire, peu
importe la base et le modulo utilisé, nous pouvons créer les automates
intuitivement, en utilisant des exemples comme je l'ai fait initialement tout
en sachant que le résultat sera tout le temps correct.

Le résultat est le suivant:

Exercice 3
a) L11 = { akbak, ∀ k ∈ {1, 2, 3, …} }

Ce langage n’est pas régulier. On peut le prouver grâce au lemme de


pompage.
1. Soit n ∈ N+, le seuil de pompage de L11.
2. Prenons le mot z = anban, z ∈ L11 et |z| ≥ n.
3. Essayons de trouver une décomposition de z = uvw, telle que :
1. |v| ≥ 1
2. |uv| ≤ n
3. uviw ∈ L11, ∀ i ≥ 0

Nous obtenons les cas suivants:

Cédric Bastien – Automne 2005 (Modifié : Aut2008)


v= Preuve
aj | j ≥ 1 Si i ≠ 1, le nombre de ‘a’ avant et après le ‘b’ ne sera plus
ère
(1 série de le même.
‘a’)
Décomposition invalide :
Contient le ‘b’ |uv| > n car le ‘b’ est à la position n+1
et ou des ‘a’
dans la 2e série

Pour chaque décomposition possible de z, nous avons trouvé au moins une


contradiction qui nous empêche d’appliquer le lemme de pompage. Le
langage n’est donc pas régulier.

b) L12 = { akbm | k > m, ∀ k, m ∈ {0, 1, 2, …} }

Ce langage n’est pas régulier. On peut le prouver grâce au lemme de


pompage.
1. Soit n ∈ N, le seuil de pompage de L12.
2. Prenons le mot z = an+1bn, z ∈ L12 et |z| ≥ n.
3. Essayons de trouver une décomposition de z = uvw, telle que :
1. |v| ≥ 1
2. |uv| ≤ n
3. uviw ∈ L12, ∀ i ≥ 0
Nous obtenons les cas suivants:

v= Contradiction
a |j≥1
j
Si i = 0, le nombre de ‘a’ sera inférieur ou égal au nombre
(contient une de ‘b’. Ce mot ne fait pas partie du langage.
série de ‘a’
parmis les n
premiers)
Contient le ‘a’ à Décomposition invalide :
la position n+1 |uv| > n car v contient au moins un symbole à partir de la
ou contient des position n+1.
‘b’

Pour chaque décomposition possible de z, nous avons trouvé au moins une


contradiction qui nous empêche d’appliquer le lemme de pompage. Le
langage n’est donc pas régulier.

c) L13 = { akbm | k+m = 3p + 1, k, m, p ∈ {1, 2, 3, …} }

Ce langage est régulier. On peut le prouver en construisant l’automate.

Cédric Bastien – Automne 2005 (Modifié : Aut2008)


d) L14 = { apbq | p – q = 3k + 1, ∀ k ∈ {1, 2, 3, …} }

Ce langage n’est pas régulier. On peut le prouver grâce au lemme de


pompage.
1. Soit n ∈ N, le seuil de pompage de L14.
2. Prenons le mot z = an+4bn, z ∈ L14 et |z| ≥ n.
3. Essayons de trouver une décomposition de z = uvw, telle que :
1. |v| ≥ 1
2. |uv| ≤ n
3. uviw ∈ L14, ∀ i ≥ 0

Nous obtenons les cas suivants:

v= Contradiction
e
3 condition :
Si i = 0, le nombre de ‘a’ diminue, car |v| ≥ 1.

aj | j ≥ 1 Initialement, z = an+4bn, donc p – q = (n + 4) – (n) = 4 =


(contient une 3k +1, où k = 1. En réduisant le nombre de ‘a’ on réduit la
série valeur de p, sans modifier la valeur de q. Ceci implique
de ‘a’ parmis que p – q < 4. Or, il n’existe pas de valeur de 3k + 1 < 4
les n premiers) pour k ≥ 1.

Le mot généré ne fait donc pas partie du langage, peu


importe la longueur de v.
Contient un ‘a’ Décomposition invalide :
à partir de la |uv| > n car v contient au moins un symbole à partir de la
position n+1 ou position n+1.
contient des ‘b’

Pour chaque décomposition possible de z, nous avons trouvé au moins une


contradiction qui nous empêche d’appliquer le lemme de pompage. Le
langage n’est donc pas régulier.

e) L15 = { akb2k+1, ∀ k ∈ {0, 1, 2, …} }

Ce langage n’est pas régulier. On peut le prouver grâce au lemme de


pompage.

Cédric Bastien – Automne 2005 (Modifié : Aut2008)


1. Soit n ∈ N, le seuil de pompage de L15.
2. Prenons le mot z = anb2n+1, z ∈ L15 et |z| ≥ n.
3. Essayons de trouver une décomposition de z = uvw, telle que :
1. |v| ≥ 1
2. |uv| ≤ n
3. uviw ∈ L15, ∀ i ≥ 0

Nous obtenons les cas suivants:

v= Contradiction
a |j≥1
j e
3 condition :
(contient une Si i ≠ 1, le nombre de ‘a’ ≠ n alors que le nombre de ‘b’ =
série 2n+1.
de ‘a’)
Décomposition invalide :
Contient un ou |uv| > n car le premier ‘b’ est à la position n+1.
plusieurs ‘b’

Pour chaque décomposition possible de z, nous avons trouvé au moins une


contradiction qui nous empêche d’appliquer le lemme de pompage. Le
langage n’est donc pas régulier.

f) L16 = { apbraq | p+q ≥ r + 2, p, q, r ∈ {1, 2, 3, …} }

Ce langage n’est pas régulier. On peut le prouver grâce au lemme de


pompage.
1. Soit n ∈ N, le seuil de pompage de L16.
2. Prenons le mot z = anbna2, z ∈ L16 et |z| ≥ n.
3. Essayons de trouver une décomposition de z = uvw, telle que :
1. |v| ≥ 1
2. |uv| ≤ n
3. uviw ∈ L16, ∀ i ≥ 0

Nous obtenons les cas suivants:

v= Contradiction
e
3 condition :
aj | j ≥ 1
ère Si i = 0, le nombre de ‘a’ diminue, donc p < n ce qui
(1 série de
implique que p + q < r + 2. Le mot résultant ne fait donc
‘a’)
pas partie du langage.
Décomposition invalide :
Contient un ‘b’ |uv| > n car le premier ‘b’ est à la position n+1.
et/ou un ‘a’
dans la 2e série.

Cédric Bastien – Automne 2005 (Modifié : Aut2008)


Pour chaque décomposition possible de z, nous avons trouvé au moins une
contradiction qui nous empêche d’appliquer le lemme de pompage. Le
langage n’est donc pas régulier.

Exercice 4

La première chose à faire, est de s’assurer que les états sont nommés de 1 à
n, où n est le nombre d’états (ici de 1 à 3). C’est déjà le cas pour l’automate
qui est fourni, on peut continuer :

Note : Cette table a été construite grâce aux expressions qui se trouvent
plus bas.

k=
R(i, j, k) \ 0 1 2
R(1, 1, k) ε ε ε
R(1, 2, k) a a aa*
R(1, 3, k) b b aa*b + b
R(2, 1, k) ∅ ∅ ∅
R(2, 2, k) a+ε a+ε a*
R(2, 3, k) b b a*b
R(3, 1, k) a a a
R(3, 2, k) b aa + b (aa + b)a*
R(3, 3, k) ε ab + ε (aa + b)a*b + ab + ε

Pour construire la colone k=0, on applique les règles suivantes :


- S’il y a un arc de i vers j, alors R(i, j, 0) = symbole(s) sur cette
transition
- Si i = j, alors il faut rajouter ε.

Pour construire les autres colones, on applique la règle suivante :


R(i, j, k) = R(i, k, k-1)R(k, k, k-1)*R(k, j, k-1) + R(i, j, k-1)

Pour k = 1:
R(1, 1, 1) = R(1, 1, 0)R(1, 1, 0)*R(1, 1, 0) + R(1, 1, 0) = ε
R(1, 2, 1) = R(1, 1, 0)R(1, 1, 0)*R(1, 2, 0) + R(1, 2, 0) = a
R(1, 3, 1) = R(1, 1, 0)R(1, 1, 0)*R(1, 3, 0) + R(1, 3, 0) = b
R(2, 1, 1) = R(2, 1, 0)R(1, 1, 0)*R(1, 1, 0) + R(2, 1, 0) = ∅
R(2, 2, 1) = R(2, 1, 0)R(1, 1, 0)*R(1, 2, 0) + R(2, 2, 0) = a+ε
R(2, 3, 1) = R(2, 1, 0)R(1, 1, 0)*R(1, 3, 0) + R(2, 3, 0) = b
R(3, 1, 1) = R(3, 1, 0)R(1, 1, 0)*R(1, 1, 0) + R(3, 1, 0) = a
R(3, 2, 1) = R(3, 1, 0)R(1, 1, 0)*R(1, 2, 0) + R(3, 2, 0) = aa + b
R(3, 3, 1) = R(3, 1, 0)R(1, 1, 0)*R(1, 3, 0) + R(3, 3, 0) = ab + ε

Pour k = 2 :
R(1, 1, 2) = R(1, 2, 1)R(2, 2, 1)*R(2, 1, 1) + R(1, 1, 1) = a(a+ε)* + ε = ε
R(1, 2, 2) = R(1, 2, 1)R(2, 2, 1)*R(2, 2, 1) + R(1, 2, 1) = a(a+ε)*(a+ε) + a = aa*
R(1, 3, 2) = R(1, 2, 1)R(2, 2, 1)*R(2, 3, 1) + R(1, 3, 1) = a(a+ε)*b + b = aa*b + b

Cédric Bastien – Automne 2005 (Modifié : Aut2008)


R(2, 1, 2) = R(2, 2, 1)R(2, 2, 1)*R(2, 1, 1) + R(2, 1, 1) = (a+ε)(a+ε)*∅ +∅ = ∅
R(2, 2, 2) = R(2, 2, 1)R(2, 2, 1)*R(2, 2, 1) + R(2, 2, 1) = (a+ε)(a+ε)*(a+ε) + (a+ε)
= a*
R(2, 3, 2) = R(2, 2, 1)R(2, 2, 1) R(2, 3, 1) + R(2, 3, 1) = (a+ε)(a+ε)*b + b = a*b
*

R(3, 1, 2) = R(3, 2, 1)R(2, 2, 1)*R(2, 1, 1) + R(3, 1, 1) = (aa+b)(a+ε)*∅ + a = a


R(3, 2, 2) = R(3, 2, 1)R(2, 2, 1)*R(2, 2, 1) + R(3, 2, 1) = (aa+b)(a+ε)*(a+ε) + aa + b
= (aa+b)a*
R(3, 3, 2) = R(3, 2, 1)R(2, 2, 1) R(2, 3, 1) + R(3, 3, 1) = (aa+b)(a+ε)*b + ab + ε
*

= (aa+b)a*b + ab + ε

Nous cherchons à trouver l’expression régulière pour passer de l’état 1 (état


initial) à l’état 2 (état final), en passant possiblement par tous les états (donc
k=3). Il faut donc trouver la valeur de R(1, 2, 3)

R(1, 2, 3) = R(1, 3, 2)R(3, 3, 2)*R(3, 2, 2) + R(1, 2, 2)


= (aa*b + b)((aa + b)a*b + ab + ε)*(aa + b)a* + aa*
= (aa*b + b)((aa + b)a*b + ab)*(aa + b)a* + aa*

L’expression régulière correspondant à l’automate donnée dans la question


est donc l’expression que nous venons de trouver.

Cédric Bastien – Automne 2005 (Modifié : Aut2008)

Vous aimerez peut-être aussi