Automates
option informatique
1/74
Automates
1 Sommaire
notion dautomate, leur intrt et leurs usages ; ee calculs dun automate et langage reconnu ; dterminisme, comment sen dispenser, et comment sen assurer ; e langages reconnaissables ; leurs proprits de stabilit ; ee e langages rationnels ; le thor`me de Kleene et le lemme de pompage ; e e expressions rguli`res ; e e le probl`me de la minimisation e
2/74
Automates
2 Alphabet et mots
Un alphabet est un ensemble ni non vide A dont les lments sont appels ee e e des caract`res. Un mot sur A est soit le mot vide, not , soit un mot de taille p : e m = m1 m2 . . . mp o` chaque mi est un caract`re. u e On note la longueur (on dit aussi la taille) dun mot ainsi : 0 = ||, p = |m1 . . . mp |.
e e La concatnation de deux mots est note par un point. Si |m| = p et |m | = q, |m.m | = p + q et le i-`me caract`re de m.m est e e mi , si i p; mip , si p + 1
p + q.
3/74
Automates
3 Notations
Lensemble des mots de longueur p se note Ap . Ap . Lensemble de tous les mots est A = {}
pN
(A , .) est un mono (cest le mono libre sur A), dont llment neutre de de ee est le mot . La loi est videmment non commutative mais associative. e Le mot abbaaabcc peut tre naturellement not ab2 a3 bc2 . e e e Le miroir dun mot m est not m. Par exemple : miroir = riorim.
4/74
Automates
4 Langages
A est suppos choisi une fois pour toutes.) e Un langage L est simplement un ensemble (ni ou non) de mots : lensemble de tous les langages est donc P(A ). On dispose donc des oprateurs ensemblistes habituels , , , \ et des e relations dinclusion entre langages. On pourra de la mme facon parler du complment dun langage L : il sagit e e de A \ L.
(Lalphabet
5/74
Automates
Ltoile dun langage L est le langage L = {} e On peut dnir bien dautres oprations, par exemple e e
2
L = {m A , m.m L}.
(A-t-on L = L ? et L2 = L ?) Ou encore le mlange (shue) de deux langages L et M : pour crire un e e mot de L M , on choisit un mot a de L et un mot b de M , puis on mlange e les lettres, en conservant toutefois lordre relatif dans chacun des mots a et b. Par exemple : bacddadb est dans {a, b} (c.{d} ), mais pas bacddacb.
6/74
Automates
Si (q, c) = q on dit que lautomate passe de ltat q ` ltat q ` la lecture e a e a du caract`re c. On note galement : q.c = q . e e
7/74
Automates
b q0
b q2
b q0
b q0 a q1 a q2
8/74
Automates
9/74
Automates
10/74
Automates
Calculs de lafd
let calcul alpha q u = let n = string_length u in let rec avance q i = if i = n then q else avance (assoc u.[i] alpha.transitions.(q)) (i + 1) in try avance q 0 with Not_found -> raise Blocage ;;
11/74
Automates
Reconnaissance
let reconna^t alpha u = mem (calcul alpha alpha.initial u) alpha.finals ;;
12/74
Automates
8 Langage reconnu
Le langage reconnu par lafd = (Q, q0 , F, ) est dni par : e L() = {u A , q0 .u F }. Autrement dit, u est un mot reconnu sil fait passer lautomate de son tat e initial ` un tat nal. a e Un langage est dit reconnaissable sil existe un afd dont il est le langage.
13/74
Automates
9 Accessibilit e
Un tat q est dit accessible sil existe un mot u tel que q0 .u = q. Lautomate e est dit accessible si tous ses tats sont accessibles. e e Un tat q est dit co-accessible sil existe un mot u et un tat nal qf tel e que q.u = qf F . Lautomate est dit co-accessible si tous ses tats sont e co-accessibles. Certains nomment utiles les tats ` la fois accessibles et co-accessibles. e a Emonder un automate, cest supprimer tous les tats inutiles. e Thor`me e e Pour tout afd tel que L() = , il existe un afd mond qui reconna e e t le mme langage. e
14/74
Automates
15/74
Automates
11 Exercice de programmation
Ecrire les fonctions suivantes :
accessibles : afd -> int list co_accessibles : afd -> int list
16/74
Automates let rec subtract l m = match l with | [] -> [] | t :: q -> if mem t m then subtract q m else t :: (subtract q m) ;; let accessibles alpha = let rec progresse trouvs = function e | [] -> trouvs e | t :: q -> let d = map snd alpha.transitions.(t) in let d = subtract d trouvs e in progresse (d @ trouvs) (d @ q) e in progresse [ alpha.initial ] [ alpha.initial ] ;;
17/74
Automates
18/74
Automates
Ainsi a-t-on dni sur tout Q A, et est sans blocage. e En outre, tout calcul de est aussi calcul de et donc L() L( ). Les seules transitions qui sortent de q y retournent, et cet tat nest e pas nal, donc les calculs russis de doivent viter ltat-puits : ce e e e sont donc aussi des calculs (russis) de , et L( ) = L(). e
19/74
Automates
q0
q1
q2
q0
q1 a
q2
b q
20/74
Automates
On aura not : quil peut y avoir plusieurs tats initiaux ; que les transitions e e sont dnies pour tout couple (q, c), mais leur font correspondre des e ensembles dtats (ventuellement vides, ce qui correspond aux blocages). e e
21/74
Automates
q .c
22/74
Automates
On trouvera la liste des tats auxquels on peut aboutir ` partir dun tat q ` e a e a la lecture dun caract`re c par assoc c alpha.transitions.(q) ; si lon e part dune liste l dtats on utilisera la fonction union de la biblioth`que e e Caml et on valuera e
it_list (fun a q -> union a (assoc c alpha.transitions.(q))) [] l
23/74
Automates
On en dduit : e
let calcul alpha dpart u = e let n = string_length u in let rec avance ql i = if i = n then ql else avance (it_list (fun a q -> union a (assoc c alpha.transitions.(q))) [] ql) (i + 1) in try avance dpart 0 e with Not_found -> raise Blocage ;; let reconna^t alpha u = let arrive = calcul alpha alpha.initials u e in it_list (fun b q -> b || mem q alpha.finals) false arrive ;; e
24/74
Automates
25/74
Automates
26/74
Automates
18 Cltures o
On appelle clture instantane (ou par -transitions) dun ensemble X o e dtats la plus petite partie (X) de Q qui contient X et qui reste stable e par : q (X), (q) (X). Notons (X) = {(x), x X}, puis 2 (X) = ((X)), etc. p (X) : la suite des k (X) est ncessairement e On a alors (X) = X
pN
stationnaire (pour linclusion) puisque Q est ni, sa limite est (X). La programmation de la clture est un exercice intressant. . . o e
27/74
Automates
On aura remarqu lanalogie avec le calcul des transitions : cest ici un e parcours de graphe. Mais, au fait, en largeur dabord ou en profondeur dabord ? (Il sen faut de peu. . . )
28/74
Automates
q .c .
q .c .
29/74
Automates
20 Dterminisme ou non ? e
Avantage des automates dterministes : leur ecacit en termes de calcul. e e Avantage des automates non dterministes : leur expressivit. e e Il est bien vident que tout langage reconnu par un afd est galement reconnu e e par un afnd (quil ne serait pas dicile de dcrire !). . . mais linverse est-il e galement vrai ? e Cest le probl`me de la dterminisation dun afnd. e e Nous allons voir quon dispose dune mthode gnrale de dterminisation, e e e e mais quelle peut tre tr`s coteuse : un cot exponentiel ! e e u u
30/74
Automates
q0
q1
q2
b b a
a q0 a q1 b q2
31/74
Automates
21 Dterminisation e
Thor`me e e Soit un automate non dterministe. Il existe un automate dterministe e e qui reconna le mme langage. t e Ce thor`me permet dutiliser indiremment un afd ou un afnd dans e e e nos preuves : il ny a pas eu denrichissement de la famille des langages reconnaissables qui serait li au non dterminisme. e e La preuve est constructive : cest lalgorithme des parties.
32/74
Automates
On consid`re = (Q, I, F, , ) et la fonction de clture e o associe. e Voici la construction de lafd = (P(Q), (I), F , ) : ltat initial est (I), qui est bien lment de P(Q) ; e ee F = {X Q, X F ?} est constitu des parties possdant au e e moins un tat nal ; e pour tout ensemble X dtats de Q et tout caract`re c, (X, c) = e e
qX
(q, c).
Remarque
Seuls les tats de qui sont des cltures sont accessibles. e o En pratique, on ne construit eectivement que des tats e accessibles.
33/74
Automates
22 Complexit de la dterminisation e e
Si lafnd de dpart poss`de n tats, notre algorithme conduit ` un algorithme e e e a n possdant 2 tats (mme si en ralit, on ne conserve que les tats e e e e e e accessibles). Le cot de la dterminisation est donc au moins exponentiel. u e Mais rien ninterdit a priori ` un algorithme plus astucieux dtre plus ecace. a e Eh bien, si : Thor`me e e Soit n un entier naturel non nul. Il existe un afnd possdant n tats tel e e que tout afd vriant L() = L() doit possder au moins 2n1 tats. e e e
34/74
Automates
Soit lafnd sans -transition = ({q1 , . . . , qn }, {q1 }, {qn }, ) dni e par : (q1 , a) = {q1 , q2 }, (q1 , b) = {q1 } ; (qn , a) = (qn , b) = et, pour 2 i n 1 : (qi , a) = (qi , b) = {qi+1 }. reconna les mots dau moins n 1 caract`res dont le (n 1)-`me t e e en partant de la n est un a. Soit un afd = (Q , q0 , F , ) qui reconnaisse ce mme langage : e n pour tout mot u, le mot u.a est reconnu, donc qu = (q0 , u) Q . Montrons que u qu est une injection de lensemble des mots de e taille n 1 sur {a, b} dans Q : on aura bien montr que |Q | 2n1 . Si u et v sont deux mots de longueur n 1 distincts, on peut les crire u = u .a.w et v = v .b.w (ou le contraire). e U = u.an2|w| L() mais V = v.an2|w| L(). Si on avait / qu = qv alors q0 .U = q0 .V qui devrait tre nal et non nal. e
35/74
Automates
23 Rcapitulation e
On dira de deux automates quils sont quivalents sils reconnaissent le mme e e langage. On a vu que tout automate non dterministe (avec ou sans -transitions) e est quivalent ` e a un automate dterministe ; e un automate dterministe complet (sans blocage) ; e un automate dterministe sans tat inutile. e e Notons R lensemble des langages reconnaissables.
36/74
Automates
37/74
Automates
25 Stabilits de R e
Thor`me e e reconna lintersection des langages L() et L( ). t Corollaire R est stable par intersection. Remplacant dans lensemble des tats nals par F Q e obtient un nouvel afd . Thor`me e e reconna la runion des langages L() et L( ). t e Corollaire R est stable par runion. e Q F , on
38/74
Automates
Supposons et complets, et choisissons comme ensemble dtats nals e du produit F (Q \ F ). On obtient un nouvel afd . Thor`me e e reconna la dirence ensembliste des langages L() et L( ). t e Corollaire R est stable par dirence ensembliste. e Corollaire R est stable par dirence symtrique. e e On en dduit le rsultat suivant, pas si vident a priori: e e e Corollaire On sait dcider si deux automates reconnaissent le mme lane e gage. Parce que le langage reconnu par leur dirence est vide si et seulement si e aucun tat nest utile. e
39/74
Automates
Dessinons maintenant deux automates et et ajoutons une transition instantane de chaque tat nal de vers chaque tat initial de . On e e e obtient un nouvel automate (non dterministe) qui reconna L().L( ). e t Thor`me e e R est stable par concatnation. e Il faut prendre plus de soin pour la stabilit par ltoile. Soit un automate. e e On ajoute un nouvel tat q qui sera le nouvel et unique tat initial et un e e nouvel tat q qui sera le nouvel et unique tat nal. Il sut de placer des e e -transitions depuis q vers q et vers chaque tat initial de lautomate de e dpart dune part et de chaque tat nal vers q dautre part, pour obtenir e e lautomate souhait. e Thor`me e e R est stable par toile. e
40/74
Automates
Or il est vident que e Lemme , A et, pour tout caract`re c, {c}, sont tous des e langages reconnaissables.
Corollaire Tout langage ni est reconnaissable. Corollaire Le complmentaire dun langage reconnaissable est reconnaise sable. Dailleurs il sut, dans un automate complet, dchanger tats nals et non e e nals pour obtenir lautomate qui reconna le complmentaire. t e
41/74
Automates
De mme il sut quon retourne les `ches dun afd, quon nomme initiaux e e les anciens tats nals, et nal lancien tat initial, pour obtenir un automate e e (non dterministe maintenant) qui reconna le miroir du langage reconnu e t par lafd de dpart. e Thor`me e e R est stable par miroir. Exercice Montrer que R est stable par shue et par racine carre, o` e u L = {u A , u.u L}.
42/74
Automates
[shue] Si = (Q, q0 , F, )(resp. = (Q , q0 , F , )) est un afd qui reconna L (resp. M ), on construit un afnd = (Q t Q , {(q0 , q0 )}, F F , ) en posant ((q, q ), c) = {((q, c), q ), (q, (q , c))} dont on vrie facilement quil reconna L M . e t [ L] Notons Q = {q0 , q1 , . . .qn } les n + 1 tats dun afd , e = (Q, q0 , F, ) qui reconna L. L est alors reconnu par lafd t n+1 = (Q , (q0 , q1 , . . . , qn ), F , ) o` on a pos u e ((p0 , . . . , pn ), c) = ((p0 , c), . . . , (pn , c)) et o` les tats naux sont de la forme : (p0 , . . . , pn ) avec pi F d`s u e e que p0 = qi . En eet un mot u conduira dans un tel tat nal si e q0 .u = p0 = qi et si qi .u = pi F , donc q0 .(uu) F .
43/74
Automates
44/74
Automates
Remarque
Pour viter un parenthsage trop lourd, on dnit un e e e ordre de priorit sur les oprateurs : a priorit sur . e e e qui a priorit sur | e e Ainsi ab |a reprsente (a.(b ))|a.
On pourrait voir E comme un langage sur lalphabet A {, , |, , ., (, )}. Il ne sagit pas dun langage reconnaissable. La taille dune expression rguli`re est le nombre de symboles qui la come e posent.
45/74
Automates
46/74
Automates
Par exemple : (ab(a|b) ab) est lensemble des mots dau moins quatre caract`res sur {a, b} qui commencent et se terminent par ab. e Lgalit des expressions rguli`res est bien sr note =. e e e e u e Deux expressions rguli`res x et y qui reprsentent le mme langage (ceste e e e `-dire que (x) = (y)) sont dites quivalentes, ce quon note x y. a e Nota Bene Le probl`me de dcider de lquivalence de deux exprese e e sions rguli`res est dicile. On en dira davantage plus e e tard.
Dans notre smantique, on remarque que est neutre pour |, absorbant pour e la concatnation, et ambig pour ltoile. En pratique, la seule expression e u e rguli`re contenant qui sera utilise est elle-mme. e e e e
47/74
Automates
Pour viter trop de parenth`ses, on a choisi dutiliser le type string plutt e e o quune concatnation de char. De la mme facon, on prote de lassociativit e e e du choix et de la concatnation pour permettre de les appliquer ` plus de e a deux arguments.
48/74
Automates
29 Langages rationnels
Dnition e [Langage rationnel] Lensemble Rat des langages rationnels sur lalphabet A est la plus petite partie de L(A) qui contienne le langage vide et les singletons, et qui soit stable pour lunion, la concatnation et ltoile. e e Sont donc en particulier langages rationnels : , A , tout langage ni. . . Nota Bene Les Amricains disent regular expression et regular lane guage. Il arrivera que vous entendiez en francais expres sion rationnelle, voire mme langage rgulier. . . tout cela e e na gu`re dimportance ! e
49/74
Automates
50/74
Automates
51/74
Automates
Nous verrons deux algorithmes qui construisent un automate reconnaissant le langage dcrit par une expression rguli`re: e e e le premier construit par une induction structurelle des automates de Thompson : cest-`-dire des afnd ne comportant quun tat initial o` a e u naboutit aucune transition et un seul tat nal do` ne part aucune e u transition ; le second construit un automate de Gloushkov ` partir dune expression a rguli`re quon aura au pralable dbarasse de toute occurrence de . e e e e e
52/74
Automates
On dessine sans dicult des automates e pour les langages , {} et les singletons. Puis, supposant construits des automates de Thompson 1 et 2 pour les expressions rguli`res e1 et e2 , e e on construit les automates de Thompson pour e1 .e2 , e1 et e1 |e2 de la facon suivante:
Automates de Thompson
1 2 1
53/74
Automates
54/74
Automates
55/74
Automates
a a a a
a b a b
b b
56/74
Automates
Nous prsentons trois algorithmes pour crire une expression rguli`re qui e e e e reprsente le langage reconnu par un automate donn : e e lalgorithme par limination des tats ; e e lalgorithme de McNaughton et Yamada ; lalgorithme par rsolution dquations. e e Lautomate suivant servira de support :
q1
b a
q2
57/74
Automates
58/74
Automates
plus ventuellement {} si un tat est ` la fois initial et nal, et on obtient e e a lexpression rguli`re cherche en valuant le choix (i.e. |) des e(n) pour e e e e p,q p initial et q nal. (k) (k) (k) La rcurrence senclenche car : e(k+1) = e(k) | ep,k+1 .(ek+1,k+1 ).ek+1,q . e p,q p,q Dans notre exemple : a b a|aa a b|aa b , E (1) = = on crit matriciellement E (0) = e b a a|aa a b|aa b aa a b (a b) aa a b(a b) puis E (2) se simplie en et aa a b (a b) aa a b(a b) on trouve lexpression rguli`re nale : L() est reprsent par lexpression e e e e e = | (a b) aa .
59/74
Automates
En outre, si Ap,q est lensemble des tiquettes des transitions de p vers q, on dispose e Ap,q .Lq , si p nest pas nal; qQ de Lp = {} Ap,q .Lq , si p est nal.
qQ
L1 = aL1 |bL2 | L2 = aL1 |bL2 On rsout un tel syst`me grce au lemme dArden : on trouve dabord L2 = b aL1 , que e e a lon reporte en obtenant L1 = b aL1 |. Une derni`re application du lemme dArden e fournit lexpression rguli`re e = (b a) . e e Dans notre exemple on a le syst`me dquations : e e Nota Bene Comme souvent dans ce genre de calculs, on confond all`grement e expressions rguli`res et langages correspondants, an dallger au e e e maximum les notations.
60/74
Automates
Lemme dArden
Thor`me e e Soient K et L deux langages sur le mme alphabet A. K .L est solution de e lquation X = K.X L. Si K, il sagit de la seule solution. e / On vrie sans dicult que K .L est solution. e e Rciproquement, si X est solution, L X donc par une rcurrence e e n simple n, K .L X et donc K .L X. Sil existait un mot dans X \ K .L, considrons en un, m, le plus e court possible. m L donc m K.X et scrit ainsi m = k.x avec / e |k| 1 si on suppose K. On a trouv ainsi x X plus court que / e m : cela impose x K .L, do` ` son tour m = k.x K .L, ce qui ua est la contradiction attendue.
61/74
Automates
Ces trois expressions sont donc naturellement quivalentes, ce quon peut e prouver ` la main (exercice. . . ). Mais on aimerait disposer dun moyen sr a u de dcider de cette quivalence. e e Cest une des applications de ce qui suit : ` chaque expression rguli`re, a e e on associe un afd par une des mthodes dj` vues. Sil existait une forme e ea canonique pour les automates, on aurait la solution.
62/74
Automates
63/74
Automates
64/74
Automates
37 Un automate minimal
Soit L un langage ayant un nombre ni de rsiduels. e Dnition e [Automate des rsiduels] Il sagit de lafd complet et accessible = e (res(L), L, F, ) o` F est lensemble des rsiduels de L contenant , et u e 1 1 1 1 o` (u .L, c) = c .(u .L) = (u.c) .L. u Thor`me e e Lautomate des rsiduels du langage L reconna le langage L. Il est de taille e t minimale parmi les afd complets et accessibles reconnaissant L. Corollaire Un langage est reconnaissable si et seulement sil poss`de un e nombre ni de rsiduels. e Par rcurrence sur |w|, on montre que pour tout mot w, et tout e rsiduel R = u1 .L, on a (R, w) = w1 .R = (u.w)1 .L. e Alors u L() (L, u) F u1 .L F u1 .L u L.
65/74
Automates
38 Minimisation
On a vu lexistence dun afd complet accessible minimal reconnaissant un langage L reconnaissable : lautomate des rsiduels, qui fournit donc en e quelque sorte un automate canonique. Mais si on me donne un afd, il nest pas vident de trouver le langage quil e reconna et de calculer ses rsiduels. t e On aimerait un algorithme permettant de minimiser lautomate sans passer par la description du langage reconnu. Cest lobjet de ltude qui suit : an de minimiser le nombre dtats, il e e convient de faire en sorte qu` deux tats distincts q = q correspondent a e deux rsiduels distincts : Lq = Lq . e
66/74
Automates
39 Miroir et minimisation
Pour tout automate , on note ici L(, q, q ) lensemble des mots u qui font passer lautomate de ltat q ` ltat q : L(, q, q ) = {u A , q q.u}. e a e Thor`me e e Soit un afnd mond (cest-`-dire sans tats inutiles) ayant un seul tat e e a e e initial q0 . est dterministe si et seulement si, pour tous les tats q, les L(, q0 , q) e e sont deux ` deux disjoints. a On rappelle que si L est le langage reconnu par un automate quelconque , son miroir est reconnu par lautomate obtenu ` partir de en renversant a le sens de chaque transition et en changeant tats naux et initiaux. e e
67/74
Automates
Si est un automate, on notera ici () lautomate dterministe sans e tat-puits (cest-`-dire mond) obtenu en appliquant ` lalgorithme de e a e e a dterminisation par parties. e On dmontre alors le thor`me suivant : e e e Thor`me e e Soit un automate quelconque. Notons successivement = , = (), = et enn = (). Alors est un automate co-accessible, et, dans , si q et q sont deux tats distincts, Lq = Lq . e qui signie en particulier que est un automate minimal quivalent ` . e a
68/74
Automates
Les tats de sont tous accessibles, puisque lautomate est e construit par dterminisation. Ainsi, les tats de sont tous coe e accessibles et ceux de aussi. Appliquant le thor`me prcdent ` lautomate dterministe , on en e e e e a e dduit que, pour les tats q de , les langages Lq sont deux ` deux e e a distincts et tous non vides. Pour conclure en ce qui concerne lautomate , il sut alors dobserver quun tat Q de est de la forme {q1 , . . . , qn } et que par e
n
consquent LQ = e
i=1
69/74
Automates
40 Equivalence de Nrode e
Soit = (Q, q0 , F, ) un afd complet et accessible. On dit de deux tats e q et q quils sont quivalents (au sens de Nrode), et on note q q , si e e Lq = {u, q.u F } = {u, q .u F } = Lq . On notera [q] la classe dun tat e q, et, pour toute partie X de Q, [X] = {[q], q X}. Lautomate quotient / est lafd complet accessible ([Q], [q0 ], [F ], ) o` u est dnie par ([q], c) = [(q, c)] e Nota Bene (vrier que cela a du sens !). e
En pratique, cela signie simplement quon peut confondre en un seul tat e toute une classe dquivalence. e Thor`me e e Lautomate quotient de Nrode dun afd accessible et complet est isomorphe e ` lautomate des rsiduels du langage quil reconna a e t.
70/74
Automates
71/74
Automates
Limplication q q = q.c q .c (valable pour tous tats q et e q et tout caract`re c) a dj` t voque : cest elle qui justie le e ea e e e e passage au quotient par la relation de Nrode. Cest, autrement dit, e que lalgorithme de Moore, par contraposition, ne marque que des paires dtats distinguables. e Montrons quil nen oublie pas : soit (q, q ) deux tats distinguables, e montrons quils seront marqus par lalgorithme. e Comme q q , on a Lq = Lq , et , q et q jouant des rles symtriques, o e on peut supposer lexistence dun mot u tel que q.u F mais q .u F . / On proc`de par rcurrence sur la taille de u. Le cas o` |u| = 0 est e e u trait par ltape 1 de lalgorithme. e e Si u = v.c o` c est un caract`re, (q.v).c F mais (q .v).c F : ainsi u e / Moore aura dcid d`s ltape 1 que (q.v).c (q .v).c et en aura e e e e dduit ` ltape 2 que q.v q .v. On est ramen ` la mme situation e a e ea e avec un mot v de taille |v| = |u| 1 et la rcurrence senclenche. e
72/74
Automates
Application Le langage L = {ap .bp , p N} nest pas reconnaissable. En eet, sinon, il existerait un entier n comme ci-dessus, et posant u = , v = an , w = bn , il existerait p 1 tel que k, an+kp .bn L.
73/74
Automates
74/74