COD Ejercicios Boletín II Jaime Barrachina Verdia 1- Sea un alfabeto con un solo símbolo ¿cuáles son sus lenguajes código? Partiendo de: Sea un lenguaje 𝐿 ⊆ 𝐴∗ , siendo A un alfabeto arbitrario, es un lenguaje código siempre que: 𝑥1 … 𝑥𝑛 = 𝑦1 … 𝑦𝑛 → (𝑛 = 𝑚) & (𝑥𝑖 = 𝑦𝑖 , 𝑖 = 1, … , 𝑛), ∀ 𝑥1 , … , 𝑥𝑛 , 𝑦1 , … , 𝑦𝑛 ∈ 𝐿 Podemos decir que cada palabra de L+ puede ser escrita de una única forma a partir de las palabras de L. Para el caso de un alfabeto A con un solo símbolo s, eso quiere decir que los lenguajes código de A son aquellos que tienen una sola palabra, hecha con n repeticiones del símbolo s. Por tanto los lenguajes de A son: {𝐿 = 𝑠 𝑘 }, 2- 𝑘 = 1…𝑛 ¿Es {ab, abb, babb} un lenguaje código? Por el razonamiento del ejercicio anterior sabemos que las concatenaciones de las palabras de este lenguaje debieran dar factorizaciones univocas, pero no es el caso con “abbabb”, que se puede descomponer de más de una forma (“abb | abb” o bien “ab | babb”), por lo que no es un lenguaje código. 3- ¿Son los lenguajes códigos cerrados para la unión? Con lo restrictiva que es la propiedad de factorizaciones unívocas, podemos intuir a priori que la unión de dos lenguajes códigos no va a ser cerrada para la unión. Se puede demostrar claramente usando el L.C. {ab, abb} y el L.C. {a, b}. La unión de {ab, abb} y {a, b} nos da {a, b, ab, abb}, donde el símbolo “ab” pertenece al L.C. obtenido y además es concatenación de otros dos símbolos del L.C. (“a” y “b”). 4- ¿Son los lenguajes códigos cerrados para la concatenación? No. De nuevo lo podemos ver con un contraejemplo sencillo como {ab, a} concatenado con {ab, b}, lo que nos da {abab, abb, aab, ab}. Como abab puede formarse de dos maneras, (usando el símbolo abab, o dos veces ab), queda demostrado que no son cerrados para la concatenación. 5 - Demuestre que los códigos instantáneos son cerrados para la concatenación. Podemos plantear esto como demostrar que los lenguajes generados por la concatenación de lenguajes instantáneos sean lenguajes prefijos. Cuando concatenamos dos lenguajes prefijos, al concatenar sus palabras, obtenemos un lenguaje donde la primera mitad de cada palabra no son prefijos unas de otras, por lo que se puede ver que el lenguaje generado es prefijo. Puesto que es prefijo, y puesto que la concatenación no puede introducir ningún λ, el lenguaje es instantáneo y queda demostrado que los códigos instantáneos son cerrados bajo la concatenación. 7 – Demuestre que si L ⊆ A* es un lenguaje código, entonces Ln también lo es para cada n > 0. Puesto que las palabras que pueden ser generadas por un lenguaje Ln , hecho al concatenar L consigo mismo cualquier numero de veces, son un subconjunto de las palabras generadas por L, y L es un lenguaje código, entonces Ln también debe serlo. 8 - Sea A un alfabeto. Demuestre que An es un lenguaje código maximal para cada n > 0. Para el alfabeto A, el lenguaje código L = A es aquel que puede generar todas las posibles palabras con los símbolos de A. Como hemos demostrado en el ejercicio 7, si A es un lenguaje código, entonces An es un lenguaje código, y puesto que no se pueden añadir mas palabras a An sin que solo siga habiendo una sola factorización para cada posible palabra generada por An, entonces es maximal. 9 – Sea L = { a }n U ( { a }m)* {b} ¿Cuáles son los casos, dependiendo de n y de m, en los que L es un lenguaje código? Podemos comenzar visualizando algunos ejemplos de L, para hacernos una idea de la forma de este lenguaje: Para n = 0, m = 0 L = a0 U a0b λ,b 0 Para n = 0, m = 1 L = a U { λ , a}b λ , b, ab 0 Para n = 0, m = 2 L = a U { λ , a, aa} b λ , b, ab, aab Para n = 1, m = 0 L = a1 U{ λ }b a, b 1 Para n = 1, m = 1 L = a U { λ , a }b a, b, ab 1 Para n = 1, m = 2 L = a U { λ , a, aa} b a, b, ab, aab Para n = 2, m = 1 L = a2 U { λ ,a} b aa, b, ab Por lo que podemos ver que mientras que el problema es que haya un numero de “a” generados por an las cuales, unidas con la “b” generada por {am}b, puedan dar más de una factorización para las ab, aab, aaab … generadas por {am}b. Por lo tanto, mientras n > m, no tendremos ese problema. Además, debe cumplirse que n >0, ya que sino tenemos λ en el lenguaje, y entonces ya no es código. Por tanto n>m, n > 0 son las condiciones para que L sea lenguaje código. 11- Si un código es completo, entonces ¿es un lenguaje código maximal? Un lenguaje código X es maximal sobre un alfabeto A si no está contenido estrictamente en ningún otro lenguaje código sobre A, osea, si le añadimos cualquier palabra deja de ser lenguaje código. Por otro lado, un código es completo si en su árbol asociado cada nodo es una hoja o tiene nnodos inmediatamente descendientes, osea, es aquel que si le añadimos cualquier palabra deja de ser prefijo. Sabiendo esto podemos decir que los lenguajes código completos incluyen a los maximales, pero también incluyen otros lenguajes prefijos que no son maximales y por tanto que un código sea completo no implica que sea maximal. 12 - Sea una fuente de memoria nula S = (A,p) con A = {a,b,c} y p(a) = p(b) = p(c) = 1/3. Obtenga un código binario para S de acuerdo al desarrollo del primer teorema de Shannon y calcule su longitud media. ¿Es óptimo? Podemos calcular la entropía como: 𝐻(𝑆) = − ∑ 𝑝𝑖 ∗ 𝑙𝑜𝑔2(𝑝𝑖 ) 1≤𝑖≤𝑛 En nuestro caso, puesto que todas las probabilidades son iguales: 1 𝑙𝑜𝑔2( ) 3 ) = 1.585 𝐻(𝑆) = −1 ∗ 3 ∗ ( 3 Expresándolo en r-unidades (para r = 3): 𝐻3 (𝑆) = 𝐻(𝑆) 1.585 = =1 𝑙𝑜𝑔2(3) 1.585 Tenemos que la longitud media de los símbolos de A es 1 { = (1 + 1 + 1) /3}, por tanto se cumple: H3(S) <= Longitud Media <= H3(S) + 1 Con lo cual sabemos que este lenguaje es óptimo para 3 símbolos. Si calculamos el lenguaje generado por la codificación de Shannon tenemos: B = 1, 00, 01 Haciendo los mismos cálculos de antes, tenemos que la entropía para 2-unidades es 1.585 y la longitud media es 1.667, por tanto, se sigue cumpliendo: H3(S) <= Longitud Media <= H3(S) + 1