1.6. EXPRESIONES REGULARES.
Construiremos lenguajes regulares
más complejos a partir de otros lenguajes regulares pequeños. Los lenguajes
más simples del alfabeto S serán
cadenas simples de longitud uno. Sin embargo, con estos no podremos construir el lenguaje
vacío Æ ni el lenguaje {
l}. Cojamos como base la colección de bloques que contiene el
lenguaje vacío y todos los lenguajes de cadenas simples de longitud uno
(luego se verá porque no se coge la cadena vacía como bloque de
formación). Para un mismo alfabeto y con las operaciones de unión,
concatenación y estrella de Kleene de los bloques de construcción,
podremos construir otros lenguajes regulares más complejos.
1.6.1. Unión de
lenguajes
La unión de dos lenguajes regulares
es otro lenguaje regular. Se utiliza la operación de unión de conjuntos;
así, para el alfabeto S ={x,y} si L1
= {x,xy} y L2 = {yz,yy} entonces su unión
será L1 È L2 = {x,xy,yz,yy
}.
Para modificar los diagramas de
transiciones deberemos conseguir que se vaya a una u otra de las estructuras originales,
pero sin mezclarlas (si se mezclan, se admitirían cadenas que no pertenecen al
lenguaje). Para ello cogeremos los diagramas originales de los dos lenguajes.
Se dibuja un estado nuevo:
- Será el nuevo estado inicial
- Será de aceptación si alguno de los estados iniciales de los diagramas
originales lo era
- Por cada uno de los arcos que hay desde los estados iniciales originales hacia otros
(puede ser el mismo), se dibuja desde el nuevo estado inicial un arco hacia el estado
destino del arco correspondiente en el diagrama original y se etiqueta con el mismo
símbolo
- A continuación se elimina la característica de inicio de los estados
iniciales originales.
1.6.2.
Concatenación de lenguajes
La concatenación de dos lenguajes regulares es otro lenguaje
regular. Se concatenan una cadena del primer lenguaje y una cadena del segundo. Con
L1 y L2 anteriores la concatenación (que se denota
°) será L1 °
L2 ={xyx,xyy,xyyz,xyyy}. La concatenación no es
conmutativa (L1 ° L2
¹ L2 ° L1
).
Cogemos los diagramas originales de los
dos lenguajes:
- Se dibuja el diagrama original de L1
- desde cada estado de aceptación del diagrama de L1 se dibuja un arco
hacia cada estado de L2 que sea el destino de un arco del estado inicial de
L2 y se rotula con el mismo símbolo
- Dejar que los estados de aceptación de L1 lo sean si el estado inicial
de L2 también lo es.
1.6.3. Estrella de Kleene
La estrella de Kleene de cualquier
lenguaje regular también es regular. Se caracteriza por que se utiliza solo un
lenguaje en lugar de dos. Se logra formando todas las concatenaciones de cero
(cadena vacía) o más cadenas del lenguaje que se amplía. La
operación se representa con el asterisco supraíndice ( * ).
Como se vio al principio de este apartado,
la cadena vacía, l, no se consideraba como uno de
los bloques de formación de lenguajes, y es porque se genera a partir de
Æ por medio de la estrella de Kleene; la cadena
vacía pertenece a la estrella de Kleene de cualquier lenguaje posible y por lo
tanto debe pertenecer a Æ* y, por tanto,
Æ**={l
}.
Para modificar el diagrama de transiciones,
se coge el diagrama:
- Se añade un nuevo estado que va a ser el de inicio
- Este nuevo estado inicial también lo marcaremos como de aceptación
(para que así puede aceptar la cadena vacía)
- Por cada uno de los arcos que hay desde el estado inicial original hacia otros
(puede ser el mismo), se dibuja desde el nuevo estado inicial un arco hacia el estado
destino del arco correspondiente en el diagrama original y se etiqueta con el mismo
símbolo
- Desde cada estado de aceptación se dibuja un arco por cada uno de
los que salen desde el estado inicial original hacia otros (puede ser el mismo). Este sale
hacia el estado destino del arco correspondiente que salía del estado
inicial en el diagrama original y se etiqueta con el mismo símbolo.
- Se quita la característica de inicio del estado inicial original.
1.6.4 Expresiones regulares
Una expresión regular para
un alfabeto S se define como:
- Æ es una expresión regular
- Cada miembro de S es una expresión regular
- Si p y q son expresiones regulares, entonces también lo es
(p È q)
- Si p y q son expresiones regulares, entonces también lo es
(p ° q)
- Si p es regular, entonces también lo es p*
Para cada expresión regular r de
un alfabeto S representa un lenguaje L(r).
Además, si p y q son expresiones regulares, L(p
È q) = L(p) È L(q), L(p
°q) = L(p) °L(q) y L(p*) = L (p)
*.
Las expresiones regulares también
especifican lenguajes (al igual que diagramas tablas, autómatas y gramáticas)
. Son una manera concisa de expresar lenguajes regulares
(en una sola línea se puede describir un autómata finito completo).
TEOREMA.- Dado un alfabeto S (tiene
que ser el mismo), los lenguajes regulares de S son
exactamente los lenguajes representados por las expresiones regulares de
S.
DEMOSTRACIÓN
|
Lo primero que hay que tener en cuenta es
que un lenguaje representado por una expresión regular es regular (demostrado en los
subapartados anteriores). Lo siguiente que haremos será representar con una
expresión regular cualquier lenguaje aceptado por un autómata finito.
Además, vamos a considerar válidos unos diagramas, que llamaremos
generalizados, en los que los arcos van a estar etiquetados con expresiones
regulares, en lugar de sólo símbolos. Para ello, vamos a ir reduciendo el
diagrama hasta tener solo uno o dos estados:
- Llamemos T al diagrama de transiciones original. Se hacen tantas copias de T como
estados de aceptación haya. Cada Ti tendrá sólo un estado
de aceptación distinto. La expresión regular resultante será la
unión de cada una de las expresiones resultantes de cada Ti
(T = T1 È T2
È .... È Tn)
- Considerando por separado cada Ti, y para ir reduciendo el diagrama estado
por estado, se usan las operaciones que se definieron anteriormente:
- Unión.- Si hay varios arcos que conectan en la misma dirección
dos estados, estos se puede sustituir por uno etiquetado con la unión de las
expresiones de esos arcos
- Estrella de Kleene.- La expresión regular será la unión de
las etiquetas de los arcos que salen e inciden en un mismo estado
- Concatenación.- Hay dos casos: dado un estado, si solo tiene un arco incidente y
otro saliente, la expresión resultante será la concatenación de las
etiquetas del arco incidente y la del saliente; si en el estado tiene un arco solo
incidente, arcos que salen e inciden en el mismo estado y un solo arco saliente, la
expresión resultante será la concatenación de la etiqueta del arco
incidente, la estrella de Kleene de la unión de las etiquetas de los arcos que iban
del estado al mismo y la etiqueta del arco saliente por ese orden.
Estas operaciones se van aplicando estado a
estado, de manera que nos van quedando sucesivamente diagramas con n estados, n-1 estados,
..., 3 estados, y 2 ó 1 estado. En estos dos últimos casos:
- Si el diagrama T queda con sólo un estado, que es inicial y de aceptación
a la vez, la expresión resultante es la estrella de Kleene de la unión de las
etiquetas de los arcos que salen e inciden en este mismo estado.
- Que T quede con dos estados, uno inicial, y el otro de aceptación. Aquí
se pueden tener alguno o todos de estos 4 arcos: (r)del inicial al inicial, (s) del inicial
al de aceptación, (t) de aceptación a aceptación y (u) de
aceptación al inicial. Si s no existe entonces la expresión regular es la
cadena vacía, pues no se puede llegar a algún estado de aceptación. Si
existe s pero no u entonces la expresión regular es (r* o
s o t*). Si existe u entonces la expresión
queda ((r* o s o t*)
o (u o (r* o
s o t*))*). Si r y t no existen son sustituidos por
Æ. Aquí r* representa la unión de las
etiquetas de los arcos que salían y entraban en el mismo estado, como se dijo
anteriormente.
|
1.6.5.
Intersección de lenguajes
La intersección de varios lenguajes
regulares es otro lenguaje regular. Se utiliza la operación de intersección
de conjuntos; así, para el alfabeto S ={x,y}
si L1 = {x,xy,yy}, L2 = {yz,yy} y L3 =
{y,yy} entonces su intersección será L1
Ç L2 ÇL3
= {yy}.
Para diseñar el autómata que
reconoce este lenguaje, vamos a considerar los autómatas finitos L(Mn). El nuevo
autómata estará definido por la quintupla (S',