DM : Automates pondérés

DM de Langages Formels 2 : Automates pondérés

Younesse Kaddar

I.

Quelques exemples

1.

%3 cluster_0 𝒜 q_0 q_0 q_0->q_0 a / 2  |  b / 1 q_0->b2 1 b1->q_0 1

En posant :

  • Q{q0}
  • 𝛴{a,b}
  • S(,+,×,0,1)
𝜆(q0)=𝛾(q0)1 𝜇(q0,a,q0)2 𝜇(q0,b,q0)1

on vérifie de manière immédiate que :

𝒜(w)=2|w|a

2.

Soit Math input error un automate séquentiel.


En s’inspirant de l’exemple vu en TD sur le demi-anneau (𝛴),,,,{𝜀}, en posant :

  • QQ
  • 𝛴𝛴
  • S(𝛴),,,,{𝜀}
𝜆(q){{m(q)} si m(q) est défini sinon 𝛾(q){{𝛾(q)} si 𝛾(q) est défini sinon 𝜇(q,a,q){{qa} si q𝒜aq est une transition de A sinon

alors

A(w){{A(w)} si A(w) est défini  sinon
%11 cluster_0 𝒜 q_0 q_0 q_0->q_0 a / q_0 ⊛ a q_1 q_1 q_0->q_1 b / q_0 ⊛ b q_1->q_1 a / q_1 ⊛ a q_2 q_2 q_1->q_2 b / q_1 ⊛ b q_2->q_2 a, b / q_2 ⊛ a, q_2 ⊛ b q_2->b2 𝛾(q_2) b1->q_0 m(q_0)

%27 cluster_0 𝒜' q_0 q_0 q_0->q_0 a / {q_0 ⊛ a} q_1 q_1 q_0->q_1 b / {q_0 ⊛ b} q_1->q_1 a / {q_1 ⊛ a} q_2 q_2 q_1->q_2 b / {q_1 ⊛ b} q_1->b3 q_2->q_2 a, b / {q_2 ⊛ a}, {q_2 ⊛ b} q_2->b2 {𝛾(q_2)} b1->q_0 {m(q_0)}

Donc avec le demi-anneau S, A est une fonction totale qui est en bijection immédiate avec A sur le domaine de définition de A.

Mais on veut l’égalité : on va donc modifier le demi-anneau, tout en restant aussi proche que possible de l’exemple précédent.

On introduit deux nouveaux symboles et dénotant respectivement un élément neutre (absorbant pour la deuxième loi) et un élément absorbant pour la première loi, et on pose :

S𝛴{,},+,,,𝜀

  • + est définie, pour tous ww𝛴, de la manière suivante :

    +() w w
    w w w
    w w w
    w w
  • est la concaténation des mots, prolongée par : w𝛴,

    • w=w=
    • w=w=
    • ==

On vérifie que S est bien un demi-anneau :

  1. (𝛴{,},+,) est bien un monoïde commutatif

    • + est associative : pour tous x,y,z𝛴{,} :

      • Si x= ou y= ou z= :

        x+(y+z)==(x+y)+z
      • Sinon si x= :

        x+(y+z)=y+z=(x+y)+z
      • Sinon si y= :

        x+(y+z)=x+z=(x+y)+z
      • Sinon si z= :

        x+(y+z)=x+y=(x+y)+z
      • Sinon si x=y=z :

        x+(y+z)=x=(x+y)+z
      • Sinon :

        x+(y+z)==(x+y)+z
    • + est commutative (le tableau est symétrique) et d’élément neutre

  2. (𝛴,,𝜀) est un monoïde :

    • est associative : pour tous x,y,z𝛴{,} :

      • Si x= ou y= ou z= :

        x(yz)==(xy)z
      • Sinon si x= ou y= ou z= :

        x(yz)==(xy)z
      • Sinon (associativité de la concaténation pour les mots) :

        x(yz)=(xy)z
    • a pour élément neutre 𝜀

  3. est distributive par rapport à + : pour tous x,y,z𝛴{,} :

    • Si x= :

      (y+z)==y+z(y+z)==y+z
    • Sinon si y=z= :

      x(y+z)==xy+xz(y+z)x==yx+zx
    • Sinon si x= :

      (y+z)==y+z(y+z)==y+z

      car l’un des deux derniers termes (à droite) vaut

    • Sinon si y=z ou z= :

      x(y+z)=xy=xy+xz(y+z)x=yx=yx+zx
    • Sinon si y= :

      x(y+z)=xz=xy+xz(y+z)x=zx=yx+zx
    • Sinon (x𝛴,y,z𝛴{} et yz) :

      x(y+z)=x==xy+xz(y+z)x=x==yx+zx
  4. est absorbant pour

Il s’ensuit qu’en posant :

  • QQ
  • 𝛴𝛴
  • S𝛴{,},+,,,𝜀
𝜆(q){m(q) si m(q) est défini sinon 𝛾(q){𝛾(q) si 𝛾(q) est défini sinon 𝜇(q,a,q){(qa) si q𝒜aq est une transition de A sinon

alors

A(w){A(w) si A(w) est défini  sinon

(la démonstration est analogue à ce qu’on a vu en TD : on le vérifie de manière immédiate, puisque est absorbant, et qu’on n’a qu’un seul chemin au plus dans A acceptant w, par déterminisme de la fonction séquentielle)

%45 cluster_0 𝒜 q_0 q_0 q_0->q_0 a / q_0 ⊛ a q_1 q_1 q_0->q_1 b / q_0 ⊛ b q_1->q_1 a / q_1 ⊛ a q_2 q_2 q_1->q_2 b / q_1 ⊛ b q_2->q_2 a, b / q_2 ⊛ a, q_2 ⊛ b q_2->b2 𝛾(q_2) b1->q_0 m(q_0)

%61 cluster_0 𝒜' q_0 q_0 q_0->q_0 a / q_0 ⊛ a q_1 q_1 q_0->q_1 b / q_0 ⊛ b q_1->q_1 a / q_1 ⊛ a q_2 q_2 q_1->q_2 b / q_1 ⊛ b q_1->b3 q_2->q_2 a, b / q_2 ⊛ a, q_2 ⊛ b q_2->b2 𝛾(q_2) b1->q_0 m(q_0)

3.

A(𝛴,Q,𝛿,I,F)

%79 cluster_0 𝒜 q_2 q_2 q_2->q_2 a, b q_0 q_0 q_0->q_0 a, b q_1 q_1 q_0->q_1 a q_1->q_2 b

%89 cluster_0 𝒜' q_2 q_2 q_2->q_2 a, b / 1 q_0 q_0 q_0->q_0 a, b / 1 q_1 q_1 q_0->q_1 a / 1 q_1->q_2 b / 1

En posant :

  • QQ
  • 𝛴𝛴
  • S,+,×,0,1
𝜆(q){1 si q est initial0 sinon 𝛾(q){1 si q est final0 sinon 𝜇(q,a,q){1 si q𝛿(q,a)0 sinon

alors

A(w)q1IAw1q2Awnqn+1F1××1n+1 fois=|{Cq1IAw1q2Awnqn+1FqiQ}|=|{C chemin acceptant étiqueté par w}|=pA(w)

4.

On note S le demi-anneau produit {,,,}|V| (non commutatif) muni des lois :

×()
+()

définies composante par composante, où :

  • sera interprété comme “la variable est vivante”
  • sera interprété comme “la variable est morte”
  • sera interprété comme “la variable est dans un état indéterminé”
  • est un élément neutre (pour +) absorbant rajouté artificiellement

NB : Par abus de notation, on notera de la même manière les lois définies sur {,,,} et les lois produit correspondantes sur {,,,}|V|

On vérifie bien que

  • (S,+) est un monoïde commutatif d’élément neutre

  • (S,×) est un monoïde d’élément neutre

  • × est distributive par rapport à + :

    • il suffit de le vérifier composante par composante : pour tous x,y,z{,,,} :

      • Si x= :

        ×(y+z)==+=×y+×z(y+z)×==+=y×+z×
      • Sinon si x= :

        ×(y+z)=y+z=×y+×z(y+z)×=y+z=y×+z×
      • Sinon si y=z= :

        x×(y+z)==x×y+x×z(y+z)×x==y×x+z×x
      • Sinon :

        x×(y+z)=x=x×y+x×z(y+z)×x=y+z=y×x+z×x
  • est absorbant

  • S est borné idempotent :

    • + est idempotent

    • Comme , S ne contient aucune chaîne infinie décroissante non stationnaire.

Donc S est un demi-anneau borné idempotent.

On pose G(Q,𝛴,S,𝜆,𝜇,𝛾), où

  • L’ensemble des états Q est l’ensemble des sommets de G
  • 𝛴I(V)
  • S({,,,}|V|,+,×,,)

Dans la suite, on notera x1,,xn les variables de V, et on indicera les vecteurs par i pour dénoter leur coordonnée selon xi.

Pour tous eI(V),q,qQ,i1,n :

𝜆(q)(,,) 𝛾(q){(,,) si q=qf(,,) sinon 𝜇(q,e,q)i{ si qeq est une arête de G et e est de la forme if e’(V’) ou y := e’(V’) avec yV,xiV sinon si qeq est une arête de G et e est de la forme xi := e’(V’) avec VV sinon

Pour tout chemin

Cqj1ej1qj2ej2ejm1qjmqf

montrons que la projection sur la i-ème composante de C permet de déterminer l’état de la variable xi

  • Cas 1 : Si pour tout k1,m1, xi n’apparaît pas dans ejk :

    alors xi est morte dans C, et :

    C=𝜆(qj1)k=1m1𝜇(qjk,ejk,qjk+1)𝛾(qf)=(,,)(k=1m1(,,))(,,)=(,,)

    donc on a bien Ci=

  • Cas 2 : Sinon, on note l le plus entier de 1,m1 tel que xi apparaît dans ejl : autrement dit, ejl est la première instruction du chemin C où apparaît xi

    • Sous-Cas 1 : si ejl est de la forme if e’(V’) ou y := e’(V’), avec yV,xiV : alors xi est vivante dans C, et :

      Ci=[𝜆(qj1)k=1m1𝜇(qjk,ejk,qjk+1)𝛾(qf)]i=[((,,)k=1l1𝜇(qjk,ejk,qjk+1)=(,,))𝜇(qjl,ejl,qjl+1)k=l+1m1𝜇(qjk,ejk,qjk+1)(,,)]i(associativité)=[((,,)k=1l1(,,))]i=[𝜇(qjl,ejl,qjl+1)]i=[k=l+1m1𝜇(qjk,ejk,qjk+1)(,,)]i=[𝜇(qjl,ejl,qjl+1)]i=[k=l+1m1𝜇(qjk,ejk,qjk+1)(,,)]i=
    • Sous-Cas 2 : si ejl est de la forme xi := e’(V’), avec VV : alors xi est morte dans C, et :

      Ci=[𝜆(qj1)k=1m1𝜇(qjk,ejk,qjk+1)𝛾(qf)]i=[((,,)k=1l1(,,))]i=[𝜇(qjl,ejl,qjl+1)]i=[k=l+1m1𝜇(qjk,ejk,qjk+1)(,,)]i=[k=l+1m1𝜇(qjk,ejk,qjk+1)(,,)]i=

Dans tous les cas, le résultat est acquis.


Pour tout sommet qQ, montrons que la projection sur la i-ème composante de

qC chemin partant de qC

permet de déterminer l’état de la variable xi

Supposons qu’il existe un chemin C de q vers qfxi est vivante.

Alors par commutativité de + :

qi=Ci=+CC chemin partant de qCi=

et le résultat est acquis.

Réciproquement, s’il n’existe aucun chemin de q vers qfxi est vivante : alors on ne peut pas avoir qi= puisque +({,,}2){,,}, donc une somme d’éléments différents de est différente de .


Il vient donc que, pour tout sommet q et chemin C, les variables vivantes de q et de C sont celles dont la coordonnée vaut .

5.

En se basant pour les observations faites précédemment, il apparaît que pour toute variable xi et pour tout état q :

  1. xi est vivante dans q si et seulement si il existe un chemin

    qqj1ej1qj2ej2ejm1qjmqf

    tel qu’en notant l le plus entier de 1,m1 tel que xi apparaît dans ejl (i.e. ejl est la première instruction du chemin où apparaît xi), ejl est de la forme

    if e’(V’) ou y := e’(V’)

    avec yV,xiV

  2. xi est morte dans q si et seulement si elle n’est pas vivante dans q et

    • il existe un chemin

      qqj1ej1qj2ej2ejm1qjmqf

      tel que la première instruction du chemin où apparaît xi est de la forme

      xi := e’(V’)

      avec VV

    ou

    • xi n’apparaît dans aucun chemin de q à qf

Si on veut que qi indique l’état de la variable xi dans l’état q, chaque transition qGeq doit donc vérifier les propriétés suivantes :

  1. P(qGeq,i) :

    si qi et e est de la forme

    if e’(V’) ou y := e’(V’)

    avec yV,xiV, alors

    qi=
  2. P(qGeq,i) :

    si qi et e est de la forme

    xi := e’(V’)

    avec VV, alors

    qi=
  3. P(qGeq,i) :

    si qi ou qi et xi n’apparaît pas dans e, alors

    qi=qi

On vérifie aussi que ces conditions sont suffisantes, d’après les observations précédentes.

De fait, la correction de l’algorithme suivant s’ensuit :

Initialiser tous les ||q||_i à ☠

Pour chaque x_i:
  Tant qu'il existe un transition t ≝ (q1 ⟶^e q') qui ne vérifie pas P_❓(t,i) ou P_☥(t,i):
      mettre ||q||_i ou ||q'||_i à ☥ pour vérifier la condition

NB : comme, à chaque étape de l’algorithme, les qi valent soit , soit : les conditions P(qGeq,i) sont toujours vérifiées, donc il est inutile d’en faire mention dans la boucle interne.

Terminaison

L’algorithme termine clairement, car

  • toute transition tqGeq telle que qi= vérifie P(t,i)
  • toute transition tqGeq telle que qi=qi{,} vérifie P(t,i)

et chaque qi ne peut être modifié (pour se voir attribuer la valeur ) qu’au plus une fois dans la boucle principale.

Complexité

Dans le pire des cas, il faudra modifier chacun des qi, pour tous q,i : et à chaque modification, on cherche une transition qui transgresse une des trois propriétés (en temps O(|𝛿|m)𝛿 est l’ensemble des transitions et m la taille maximale des instructions eI(V)) donc

la complexité de l’algorithme est en

O(|V||Q||𝛿|m)

  • Q est l’ensemble des états
  • 𝛿 est l’ensemble des transitions
  • m est la taille maximale d’une instruction de I(V)

NB : en fait, on ne modifiera jamais les qfi puisqu’il n’y a pas de transition sortante de qf, mais on ne cherche pas à être aussi précis.


Exemple :

x := 0
y := x+1
if x == 0:
  x := x+y
  goto line 2
%99 q_f q_f q_0 q_0 b->q_0 q_1 q_1 q_0->q_1  x := e(∅) q_2 q_2 q_1->q_2 y := e'(x) q_2->q_f if ¬ e''(x) q_3 q_3 q_2->q_3 if e''(x) q_3->q_2 x := e'''(x, y)
I(V)={x := e(∅),y := e’(x),if e”(x),if ¬ e”(x),x := e”’(x, y)}

On pose x1x,x2y

  • Initialisation :

    q q
    q0 (,)
    q1 (,)
    q2 (,)
    q3 (,)
    qf (,)
    %113 q_f q_f (☠ , ☠) q_0 q_0 (☠ , ☠) b->q_0 q_1 q_1 (☠ , ☠) q_0->q_1  x := e(∅) q_2 q_2 (☠ , ☠) q_1->q_2 y := e'(x) q_2->q_f if ¬ e''(x) q_3 q_3 (☠ , ☠) q_2->q_3 if e''(x) q_3->q_2 x := e'''(x, y)
  • xi=x :

    • La transition q2if ¬ e’‘(x)qf ne vérifie pas la propriété P :

      %127 q_f q_f (☠ , ☠) q_0 q_0 (☠ , ☠) b->q_0 q_1 q_1 (☠ , ☠) q_0->q_1  x := e(∅) q_2 q_2 (☥ , ☠) q_1->q_2 y := e'(x) q_2->q_f if ¬ e''(x) q_3 q_3 (☠ , ☠) q_2->q_3 if e''(x) q_3->q_2 x := e'''(x, y)
    • La transition q3x := e’’‘(x, y)q2 ne vérifie pas la propriété P :

      %141 q_f q_f (☠ , ☠) q_0 q_0 (☠ , ☠) b->q_0 q_1 q_1 (☠ , ☠) q_0->q_1  x := e(∅) q_2 q_2 (☥ , ☠) q_1->q_2 y := e'(x) q_2->q_f if ¬ e''(x) q_3 q_3 (☥ , ☠) q_2->q_3 if e''(x) q_3->q_2 x := e'''(x, y)
    • La transition q1y := e’(x)q2 ne vérifie pas la propriété P :

      %155 q_f q_f (☠ , ☠) q_0 q_0 (☠ , ☠) b->q_0 q_1 q_1 (☥ , ☠) q_0->q_1  x := e(∅) q_2 q_2 (☥ , ☠) q_1->q_2 y := e'(x) q_2->q_f if ¬ e''(x) q_3 q_3 (☥ , ☠) q_2->q_3 if e''(x) q_3->q_2 x := e'''(x, y)
  • xi=y :

    • La transition q3x := e’’‘(x, y)q2 ne vérifie pas la propriété P :

      %169 q_f q_f (☠ , ☠) q_0 q_0 (☠ , ☠) b->q_0 q_1 q_1 (☥ , ☠) q_0->q_1  x := e(∅) q_2 q_2 (☥ , ☠) q_1->q_2 y := e'(x) q_2->q_f if ¬ e''(x) q_3 q_3 (☥ , ☥) q_2->q_3 if e''(x) q_3->q_2 x := e'''(x, y)
    • La transition q2if e’‘(x)q3 ne vérifie pas la propriété P :

      %183 q_f q_f (☠ , ☠) q_0 q_0 (☠ , ☠) b->q_0 q_1 q_1 (☥ , ☠) q_0->q_1  x := e(∅) q_2 q_2 (☥ , ☥) q_1->q_2 y := e'(x) q_2->q_f if ¬ e''(x) q_3 q_3 (☥ , ☥) q_2->q_3 if e''(x) q_3->q_2 x := e'''(x, y)
    • La transition q2if e’‘(x)q3 ne vérifie pas la propriété P :

      %197 q_f q_f (☠ , ☠) q_0 q_0 (☠ , ☠) b->q_0 q_1 q_1 (☥ , ☠) q_0->q_1  x := e(∅) q_2 q_2 (☥ , ☥) q_1->q_2 y := e'(x) q_2->q_f if ¬ e''(x) q_3 q_3 (☥ , ☥) q_2->q_3 if e''(x) q_3->q_2 x := e'''(x, y)

Sortie :

q q
q0 (,)
q1 (,)
q2 (,)
q3 (,)
qf (,)

Propriétés de clôture

6.

Soient f:𝛴S une fonction reconnue par un automate pondéré A(Q,𝛴,S,𝜆,𝜇,𝛾), et h:SS un morphisme.

Alors en posant :

Ah(Q,𝛴,S,𝜆,𝜇,𝛾)
  • 𝜆h𝜆
  • 𝛾h𝛾
  • 𝜇h𝜇

il vient immédiatement (avec la notation matricielle) que pour tout mot w :

Ah(w)=𝜆𝜇(w)𝛾=(h𝜆)(h𝜇)(w)(h𝛾)=h(𝜆𝜇(w)𝛾)puisque h respecte les lois de S=h(A(w))=h(f)(w)

Donc

si f est reconnaissable et si h est un morphisme, h(f) est reconnaissable.

5.

Soient f:𝛴S et g:𝛴S deux fonctions reconnues respectivement par des automates pondérés Af et Ag.

Alors l’automate union Af+g obtenu en juxtaposant (en mettant “côte à côte”) les automates Af et Ag reconnaît f+g.

En effet, pour tout mot w (avec la notation matricielle et des notations évidentes) :

(f+g)(w)=f(w)+g(w)=Af(w)+Ag(w)=𝜆f𝜇f(w)𝛾f+𝜆g𝜇g(w)𝛾g

et d’après la sémantique des automates pondérés, 𝜆f𝜇f(w)𝛾f+𝜆g𝜇g(w)𝛾g est le poids de w dans l’automate union (la somme des sommes des poids de tous les chemins étiquetés par w dans chacun des automates égale la somme des sommes des poids de tous les chemins étiquetés par w dans l’automate union, par définition de l’automate union).

Donc

si f et g sont reconnaissables, f+g l’est aussi.

6.

Soient f:𝛴S et g:𝛴S deux fonctions reconnues respectivement par des automates pondérés Af et Ag, et (S,+,×) un demi-anneau commutatif.

Rappels sur le produit de Kronecker :

Si A𝕸m,n(S) et B𝕸p,q(S) :

AB(a11Ba1nBam1BamnB)=(a11b11a11b12a11b1qa1nb11a1nb12a1nb1qa11b21a11b22a11b2qa1nb21a1nb22a1nb2qa11bp1a11bp2a11bpqa1nbp1a1nbp2a1nbpqam1b11am1b12am1b1qamnb11amnb12amnb1qam1b21am1b22am1b2qamnb21amnb22amnb2qam1bp1am1bp2am1bpqamnbp1amnbp2amnbpq)

On a montré en prépa (il suffit de faire le calcul) que :

Propriété du produit mixte :

Si A,B,C,D sont des matrices à coefficients dans un demi-anneau commutatif, sous réserve de compatibilité des tailles :

(AB)(CD)=(AC)(BD)

Montrons que f×g est reconnaissable.

On note n (resp. m) le nombre d’états de Af (resp. Ag).

Avec la notation matricielle (et des notations évidentes), pour tout mot w :

(f×g)(w)=f(w)S×g(w)S=f(w)Sg(w)S(les éléments de S sont vus comme des matrices 1×1)=(𝜆f𝜇f(w)𝛾f)(𝜆g𝜇g(w)𝛾g)=(𝜆f𝜆g)(𝜇f(w)𝜇g(w))(𝛾f𝛾g)(produit mixte, car S est commutatif)=(𝜆f,1𝜆g,1𝜆f,1𝜆g,m𝜆f,n𝜆g,1𝜆f,n𝜆g,m)(𝜇f,11(w)𝜇g(w)𝜇f,1n(w)𝜇g(w)𝜇f,n1(w)𝜇g(w)𝜇f,nn(w)𝜇g(w))(𝛾f,1𝛾g,1𝛾f,1𝛾g,m𝛾f,n𝛾g,1𝛾f,n𝛾g,m)=Af×g(w)

en posant Af×g(Q,𝛴,S,𝜆,𝜇,𝛾)

  • QQf×Qg

  • qQf,qQg,𝜆((q,q))𝜆f(q)×𝜆g(q)

  • qQf,qQg,𝛾((q,q))𝛾f(q)×𝛾g(q)

  • a𝛴,q1,q2Qf,q1,q2Qg,𝜇((q1,q1),a,(q2,q2))𝜇f(q1,a,q2)×𝜇g(q1,a,q2)

Donc

si f et g sont reconnaissables et si S est commutatif, f×g est reconnaissable.

8.

L’hypothèse de commutativité de S est cruciale : le résultat précédent n’est pas vrai dans le cas général.

Contre-exemple

On se place sur le demi-anneau non commutatif S(𝛴),,,,{𝜀} et sur l’alphabet 𝛴{a,b}.

La fonction f définie sur tout mot w𝛴 par

f(w){w}

est clairement reconnaissable.

Mais ce n’est pas le cas de f×fw{w}{w}={w2}.

Par l’absurde, si A(Q,𝛴,S,𝜆,𝜇,𝛾) à N|Q| états reconnaissait f×f : on obtiendrait une contradiction en imitant la démonstration du lemme de pompage pour les automates finis.

En effet : le chemin qj1aqj2abqjmF étiqueté par aN+1b (il est unique car f2(aN+1b) est un singleton) passerait nécessairement deux fois par le même état qjk=qjk (disons que k<k) lors de la lecture des N+1 premières lettres, et il existerait deux entiers r1,l0 tels que

  • k+l+r=N+1
  • le même chemin où on a bouclé n fois sur qjkaaqjk+r1aqjk+r=qjk serait étiqueté par ak(ar)nalb

Or :

  • f2(aN+1b)={aN+1baN+1b}

  • f2(ak(ar)nalb)={ak(ar)nalbak(ar)nalb}={uvnw}

    • uvw=a2(N+1)b

on obtient une contradiction pour n assez grand :

  • soit à cause du nombre de b si v contient la lettre b

  • soit, si v ne contient pas la lettre b, en considérant les facteurs à gauche et à droite du b central (qui doivent être égaux dans ak(ar)nalbak(ar)nalb, mais qui ne peuvent pas l’être dans uvnw si v ne contient pas la lettre b)

On a donc montré que :

Si S n’est pas commutatif, et f et g sont reconnaissables, f×g n’est pas nécessairement reconnaissable.

Leave a comment