5.5. ÁRBOLES DE DERIVACIÓN 87<strong>de</strong>scendientes están a la izquierda <strong>de</strong>l vértice j y <strong>de</strong> todos sus <strong>de</strong>scendientes. Por lo tanto, α = α 1 α 2 . . . α n .Un subárbol <strong>de</strong>be tener menos vértices interiores que el árbol original, a menos que sean el mismo árbol.Por la hipótesis <strong>de</strong> inducción, para cada vértice i que no es una hoja X i∗⇒αi . Si X i = α i , entonces X i∗⇒αi ,trivialmente. Poniendo todas estas <strong>de</strong>rivaciones parciales juntas,A ⇒ X 1 X 2 . . . X n∗⇒α1 X 2 . . . X n∗⇒α1 α 2 . . . X n∗⇒ . . .∗⇒α1 α 2 . . . α n = αPor lo tanto A ∗ ⇒ G α. Nótese que la anterior es sólo una <strong>de</strong> las posiblemente muchas <strong>de</strong>rivaciones que sepue<strong>de</strong>n obtener.Suponga ahora que A ∗ ⇒α. Se <strong>de</strong>be mostrar que existe un árbol-A con rédito α. Si A ⇒ α, entoncesA → α está en P y hay un árbol con rédito α que tiene la forma <strong>de</strong> la Figura 5.7.✟✟✟✟ XA✂✂✂❍ ❍❍❍❍1 X2 ... XN( con α = X1X 2... X N)Figure 5.7: Árbol-A con rédito αSupóngase ahora que para cualquier variable A, si A ∗ ⇒α en menos <strong>de</strong> k pasos, hay un árbol-A con réditoα. Suponga que A ∗ ⇒α por una <strong>de</strong>rivación <strong>de</strong> k pasos. Sea A ⇒ X 1 X 2 . . . X n el primero <strong>de</strong> estos pasos;cualquier símbolo <strong>de</strong> α <strong>de</strong>be ser uno <strong>de</strong> X 1 , X 2 , . . . , X n o ser <strong>de</strong>rivado <strong>de</strong> uno <strong>de</strong> ellos. También, la parte <strong>de</strong>α <strong>de</strong>rivada <strong>de</strong> X i <strong>de</strong>be estar a la izquierda <strong>de</strong> los símbolos <strong>de</strong>rivados <strong>de</strong> X j , si i < j. Por lo tanto es posibleescribir α como α 1 α 2 . . . α n , en que para cada i entre 1 y n,• α i = X i si X i es un terminal, y• X i∗⇒αi si X i es una variableSi X i es una variable, la <strong>de</strong>rivación <strong>de</strong> α i <strong>de</strong>s<strong>de</strong> ella <strong>de</strong>be tomar menos <strong>de</strong> k pasos. Por lo tanto, por lahipótesis <strong>de</strong> inducción, por cada X i que es una variable, hay un árbol-X i con rédito α i , que se <strong>de</strong>nominaráT i . Se construye un árbol-A con n hojas, con etiquetas X 1 , X 2 , . . . , X n . Cada vértice con etiqueta X i ∉ Tse reemplaza por el árbol T i . Si X i es un terminal no se reemplaza el nodo.A❛✁ ❧ ❛❛❛❛❛❛❛❛❛✁ ❧❧❧❧❧✁✘✘ ✘✘ ✘ ✘✘✘ ✘ ✘✘✘ ✘ ✘✘ ✦✦ ✦✦✦✦✦✦✦✁❛X 1 X2X 3XN-1X N✂❇✂❇✂❇✂✂❇✂( terminal ) ❇❇✂✂( terminal )❇❇✂❇✂❇✂❇✂✂T 2❇ ✂T3❇✂TN❇❇Figure 5.8: Construcción <strong>de</strong>l árbol-AEl rédito <strong>de</strong>l árbol así construido es α, como se quería.✷
88 CHAPTER 5.ACEPTACIÓN Y GENERACIÓN DE LENGUAJES LIBRES DE CONTEXTOSi en cada paso <strong>de</strong> una <strong>de</strong>rivación se usa una producción para reemplazar la variable <strong>de</strong> más a la izquierdaen la forma sentencial, se dice que esa es una <strong>de</strong>rivación por la izquierda. Similarmente, si es la variable <strong>de</strong>más a la <strong>de</strong>recha, se dice que es una <strong>de</strong>rivación por la <strong>de</strong>recha.Si w ∈ L(G) para alguna gramática libre <strong>de</strong> contexto G, entonces w tiene al menos un árbol <strong>de</strong> <strong>de</strong>rivación;y correspondiente a un árbol <strong>de</strong> <strong>de</strong>rivación en particular, w tiene una única <strong>de</strong>rivación por la izquierda yuna única <strong>de</strong>rivación por la <strong>de</strong>recha. Por supuesto que w pue<strong>de</strong> tener varias <strong>de</strong>rivaciones por la izquierda yvarias <strong>de</strong>rivaciones por la <strong>de</strong>recha ya que pue<strong>de</strong> haber más <strong>de</strong> un árbol <strong>de</strong> <strong>de</strong>rivación para w. Sin embargo,es fácil mostrar que por cada árbol <strong>de</strong> <strong>de</strong>rivación hay sólo una <strong>de</strong>rivación por la izquierda y, también, unaúnica <strong>de</strong>rivación por la <strong>de</strong>recha.Ejemplo 73 La <strong>de</strong>rivación por la izquierda que correspon<strong>de</strong> al árbol <strong>de</strong>l ejemplo anterior esS ⇒ aAS ⇒ aSbAS ⇒ aabAS ⇒ aabbaS ⇒ aabbaay la <strong>de</strong>rivación por la <strong>de</strong>recha esS ⇒ aAS ⇒ aAa ⇒ aSbAa ⇒ aSbbaa ⇒ aabbaaUna gramática G tal que algún string tiene dos árboles <strong>de</strong> <strong>de</strong>rivación se dice que es ambigua. Una<strong>de</strong>finición equivalente es que algún string tenga más <strong>de</strong> una <strong>de</strong>rivación por la izquierda o más <strong>de</strong> una por la<strong>de</strong>recha. Un lenguaje libre <strong>de</strong> contexto para el cual toda gramática es ambigua, se dice que es un lenguajeinherentemente ambiguo. Más a<strong>de</strong>lante se verá que existen lenguajes inherentemente ambiguos.5.6 Simplificación <strong>de</strong> GramáticasHay varias maneras en que se pue<strong>de</strong> restringir el formato <strong>de</strong> las producciones, sin reducir el po<strong>de</strong>r generador<strong>de</strong> las gramáticas libres <strong>de</strong> contexto. Si L es un lenguaje libre <strong>de</strong> contexto no vacío, entonces pue<strong>de</strong> sergenerado por una gramática libre <strong>de</strong> contexto, G, con las siguientes propieda<strong>de</strong>s:• Cada variable y cada terminal <strong>de</strong> G aparece en la <strong>de</strong>rivación <strong>de</strong> algún string <strong>de</strong> L• No hay producciones <strong>de</strong> la forma A → B, en que A y B son variablesMás aún, si ε ∉ L, no es necesario que haya producciones <strong>de</strong> la forma A → ε.Primero se verá cómo eliminar símbolos inútiles <strong>de</strong> una gramática. Sea G = (V, T, P, S) una gramática.Un símbolo X es útil si existe una <strong>de</strong>rivaciónS ∗ ⇒αXβ ∗ ⇒wpara algún α, β y w, con w ∈ T ∗ . Si un símbolo no es útil, se dice que es inútil. Hay dos aspectos queconsi<strong>de</strong>rar en esto <strong>de</strong> la utilidad. Primero, algún string <strong>de</strong> terminales <strong>de</strong>be ser <strong>de</strong>rivable <strong>de</strong> X y, segundo,X <strong>de</strong>be ser parte <strong>de</strong> un string <strong>de</strong>rivable <strong>de</strong> S. Pero no sólo eso, sino que a<strong>de</strong>más X <strong>de</strong>be ocurrir en algunaforma sentencial <strong>de</strong> la que es posible <strong>de</strong>rivar un string <strong>de</strong>l lenguaje.Lema 3 Dada una gramática libre <strong>de</strong> contexto G = (V, T, P, S), con L(G) ≠ ∅, es posible encontrar efectivamenteuna gramática libre <strong>de</strong> contexto, G ′ = (V ′ , T, P ′ , S), tal que para todo A ∈ V ′ hay un w ∈ T ∗ parael cual A ∗ ⇒w.Demostración : Cada variable A con producciones A → w en P , pertenece a V ′ . Si A → X 1 X 2 . . . X n esuna producción en que cada X i es un terminal o una variable que ya está en V ′ , entonces es posible <strong>de</strong>rivarun string <strong>de</strong> terminales <strong>de</strong>s<strong>de</strong> A por una <strong>de</strong>rivación que comienza con A ⇒ X 1 X 2 . . . X n y, por lo tanto,A ∈ V ′ . El conjunto V ′ se pue<strong>de</strong> calcular con el siguiente algoritmo:✷