CAPITULO 2: LENGUAJES 2.1. DEFINICIONES PREVIAS SIMBOLO: Es una entidad indivisible, que no se va a definir. Normalmente los símbolos son letras (a,b,c,………….., Z), dígitos (0, 1, ……….., 9) y otros caracteres (+, -, *, /, ¿, ………….). los símbolos también pueden estar formados por varias letras o caracteres, así por ejemplo las palabras reservadas de un lenguaje de programación son símbolos de dicho lenguaje. abc..........Z 0 1 2 . . . . . . . . . .9 Símbolos +*?>......... 2.2. ALFABETO O VOCABULARIO: Conjunto finito de “símbolos”. Los alfabetos se definen por enumeración de los símbolos que contienen. Utilizaremos la letra V para referenciar un alfabeto, para definir que un símbolo a pertenece a un alfabeto V se utiliza la notación a ϵ V. Ej: V V1 = {a, b, c, ……………., z} → alfabeto castellano a z V2 = {0, 1} → alfabeto binario b d V3 = {a, b} 2.3. CADENA SOBRE UN ALFABETO: Toda secuencia finita de símbolos tomados de un determinado alfabeto. Puede haber repetición, es decir, un símbolo puede aparecer varias veces dentro de la cadena. También se llama a la cadena, palabra, tira o string. Utilizaremos la letra s minúscula para referenciar una cadena. Secuencia: → tienen un orden lineal, sucesión finita. Todos los símbolos tienen un sucesor excepto el último y todos tienen un predecesor excepto el primero. Ej: s1 = abcbz es una cadena del alfabeto V1 s2 = 001101 es una cadena del alfabeto V2 s3 = aaabab es una cadena del alfabeto V3 s4 = sintaxis es una cadena del alfabeto V1 2.4. LONGITUD DE UNA CADENA s: Esta dada por la cantidad de apariciones u ocurrencias de símbolos en la cadena, es decir, cantidad de símbolos o letras que la componen. Se indica |s| 19 Ej V = {a, b} V = {a, b, c, . . .. . . , z} s1 = abbba |s1| = 5 s2 = a |s2| = 1 s1 = sintaxis |s1| = 8 s2 = lenguajes |s2| = 9 s3 = for |s3| = 3 2.5. CADENA VACIA: Es una cadena especial de longitud cero, es decir, no posee símbolos. Se indica o representa con la letra Ɛ (épsilon). | Ɛ | = 0. 2.6. PARTES DE UNA CADENA: PREFIJO DE UNA CADENA s: toda cadena que resulta de eliminar 0 o más ocurrencias de símbolos de la cadena s desde el extremo derecho. Si no elimino ninguno me queda s, si elimino todos me queda Ɛ, por lo tanto, s y Ɛ son prefijos. Se define como prefijo propiamente dicho a aquel que no es ni s ni Ɛ. Ej: s = sintaxis → sin SUFIJO: cadena que se obtiene eliminando 0 o más símbolos desde la izquierda. Sufijo propiamente dicho es aquel que no es ni s ni Ɛ. Ej: s = sintaxis → taxis SUBCADENA DE UNA CADENA s: toda cadena que se obtiene al eliminar un prefijo y un sufijo de s. Subcadena propiamente dicha es aquella que no es ni s ni Ɛ. Ej: s = sintaxis → inta SUBSECUENCIA DE s: cualquier cadena que se forma eliminando 0 o más símbolos, no necesariamente consecutivos, de s. Ej: s = sintaxis → sinas Con un alfabeto finito puedo hacer infinitas cadenas ∀ s, tanto s como Ɛ son: prefijo, sufijo y subcadena 20 2.6. OPERACIONES ENTRE CADENAS CONCATENACION DE CADENAS: sean x e y dos cadenas cualesquiera sobre el alfabeto V, se denomina concatenación de x e y y se representa x.y a una nueva cadena que se obtiene agregando y a x. Es decir, es la palabra formada al escribir los símbolos de la primera seguidos inmediatamente por los símbolos de la segunda. Ej: x = vice y = director x . y = vicedirector y . x = directorvice POTENCIA ENTERA n ≥ 0 DE UNA CADENA s por lo tanto x.y≠y.x sn: Estamos en presencia de una definición por recurrencia: s0 = Ɛ cadena vacía si = si-1 . s (con i > 0) = s.s.s. . . . . . s (i veces) Ej: s3 = s2 . s = (s1 . s) . s = ((s0 .s) . s) . s = ((Ɛ . s) .s) .s = (s . s) . s = s . s . s s3 = jajaja s = ja 2.7. LENGUAJE: Conjunto (finito o infinito) de cadenas que se pueden formar con un alfabeto (finito). Se representa con la letra L Lenguaje sobre un alfabeto V es cualquier conjunto de cadenas sobre ese alfabeto. Lenguaje sobre V es cualquier subconjunto de V*. V* conjunto de todas las palabras posibles obtenidas de V incluyendo la palabra vacía (es un conjunto infinito ∞). V* cadenas Ɛ a V V alfabeto cadenas de longitud 1 = alfabeto V es un lenguaje sobre V V* es un lenguaje sobre V {Ɛ} es un lenguaje – tiene una cadena que es vacía Ø o { } es un lenguaje – conjunto vacío – no tiene cadenas L ⊆ V* (L está contenido en V* o es igual a V*) 21 Ej: V = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} L1(V) = {nº de 2 cifras} L2(V) = {todos los nº} L3(V) = {nº binarios} V = {n, s, o, i, 3, 9} R = {no; si} S = {33; 9a} 2.8. LENGUAJE VACÍO: Existe un lenguaje denominado lenguaje vacío, que es un conjunto vacío y que se denota con Ø o { }. El lenguaje vacío no debe confundirse con un lenguaje que contenga una sola cadena y que esta sea la cadena vacía, es decir {Ɛ}, ya que el nº de elementos (cardinalidad) de estos dos conjuntos es diferente. Cardinal ({ Ø }) = 0 Cardinal {( Ɛ }) = 1 2.9. OPERACIONES SOBRE LENGUAJES Union de L y M: L U M L U M = { s / s está en L o s está en M } Concatenacion de L con M: L . M L . M = { s / s = r . t con r en L y t en M } Ej: No es conmutativa Puedo concatenar un lenguaje consigo mismo, o sea, L . L es válido R . S = {no; si} . {33; 9a} = {no33; no9a; si33; si9a} S . R = {33; 9a} . {no; si} = {33no; 33si; 9ano; 9asi} R . R = {no; si} . {no; si} = {nono; sisi; nosi; sino} Ln Potencia entera n ≥ 0 de un Lenguaje L L0 = { Ɛ } Li = Li-1 . L conjunto que contiene la cadena vacía (con i > 0) Cerradura o Clausura de Kleene de L L* L0 = { Ɛ } L1 = L0 . L = { Ɛ } . L = L L2 = L1 . L = L . L 22 L3 = L . L . L Ln = Ln-1 . L L* = L0 U L1 U L2 U . . . . . . U Ln (Unión de todas las potencias del lenguaje de 0 en adelante) ∞ L* = { Ɛ } U L U L . L U (L .L) .L U . . . . . . = U Li i=0 por lo tanto L* es un lenguaje infinito que contiene al propio lenguaje, y Ɛ siempre está en la cerradura. 2.10. CERRADURA DE KLEENE DEL ALFABETO TOMADO COMO LENGUAJE V* = V0 U V1 U V2 U V3 U . . . . . . . . (unión de todas las potencias enteras de V de 0 en adelante) V* = {Ɛ} U V U V . V U V . V . V U . . (conjunto de todas las cadenas que se pueden construir con los símbolos del alfabeto) {Ɛ} cadenas de longitud 0 V cadenas de longitud 1 V . V cadenas de longitud 2 V . V . V cadenas de longitud 3 Cuando tomo el alfabeto como lenguaje y hago la cerradura de Kleene del alfabeto lo que obtengo es el universo de todas las cadenas sobre V. L+ 2.11. CERRADURA POSTIVA DE L L+ = L1 U L2 U L3 U . . . . . . (unión de todas as potencias positivas de L de 1 en adelante) ∞ L+ = L U L . L U (L .L) .L U . . . . . . = U Li i=1 L+ U {Ɛ} = L* Ej: L = { a, aab} M = { b, bb } L U M = { a, aab, b, bb } LM = { ab, aabb, abb, aabbb } L* = L0 U L1 U L2 U .......... = { Ɛ, a, aab, aa, aaab, aaba, aabaab, ......... } L+ = L* - { Ɛ } L2 = { aa, aaab, aaba, aabaab } Ej: Imaginemos un alfabeto que contiene letras y dígitos 23 V = { a, b, c, . . . , Z, 0, 1, 2, . . .,9 } y sobre este alfabeto los lenguajes: L = { A, B, .........., Z, a, b, ...........z } D = { 0, 1, ..........., 9 } L U D = { conjunto de letras y dígitos } L . D = { conjunto de cadenas consistentes en 1 letra seguida por 1 dígito } L4 = { conjunto de cadenas de 4 letras } L* = { conjunto de cadenas de 1 o más letras, incluída Ɛ } D+ = { conjunto de cadenas de 1 o más dígitos } L . (L U D) = { conjunto de cadenas de letras y dígitos que empiezan con una letra} (L U D)* = { conjunto de cadenas de letras y dígitos, incluída la cadena vacía} L . (L U D)* = { conjunto de cadenas de letras y dígitos que empiezan con una letra, no incluye la cadena vacía } Los nombres de variables en Pascal son cadenas de este conjunto. Este es el lenguaje formal de los identificadores de Pascal. En Pascal: <identificador> dígito letra letra L . (L U D)+ = {conjunto de cadenas de letras y dígitos de por lo menos longitud 2 y que empiezan con una letra, no incluye la cadena vacía} D+ = {conjunto de cadenas de 1 o más dígitos} = {conjunto de los enteros positivos} también ϵ al Pascal: D+ = D1 U D2 U D3 U . . . . . . . . . . <entero sin signo> dígito 24 25