6.3. ALGORITMOS DE DECISIÓN 113Input a A, M y M ′✻Control<strong>de</strong> M ′Control<strong>de</strong> AControl<strong>de</strong> M✛❄Stack<strong>de</strong>M y M ′Figure 6.5: Construcción <strong>de</strong> un AA para L ∩ Ren que w = xa; con a ∈ Σ ∪ {ε}. Por la hipótesis <strong>de</strong> inducciónδ A (p 0 , x) = p ′ y (q 0 , x, Z 0 ) ⊢ Mi−1(q ′ , ε, β)Por la <strong>de</strong>finición <strong>de</strong> δ, el hecho <strong>de</strong> que ([p ′ , q ′ ] , a, β) ⊢ M ′([p, q] , ε, γ) indica que δ A(p ′ , a) = p y (q ′ , a, β) ⊢ M (q, ε, γ).Por lo tanto δ A (p 0 , w) = p, y(q 0 , w, Z 0 ) ⊢ Mi(q, ε, γ)El converso, que (q 0 , w, Z 0 ) M ⊢ i(q, ε, γ) y δA (p 0 , w) = p implica ([p 0 , q 0 ] , w, Z 0 ) M⊢ i([p, q] , ε, γ) es similar.✷Ejemplo 82 Sea L = {ww/w ∈ {a, b} ∗ }. Esto es, L consiste <strong>de</strong> todas las palabras cuyas primeras ysegundas mita<strong>de</strong>s son las mismas. Si L fuera libre <strong>de</strong> contexto, entonces L 1 = L ∩ a + b + a + b + <strong>de</strong>biera serlo,ya que son cerrados bajo intersección con un lenguaje regular. Pero L 1 es claramente {a i b j a i b j /i ≥ 1, j ≥ 1}casi idéntico a uno que ya se probó no era libre <strong>de</strong> contexto.Sea h el homomorfismo h(a) = h(c) = a y h(b) = h(d) = b. Entonces h −1 (L 1 ) contiene strings <strong>de</strong> laforma x 1 x 2 x 3 x 4 en que x 1 y x 3 tienen igual largo y pertenecen a (a + c) + y x 2 y x 4 tienen igual largo yestán en (b + d) + . Por lo tanto h −1 (L 1 ) ∩ a ∗ b ∗ c ∗ d ∗ es igual a {a i b j c i d j /i ≥ 1, j ≥ 1}. Como este último noes libre <strong>de</strong> contexto, L tampoco lo es.6.3 Algoritmos <strong>de</strong> DecisiónHay varias preguntas sobre los lenguajes libres <strong>de</strong> contexto que se pue<strong>de</strong> respon<strong>de</strong>r. Ellas incluyen <strong>de</strong>terminarsi un lenguaje dado es vacío, finito o infinito y si un string está en un lenguaje. Sin embargo, hay otraspreguntas acerca <strong>de</strong> los lenguajes libres <strong>de</strong> contexto para los cuales no existe algoritmo que las responda.Entre éstas está el saber si dos gramáticas son equivalentes, si un lenguaje es cofinito, si el complemento <strong>de</strong>un lenguaje libre <strong>de</strong> contexto es también libre <strong>de</strong> contexto y si una cierta gramática es o no ambigua. Enesta sección se verán algoritmos para algunas <strong>de</strong> las preguntas que tienen algoritmos.Como en el caso <strong>de</strong> los lenguajes regulares, hay varias representaciones posibles para los lenguajes libres<strong>de</strong> contexto, es <strong>de</strong>cir, gramáticas libres <strong>de</strong> contexto y autómatas apiladores que aceptan por stack vacío o✷
114 CHAPTER 6. PROPIEDADES DE LOS LENGUAJES LIBRES DE CONTEXTOpor estado final. Como las construcciones <strong>de</strong>l capítulo 5 son todas efectivas, un algoritmo que usa una representaciónse pue<strong>de</strong> hacer funcionar para cualquiera <strong>de</strong> las otras. En esta sección se usará la representaciónpor gramáticas libres <strong>de</strong> contexto.Teorema 33 Existen algoritmos para <strong>de</strong>terminar si un lenguaje libre <strong>de</strong> contexto es1. vacío,2. finito, o3. infinito.Demostración : Ya se ha dado un algoritmo para probar si un lenguaje libre <strong>de</strong> contexto es vacío. Para unagramática G = (V, T, P, S), el test <strong>de</strong>l primer lema para remover símbolos inútiles <strong>de</strong>termina si una variablegenera algún string <strong>de</strong> terminales. Obviamente L(G) es no vacío si y sólo si el símbolo inicial, S, generaalgún string <strong>de</strong> terminales.Para saber si L(G) es finito, utilice el algoritmo <strong>de</strong>l teorema correspondiente para construir una gramáticaG ′ = (V ′ , T, P ′ , S) en la forma normal <strong>de</strong> Chomsky, que genera L(G) − {ε}. L(G ′ ) es finito si y sólo si L(G)es finito. Un test simple para la finitud <strong>de</strong> una gramática en forma normal <strong>de</strong> Chomsky sin símbolos inútiles,es construir un grafo dirigido con un vértice por variable y un arco <strong>de</strong> A a B, si hay una producción <strong>de</strong> laforma A → BC o A → CB para algún C. El lenguaje generado es finito si y sólo si este grafo no tiene ciclos.(Ver texto).Otra pregunta que se pue<strong>de</strong> respon<strong>de</strong>r es: dada una gramática libre <strong>de</strong> contexto, G = (V, T, P, S) y unstring x en T ∗ , ¿está x ∈ L(G)? Aquí se presentará un algoritmo simple <strong>de</strong> or<strong>de</strong>n ϑ(|x| 3 ) conocido como elalgoritmo <strong>de</strong> Cocke-Younger-Kasami o CYK. Dado x <strong>de</strong> longitud N ≥ 1 y una gramática G, que se asumeestá en la forma normal <strong>de</strong> Chomsky, se <strong>de</strong>termina para cada i, para cada j y para cada variable A, siA ∗ ⇒X ij , en que X ij es el substring <strong>de</strong> x que tiene largo j y comienza en la posición i.El proceso es por inducción en j. Para j = 1, A ∗ ⇒X ij si y sólo si A → X ij es una producción, ya queX ij tiene largo 1. Para valores mayores <strong>de</strong> j, si j > 1, entonces A ∗ ⇒X ij si y sólo si hay alguna producciónA → BC y algún k, 1 ≤ k ≤ j, tal que B <strong>de</strong>riva los primeros k símbolos <strong>de</strong> X ij y C <strong>de</strong>riva los últimosj − k símbolos <strong>de</strong> X ij . Esto es, B ∗ ⇒X ij y C ⇒ X i+k,j+k . Ya que tanto k como j − k son menores que j,en el proceso ya se sabe si estas dos últimas <strong>de</strong>rivaciones son posibles. Por lo tanto, se pue<strong>de</strong> <strong>de</strong>terminar siA ∗ ⇒X ij . Cuando j = N, se pue<strong>de</strong> <strong>de</strong>terminar si S ∗ ⇒X 1N = x. Es <strong>de</strong>cir, se pue<strong>de</strong> saber si x ∈ L(G).Para <strong>de</strong>finir el algoritmo <strong>de</strong> CYK en forma precisa, sea V ij el conjunto <strong>de</strong> variables A, tales que A ∗ ⇒X ij .Se pue<strong>de</strong> asumir que 1 ≤ i ≤ N − j + 1 ya que no hay string más largo <strong>de</strong> N − i + 1 que comienza en posicióni.(1) FOR i := 1 TO N DO(2) V i1 := {A/A → a ∈ P y a es el i-esimo simbolo <strong>de</strong> x }(3) FOR j := 2 TO N DO(4) FOR i := 1 TO N − j + 1 DO BEGIN(5) V ij := ∅;(6) FOR k := 1 TO J − 1 DO(7) V ij := V ij ∪ {A/A → BC ∈ P , B ∈ V ik y C ∈ V i+k,j−k }ENDEl loop <strong>de</strong> líneas (1) y (2) inicializan para j = 1. Como la gramática es fija, línea (2) toma tiempoconstante. Por lo tanto el ciclo toma ϑ(N) pasos.Los loops anidados <strong>de</strong> líneas (3) y (4) hacen que las líneas (5) a (7) se ejecuten a lo más N 2 veces.La línea (5) toma tiempo constante cada vez, es <strong>de</strong>cir, en total se ejecuta ϑ(N 2 ) veces. El loop <strong>de</strong> lalínea (6) hace que la línea (7) se ejecute ϑ(N 3 )veces. Es <strong>de</strong>cir el algoritmo es ϑ(N 3 ).✷