23
TEMA 1 ALFABETOS, PALABRAS Y LENGUAJES 1. ELEMENTOS BÁSICOS: ALFABETOS, PALABRAS Y LENGUAJES Alfabeto: Conjunto finito y no vacío cuyos elementos se denominan símbolos. Para designarlo se utilizan letras mayúsculas del alfabeto griego, especialmente Σ y Γ. Como ejemplos de alfabetos, contamos con {0,1} alfabeto binario; {a,b,c…x,y,z} alfabeto latino de letras minúsculas… Palabras: Secuencia finita de símbolos de un alfabeto, cuando además queremos dejar claro que los símbolos que se utilizan son los de un alfabeto determinado, se habla de palabras sobre un alfabeto. Por ejemplo, según el alfabeto {a,b} son palabras de este alfabeto aba, aab, aaabbaaaa, a, b y λ (ésta última es una secuencia vacía de símbolos y representa la palabra vacía, por lo cual es una palabra sobre cualquier alfabeto). Subpalabras, prefijos y sufijos: Las subsecuencias de símbolos consecutivos de una palabra reciben el nombre de subpalabras de esta palabra. Se consideran subpalabras impropias la palabra vacía y la entera y el resto se consideran propias. Por ejemplo los prefijos de la palabra bbaab son {λ, b bb, bba, bbaa, bbaab} de los cuales el primero y el último son prefijos impropios y el resto propios. Lenguajes, conjunto de palabras: Un lenguaje es un conjunto de palabras sobre un alfabeto determinado, para designarlos se usa la letra L con subíndices si es necesario, y otras letras mayúsculas del alfabeto latino. Algunos ejemplos de lenguajes sobre el alfabeto {a,b} son L1={a, aa, aaa}; L2= {a, b, aa, bb, ab, abababab}; L3={λ}. No obstante, un lenguaje no debe ser necesariamente finito, por ejemplo, lenguaje de todas las palabras sobre Σ={0,1} que comiencen por el símbolo 1. 2. OPERACIONES SOBRE PALABRAS Concatenación: Concatenar dos palabras significa construir una palabra nueva añadiendo los símbolos de la segunda tras los símbolos de la primera, el operador de concatenación es el símbolo ·. Así aaa·bbb=aaabbbb, aba· λ=aba. La concatenación no es conmutativa, porque en general w1·w2<>w2·w1; sí tiene en cambio la propiedad asociativa y la palabra vacía λ constituye el elemento neutro de la concatenación. La concatenación de una palabra consigo misma se suele representar con notación exponencial, de manera que w 2 =w·w; y la concatenación de una palabra y un símbolo se denota de la misma manera que la concatenación de dos palabras. Longitud: el número de símbolos de una palabra se desgina por |w| y es interesante reconocer que: |w1·w2|=|w1|+|w2| y |w|=0 w= λ. Número de ocurrencias de un símbolo: la notación |w|a denota el número de apariciones del símbolo a en la palabra w, así |aabbabaa| a = 5. Inversión: Consiste en escribir al revés una palabra dada, la palabra resultante de la inversión se denomina inversa, si w es una palabra cualquiera w R denota su inversa; así (ab) R =ba, (011101) R =101110, λ R = λ. Fijémonos que (w1·w2) R =(w2) R ·(w1) R . Palíndromos: Cuando una palabra es igual a su inversa, se denomina palíndromo. Así λ es un palíndromo, y también aba y también todas las palabras formadas por un solo símbolo. Teoría de autómatas y lenguajes formales 1 Tema 1 Alfabetos, palabras y lenguajes 1. Elementos básicos: alfabetos, palabras y lenguajes 2. Operaciones sobre palabras 3. Operaciones sobre lenguajes 4. Definición de lenguajes

TEMA 1 ALFABETOS, PALABRAS Y LENGUAJES

Embed Size (px)

Citation preview

TEMA 1 ALFABETOS, PALABRAS Y LENGUAJES 1. ELEMENTOS BÁSICOS: ALFABETOS, PALABRAS Y LENGUAJES Alfabeto: Conjunto finito y no vacío cuyos elementos se denominan

símbolos. Para designarlo se utilizan letras mayúsculas del alfabeto griego, especialmente Σ y Γ. Como ejemplos de alfabetos, contamos con 0,1 alfabeto binario; a,b,c…x,y,z alfabeto latino de letras minúsculas…

Palabras: Secuencia finita de símbolos de un alfabeto, cuando además queremos dejar claro que los símbolos que se utilizan son los de un alfabeto determinado, se habla de palabras sobre un alfabeto. Por ejemplo, según el alfabeto a,b son palabras de este alfabeto aba, aab, aaabbaaaa, a, b y λ (ésta última es una secuencia vacía de símbolos y representa la palabra vacía, por lo cual es una palabra sobre cualquier alfabeto).

Subpalabras, prefijos y sufijos: Las subsecuencias de símbolos consecutivos de una palabra reciben el nombre de subpalabras de esta palabra. Se consideran subpalabras impropias la palabra vacía y la entera y el resto se consideran propias. Por ejemplo los prefijos de la palabra bbaab son λ, b bb, bba, bbaa, bbaab de los cuales el primero y el último son prefijos impropios y el resto propios.

Lenguajes, conjunto de palabras: Un lenguaje es un conjunto de palabras sobre un alfabeto determinado, para designarlos se usa la letra L con subíndices si es necesario, y otras letras mayúsculas del alfabeto latino. Algunos ejemplos de lenguajes sobre el alfabeto a,b son L1=a, aa, aaa; L2= a, b, aa, bb, ab, abababab; L3=λ. No obstante, un lenguaje no debe ser necesariamente finito, por ejemplo, lenguaje de todas las palabras sobre Σ=0,1 que comiencen por el símbolo 1.

2. OPERACIONES SOBRE PALABRAS Concatenación: Concatenar dos palabras significa construir una palabra

nueva añadiendo los símbolos de la segunda tras los símbolos de la primera, el operador de concatenación es el símbolo ·. Así aaa·bbb=aaabbbb, aba· λ=aba. La concatenación no es conmutativa, porque en general w1·w2<>w2·w1; sí tiene en cambio la propiedad asociativa y la palabra vacía λ constituye el elemento neutro de la concatenación. La concatenación de una palabra consigo misma se suele representar con notación exponencial, de manera que w2=w·w; y la concatenación de una palabra y un símbolo se denota de la misma manera que la concatenación de dos palabras.

Longitud: el número de símbolos de una palabra se desgina por |w| y es interesante reconocer que: |w1·w2|=|w1|+|w2| y |w|=0 w= λ.

Número de ocurrencias de un símbolo: la notación |w|a denota el número de apariciones del símbolo a en la palabra w, así |aabbabaa| a = 5.

Inversión: Consiste en escribir al revés una palabra dada, la palabra resultante de la inversión se denomina inversa, si w es una palabra cualquiera wR denota su inversa; así (ab)R=ba, (011101) R=101110, λ R= λ. Fijémonos que (w1·w2) R =(w2) R·(w1) R.

Palíndromos: Cuando una palabra es igual a su inversa, se denomina palíndromo. Así λ es un palíndromo, y también aba y también todas las palabras formadas por un solo símbolo.

Teoría de autómatasy lenguajes formales 1

Tema 1 Alfabetos, palabras y lenguajes

1. Elementos básicos: alfabetos, palabras y lenguajes

2. Operaciones sobre palabras 3. Operaciones sobre lenguajes

4. Definición de lenguajes

2 · Teoría de autómatas y lenguajes formales 1

3. OPERACIONES SOBRE LENGUAJES Operaciones conjuntistas: Estas operaciones son las siguientes: la unión,

intersección, complementación y diferencia. Concatenación: de dos lenguajes es otro lenguaje que contiene todas las

palabras que se pueden construir concatenando una palabra del primer lenguaje con una palabra del segundo lenguaje. Como ejemplos tenemos, si L1=a, aa y L2=b, bb entonces L1·L2=ab, abb, aab, aabb. Entre las propiedades de la concatenación de lenguajes destacan:

o La concatenación no es conmutativa, así L1·L2<>L2·L1 o La concatenación sí es asociativa (L1L2)L3=L1L2L3 o El elemento neutro de la concatenación es λ. o La concatenación es distributiva respecto de la unión. o Pero no lo es respecto de la intersección.

Concatenación de un lenguaje consigo mismo: También se puede representar con la notación exponencial, así L2=L·L.

Concatenación de una palabra y un lenguaje: El concatenar una palabra y un lenguaje wL y Lw puede abreviarse como wL y Lw y es el resultado de añadir una palabra w delante y detrás de cada una de las palabras de L. Misma aplicación para los símbolos aL y La.

Inversión: El lenguje inverso LR de otro L dado no es más que el lenguaje formado por los inversos de las palabras de L.

Cierre de Kleene: El cierre de Kleene de un lenguaje es la unión de todas las potencias de ese lenguaje. Si L es un lenguaje este cierre se representa por L*, y así si L=ab, L*= λ, ab, abab. Ababab, abababab…

Cierre positivo de Kleene: Se representa por L+ y es igual al anterior a excepción de la presencia del símbolo λ. Por ello s L=ab, L+=ab, abab. Ababab, abababab….

Cierres de un alfabeto Σ* y Σ+: Dado que cualquier alfabeto puede ser considerado un lenguaje formado por palabras de un solo símbolo (longitud 1), las operaciones de cierre de Kleene y de cierre positivo de Kleene también son aplicables a los alfabetos.

4. DEFINICIÓN DE LENGUAJES A menudo disponemos de una definición informal de un lenguaje dada en lenguaje natural, y necesitamos ser más específicos convirtiéndola en una definición cuanto más formal, mejor. Generalmente para formalizar la definición de un lenguaje se utiliza: L = w Σ* | Condicion(es) de pertenencia. Por ejemplo: Palabras con el doble de símbolos de a que de símbolos b:

o L = w | |w|a = 2|w|b Palabras que empiezan con el símbolo a y acaban con el sufijo aba.

o L = w | x Σ*(w=axaba) o L=a Σ*aba

Teoría de autómatas y lenguajes formales 1 · 3

TEMA 2 AUTÓMATAS FINITOS Y LENGUAJES REGULARES 1. AUTÓMATAS FINITOS DETERMINISTAS Y LENGUAJES REGULARES

Los autómatas finitos representan un modelo matemático con las siguientes características: A cada momento el sistema se encuentra en un estado (q) y el conjunto total

de estados diferentes en los que se puede encontrar el sistema es finito (si además no es un número muy elevado puede ser representado gráficamente).

Pueden responder a un número finito de acontecimientos diferentes. El estado en el que se encuentra el sistema resume toda la información

referente a acontecimientos pasados. La respuesta a un acontecimiento sólo se determina en función del

acontecimiento y del estado en que se encuentra el sistema.

Como ejemplo de estos tipos de sistemas podemos encontrar un interruptor biestable, que puede estar encendido o apagado y que responde al acontecimiento de “pulsación” que provoca un cambio de estado que depende obviamente del estado actual en que se encuentre.

Imaginaremos los autómatas finitos como máquinas que constan de una unidad

central con un cabezal que se encuentra en un estado inicial (q0), situado a la izquierda de una cinta sobre la cual se ha escrito de izquierda a derecha; a cada unidad de tiempo el cabezal se desplaza una posición y lee el símbolo sobre el que se sitúa, y esto determina un nuevo estado. Hay dos tipos de estado, el estado aceptador que hace que la cadena de símbolos que van desde el inicio de la cinta hasta el que se encuentra ahora forme una palabra reconocida como perteneciente a L, o estado no aceptador que no reconoce la palabra. Como ejemplo estudiamos el autómata finito representado a la izquierda, que es capaz de reconocer la palabra ababa si el estado final es aceptador. Ya hemos adelantado que es habitual que los autómatas finitos se representen gráficamente si las medidas lo permiten, para ello tendremos en cuenta: Los estados se representan con círculos que, si es preciso, llevan en su interior

un nombre para identificarlo. El estado inicial se indicará con una pequeña flecha que incida sobre éste. Los estados aceptadores se indicarán con una pequeña cruz que salga de los

mismos. Las posibles transiciones, en función de los símbolos leídos, se indicarán con

flechas que van de un estado a otro (o a sí mismo).

En el ejempo lateral podemos observar un autómata que reconoce el lenguaje de las palabras que empiezan por a y acaban por b, es decir:

L = w | x

Σ*(w=axb)

Cualquier autómata finito puede interpretarse como un algoritmo que especifica un cálculo, y la cantidad de memoria que debe consumirse para realizar el procesamiento de la palabra es siempre la misma e independientemente de la longitud de la misma. Aquellos lenguajes que para poder dictaminar si una palabra pertenece a los mismos o no, requieren algoritmos que utilizan una cantidad de memoria que depende de la longitud de la palabra medida, no pueden ser reconocidos por autómatas finitos, y se denominan lenguajes no regulares. Por ejemplo el lenguaje de las palabras de la forma L=a n b n |n>=0=anb n, no es un lenguaje regular, dado que solo se reconocen las palabras cuyo número de

Tema 2 Autómatas finitos y lenguajes Regulares

1. Autómatas finitos deterministas y lenguajes

regulares 2. Autómatas finitos

indeterministas 3. Operaciones con autómatas

finitos 4. Minimización de autómatas

finitos 5. Expresiones regulares 6. Determinación de la no

regularidad de un lenguajes: el lema del bombeo

Autómata finito

Autómata finito

4 · Teoría de autómatas y lenguajes formales 1 símbolos a sea igual al número de símbolos b; así pues es indispensable recordar el número de símbolos de cada tipo que se llevan leídos en cada momento. La memoria que se requiere para llevar a cabo esta operación depende por tanto de la longitud de la palabra. Habría que asignar un estado distinto a cada número de símbolos posible, sin embargo esto es imposible, porque el número de estados debe ser finito. La definición formal de un autómata finito determinista o DFA es que se trata de autómatas con un número finito de estados, que tienen un único estado inicial y para cada estado una, y solo una, transición para cada símbolo. Por tanto, para poder definir completamente un DFA es necesario conocer los siguientes elementos de los que se compone: Conjunto de estados (Q). Cual es el estado inicial (q0). Cuales son los estados aceptadores (F). Cual es el alfabeto de la palabra que se escribe en la cinta (Σ). La manera de determinar el nuevo estado en función del símbolo leído y del

estado actual (σ). Este símbolo es la llamada función de transición, que dado un estado y un símbolo el resultado es otro estado.

Con todo ello, un DFA se define como un quíntuplo de la forma (Q, Σ, q0, F, σ).

Como ejemplo proponemos el DFA lateral, representado de manera formal (que incluya una representación tabular para la función de transición) y gráfica.

Un último aspecto nos queda por aclarar y es definir formalmente lo que es un

lenguaje reconocido por un DFA. Para ello debemos saber que:

σ(qi, a) = qj ; es decir dato un estdo inicial, y en presencia de un símbolo, obtenemos otro estado final (función de transición).

σ(q,w) = q si w = λ o d σ(σ(q0, x), a) si w=xa. A esto se le denomina función de transición extendida y su propósito es extender a las palabras la función de transición. Haciendo uso de esta función definimos un lenguaje reconocido por un DFA -L(A)- como el conjunto de palabras que, a partir del estado inicial, provocan que el autómata evolucione hasta alguno de los estados aceptadores, es decir: L(A) = w Σ* | σ(q0, w) F.

Lenguaje regular y lenguaje reconocido por un DFA son expresiones

sinónimas ya que un lenguaje es regular si, y solo si, existe un DFA que lo reconoce (y además requieren una cantidad de memoria independiente de la longitud de las palabras). Para demostrar que un lenguaje es regular, es suficiente con exhibir un autómata que lo reconozca, porque, por definición, un lenguaje es regular si es reconocido por algún DFA. 2. AUTÓMATAS FINITOS DETERMINISTAS Y LENGUAJES REGULARES

Los autómatas finitos indeterministas son una forma especial de autómatas finitos que forman parte del conjunto de herramientas que pueden utilizarse para facilitar la tarea de construcción de autómatas finitos deterministas. Construir un NFA (Non-deterministic Finite Automaton) es más simple que un DFA, y tiene lugar cuando se da una o más de las siguientes 3 condiciones: Tiene más de un estado inicial Tiene transiciones definidas de forma múltiple Tiene transiciones no definidas

Para que una palabra sea aceptada por un NFA el reconocimiento es similar

al que tenía lugar en el apartado anterior, pero tendremos en cuenta además las siguientes consideraciones: Si el autómata tiene más de un estado inicial, entonces el reconocimiento

comienza en cualquiera de éstos.

Formalización de un DFA

Representación formal Q = A,B,C,D,E Σ = a,b q0 = A F = A,B,E σ =

σ a b + A B D + B B C C C C D E D + E E D

Representación gráfica

Teoría de autómatas y lenguajes formales 1 · 5

Si en un estado y para un símbolo determinado hay más de una transición definida, se aplica cualquiera de éstas.

Si en un estado y para un determinado símbolo no hay transición definida, entonces el proceso de reconocimiento se detiene y la palabra no se acepta.

Podemos entender que un NFA es un autómata que, en algunas

circunstancias, tiene capacidad de elección, y habrá palabras que en algunas ocasiones sea aceptada y en otras rechazada por el mismo NFA. Así entenderemos que una palabra es aceptada por un NFA cuando hay alguna secuencia de transiciones que la hacen evolucionar hasta un estado

aceptador. En el autómata de la tabla lateral la secuencia abaabb en algunas ocasiones puede ser reconocida y en otras no. A pesar de ello existen 4 tipos de lenguaje para los cuales es muy fácil construir los autómatas indeterministas que los reconocen:

Los lenguajes que se definen como “palabras que empiezan por un determinado prefijo”. En la tabla lateral de ejemplos el primer autómata reconoce claramente todas las palabras que empiecen por aba. Los lenguajes que se definen como “palabras que acaban con un determinado sufijo”. En el segundo autómata del ejemplo, se reconocen todas las palabras que acaben por bba, independientemente de lo que haya delante. Lenguajes que se definen como “palabras que contienen una determinada subpalabra”. Es una especie de mezcla de los anteriores, y observamos en el ejemplo que se reconoce cualquier palabra de la forma …babb… Lenguajes que se definen en términos de la unión de otros

lenguajes. Dados dos autómatas, la suma de ambas da un único NFA, pues puede tener varios estados de inicio.

La definición formal de un autómata finito indeterminado o NFA es que

se define por un quíntuplo de la forma (Q, Σ, I, F, σ). Conjunto de estados (Q). Cual es el conjunto de estados inicial (IQ). Cuales son los estados aceptadores (FQ). Cual es el alfabeto de la palabra que se escribe en la cinta (Σ). La manera de determinar el nuevo estado en función del símbolo leído y del estado actual (σ). Este símbolo es la llamada función de transición, que dado un estado y un símbolo el resultado es otro estado.

Recordemos que ahora no contamos con un único estado inicial y que para cada pareja estado-símbolo puede no definirse un único estado, sino un conjunto de ellos. Así podemos observar la representación gráfica y en tabla de transición de un DFA:

Igualmente la definición formal de lenguaje reconocido por un NFA

es el conjunto de palabras que desde los estados iniciales (I) pueden llevar al autómata hasta alguno de sus estados finales. Pero que esto no nos lleve a confusión, los lenguajes que puede reconocer un NFA son los mismos que un DFA, es decir, los lenguajes regulares. Así pues, el indeterminismo de los NFA no aporta la capacidad de reconocer más lenguajes, sino la simplicidad de construirlos.

Existe un proceso para la determinización de autómatas indeterministas,

ya que realmente un DFA puede considerarse un caso particular de un NFA, es decir el caso particular en el que solo se cuenta con un estado inicial y con una función de transición definida para todos los estados y símbolos posibles. Como es más fácil crear un autómata indeterminista, se crea este primero, luego se determiniza y se suele utilizar la versión determinizada, ya que la indeterminación es una cualidad poco deseable en la mayoría de las ocasiones.

Autómata finito indeterminado

Autómatas finitos indeterminados

Autómata finito indeterminado

6 · Teoría de autómatas y lenguajes formales 1

En el proceso de determinización, las claves para hacerlo correctamente son las siguientes: El estado inicial del autómata determinista el el

conjunto de los estados iniciales del indeterminista (I).

Los estados aceptadores del determinista son aquellos que contienen algún aceptador del indeterminista.

La función de transición del determinista tiene en consideración todas las transiciones definidas para cada uno de los estados del autómata indeterminista, que componen un estado del autómata determinista.

Vemos a continuación dos ejemplos de ello, el

primero en construcción gráfica, y el segundo en función de transición a partir de la tabla de funciones de transición del NFA.

Es necesario saber que cada estado del autómata

determinista es un conjunto de estados del autómata indeterminista, en otras palabras cada estado del determinista es un subconjunto del conjunto de estados del indeterminista; si éste tiene N estados, el autómata determinista puede llegar a tener 2N estados. El crecimiento del número de estados puede llegar a ser exponencial, pero éste es el precio que se deberá pagar por eliminar el indeterminismo. 3. OPERACIONES CON AUTÓMATAS FINITOS ¿La unión de dos lenguajes es también un lenguaje regular? Pues efectivamente así es. Si un lenguaje L es regular su complementario (LC), su inverso (LR), su cierre de Kleene (L*) y su cierre positivo de Kleene (L+) también son lenguajes regulares. E igualmente la intersección, unión y producto cartesiano de dos lenguajes regulares da lugar a un tercer lenguaje regular. Con estas propiedades no solo mostramos el interés por las propiedades de los lenguajes regulares, sino que además se proporcionan herramientas muy útiles para la construcción de autómatas, porque permiten construir autómatas de gran complejidad a partir de autómatas más simples. 3.1. Autómata finito para el lenguaje complementario Si en un DFA se intercambian los estados aceptadores por los no aceptadores y viceversa, se obtiene otro DFA que reconoce el complementario del lenguaje aceptado por el primero (ver ejemplo en la figura lateral). Eso sí, esta técnica solo es aplicable a autómatas deterministas, pues en indeterministas pueden dar resultados incorrectos. 3.2. Autómata finito para el lenguaje intersección: producto cartesiano Si L1 y L2 son dos lenguajes regulares, su intersección también lo es. Es decir, sin u lenguaje reconoce (como vemos en el ejemplo de la página siguiente) las palabras que acaban e a y otro lenguaje las palabras que empiezan por b, su intersección será el lenguaje que reconoce las palabras que empiezan por b y acaban en a. Para encontrar estos autómatas es necesario llevar a cabo el producto cartesiano y tratar la tabla de función de transición del autómata. Así por ejemplo

Procesos de determinización

Autómata finito para ellenguaje complementario

Teoría de autómatas y lenguajes formales 1 · 7

como vemos en las tablas laterales, partimos del estado A1 (estados de inicio en ambas tablas) y construimos dos nuevos estados para ellos el B1 y A2. Así continuamos tratando la tabla de transición hasta que no quedan estados nuevos y solo serán estados aceptadores cuando lo sean en ambos elementos del producto cartesiano. Así si en el primer autómata el estado aceptador es B y en el segundo lo es 2, solo puede existir un estado aceptador, que es el <B,2>. La construcción del producto cartesiano también se puede aplicar, sin ninguna modificación, si alguno o todos los autómatas fuesen indeterministas. No obstante, es recomendable minimizarlos antes para evitar la proliferación de estados.

3.3. Autómata finito para el lenguaje unión Existen dos formas de llevar a cabo este lenguaje. Debemos saber que la unión en el ejemplo anterior sería aquel lenguaje capaz de reconocer todas las palabras que empiecen por b o terminen por a. Pues bien este autómata finito se construye de manera análoga al anterior, partiendo del producto cartesiano y de la tabla de transiciones anterior, a excepción de que: En el caso de la intersección, son estados aceptadores los pares en los que

cada componente es un estado aceptador. En el caso actual de la unión, son estados aceptadores los pares en los que

cualquiera de los dos componentes sea un estado aceptador. Así los estados aceptadores aumentarían de uno en el caso anterior de la intersección a 4 en la tabla de transiciones actual, como puede verse en el ejemplo de la figura lateral. No obstante, existe un segundo método para llevar a cabo la unión que es la adjunción y que es conveniente llevar a cabo cuando al menos uno de los dos autómatas a unir es indeterminista. Este segundo método consiste en considerar que en lugar de dos autómatas se tiene uno. Tanto si los autómatas de partida son deterministas como si no lo son, el resultado es siempre un autómata indeterminista. Dado que la adjunción (independientemente del tipo de autómatas de partida) introduce indeterminismo, es preferible llevar a cabo este método cuando existe algún autómata de partida indeterminista, como ya apuntábamos anteriormente. 3.4. Autómata finito para la concatenación

Dados dos lenguajes regulares L1 y L2, la concatenación consistiría en palabras que tiene una primera parte de L1 y una segunda parte de L2, por ello lo que debemos hacer será aprovechar el primer autómata para reconocer esta primera parte y cuando se produzca el reconocimiento, saltar al autómata que reconoce L2 e intentar aceptar entonces la palabra. Para concatenar los dos

Intersección: Producto cartesiano

Unión: Producto cartesiano

Unión por adjunción

Autómata finito para la concatenación

8 · Teoría de autómatas y lenguajes formales 1 autómatas, añadiremos transiciones a todos los estados del primer autómata que desemboquen en estados aceptadores. Las nuevas transiciones con los mismos símbolos que los originales irán a parar a los estados iniciales del autómata que reconoce el segundo lenguaje. Así los pasos por los que debemos concatenar son: Conectaremos los estados que preceden a los estados aceptadores de A1 con

los iniciales de A2 con el mismo símbolo que hacían llegar al estado aceptador en A1.

Si λ L1 (algún estado inicial de L1 es aceptador) dejamos entonces como estados iniciales tanto los de A1 como los de A2. En caso contrario solo los estados iniciales de A1 quedarán como estados iniciales del nuevo autómata.

Consideramos como estados aceptadores solo los estados aceptadores del autómata A2.

En el ejemplo de la tabla lateral observamos que conectamos los estados que preceden a los aceptadores del autómata 1 con los iniciales del autómata 2, y para ello realizamos 4 conexiones: dos que parten de A y dos que parten de C. Una vez hecho esto dado que el estado A inicial de A1 es aceptador, tanto los estados de A1 como los de A2 son estados iniciales; y por último, los estados aceptadores son únicamente los del autómata 2. 3.5. Autómata finito para el cierre positivo El caso del cierre positivo es igual que el de la concatenación, con la única salvedad que el autómata 1 y el 2 son el mismo, es decir, es la concatenación de un lenguaje consigo mismo. Por lo tanto, el mecanismo a seguir es: Detectar los estados que preceden a los aceptadores y con qué

símbolos. Se añaden transiciones desde estos estados preaceptadotes hasta los

iniciales del autómata con los mismos símbolos. No es necesario hacer nada más, pues los estados iniciales y

aceptadores son los mismos. 3.6. Autómata finito para el cierre de Kleene Debemos recordar que el cierre de Kleene es el conjunto de todas las potencias de un lenguaje incluyendo λ. Por lo tanto primero debemos hallar el cierre positivo como hacíamos en el caso anterior y después adjuntarle el autómata que reconoce λ. Ciertamente esto añade indeterminismo, pero es que el autómata resultante del paso anterior ya era indeterminado. Como ejemplo llevamos a cabo el autómata que reconoce el lenguaje L=a,a, ver en la figura lateral. 3.7. Autómata finito para el lenguaje inverso Si L es un lenguaje regular su lenguaje inverso LR también lo es. En este caso probablemente la idea intuitiva consistiría en construir un nuevo autómata, intercambiando los papeles de los estados aceptadores y los estados iniciales e invirtiendo el sentido de las transiciones. Pues efectivamente, la idea intuitiva es correcta, y podemos comprobarlo en el ejemplo de la figura lateral, donde a partir de un autómata que reconoce las palabras que acaban con el sufijo bb, se pasa a un autómata que reconoce las palabras que empiezan por el sufijo bb. Este método puede provocar la introducción de indeterminismo.

Autómata finito para el cierre positivo

Autómata finito para el cierre de Kleene

Autómata finito para el lenguaje inverso

Teoría de autómatas y lenguajes formales 1 · 9

A continuación se presenta una breve tabla resumen de las operaciones que podemos realizar con los lenguajes:

Lenguaje Abrev. Método Ejemplo

Lenguaje complementario LC Intercambiar estados aceptadores por no aceptadores y

viceversa

De reconocer palabras que acaban en aa pasaríamos a no reconocer las palabras que acaben en aa

Lenguaje intersección L1 L2

Producto cartesiano Se parte de un estado de inicio de ambos autómatas Se crean nuevos estados en la tabla de transición

hasta que ya no quedan estados por tratar El o los estados aceptadores son aquellos en que los

dos componentes del estado son aceptadores en sus respectivos autómatas de origen

Un lenguaje reconoce las palabras que empiezan por a y el otro las

que acaben por b, la intersección es un tercer lenguaje que reconoce las

palabras que empiezan por a y además acaban por b.

Lenguaje unión L1 L2

Producto cartesiano y seguimos el mismo método del lenguaje intersección

La diferencia es que el o los estados aceptadores en este caso con aquellos en los que cualquier

componente del estado sea aceptador en su autómata de origen.

También se puede hacer la unión por adjunción (indeterminismo).

Un lenguaje reconoce las palabras que empiezan por a y otro las que acaban por b, la unión es un tercer lenguaje que reconoce las palabras que empiezan por a o acaben por b

Concatenación L1·L2

Se conectan los estados que preceden a los aceptadores de A1 con los iniciales de A2 con el mismo

símbolo que hacían llegar al estado aceptador en A1 Si λ L1 (algún estado inicial de L1 es aceptador)

dejamos entonces como estados iniciales tanto los de A1 como los de A2. En caso contrario solo los estados iniciales de A1 quedarán como estados iniciales del

nuevo autómata. Consideramos como estados aceptadores solo los

estados aceptadores del autómata A2.

El nuevo lenguaje reconoce palabras que tienen una primera

parte de un lenguaje y una segunda parte de un segundo lenguaje.

Cierre positivo L+

Detectar los estados que preceden a los aceptadores y con qué símbolos.

Se añaden transiciones desde estos estados preaceptadotes hasta los iniciales del autómata con los

mismos símbolos. No es necesario hacer nada más, pues los estados

iniciales y aceptadores son los mismos.

La misma idea de la concatenación anterior pero en este caso solo se

involucra un único autómata

Cierre de Kleene L* Primero debemos hallar el cierre positivo como hacíamos en

el caso anterior y después adjuntarle el autómata que reconoce λ.

L* = L+ λ

Lenguaje inverso LR Los estados iniciales pasan a ser estados aceptadores y los aceptadores estados iniciales; además debemos invertir el

sentido de todas las transiciones

Pasamos de un autómata que reconoce las palabras acabadas en

bb a un autómata inverso que reconoce las palabras que

comienzan por bb.

4. MINIMIZACIÓN DE AUTÓMATAS FINITOS La versión mínima de un DFA es otro DFA que reconoce exactamente el mismo lenguaje que el primero, pero que lo hace con el menor número posible de estados. Minimizar un DFA es muchas veces una necesidad incuestionable dado que la determinización puede provocar que se pase de N a 2N estados y que la introducción del indeterminismo es insalvable cuando se utilizan algunos de los métodos que hemos visto en el apartado anterior. La idea subyacente para poder minimizar es que pueden existir un grupo de estados cuyos comportamiento pueda reducirse a un único estado, como vemos

10 · Teoría de autómatas y lenguajes formales 1 por ejemplo en la figura lateral, donde hemos reducido dos estados a uno solo y con el mismo comportamiento. Es evidente que dado un lenguaje regular, el autómata mínimo que lo reconoce es mínimo, con lo cual y esto da lugar a la unicidad del autómata mínimo: Para saber si dos autómatas reconocen el mismo lenguaje, los

minimizamos los dos y comparamos los autómatas mínimos resultantes. Si son iguales, podemos afirmar que los dos autómatas originales reconocen el mismo lenguaje.

Para saber si dos lenguajes regulares son el mismo lenguaje, construimos los autómatas que los reconocen, los minimizamos y los comparamos. Si son iguales podemos afirmar que los dos lenguajes originales son el mismo lenguaje.

La construcción del autómata mínimo o cociente es un poco complicada, complicación que aumentará con el número de estados que hayamos de minimizar. Lo que vamos a hacer es separar las clases primero en estados aceptadores y no aceptadores. En cada clase estudiaremos la respuesta de cada uno de los estados que lo componen. Si son el mismo la clase no se dividirá, si son distintos la clase se dividirá. Una vez halladas las divisiones volvemos a repetir el mismo proceso, hasta que las clases no se dividan más, y en ese momento construiremos el autómata finito mínimo. Se estudia de manera más sencilla con un ejemplo. Tomamos el autómata finito que tenemos en la figura lateral. Buscamos primeramente las clases inducidas por 0, estas clases es el resultado de separar los estados aceptadores de los no aceptadores, y así obtenemos: A=A,H,I y B=B,C,D,E,F,G. Ahora estudiamos el comportamiento de los elementos de estas dos clases y llegamos a la siguiente conclusión, buscando las clases inducidas por 1 y al lado y una vez halladas éstas, las inducidas por 2

Minimización de un DFA

DFA a minimizar

Teoría de autómatas y lenguajes formales 1 · 11

No vamos a buscar las clases inducidas por 3, aunque habría que hacerlo, ya que serán iguales a las 2; por ello el autómata se construye según la siguiente tabla de transiciones y da el siguiente autómata:

5. EXPRESIONES REGULARES Las expresiones regulares nos proporcionan una manera simple y precisa de describir lenguajes regulares. Si ∑ es un alfabeto, una expresión regular sobre ∑ se define, recursivamente de la siguiente manera: λ y Ø son expresiones regulares. Cada símbolo de ∑ es una expresión regular. Si e1 y e2 son expresiones regulares, entonces e1+e2 es una expresión

regular, como también lo es e1·e2. Si e es una expresión regular, entonces e* también lo es.

DFA ya minimizado

12 · Teoría de autómatas y lenguajes formales 1

Utilizaremos algunas convenciones que nos ahorrarán símbolos a la hora de reducir estas expresiones, así la prioridad de * es la mayor y la de + es la menor. El punto · se puede omitir.

Las expresiones regulares y los lenguajes regulares están muy vinculados, tal

como pone de manifiesto el teorema de Kleene: un lenguaje es regular si y solo si, es descrito por una expresión regular; y como también sabemos que un lenguaje es regular si y solo si es reconocido por algún autómata finito, nos queda claro que si L es un lenguaje, entonces existe un autómata que lo reconoce si, y solo si, existe una expresión regular que describe L.

Es fundamental para minimizar las expresiones regulares el lema de Arden

que afirma que la ecuación X= AX+B, donde A y B son lenguajes cualesquiera, da como resultado el lenguaje A*B.

Para pasar un autómata finito a una expresión regular no solo hay que poner

en marcha los mecanismos anteriores, debemos comenzar con ver el lenguaje asociado a cada estado y que debemos expresar en forma de ecuación. Para ello nos vamos a servir del ejemplo que se observa en la figura lateral. En primer lugar encontramos el sistema de ecuaciones que describen el autómata:

La = bLa + aLb Lb = aLb + bLa + λ

La segunda ecuación, aplicando el lema de Arden queda Lb = a·(bLa + λ), y

sustituyendo este resultado en la primera ecuación nos queda: La = bLa + a a·(bLa + λ), reorganizamos para volver a aplicar Arden: La = (b+aa*b)La + aa*; y nos queda entonces: La = (b+aa*b)aa* ; Este ya puede ser un resultado final, pero aun así podemos reducirlo mucho

más, quedándose en (a*b)*aa*.

6. DETERMINACIÓN DE LA NO REGULARIDAD DE UN LENGUAJE Enunciado informalmente el lema del bombeo afirma que si L es un lenguaje regular y w pertenece a este lenguaje siendo una palabra lo bastante larga, entonces es inevitable que pase lo siguiente: la palabra w se puede descomponer en tres subpalabras xyz (w=xyz) de manera que xy2z pertenece a L, xy3z pertenece a L y en general xynz pertenece a L. En otras palabras, si w es suficientemente larga, entonces todas las palabras resultantes de repetir tantas veces como se quiera una determinada parte central continúan perteneciendo a L. Evidentemente si nos encontramos con un autómata finito con n estados y resulta que w tiene más símbolos que los n estados de los que se compone el autómata, es evidente que debe pasar por algún estado más de una vez. Ese estado o estados centrales son los que reconocemos por y, y que se pueden repetir tantas veces como se quiera perteneciendo siempre la palabra resultante al lenguaje L. Esta condición es necesaria para la regularidad pero nos podemos encontrar con el caso contrario, la condición suficiente para la no regularidad: Si se detecta que en un lenguaje todas las palabras a partir de una

determinada longitud son “abombables”, esto no significa que el lenguaje sea necesariamente regular.

Pero por otro lado, si se detecta que en un determinado lenguaje es posible encontrar palabras de todas las longitudes posibles que no son abombables, entonces ya se puede afirmar con toda seguridad que el lenguaje no es regular.

Operaciones

X = AX + B A*Baa* = a+

a* = a++ λ

Ejemplo

El lema del bombeo…

…recibe este nombre porque afirma que la parte central (y) de la

palabra w=xyz se puede hacer crecer tanto como se quiera sin

que esto afecte a la pertenencia de la palabra resultante al lenguaje L. Este “hacer crecer” la parte central

se denomina bombeo de la palabra.

Teoría de autómatas y lenguajes formales 1 · 13

Este último planteamiento nos permite afirmar con seguridad la no regularidad de un lenguaje es el contrarrecíproco del lema del bombeo y para que ello se de es necesario que:

Para cada posible longitud, podamos encontrar una palabra de aquella longitud

o superior. Para cada una de las palabras, consideraremos todas las posibles

factorizaciones en tres subpalabras x, y y z. Para cada una de las factorizaciones de cada una de las palabras debemos

encontrar una constante que no cumpla que xynz pertenezca a L.

Si se consigue todo lo anterior, ya se puede afirmar que L no es regular.

El contrarrecíproco Recordemos ue cuanto

estudiábamos lógica AB es lo mismo que ¬B¬A: Si A es

suficiente para B, entonces B es necesario para A. Esto se conoce

como ley del contrarrecíproco

14 · Teoría de autómatas y lenguajes formales 1 TEMA 3 GRAMÁTICAS INCONTEXTUALES Y AUTÓMATAS CON PILA 1. CONCEPTOS INTRODUCTORIOS Una gramática generativa es un conjunto finito de reglas de producción cuya aplicación repetida nos proporciona el conjunto de palabras de un determinado lenguaje. Está formada por los cuatro componentes siguientes: Un alfabeto V de símbolos no terminales o variables. Un alfabeto ∑ (disyunto del anterior) de símbolos terminales, serán estos

símbolos terminales los que ya conocemos a, b, 1, etc. Un conjunto de pares ordenados de reglas de producción A B, donde el

primer elemento del par A, contiene como mínimo un símbolo de V, y el segundo un símbolo de ∑, o la palabra vacía λ. Para aplicar una regla de producción, hay que reconocer en la palabra en curso la subpalabra que coincide con la parte izquierda de la regla de producción (A) y sustituirla por la parte derecha de la regla de producción (B). Este proceso de denomina derivación en un solo paso.

Un símbolo inicial o axioma S que pertenece a V.

Veamos ahora algunos ejemplos: Sλ y SaS

Habitualmente representamos las variables con letras mayúsculas (reservando la S para el símbolo inicial) y los símbolos terminales con letras minúsculas. Para abreviar la escritura de las reglas de producción se suelen agrupar en una misma línea todas las que comparten la misma variable en la parte izquierda separadas por la barra vertical |. Así que las dos reglas anteriores serían: S λ |aS Podemos obtener λ aplicando de un solo paso la primera regla; a, aplicando una vez la segunda regla y después la primera; aa aplicando dos veces la segunda y una vez la primera,; y en general an aplicando n veces la segunda regla y una vez la primera; por tanto L = an | n>=0

Sλ | aSb Obtenemos: S, aSb, aaSbb, aaaSbbb, hasta que nos decidamos a aplicar la primera regla, y asi obtenemos aaabbb, por tanto L = anbn | n>=0

Según la jerarquía de lenguajes de Chomsky existen 4 tipos de gramáticas generativas: Tipo 0: Gramáticas generales son aquellas que no tienen ningún tipo de

restricción. Tipo 1: Gramáticas contextuales o sensibles al contexto. Cada regla de

producción tiene la forma xAy x~y, donde x, ~ e y pertenecen a (V ∑)* y entonces S no puede aparecer en la parte derecha de las reglas. Fijémonos en que se llaman sensibles al contexto porque para poder aplicar la regla sobre el símbolo no terminal A, debe tener un contexto determinado, es decir, un conjunto de elementos delante y detrás (en este caso x e y).

Tipo 2: Gramáticas incontextuales o de contexto libre. Cada regla de

producción tiene la forma A~, por lo tanto la sustitución de la variable A puede hacerse en cualquier contexto.

Tipo 3: Gramáticas regulares: Cada regla de producción tiene la forma

A~B o bien A~, perteneciendo ~ a ∑* y A y B a V. Esta gramática genera lenguales como los ya estudiados en el tema anterior.

Tema 3 Gramáticas incontextuales y autómatas con pila

1. Conceptos introductorios2. Árbol de derivación y

ambigüedad 3. Verificación de gramáticas

4. Formas normales5. Formas normales

6. Propiedades de los lenguajes incontextuales

Teoría de autómatas y lenguajes formales 1 · 15

La propiedad más interesante es la jerarquía de lenguajes respecto al tipo de gramática que la genera, en que cada uno está incluido estrictamente en la clase anterior. El objetivo de este tema es el estudio de los lenguajes incontextuales, es decir los generados por las gramáticas de tipo 2, y dentro de este grupo aquellos que no son regulares (pues éstos ya se han visto en el tema anterior). Los lenguajes incontextuales son los generados por una gramática incontextual y se podría formular así:

L(G) = w ∑* | S * w

Lo cual indica que las palabras w se formarán a través de * derivaciones partiendo del símbolo inicial S. Forman parte de este lenguaje las cadenas de paréntesis balanceados, las expresiones aritméticas bien definidas, los lenguajes tipo anbn, las fórmulas bien formadas de la lógica proposicional, el lenguaje de los palíndromos, el lenguaje de todas las palabras que contienen tantas a como b… 2. ÁRBOL DE DERIVACIÓN Y AMBIGÜEDAD Para mostrar que una palabra está generada por una gramática (y que por tanto pertenece al lenguaje generado por la gramática), damos su derivación paso a paso. Por ejemplo, en la figura lateral aparecen las reglas de producción de un lenguaje incontextual y su árbol de derivación correspondiente para la palabra bbaaab, según el siguiente tratamiento: S bAS bAaBS bbAAaB bbaAaB bbaaaB bbaaab Hemos de darnos cuenta que en la figura lateral si leemos las hojas del árbol de derivación de izquierda a derecha, obtenemos la palabra anterior bbaaab. Un árbol es un árbol de derivación con respecto a una gramática G, con componentes (∑, V, P ,S) si se cumplen las siguientes condiciones: Cada nodo tiene una etiqueta, que es un símbolo de V ∑ λ. La etiqueta de la raíz del árbol es la variable S. Si un nodo es interno y tiene la etiqueta A, A debe estar en V. Si un nodo interno tiene la etiqueta A y sus hijos de izquierda a derecha X1,

X2…Xn, respectivamente, entonces A X1X2…Xn debe ser una regla de producción de P.

Si un nodo interno tiene la etiqueta λ, entonces noe s una hoja y es el único hijo de su padre.

Intuitivamente ya observamos que una palabra es una derivación de una cierta

gramática (y por tanto pertenece al lenguaje generado por ésta) si hay un árbol de derivación respecto a la gramática tal que las hojas del árbol leídas de izquierda a derecha forman la palabra. Realmente, lo bueno de aplicas el árbol de derivación es que queda más clara la regla de producción que se aplica sobre cada variable, independientemente del orden en que se haga. Por ello diferentes derivaciones de una misma palabra, pueden quedar representadas en un mismo árbol de derivación. En el ejemplo anterior de esta misma página, también podíamos aplicar: S bAS bAaBS bbAAaB bbaAaB bbaaaB bbaaab

S bAS bbAAS bbaAS bbaaS bbaaaBS bbaaab A pesar de aplicar diferentes reglas de derivación en distinto orden, el árbol de derivación sería el mismo para las dos. Todas las derivaciones que corresponden a un mismo árbol de derivación son equivalentes. De aquí podemos definir la

Jerarquía de lenguajes

Árbol de derivación S aBs | bAs | λ

A bAA | a B aBB | b

16 · Teoría de autómatas y lenguajes formales 1 gramática ambigua como aquella en la que es posible construir dos árboles de derivación diferentes que corresponden a la misma palabra, y no son dos derivaciones diferentes de la misma palabra. Mientras haya una sola palabra con dos derivaciones diferentes, la gramática ya se puede considerar ambigua; y por tanto, para demostrar que una gramática es inambigua, se debe demostrar que no puede haber ninguna palabra en la gramática que tenga dos árboles de derivación. Por ejemplo, la gramática de la tabla lateral, que general el lenguaje que tiene tantas a como b, es una gramática ambigua, ya que como se ve en la imagen lateral encontramos dos árboles de derivación distintos para la palabra baba, y aunque existan más árboles distintos para otras palabras, ya es una gramática ambigua. Para demostrar que una gramática es inambigua, lo podemos hacer intuitivamente por reducción al absurdo. Si intentamos encontrar una palabra con dos árboles de derivación diferentes, llegamos a la conclusión, tras probar con distintas reglas de producción, que es imposible. También puede ser útil intentar construir los dos árboles de derivación distintos para una misma palabra en paralelo y tratar de aplicar sucesivamente distintas reglas alternativas para una misma variable, descartando los casos en los que quede claro que ya no podemos llegar a la palabra buscada (reducción al absurdo constructiva). Hay lenguajes que tienen gramáticas ambiguas que lo generan y a la vez también gramáticas inambiguas. Como regla general nos interesará tener gramáticas inambiguas; pero no existe un procedimiento general para encontrar estas gramáticas; de hecho existen los llamados lenguajes inherentemente ambiguos, aquellos que solo están generados por gramáticas ambiguas, como pueden ser el lenguaje:

L = aibjck | i=j ó j=k 3. VERIFICACIÓN DE GRAMÁTICAS La verificación de una gramática es la demostración de que esta gramática genera un lenguaje determinado. Es decir, si nos piden un lenguaje que genere una determinada gramática incontextual, el hecho de encontrarlo no es nada trivial. Para saber si lo hemos hecho bien debemos verificar este lenguaje; no hay un método general para ello, aunque habitualmente se utiliza el razonamiento por inducción, que es el que vamos a aplicar. Como ejemplo debemos saber si: S λ | (S) | SS es capaz de generar el lenguaje de los paréntesis balanceados. Una cierta cadena de paréntesis está balanceada si el número de paréntesis de abrir es igual al de paréntesis de cerrar; y si en todos los prefijos de la palabra, el número de paréntesis abrir es mayor o igual al número de paréntesis de cerrar. En este ejemplo debemos demostrar: 1. Toda palabra generada por la gramática pertenece al lenguaje (satisface las

dos condiciones anteriores). 2. Toda palabra que pertenece al lenguaje se puede generar con la gramática.

Para demostrar que toda palabra pertenece al lenguaje lo demostramos: 1. Lo demostraremos por inducción sobre la longitud de la derivación:

Gramática ambigua

S aSbS | bSaS | λ

Una demostración…

… por inducción consta de dos pasos: 1. Demostrar que la afirmación es cierta para un caso base. 2. Suponiendo que la afirmación sea cierta para un caso general n, demostrar que también es cierta para el caso n+1.

Teoría de autómatas y lenguajes formales 1 · 17

Para un caso base, que es la derivación de cero pasos: S 0 α = S; por

tanto de forma obvia S verifica las dos condiciones anteriores Ahora debemos descomponer la derivación en la dervicación (n+1)-ésima:

S n β

1 α

Para la hipótesis de inducción β satisface las dos condiciones, y comprobaremos α. EL número de paréntesis de abrir es igual al de cerrar queda demostrado porque si β lo cumple, también lo cumplirá α; con la primera y última reglas de producción está claro, dado que no aparecen paréntesis, y con la segunda también dado que hay igual número de paréntesis de abrir que de cerrar. Ahora bien, en relación con saber que el número de paréntesis de abrir es mayor o igual al de cerrar, debemos ahora distinguir por separado los 3 subcasos en las reglas de producción. Tenemos una palabra β que cumple la segunda condición y que contiene como mínimo una variable S y queremos saber si, al aplicar la regla S (S) sobre cualquiera de las variables S de β, se continua afirmando que cumple la segunda condición. La palabra β la podemos dividir para ello en B = B1S β2 y α =B1(S) β2. Observamos que los prefijos de B1 coinciden en las dos palabras, con lo que cumple la segunda condición. Los prefijos de B1(S también cumplen la segunda condición y finalmente B1(S)B2 también la cumplen. Con todo esto queda demostrado que toda palabra generada por la gramática es balanceado y por lo tanto pertenece al lenguaje.

2. Ahora toca demostrar que toda palabra que pertenece al lenguaje se puede

generar con esta gramática. El caso base es la palabra de longitud 0. Y la palabra vacía se puede

derivar en un solo paso con la regla S λ. Suponemos ahora que toda palabra de longitud menor o igual que n se

puede generar con la gramática y debemos demostrar que una palabra de longitud n+1 también se puede generar.

Los problemas de una demostración surgen cuando la gramática juega con

muchas variables y muchas reglas de producción; entonces hay una explosión de casos; por ello es conveniente la simplificación o depuración de gramáticas como paso previo a su verificación. Cuestión que resolvemos en el apartado siguiente. 4. SIMPLIFICACIÓN DE UNA GRAMÁTICA En este apartado lo que pretendemos es eliminar reglas o elementos inútiles de una gramática con la intención de simplificarla o depurarla. Eso sí, la simplificación no significa necesariamente “reducir”· o hacer menor la gramática, al contrario, en la mayoría de las ocasiones crecerá “exteriormente”. Nos vamos a enfrentar a los siguientes procesos: Gramática limpia:

o Eliminación de las reglas de producción vacías o Eliminación de las reglas unitarias

Variables equivalentes en un primer paso Variables no equivalentes posteriormente.

Gramática pelada: o Variables que derivan en símbolos terminales. o Selección de las variables que aparecen en alguna derivación a

partir de S.

La Gramática limpia consiste en eliminar las reglas del tipo Aλ (reglas de producción vacías) y las del tipo A B (unitarias); está claro que si la gramática

18 · Teoría de autómatas y lenguajes formales 1 generaba la palabra vacía, al limpiarla dejará de generarla, pero el resto del lenguaje permanecerá igual. El proceso de limpieza tiene dos partes:

Eliminación de las reglas de producción vacías: Añadiremos directamente

en las reglas lo que se deja de generar al eliminar las reglas vacías. Lo estudiaremos con el ejemplo lateral:

o En primer lugar, determinamos las variables anulables; en el ejemplo lateral las variables anulables son B (ya que genera directamente λ) e indirectamente BB.

o Ampliamos las reglas en las que aparecen variables anulables en la parte derecha añadiendo una regla idéntica pero sin la variable anulable. Si así añadimos reglas que ya se encuentran en la parte derecha, evidentemente no la añadimos. Por ejemplo, en el ejemplo lateral tenemos que S genera aBCb, pues como la regla de B será eliminada, generamos también aCb; como tenemos BB, generamos B; en A tenemos aAbB, pues generamos aAb; y quizá en C la más complicada, al tener bSBa, generaremos bBa, bSa y ba.

o Finalmente eliminamos las reglas vacías.

Eliminación de las reglas unitarias: Las reglas unitarias son del tipo AB, donde A y B son dos variables cualesquiera. Diferenciamos aquí dos pasos: en primer lugar las variables equivalentes y después las que no lo son:

o Variables equivalentes: Son aquellas en las que AB y BA. Lo que hacemos es eliminar una de ellas, por ejemplo la A y colocar añadir en B todas las reglas de la A. Por supuesto en el resto de reglas de transición sustituiremos todas las As que aparezcan por Bs. En nuestro ejemplo lateral, rápidamente identificamos la S y la B como variables equivalentes. Por ejemplo de la A se desprende la C, pero como de la C no la A pues no podemos tocarla. Lo que vamos a hacer con S y B es eliminar esta última, para eso sus reglas las añadimos a las de la S y sustituimos todas las B por S.

o Variables no equivalentes: Procedemos a ordenar el resto de las variables, de tal manera que A < B si A se puede derivar de B. En nuestro ejemplo tanto a partir de A como de S podemos llegar a derivar C y por tanto esta es la palabra más pequeña, pero como ni S ni A se pueden generar, pues nos da igual el orden C<S<A o C<A<S. Si elegimos este último órden, lo que debemos hacer es sustituir las reglas en A que involucren la regla unitaria C añadiendo en A las reglas de C y sustituyendo si aparecen Cs por A; una vez acabado esto sustituiremos en S las regla unitaria C pero sustituyendo las posibles C por S. Así si en C aparecen dos reglas de transición como son bSSa y AA las colocamos en A, y posteriormente esas dos mismas reglas las colocaremos en S y quedarán eliminadas las reglas unitarias.

La Gramática pelada consiste en eliminar los elementos inútiles o sea

variables o reglas que no aportan nada a la gramática, que quitándolas sin más, no hacen cambiar el conjunto de palabras o lenguaje generado por esa gramática. Para cada gramática incontextual que genera un lenguaje no vacío, hay una gramática pelada que genera ese mismo lenguaje. Para pelar una gramática hay que seguir dos pasos: Identificar las variables a partir de las cuales se puede derivar una palabra

de símbolos terminales. En un primer paso identificaremos las variables que generan palabras con símbolos terminales por sí mismas. En una segunda vuelta incorporaremos todas las variables que contengan estas variables anteriores y que con ello generen palabras; y así hasta que no podamos añadir más. Por ejemplo en la tabla lateral y con la gramática incontextual dada, observamos que C forma una palabra por sí misma aunque sea vacía, también

Eliminación de las reglasde producción vacías

Gramática incontextual:S aBCb | BB | aC A aAbB | Ca B λ | aCS | B C bSBa | AA Ampliamos las reglas: S aBCb | BB | aC | aCb | B | λ A aabB | Ca | aAb B λ | aCS | B | aC C bSBa | AA | bBa | bSa| ba Eliminación reglas vacías: S aBCb | BB | aC | aCb | B A aabB | Ca | aAb B aCS | B | aC C bSBa | AA | bBa | bSa| ba

Eliminación de las reglasunitarias

Gramática incontextual:S aBCb | B | aC A aAbB | C B S | aCS | B | C C bSBa | AA Variables equivalentes S aSCb | aC | aCS | C A aAbS | C C bSSa | AA Sustitución C<A: S aSCb | aC | aCS | C A aAbS | bSSa | AA C bSSa | AA Sustitución C<A<S: S aSCb | aC | aCS | bSSa | AA A aAbS | bSSa | AA C bSSa | AA

Gramática pelada 1

Gramática incontextual:S aAb | bDA | AEb A aaA | CabA | DCba B bAB | aaD C λ | Aa D baba | AD E EbbCB F λ | bbB | aaA Identificar variables C, D, F C, D, F, A, B, C, D, F, A, B, S Resultado: S aAb | bDA A aaA | CabA | DCba B bAB | aaD C λ | Aa D baba | AD F λ | bbB | aaA

Teoría de autómatas y lenguajes formales 1 · 19

F hace lo propio y además D puede generar la palabra baba. En esta primera vuelta hemos encontrado estas 3 variables. En una segunda vuelta observamos que a forma DCba, y como D y C están en el grupo inicial lo añadimos. Así continuamos hasta comprobar que la E no se puede añadir; ello implica que la variable E es inútil y se puede borrar sin más; quedando la gramática con menos variables y reglas de producción, quitamos todas aquellas reglas en las que apareciese la E, como la tercera regla en S.

Seleccionar las variables que aparecen el alguna derivación a partir de S: De manera incremental al igual que en el paso anterior ahora partimos de S y anotamos todas las variables que aparecen en las reglas de producción en S. Con el grupo que encontramos ahora añadimos las que aparecen en esas nuevas palabras y así vamos incrementando el grupo. Por ejemplo, de la tabla lateral en S, extraemos las variables A y D. Ahora buscamos en estas variables y encontramos C. Ya no podemos añadir más porque en C solo encontramos la A. Con lo cual partiendo de S no podemos llegar nunca a B ni a F; por ello las podemos eliminar tranquilamente y las demás variables no requerirán ningún retoque en sus reglas de transición puestas dos variables evidentemente no aparecían.

5. FORMAS NORMALES Una gramática esta en forma normal si sus variables y reglas están sujetas a restricciones especiales, sin que esto afecte al lenguaje que ha generado. Las dos formas normales más utilizadas son la de Chomsky y la de Greibach, que procedemos a estudiar a continuación: 5.1. Forma normal de Chomsky Una gramática está en la forma normal de Chomsky si todas sus reglas de producción están en una de las dos formas siguientes: A BC A a

Donde A, B y C son variables y a es un símbolo terminal; además la forma normal de Chomsky no acepta que haya más de dos variables por regla de producción. Los pasos para conseguir la forma normal de Chomsky los relatamos a continuación con un ejemplo: En primer lugar, limpiamos la gramática (eliminamos las reglas de producción

vacías y unitarias) como ya sabíamos hacer en el apartado anterior). A continuación introducimos una nueva variable no terminal (B, C, etc) para

sustituir todos los símbolos terminales, excepto claro está si la regla solo incluye símbolos terminales. Tras este paso todas las reglas de producción o contienen símbolos terminales o solo variables. En el ejemplo lateral sustituimos solo las a y b que no están solas, por tanto en la primera línea, en la segunda línea solo la primera B y en la tercera línea solo la primera a.

En tercer lugar, por cada regla de producción que tiene más de dos variables (como CSA en el ejemplo), introducimos una nueva variable que viene a sustituir las dos variables de la derecha por solo una. (Por ejemplo ESA); y así obtenemos la forma normal de Chomsky.

5.2. Forma normal de Greibach Una gramática incontextual, está en la forma normal de Greibach si todas sus reglas de producción son de la forma A aβ, donde A es una variable, a es

Gramática pelada 2

Gramática incontextual : S aAb | bDA A aaA | CabA | DCba B bAB | aaD C λ | Aa D baba | AD F λ | bbB | aaA Seleccionar variables:ç S S, A, D S, A, D, C Resultado final: S aAb | bDA A aaA | CabA | DCba C λ | Aa D baba | AD

Forma normal de Chomsky

Gramática incontextual: S aSA | SB A bAA | a B aB | b Sustitución inicial: S CSA | SB A DAA | a B CB | b C a D b Reglas > 2 variables: S CE | SB A DF | a B CB | b C a D b E SA F AA

20 · Teoría de autómatas y lenguajes formales 1 un símbolo terminal y β es una concatenación de variables. Los pasos para su obtención son los siguientes: En primer lugar, limpiamos la gramática y la pasamos a la forma normal de

Chomsky. Una vez hecho esto cambiamos el nombre de las variables numerándolas con subíndices; A1, A2, A3…

A continuación hacemos los cambios necesarios para que las reglas cumplan que en AiAj… siempre j>1, por ello nos podemos encontrar con varios casos:

o Si i=j debemos introducir una nueva variable Bi para cada caso., y añadiremos las reglas Biβ y Bi βBi con la nueva variable como parte izquierda y las reglas Ai ΩBi, donde Ω es la parte derecha de todas las reglas en que Ai es su parte izquierda. En el ejemplo, tenemos una regla en la primera línea que dice A1A1A1. Para poder sustituirla debemos introducir una nueva variable B1 y las siguientes cuatro reglas:

B1A1 Porque es la parte derecha del A1 inicial. B1A1B1 Igual a la anterior pero con B1 en su parte dcha. A1 A2A3B1 y A1 A2A4B1 Porque A2A3 y A2A4 son dos

normas en las que A1 es su parte izquierda, en la primera línea.

o Si i>j se deben añadir nuevas reglas Ai XY, donde X son las partes derechas de todas las reglas con Aj en la parte izquierda. Y quizá debamos repetir este proceso varias veces. En el ejemplo encontramos que A4A1A3, por lo que debemos proceder a sustituir A1, por los valores que tenemos en la primera línea de reglas de producción, que son las 4 reglas que hemos creado anteriormente, así la primera regla de producción de A1 es A2A3, pues sustituimos A4A1A3 por A4(A2A3)A3 y este mismo cambio lo tenemos que hacer con las 3 reglas restantes. Como aun así i sigue siendo mayor que j, procedemos a cambiar A2 que es el nuevo valor j por el valor ( de su regla de producción.

En tercer lugar, pasamos a sustituir en las variables A desde abajo hasta arriba aquellas que no comiencen por un símbolo terminal. En nuestro ejemplo, solo en la primera línea no comienzan por un símbolo terminal, pero nosotros los sustituimos por el de A2 que es (.

Por último ahora en B pasamos a sustituir la variable inicial A1 en estos dos casos por todas las 4 reglas de transición de A1. Como son 4 reglas x2 deberían salirnos 8, pero omitimos dos que nos saldrían repetidas; así finalizamos la forma normal de Greibach.

6. AUTÓMATAS CON PILA Un autómata con pila es un autómata infinito con control sobre una cinta de entrada, que dispone de una memoria (potencialmente infinita) con estructura de pila (LIFO) en la que almacena símbolos de trabajo. Hay que tener claro que en su versión indeterminista, los autómatas con pila son equivalentes a los lenguajes y gramáticas incontextuales; sin embargo los autómatas con pila deterministas solo caracterizan un subconjunto estricto de los lenguajes incontextuales. También es preciso recordar que todo autómata finito no determinista (NFA) tenía un equivalente determinista; pero no sucede lo mismo en los autómatas con pila, ya que se pueden realizar más acciones con el no determinista. Por tanto, la estructura de un autómata con pila está formada por los siguientes componentes: Un conjunto finito de estados Q. Un alfabeto de entrada ∑. Un alfabeto de pila Z. Un estado inicial q0 Q.

Gramática pelada 1

Gramática incontextual:A1 A2A3 | A2A4 | A1A1 A2 (, A3 ), A4 A1A3

i=j A1 A2A3 | A2A4 | A2A3B1| A2A4B1 A2 (, A3 ), A4 A1A3

B1 A1 | A1B1

Primer cambio i>j A1 A2A3 | A2A4 | A2A3B1| A2A4B1 A2 (, A3 ), A4 A2A3 A3 | A2A4 A3 | A2A3B1 A3

A2A4B1 A3

B1 A1 | A1B1

Segundo cambio i>j A1 A2A3 | A2A4 | A2A3B1| A2A4B1 A2 (, A3 ), A4 (A3 A3 | (A4 A3 | (A3B1 A3

(A4B1 A3

B1 A1 | A1B1

Símbolo terminal en A A1 (A3 | (A4 | (A3B1| (A4B1 A2 (, A3 ), A4 (A3 A3 | (A4 A3 | (A3B1 A3

(A4B1 A3

B1 A1 | A1B1

Símbolo terminal en B A1 (A3 | (A4 | (A3B1| (A4B1 A2 (, A3 ), A4 (A3 A3 | (A4 A3 | (A3B1 A3

(A4B1 A3

B1 (A3 B1 | (A4 B1 | (A3B1 B1 | (A4B1 B1 | (A3B1 B1| (A4B1 B1

Teoría de autómatas y lenguajes formales 1 · 21

Un símbolo de fondo de pila zo Z. Un conjunto de estados finales F. Un conjunto de transiciones.

La notación quedará (q, a, z) |- (q´, β) que significa intuitivamente que cuando el autómata está en el estado q, leyendo el símbolo a en la cinta de entrada y z es la cima de la pila, se puede desafilar z, después apilar β y mover el cabezal de la cinta una posición a la derecha y pasar al estado q´.

El lenguaje aceptado por un autómata con pila utiliza dos definiciones

alternativas: Aceptación por pila vacía: Esta definición acepta las palabras que dejan la pila

vacía después de ser consumidas. El lenguaje aceptado por pila vacía denota el conjunto de las palabras que permiten pasar de la descripción instantánea inicial a una descripción instantánea en la que la pila está vacía después de haber consumido todos los símbolos de la cinta de entrada.

Aceptación por estado final: Acepta las palabras que llegan a un estado final después de ser consumidas. El lenguaje aceptado por estado final es el conjunto de las palabras que permiten pasar de la descripción instantánea inicial a una descripción instantánea con estado final después de haber consumido todos los símbolos de la cinta de entrada.

Ambas definiciones son equivalentes y no importa la que se utilice.

Para fijar mejor estos conceptos, vamos a llevar a cabo un ejemplo:

Dado el lenguaje de la tabla lateral, el autómata con pila que lo reconoce tiene las 12 transiciones que podemos observar también en la tabla: Esta transición 1 sirve para reconocer λ como palabra del lenguaje. 2 y 3: Son las transiciones que sirven para reconocer el primer símbolo de la

palabra (sea a o b) y apilarlo. 4, 5, 6 y 7: Son las transiciones que sirven para reconocer los restantes

símbolos de la primera mitad de la palabra. Es decir si hay una a en la cinta y tenemos una a en la pila, añadimos esa a (transición 4).

8 y 9 son transiciones que sirven para reconocer el primer símbolo de la segunda mitad de la palabra y desapilarlo; el autómata ahora transita al estado q1, porque en este punto cambia el comportamiento del autómata.

10 y 11 son las transiciones que sirven para reconocer los restantes símbolos de la segunda mitad de la palabra. Solo hay dos transiciones porque solo hay dos posibilidades para que la palabra sea palíndromo, que en la cinta salga una a y en la pila haya una a; o en la cinta salga una b y en la pila haya una b.

La transición 12 pasa al estado final y vacía la pila cuando no hay más símbolos de entrada, se acepta la palabra.

Es obvio que los lenguajes aceptados por un autómata con pila (no

determinista) son exactamente los lenguajes incontextuales (generados por una gramática incontextual). O dicho de otra forma, un lenguaje es incontextual sí y solo sí, es aceptado por algún autómata con pila: todo lenguaje incontextual tiene un autómata con pila que lo reconoce, y todo lenguaje aceptado por algún autómata con pila es un lenguaje incontextual.

Del párrafo anterior se desprende que siempre se puede construir un

autómata con pila a partir de una gramática incontextual, tal como apreciamos en la tabla lateral.

Autómata con pila

L=wwR/ w (a+b)* 1. (q0, λ, z0) |- (qf, λ) 2. (q0, a, z0) |- (q0, az0) 3. (q0, b, z0) |- (q0, bz0) 4. (q0, a, a) |- (q0, aa) 5. (q0, a, b) |- (q0, ab) 6. (q0, b, a) |- (q0, ba) 7. (q0, b, b) |- (q0, bb) 8. (q0, a, a) |- (q1, λ) 9. (q0, b, b) |- (q1, λ) 10. (q1, a, a) |- (q1, λ) 11. (q1, b, b) |- (q1, λ) 12. (q1, λ, z0) |- (qf, λ)

Construcción de un autómata con pila

S [B | [SB | [BS | [SBS B 1. (q, [, S) |- (q, B) 2. (q, [, S) |- (q, SB) 1. (q, [, S) |- (q, BS) 1. (q, [, S) |- (q, SBS) 1. (q, ], B) |- (q, λ)

22 · Teoría de autómatas y lenguajes formales 1

7. PROPIEDADES DE LOS LENGUAJES INCONTEXTUALES 7.1. Lema de bombeo Existe un lema de bombeo para los lenguajes incontextuales muy similar al que tenemos para lenguajes regulares. En su forma contrapositiva nos permite demostrar que un cierto lenguaje no es incontextual. Dice que para todo lenguaje L hay una constante N>=0, tal que si m pertenece al lenguaje L y |m|>=N entonces podemos dividirlo en 5 subpalabras m=uvwxy, tal que: |vx| λ |vwx| <= N Para todo i>= 0, uviwxiy pertenecen al lenguaje L.

Informalmente podemos decir que para todo lenguaje incontextual L, toda palabra suficientemente larga se puede dividir en cinco factores tales que los tres factores centrales no son demasiado largos, el segundo y el cuarto no son nulos y que es igual las veces que dupliquemos simultáneamente el segundo y el cuarto factor, porque la palabra continuará perteneciendo al lenguaje. Como ya apuntábamos anteriormente solemos utilizar esta propiedad en su forma contrarrecíproca, y decimos que para todo N>=0 hay una palabra m que pertenece al lenguaje L tal que para todas las posibles maneras de dividir m en 5 subpalabras m=uvwxy con |vx| λ, |vwx| <= N, existe un i>= 0, tal que uviwxiy no pertenece al lenguaje L. No obstante, hay ciertos lenguajes incontextuales en los que el lema del bombeo no permite demostrar que no lo son, para estos casos hay una versión todavía más restringida del lema de bombeo, conocido como lema de Orden que reza que para todo lenguaje incontextual L, hay una constante n>=0, tal que si marcamos cualquier N o más posiciones de m como “distinguidas”, entonces podemos dividir la palabra en cinco subpalabras m= uvwxy, tal que: Las subpalabras v y x tienen como mínimo una posición distinguida. Las subpalabrasvwx tienen como máximo N posiciones distinguidas Para todo i>0 uviwxiy pertenece a L.

También podemos apreciar la incontextualidad de un lenguaje de forma intuitiva y rápida, y para ello lo que hacemos es razonar sobre el autómata con pila. Por ejemplo en el lenguaje en el que existe el mismo número de a , b y c, sabemos que no es un lenguaje incontextual. Así, si pensamos en la pila, cuando apilamos a, y luego vienen b y las desapilamos, cuando llegan las c no tenemos ya nada en la pila y por eso el lenguaje no es incontextual.

7.2. Propiedades de cierre Procedemos a ver como se comportan los lenguajes incontextuales frente a las operaciones básicas de concatenación, unión, etc, el interés es elevado ya que puede ayudarnos a construir gramáticas para lenguajes incontextuales a través de lenguajes más simples, nos puede ayudar además a demostrar que un determinado lenguaje no es incontextual o que sí lo es. Unión: Los lenguajes incontextuales son cerrados respecto a la unión, es decir

la unión de dos lenguajes incontextuales es un tercer lenguaje incontextual. Así en el ejemplo lateral llegamos al lenguaje final a través de la unión del lenguaje A y del lenguaje B con la regla S A | B que nos permite escoger entre un lenguaje u otro.

Concatenación: La concatenación de dos lenguajes incontextuales es también

un lenguaje incontextual. EN el ejemplo lateral en el que existentes tantas a como b y tantas c como d, un posible lenguaje para cada uno de ellos es el

Gramática pelada 1

Unión: L=aibj | i!=j = L=aibj | i<j aibj | i>j A a | aA | aAb B b | bB 1 bBa

Resultado: S A | B A a | aA | aAb B b | bB 1 bBa Concatenación: L=aibicjdj | i,j >=1 A ab | aAb B cd | cBd

Resultado: S AB A ab | aAb B cd | cBd

Teoría de autómatas y lenguajes formales 1 · 23

mostrado en las reglas de transición A y B, que unidas a la regla S AB, nos permite concaternar estos dos lenguajes.

La estrella de kleene (*) y el cierre positivo (+): También son lenguajes

incontextuales. El lenguaje inverso también es incontextual. La intersección de dos lenguajes incontextuales no siempre es u lenguaje

incontextual. Ahora bien, la intersección de un lenguaje incontextual y un lenguaje regular, es un lenguaje incontextual.

La complementación de dos lenguajes incontextuales no siempre es un

lenguaje incontextual.

Texto elaborado a partir de:Teoría de autómatas y lenguajes formales I

Joan Vancells i Flotats, Enric Sesa i Nogueras, Junio 2003