














Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Una introducción a los conceptos básicos de los lenguajes formales, con un enfoque en su relación con los lenguajes naturales. Se explican las características de los lenguajes naturales que motivan el uso de lenguajes formales en informática. Además, se define el concepto de lenguaje universal y se estudian las operaciones básicas de concatenación y reflexiva de lenguajes.
Tipo: Apuntes
1 / 22
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!















ASIGNATURA: Aut´omatas y Lenguajes Formales. Grado en Inform´atica (2◦^ curso).
determine de forma ´unica la sem´antica con objeto de que la interpretaci´on y ejecuci´on de las ´ordenes sea correcta. Se requiere adem´as que el ordenador proporcione una respuesta lo m´as r´apida posible a las instrucciones que recibe y para ello es necesario que se minimice el tiempo que el ordenador emplea en analizar las ´ordenes antes de pasar ejecutarlas.
Debido a los requerimientos anteriores de precisi´on y eficiencia, en Inform´atica se nece- sitan lenguajes formales m´as simples que el lenguaje natural, para definir los comandos del sistema operativo y las instrucciones de los lenguajes de programaci´on, para describir con precisi´on el formato de entrada a un programa, para describir comandos de formateo de texto o realizar conversiones de formato entre archivos, etc. El uso de lenguajes formales evita la dificultad computacional que supone el procesamiento del lenguaje natural.
Un lenguaje formal no es m´as que un conjunto de cadenas que se caracterizan por cumplir una determinada propiedad que puede describirse de manera precisa, por ejemplo mediante reglas gramaticales o de sintaxis. Algunos ejemplos de lenguajes formales son:
Ejemplo 1
El lenguaje de la l´ogica proposicional. Las cadenas de este lenguaje se llaman f´ormulas proposicionales o proposiciones. Las f´ormulas se escriben seg´un unas reglas sint´acticas r´ıgidas que permiten, entre otras cosas, distinguir claramente las cadenas que son f´ormulas bien formadas (sint´acticamente correctas) de las que no los son. Ej. La cadena “v 1 ∨ ¬v 2 ∧ v 3 ” es una f´ormula del lenguaje de la l´ogica proposicional, mientras que “∨v 1 ∧ v 2 ” no tiene la forma correcta para considerarse una f´ormula. Una vez que se sabe que “v 1 ∨ ¬v 2 ∧ v 3 ” es una f´ormula sint´acticamente correcta, puede pasarse a evaluarla dando valores booleanos a las variables v 1 , v 2 , v 3 , tenien- do en cuenta las reglas de evaluaci´on (tablas de verdad) de los operadores l´ogicos (conectivas ∨, ∧, ¬). Para cada asignaci´on particular de valores a las variables, el valor de verdad resultante (que equivale al significado de la f´ormula) es ´unico, no hay ambig¨uedad en el resultado o, al menos, puede evitarse con facilidad estableciendo reglas de precedencia y asociatividad de operadores.
El lenguaje de programaci´on C. Las cadenas de este lenguaje son los programas sint´acticamente correctos en C. No es lo mismo un algoritmo que un programa en C. En el algoritmo no se tiene en cuenta una sintaxis estricta para escribir las instruc- ciones, para el tipo de las variables o para usar sentencias de entrada/salida, porque lo que interesa es mostrar la esencia de los c´alculos que se necesitan para resolver un problema. El lenguaje algor´ıtmico abstracto puede considerarse semi-formal, porque es una mezcla de formalismos y lenguaje natural; el lenguaje algor´ıtmico en pseu- doc´odigo es m´as formal, pero para que un ordenador lo entienda es necesario im- plementar los algoritmos en programas escritos en un lenguaje formal como C, para que pueda ser compilado y ejecutado por la m´aquina.
El lenguaje de direcciones de correo electr´onico. Es un lenguaje m´as simple que los anteriores. Est´a formado por cadenas que respetan la sintaxis de las direc- ciones de correo. Ej. “[email protected]” es una cadena del lenguaje, pero “unalumno@es” no lo es, porque le falta la subcadena que identifica al dominio del servidor de correo.
Especificaci´on y procesamiento de lenguajes formales
La mayor´ıa de lenguajes formales de inter´es en Inform´atica contienen potencialmente un n´umero infinito de cadenas y resulta fundamental encontrar una descripci´on com- putacional del lenguaje, que es aquella que especifica formalmente (de forma precisa, sin ambig¨uedad) el lenguaje mediante una expresi´on finita, codificable y aplicable en tareas de procesamiento de cadenas del lenguaje. Los formalismos y modelos te´oricos m´as comunes para especificaci´on formal y proce- samiento de lenguajes formales, que estudiaremos en los distintos temas de la asignatura, son las expresiones regulares, los aut´omatas y las gram´aticas. Tambi´en se usan estos for- malismos en determinadas tareas relacionadas con el procesamiento del lenguaje natural. De hecho las gram´aticas tienen su origen en los trabajos de Noam Chomsky en ling¨u´ıstica.
Ahora introducimos un ejemplo de gram´atica. Una gram´atica es un conjunto finito de reglas con las que se puede describir la sintaxis y la estructura de las cadenas de un lenguaje formal. Con las reglas se pueden generar cadenas del lenguaje y tambi´en se usan las reglas en algoritmos que comprueban si una cadena de s´ımbolos tiene el formato adecuado para que se considere dentro del lenguaje especificado por la gram´atica, es decir, para comprobar si es sint´acticamente correcta. Las gram´aticas son de especial inter´es para describir formalmente la sintaxis de los lenguajes de programaci´on y para construir compiladores.
Ejemplo 2 Supongamos que tenemos un lenguaje de programaci´on simple y describi- mos informalmente los programas como: “un programa comienza por la palabra clave begin, va seguido de un bloque de sentencias (debe haber al menos una senten- cia) y termina por la palabra clave end. Una sentencia puede ser una sentencia de asignaci´on o una sentencia condicional tipo if o una sentencia iterativa tipo while. Un sentencia de asignaci´on se forma... , etc.” Esta descripci´on narrada de la sintaxis se especifica formalmente mediante las siguientes reglas gram´aticales (se incluyen s´olo las primeras reglas):
⟨programa⟩ → begin ⟨bloque-sentencias⟩ end ⟨bloque-sentencias⟩ → ⟨sentencia⟩ | ⟨sentencia⟩⟨bloque-sentencias⟩ ⟨sentencia⟩ → ⟨sent-if⟩ | ⟨sent-while⟩ | ⟨sent-asig⟩ ⟨sent-asig⟩ →...
...
Lo que aparece entre ´angulos son variables de la gram´atica y representan porciones de las cadenas del lenguaje, en este caso de los programas. Por ejemplo, la variable ⟨programa⟩ representa a un programa completo y la variable ⟨sentencia⟩ representa a una sentencia de un programa. Cada regla de la gram´atica tiene una variable en la parte izquierda de la flecha y una o varias expresiones separadas por | en parte derecha, que describen en qu´e consiste la parte de un programa representada por la variable de la izquierda.
Para el dise˜no e implementaci´on de una aplicaci´on compleja de procesamiento de cade- nas de un lenguaje formal, como es el caso de un compilador, se usan modelos te´oricos, algoritmos y herramientas que combinan expresiones regulares, gram´aticas y aut´omatas
Una cadena (o palabra) es una secuencia finita de s´ımbolos de cierto alfabeto V. En general, usaremos las letras w, x, y, z como variables de cadena, para referirnos a cadenas arbitrarias. Ej. considerando el alfabeto {a, b, c} tenemos que aa, abb, bcacc son cadenas formadas por s´ımbolos de ese alfabeto, porque en ellas s´olo aparecen los s´ımbolos a, b, c y se tiene que a, b, c ∈ {a, b, c}. Obs´ervese que a, b, c adem´as de ser s´ımbolos pueden considerarse tambi´en cadenas.
La longitud de una cadena w se denota como |w| y es el n´umero de s´ımbolos que aparecen en w. Ej. |bcacc| = 5, |a| = 1.
A la cadena que no tiene s´ımbolos la llamaremos cadena vac´ıa y se denota por la letra griega λ (en algunos libros se usa ϵ). Se tiene que |λ| = 0.La cadena vac´ıa no es un s´ımbolo, as´ı que es incorrecto afirmar que λ ∈ V , sea cual sea el alfabeto V.
V ∗^ denota el conjunto de las cadenas de cualquier longitud que se forman con los s´ımbolos del alfabeto V, incluida la cadena vac´ıa λ, y se llama lenguaje universal con alfabeto V. Siempre se tiene que λ ∈ V ∗, con independencia de los s´ımbolos del alfabeto V. Ej. considerando que V = {a, b, c} entonces V ∗^ = {a, b, c}∗^ es el lenguaje universal con alfabeto {a, b, c} que contiene todas las cadenas formadas por a’s o b’s o c’s y tambi´en la cadena vac´ıa; as´ı λ, a, abb, c, bcacc son cadenas de {a, b, c}∗, que expresamos formalmente como: λ, a, abb, c, bcacc ∈ {a, b, c}∗.
V +^ es el conjunto de las cadenas con alfabeto V de longitud mayor o igual que 1 (no incluye λ). Se cumple que V ∗^ = V +^ ∪ {λ}.
Ejemplo 3 Consideremos el alfabeto de d´ıgitos decimales Vdig = { 0 , 1 , 2 ,... , 9 }.
En el lenguaje universal V (^) dig∗ est´an todas las cadenas formadas por concatenaci´on de s´ımbolos que representan d´ıgitos decimales, junto con la cadena vac´ıa λ. Las cadenas de V (^) dig+ (no incluye λ), podemos interpretarlas como n´umeros naturales en notaci´on decimal.
Es incorrecto escribir 245 ∈ Vdig, porque los elementos del alfabeto Vdig son s´ımbo- los, no cadenas. Es correcto escribir 245 ∈ V (^) dig∗ y tambi´en 2 ∈ V (^) dig∗, porque 2 , adem´as de ser un s´ımbolo del alfabeto ( 2 ∈ Vdig), es tambi´en una cadena de longi- tud 1 del lenguaje universal V (^) dig∗.
No debemos pensar que los s´ımbolos son los caracteres con que se escriben las palabras de un texto o los n´umeros. Son m´as que eso:
Los s´ımbolos de un alfabeto son entidades abstractas que se usan para repre- sentar (simbolizar ) componentes indivisibles de un lenguaje formal (no se pueden ‘partir’ en otros s´ımbolos) y que se combinan para formar cadenas o secuencias de muy diverso tipo.
Ejemplo 4 Con el alfabeto V = {A, C, G, T } se pueden representar las bases nitroge- nadas que se conectan en una cadena de ADN, a saber: Adenina, Citosina, Guanina, Timina. Ciertas cadenas que se forman con estos s´ımbolos, como GAT T ACA, represen- tan secuencias de ADN. En Bioinform´atica es de vital inter´es analizar secuencias de
ADN y puede hacerse en parte aplicando diversas t´ecnicas que proporciona la Teor´ıa de Aut´omatas y Lenguajes Formales.
A veces, los s´ımbolos se usan para representar eventos que suponen un cambio de estado en un sistema y opcionalmente la realizaci´on de alguna acci´on. Se puede definir un alfabeto con un s´ımbolo para representar a cada evento y las cadenas ser´ıan secuencias de eventos que se producen en cierto intervalo de tiempo.
Ejemplo 5 Podemos usar nombres m´as significativos para los s´ımbolos de eventos. Ej. el alfabeto EvBoton = {aceptar, cancelar, cerrar} contiene tres s´ımbolos que representan eventos que se producen por la pulsaci´on de botones en una ventana de una interfaz gr´afica. El s´ımbolo ‘aceptar’ representa un ´unico evento y los caracteres individuales del nombre del s´ımbolo no tienen sentido de forma aislada. Si hay m´as botones que generen eventos en la aplicaci´on se ampliar´ıa este alfabeto de s´ımbolos de evento. Una cadena con estos s´ımbolos representa una secuencia de eventos de pulsaci´on de botones.
La operaci´on fundamental con cadenas de cierto lenguaje universal V ∗^ es la concate- naci´on. Es una operaci´on binaria que denotamos con el operador ◦ y se define formalmente como:
◦ : V ∗^ × V ∗^ −→ V ∗ x ◦ y 7 → xy
La definici´on anterior indica que la concatenaci´on se aplica a dos cadenas x, y ∈ V ∗^ y produce como resultado la cadena xy con los s´ımbolos de la primera cadena x seguidos de los s´ımbolos de la segunda cadena y.
Ejemplo 6 Dado un alfabeto V = {a, b} y las cadenas x = abb, y = aaaa, entonces x ◦ y = xy = abbaaaa.
Propiedades b´asicas de la concatenaci´on:
Propiedad asociativa: ∀ x, y, z ∈ V ∗^ : x ◦ (y ◦ z) = (x ◦ y) ◦ z
Elemento identidad λ: ∀ x ∈ V ∗^ : λ ◦ x = x ◦ λ = x
Definici´on 2 (subcadena, prefijo y sufijo)
Una cadena z es subcadena de otra cadena w def ⇐⇒ ∃ x, y : w = x ◦ z ◦ y
Una cadena z es un prefijo de w
def ⇐⇒ ∃ x : w = z ◦ x
Una cadena z es un sufijo de w def ⇐⇒ ∃ x : w = x ◦ z
Nota:
La potencia tiene mayor precedencia que la concatenaci´on. Eso significa que hay que usar par´entesis cuando sea oportuno para alterar el convenio de precedencia de operadores, como en las operaciones aritm´eticas. Ej. al escribir w^2 se entiende que la cadena resultante es w ◦ w = ww, pero si se escriben los s´ımbolos concretos de w hay que encerrar los s´ımbolos entre par´entesis. Ej. si w = 234 entonces w^2 = (234)^2 = 234 ◦ 234 = 234234, mientras que si no ponemos los par´entesis tenemos que 234^2 = 23 ◦ (4)^2 = 23 ◦ 44 = 2344.
w^0 siempre es λ, independientemente de c´omo sea la cadena w. Ej. considerando que 234 es una cadena de s´ımbolos de d´ıgitos decimales, esto es: 234 ∈ V (^) dig∗ , entonces (234)^0 = λ. No es cierto que (234)^0 = 1. Ese ser´ıa el resultado en caso de interpretar 234 como un n´umero y aplicar la operaci´on de potencia num´erica.
Informalmente, dada una cadena w, la cadena refleja wR^ se obtiene ‘d´andole la vuelta’ a los s´ımbolos de w. Por ejemplo, si w = aab entonces wR^ = baa. Se puede definir formalmente la cadena refleja de manera recursiva teniendo en cuenta que la cadena sea vac´ıa (caso base) o que tenga al menos un s´ımbolo:
Nota: La reflexi´on tiene mayor precedencia que la concatenaci´on y la misma que la potencia.
Ejemplo 9 Dada la cadena aab entonces (aab)R^ = baa y se puede comprobar a partir de la definici´on recursiva haciendo una evaluaci´on descendente de (aab)R, teniendo en cuenta que abb = a ◦ ab:
(aab)R^ = (a ◦ ab)R
def z}|{ = (ab)R^ ◦ a = (a ◦ b)R^ ◦ a = (bR) ◦ a ◦ a = (λR) ◦ b ◦ a ◦ a
resolver z}|{ = baa
De forma m´as compacta omitiendo el operador de concatenaci´on ‘◦’ en todos los pasos de la evaluaci´on recursiva ser´ıa:
(aab)R^ = (ab)Ra = (bR)aa = (λR)baa = λbaa = baa
Recordamos que V ∗^ denota al lenguaje universal con alfabeto V , que contiene a todas las cadenas de cualquier longitud formadas por s´ımbolos del alfabeto V y la cadena vac´ıa λ. Seleccionando distintos tipos de cadenas del lenguaje universal se forman distintos lenguajes. En general, se dice que un lenguaje con alfabeto V es un conjunto de cadenas de s´ımbolos del alfabeto V. M´as formalmente se dice que:
Definici´on 4 Un lenguaje L con alfabeto V es un subconjunto del lenguaje universal V ∗ y se denota como L ⊆ V ∗.
Nota: El lenguaje vac´ıo ∅ y el propio alfabeto V pueden considerarse lenguajes, por ser subconjuntos de V ∗. No es lo mismo ∅ que {λ}, porque el lenguaje {λ} contiene la cadena vac´ıa y el lenguaje ∅ no contiene ninguna cadena.
Entre todos los lenguajes incluidos en el lenguaje universal (hay un n´umero infinito no numerable de ellos, tantos como subconjuntos de V ∗) nos interesan los lenguajes for- males, que son aquellos cuyas cadenas cumplen cierta propiedad que puede describirse o especificarse de manera precisa (formal), a partir de una descripci´on informal o en lenguaje natural. Al ser los lenguajes formales conjuntos de cadenas podemos describirlos formal- mente como se hace habitualmente para definir conjuntos en matem´aticas. Entre los diver- sos tipos de definiciones o descripciones matem´aticas de conjuntos/lenguajes destacamos en este tema las definiciones por extensi´on y las definiciones por comprensi´on (tambi´en llamadas definiciones por intensi´on), que explicamos a continuaci´on.
Definici´on de un lenguaje por extensi´on
Consiste simplemente en enumerar las cadenas del lenguaje entre llaves y separadas por comas. Es una descripci´on que s´olo sirve para lenguajes finitos.
Nota: cuando tenemos un lenguaje finito L, la cardinalidad de L es el n´umero de elementos (cadenas) de L, que se expresa como |L| (no confundir con |w|, que es la longitud o n´umero de s´ımbolos de la cadena w).
Ejemplo 10 Consideramos la siguiente descripci´on informal (en lenguaje natural) de un lenguaje que llamamos BinLon2: “el lenguaje BinLon2 est´a formado por todas las cadenas de d´ıgitos binarios de longitud 2”. El alfabeto de este lenguaje es { 0 , 1 } y el lenguaje universal es { 0 , 1 }∗. La descripci´on formal por extensi´on del lenguaje es
BinLon2 = { 00 , 01 , 10 , 11 }
Se tiene que BinLon2 ⊆ { 0 , 1 }∗. Est´a claro que |BinLon2| = 4, porque hay 4 cadenas en el lenguaje BinLon2. Adem´as, para toda cadena w ∈ BinLon2 se tiene que |w| = 2.
damos por supuesto que el alfabeto del lenguaje A es {a, b} y por tanto el lenguaje universal es {a, b}∗. Aqu´ı la propiedad de pertenencia se expresa con el patr´on anb, n ≥ 0 , que se reparte entre el pre´ambulo y el cuerpo de la definici´on e indica el formato de las cadenas que pertenecen al lenguaje A. En el patr´on aparece el par´ametro num´erico n, que al variarlo permite describir a todas las palabras del lenguaje. Cuando n = 0 se tiene que a^0 b = b, as´ı que b ∈ {anb | n ≥ 0 } y para n = 1, 2 , 3... se tiene que ab, aab, aaab,... , son cadenas del lenguaje {anb | n ≥ 0 }. La definici´on en (1) es equivalente a esta otra en (2) donde se especifica expl´ıcitamente el lenguaje universal: A = {w ∈ {a, b}∗^ | w = anb y n ≥ 0 } (2)
Cuando hay varias condiciones en el cuerpo de la definici´on, como es el caso de la definici´on en (2), pueden separarse las condiciones mediante comas o mediante la conjunci´on l´ogica ∧, en lugar de ‘y’ en lenguaje natural (son preferibles las dos primeras opciones, por no confundir ‘y’ con una cadena):
A = {w ∈ {a, b}∗^ | w = anb, n ≥ 0 }, o bien A = {w ∈ {a, b}∗^ | w = anb ∧ n ≥ 0 }
La descripci´on matem´atica de lenguajes es adecuada como paso previo para formalizar la resoluci´on computacional de un problema de procesamiento de cadenas del lenguaje. En los siguientes temas veremos c´omo ‘traducir’ una descripci´on matem´atica en una de- scripci´on computacional de un lenguaje mediante alguno de los formalismos (tambi´en de car´acter matem´atico) de expresiones regulares, aut´omatas o gram´aticas y c´omo usar dichos formalismos en diversos algoritmos de procesamiento de cadenas.
Los lenguajes se pueden combinar mediante operaciones que producen como resultado otro lenguaje. Algunas de las operaciones con lenguajes son las mismas que se pueden hacer entre conjuntos cualesquiera y otras son operaciones que tienen que ver con las operaciones entre cadenas que hemos introducido en la secci´on 2. Las operaciones con lenguajes, aparte de ser usadas en demostraciones de resultados te´oricos, pueden servir como herramienta para obtener descripciones formales de lenguajes complejos a partir de otros lenguajes m´as simples.
Las operaciones habituales de la teor´ıa de conjuntos son aplicables a los lenguajes, ya que los lenguajes son conjuntos de cadenas. Hacemos ahora un repaso de las operaciones de conjuntos que se ven en la asignatura de Fundamentos L´ogicos, teniendo en cuenta que los elementos de los conjuntos que nosotros manejamos son siempre cadenas de s´ımbolos de cierto alfabeto V. El “universo” de todas las cadenas de s´ımbolos de V , que tenemos en cuenta en las operaciones, es el lenguaje universal V ∗.
Definici´on 5 Sean L 1 y L 2 dos lenguajes:
La uni´on de L 1 y L 2 , denotada L 1 ∪ L 2 , es el lenguaje formado por las cadenas de ambos lenguajes. Formalmente:
L 1 ∪ L 2 = {w | w ∈ L 1 o w ∈ L 2 }
O mejor usando las disyunci´on l´ogica ∨, por no confundir ‘o’ con una cadena o un s´ımbolo. L 1 ∪ L 2 = {w | w ∈ L 1 ∨ w ∈ L 2 }
La intersecci´on de dos lenguajes L 1 y L 2 , denotada L 1 ∩ L 2 , es el lenguaje que contiene a cadenas que pertenecen tanto a L 1 como a L 2. Formalmente:
L 1 ∩ L 2 = {w | w ∈ L 1 ∧ w ∈ L 2 }
La diferencia de los lenguajes L 1 y L 2 , denotada L 1 −L 2 , es el lenguaje que contiene a cadenas que pertenecen a L 1 y no pertenecen a L 2 :
L 1 − L 2 = {w | w ∈ L 1 ∧ w /∈ L 2 }
El lenguaje complementario de L 1 (con respecto a cierto lenguaje universal V ∗) es el lenguaje, denotado como L 1 , que contiene a todas las cadenas del lenguaje universal V ∗^ que no est´an en L 1. Formalmente: L 1 = V ∗^ − L 1
Ejemplo 13 Consideremos de nuevo el lenguaje
BinIg = {w ∈ { 0 , 1 }∗^ | ceros(w) = unos(w)}
Sea ahora el lenguaje BinImpar que contiene las cadenas que representan n´umeros bi- narios impares. Este lenguaje se puede describir por comprensi´on sin hacer referencia a ninguna propiedad num´erica como:
BinImpar = {z 1 | z ∈ { 0 , 1 }∗}
O lo que es lo mismo (usando el lenguaje universal en el pre´ambulo):
BinImpar = {w ∈ { 0 , 1 }∗^ | w = z 1 }
La propiedad de pertenencia indica, por tanto, que la cadena w debe acabar en 1 (adem´as de contener s´olo s´ımbolos 0/1). En la segunda definici´on se deduce que z ∈ { 0 , 1 }∗, por tanto no es necesario incluir esta condici´on en el cuerpo de la descripci´on. Si queremos describir al lenguaje BinIgImpar formado por todas las cadenas binarias que representan n´umeros impares y adem´as tienen el mismo n´umero de ceros que de unos podemos tener en cuenta que
BinIgImpar = BinIg ∩ BinImpar = {w | w ∈ BinIg ∧ w ∈ BinImpar}
La anterior no es una definici´on expl´ıcita de BinIgImpar porque se hace referencia a otros lenguajes. Considerando la propiedad que caracteriza la pertenencia de w a cada lenguaje, podemos dar una descripci´on por comprensi´on expl´ıcita de BinIgImpar como:
BinIgImpar = {w ∈ { 0 , 1 }∗^ | ceros(w) = unos(w), w = z 1 }
Ej. Dado el lenguaje finito A = {ab, c} con alfabeto V = {a, b, c}:
A^0 = {λ} A^1 = A ◦ A^0 = {ab, c} ◦ {λ} = {ab ◦ λ, c ◦ λ} = {ab, c} A^2 = A ◦ A^1 = {ab, c} ◦ {ab, c} = {ab ◦ ab, ab ◦ c, c ◦ ab, c ◦ c} = {abab, abc, cab, cc} A^3 = A ◦ A^2 = {ab, c} ◦ {abab, abc, cab, cc} = {ababab, ababc, abcab, abcc, cabab, cabc, ccab, ccc}
Obs´ervese que no se puede afirmar que Ln^ = {wn^ | w ∈ L}, ya que para n = 2 y L = A = {ab, c} se tiene que {w^2 | w ∈ {ab, c}} = {(ab)^2 , c^2 } = {abab, cc} y este lenguaje es claramente distinto de A^2 = {abab, abc, cab, cc}.
El lenguaje reflejo de L 1 , denotado LR 1 , es el lenguaje que contiene todas las cadenas reflejas de las cadenas de L 1 :
LR 1 =
wR^ | w ∈ L 1
Ej. El lenguaje reflejo de A = {ab, c} es el lenguaje AR^ = {ab, c}R^ =
(ab)R, cR
{ba, c}.
propiedades de la concatenaci´on de lenguajes:
Dados tres lenguajes cualesquiera L 1 , L 2 , L 3 , se cumplen las siguientes propiedades:
Elemento nulo ∅: L 1 ◦ ∅ = ∅
Elemento identidad {λ}: L 1 ◦ {λ} = {λ} ◦ L 1 = L 1
Propiedad asociativa: (L 1 ◦ L 2 ) ◦ L 3 = L 1 ◦ (L 2 ◦ L 3 )
Distributiva de la concatenaci´on de lenguajes con respecto de la uni´on:
Dado un lenguaje L, se define la clausura de Kleene (o cierre) de L, denotado L∗, mediante cualquiera de las dos expresiones siguientes:
(1)
L∗^ =
n=
Ln^ o por comprensi´on:
(2) L∗^ = {w 1 w 2... wk | k ≥ 0 , donde cada wi ∈ L}
Al desarrollar la uni´on infinita en (1) se tiene que L∗^ = L^0 ∪ L^1 ∪ L^2 ∪... y puede expresarse de forma expl´ıcita como se indica en la definici´on (2), donde se aprecia que L∗^ contiene todas las cadenas que se obtienen al concatenar cero o m´as cadenas de L; se tiene que λ ∈ L∗^ por defecto, cuando se considera k = 0 (se concatenan 0 cadenas de L).
De la expresi´on (1) se deduce igualmente que λ ∈ L∗^ sea cual sea el lenguaje L, porque
al hacer la uni´on con L^0 = {λ} se tiene que L∗^ = {λ} ∪ L^1 ∪ L^2 ∪....
Se define la clausura positiva (o cierre positivo) de L, denotado L+, de forma an´aloga a L∗, pero considerando que se concatenan una o m´as cadenas de L:
n=
Ln^ o por comprensi´on: L+^ = {w 1 w 2... wk | k > 0 , donde cada wi ∈ L}
A partir de las definiciones anteriores se deduce que L+^ ⊆ L∗^ puesto que L∗^ = {λ} ∪ L+
Aunque en la uni´on infinita de L+^ no se incluye la potencia cero L^0 = {λ}, eso no quiere decir necesariamente que λ /∈ L+^ porque puede que λ ∈ L y por tanto se incluye en la clausura positiva por la uni´on con L^1 = L, o bien, por la definici´on expl´ıcita: si λ ∈ L entonces para k = 1 y w 1 = λ se tiene que λ ∈ L∗.
Ejemplo 14 Sea el lenguaje C = { 00 , 11 }. En C∗^ tendr´ıamos todas las cadenas que se forman al concatenar cero o m´as veces las cadenas 00 o 11. Ejemplos de cadenas que pertenecen a C∗^ son (de menor a mayor longitud, hasta longitud 4):
λ, 00 , 11 , 0000 , 0011 , 1100 , 1111 ,...
Para describir C∗^ de forma expl´ıcita por comprensi´on recurrimos a la definici´on general dada en (2) m´as arriba, sustituyendo L por { 00 , 11 }:
C∗^ = {w 1 w 2... wk | k ≥ 0 , donde cada wi ∈ { 00 , 11 }}
lo cual equivale a:
C∗^ = {w 1 w 2... wk | k ≥ 0 , donde cada wi = 00 ∨ wi = 11}
Sean ahora los lenguajes A = {a} y B = {b}. Vamos a describir por comprensi´on (A ◦ B)∗ y (A ◦ B)+^ con una expresi´on lo m´as corta posible, usando un patr´on con par´ametros num´erico. Primero calculamos A ◦ B = {ab}, que contiene s´olo la cadena ab y por tanto en la clausura (A ◦ B)∗^ tendr´ıamos todas las cadenas que se forman al concatenar cero o m´as veces la cadena ab consigo misma. Por tanto podemos afirmar que:
(A ◦ B)∗^ = {ab}∗^ = {(ab)n^ | n ≥ 0 }
Desarrollando la uni´on de las sucesivas potencias de (A ◦ B)∗^ podemos llegar a la misma conclusi´on:
(AB)∗^ =
n=0(AB)
n (^) = (AB) (^0) ∪ (AB) (^1) ∪ (AB) (^2) ∪ (AB) (^3) ∪ · · · = {λ} ∪ {ab} ∪ {abab} ∪ {ababab} ∪ · · · = {(ab)n^ | n ≥ 0 }
Por razonamiento an´alogo se tiene que (A ◦ B)+^ = {ab}+^ = {(ab)n^ | n > 0 }. En este caso λ /∈ (A ◦ B)+^ porque λ /∈ (A ◦ B).
Como vemos, se obtienen resultados diferentes para (1) y (2), por tanto no se cumple la propiedad.
L 1 = {w ∈ { 0 , 1 }∗^ | ceros(w) es par} L 2 = {w ∈ { 0 , 1 }∗^ | w = 01n, n ≥ 0 }
Demuestra que L 1 ◦ L 2 = L 3 , donde:
L 3 = {w ∈ { 0 , 1 }∗^ | ceros(w) es impar}
Soluci´on.Para demostrar que L 1 ◦ L 2 = L 3 se procede como en una demostraci´on de igualdad de conjuntos, por lo que hay que probar que se da la inclusi´on en ambos sentidos, es decir, que L 1 ◦ L 2 ⊆ L 3 y que L 3 ⊆ L 1 ◦ L 2. Probamos que L 1 ◦ L 2 ⊆ L 3. Mostramos los pasos para deducirlo.
a) Supongamos que w ∈ L 3 y w = x0. Entonces x debe tener un n´umero par de ceros, por tanto: w = (^) |{z}x ∈ L 1
|{z}^0 ∈ L 2 b) Supongamos que w ∈ L 3 y w = x1. Entonces x debe tener un n´umero impar de ceros, por pertenecer w a L 3. Ahora partimos la cadena x de forma x = z 10 z 2 , donde el cero que aparece es el de m´as a la derecha de x y por tanto z 1 ser´a una subcadena con un n´umero par de ceros y z 2 una subcadena con cero o m´as unos. Por tanto. w = x1 = z 1 |{z} ∈ L 1
0 z 21 | {z } ∈ L 2 De los casos a) y b) se deduce que toda cadena w del lenguaje L 3 puede ex- presarse como la concatenaci´on de una cadena de L 1 y una cadena de L 2 , por tanto L 3 ⊆ L 1 ◦ L 2 , como quer´ıamos probar.
conclusi´on: habiendo probado que L 1 ◦ L 2 ⊆ L 3 y que L 3 ⊆ L 1 ◦ L 2 se deduce que L 1 ◦ L 2 = L 3
Npar = {xp ∈| x ∈ V (^) dig∗ , p ∈ { 0 , 2 , 4 , 6 , 8 }}
La descripci´on muestra un patr´on para las cadenas de n´umeros pares. Dice en el pre´ambulo que est´an formadas por la concatenaci´on de dos subcadenas (xp) y en el cuerpo se indica que x es una secuencia de cero o m´as d´ıgitos (x ∈ V (^) dig∗) y se impone la condici´on de que p sea un d´ıgito par (p ∈ { 0 , 2 , 4 , 6 , 8 }). Ej. se puede afirmar que 334 ∈ Npar seg´un la definici´on anterior porque 334 = xp, donde x = 33, que pertenece a V (^) dig∗ , y p = 4, que pertenece al conjunto { 0 , 2 , 4 , 6 , 8 }. Tambi´en tenemos que 6 ∈ Npar porque 6 = xp, donde x = λ, λ ∈ V (^) dig∗, p = 6 y 6 ∈ { 0 , 2 , 4 , 6 , 8 }. Sin embargo 845 ∈/ Npar, porque debe ser p = 5, pero 5 ∈ {/ 0 , 2 , 4 , 6 , 8 }.
a) Npar = N (^) par+ b) Npar=N (^) par∗
Soluci´on. a) Primero observamos que para formar la clausura positiva N (^) par+ se obtienen todas las cadenas resultantes de la concatenaci´on de una o m´as cadenas de Npar y de esta forma se obtienen siempre cadenas que acaban con un d´ıgito par, luego todas las cadenas w ∈ N (^) par+ cumplen que w ∈ Npar, lo que significa que N (^) par+ ⊆ Npar. Por otro lado esta claro que Npar ⊆ N (^) par+ puesto que por definici´on N (^) par+ =
n=1 N^
n par. Como N (^) par+ ⊆ Npar y Npar ⊆ N (^) par+ podemos concluir que Npar = N (^) par+.
b) Npar ̸= N (^) par∗ porque λ /∈ Npar (no acaba en d´ıgito par) y λ ∈ N (^) par∗ (la cadena vac´ıa pertenece a la clausura de cualquier lenguaje).
a) Obtener An^ para 0 ≤ n ≤ 3, teniendo en cuenta la definici´on recursiva de An. b) ¿Cuantos elementos tiene An^ en general (∀ n ≥ 0)? Justifica la respuesta c) ¿Se cumple que A∗^ = A+? Justifica la respuesta.
Soluci´on. a) Calculamos las potencias de A hasta n = 3, seg´un la definici´on recursiva:
A^0 = {λ} (caso base) A^1 = A ◦ A^0 = {λ, a} ◦ {λ} = {λ, a} A^2 = A ◦ A^1 = {λ, a} ◦ {λ, a} = {λ, a, aa} A^3 = A ◦ A^2 = {λ, a} ◦ {λ, a, aa} = {λ, a, aa, aaa}
b) Observando las potencias anteriores y generalizando podemos deducir que:
An^ = {ak^ | 0 ≤ k ≤ n}