GRAMÁTICAS REGULARES
1.5.1.
Gramáticas formales
Gramática es un conjunto de reglas
que estructuran la formación de un lenguaje. Una frase en español tendría las
siguientes reglas gramaticales:
<
frase > < sujeto > < predicado
> < punto >
< sujeto > < sustantivo >
< sustantivo > María
<sustantivo > Juan
< predicado > < verbo intransitivo >
< predicado > < verbo transitivo > < objeto >
< verbo intransitivo > patinar
< verbo transitivo > golpear
< verbo transitivo > quiere < objeto >
< objeto > a < sustantivo >
< punto > .
Una
gramática estará formada por los siguientes elementos
El
conjunto de terminales, no terminales, símbolo de inicio y un conjunto
finito de reglas de reescritura constituye lo que se denomina gramática
estructurada por frases.
Denotar
que puede darse el caso de que haya varias reglas de reescritura que tengan el
símbolo de inicio en su parte izquierda; esto es necesario para que una misma
gramática represente patrones distintos de cadenas.
Formalmente,
una gramática está definida por la cuádrupla (V,T,S,R) donde:
En
general los dos lados de las reglas de reescritura pueden ser combinaciones de
terminales y no terminales, la parte izquierda siempre debe tener
al menos un no terminal. El lado derecho puede tener la cadena vacía, la
cual se denomina regla .
A
partir de ahora vamos a representar los terminales con letras en minúscula
y los no terminales con mayúsculas.
La
derivación de una cadena consiste en generar una cadena aplicando las
reglas de la gramática. Se puede derivar si al comenzar con el símbolo de
inicio, se puede producir esa cadena sustituyendo sucesivamente los patrones
de la izquierda por las expresiones del lado derecho
correspondiente, hasta que solo quedan terminales.
Sea
una gramática G cualquiera; si sus terminales son símbolos de un alfabeto
decimos que G es una gramática de y las cadenas generadas por
ella pertenecen a * ; la
gramática G del alfabeto especifica un lenguaje y se
representa por L(G).
Se
llama gramática regular a aquella que en sus reglas de reescritura tiene
las siguientes restricciones:
En
el caso de no querer reglas con solo un terminal (b.2), estas se pueden
sustituir por dos reglas de reescritura, una cuya parte derecha será siempre un
terminal seguido de un no terminal, el cual no existía en la gramática original
y la otra cuya parte izquierda es ese no terminal nuevo y la derecha es la
cadena vacía.
N x se
sustituye por N xX
X
TEOREMA Para cada alfabeto , {L(G):
G es una gramática regular de } = {L(M): M es una autómata finito de
} (los lenguajes generados por gramáticas regulares son exactamente los
lenguajes que aceptan los autómatas finitos).
DEMOSTRACIÓN |
Sea
G una gramática regular. Primero tenemos que convertirla en una gramática G'
que genera el mismo lenguaje pero que no contiene reglas de reescritura cuyo
lado derecho sea solo un terminal (como se vio antes). Definimos el autómata finito M como el autómata finito
no determinista (S,
, , , F) donde:
Al
revés, sea M un autómata finito no determinista (S, , , , F), entonces podemos
definimos la gramática regular G' del alfabeto
tal que:
L(M)
= L(G') ya que la derivación de la cadena corresponde con la ruta a seguir en
el diagrama de transiciones de M |
Hay
que aclarar dos conceptos: en primer lugar se trata de un autómata finito no
determinista debido a que se están haciendo equivalencias con tripletas, y no
con una función; en segundo lugar hay que tener en cuenta que pueden existir
gramáticas no regulares que definan un lenguaje regular.
EXPRESIONES
REGULARES.
Construiremos
lenguajes regulares más complejos a partir de otros lenguajes regulares
pequeños. Los lenguajes más simples del alfabeto serán cadenas simples
de longitud uno. Sin embargo, con estos no podremos construir el lenguaje vacío
ni el lenguaje {}. 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.
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 ={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:
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:
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, , 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, **={ }.
Para
modificar el diagrama de transiciones, se coge el diagrama:
Una
expresión regular para un alfabeto se define como:
Para
cada expresión regular r de un alfabeto 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
(tiene que ser el mismo), los lenguajes regulares de son exactamente
los lenguajes representados por las expresiones regulares de .
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:
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:
|
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 ={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',
' , ', ', F'), donde: