Hub / LF / Parcial 2

Notas de estudio — Parcial 2

Unidades: 3, 4, 5 • 6 temas

Gramáticas Libres de Contexto (lo más importante!)

Definición formal — CFG

Gramática libre de contexto (CFG) — 4-tupla:

G=(V,Σ,P,S)G = (V, \Sigma, P, S)

donde:

  • VV — conjunto finito de variables (no terminales)
  • Σ\Sigma — conjunto finito de terminales (VΣ=V \cap \Sigma = \emptyset)
  • PV×(VΣ)P \subseteq V \times (V \cup \Sigma)^* — conjunto finito de producciones (AαA \to \alpha, con AVA \in V)
  • SVS \in Vsímbolo inicial (o axioma)

Restricción clave: el lado izquierdo de toda producción es una sola variable. Esto es lo que la hace “libre de contexto” — se puede reescribir AA sin importar qué la rodea.

Derivación: αβ\alpha \Rightarrow \beta si β\beta se obtiene reemplazando un no terminal de α\alpha por el cuerpo de alguna producción.

  • Derivación por la izquierda (lm\Rightarrow_{lm}): siempre se expande el no terminal más a la izquierda.
  • Derivación por la derecha (rm\Rightarrow_{rm}): siempre se expande el no terminal más a la derecha.
  • L(G)={wΣSw}L(G) = \{w \in \Sigma^* \mid S \Rightarrow^* w\}

Árbol de derivación (parse tree): representación gráfica donde la raíz es SS, los nodos internos son variables, las hojas son terminales o ε\varepsilon, y los hijos de cada nodo corresponden al cuerpo de la producción aplicada. La cosecha (yield) del árbol es la cadena que se lee de izquierda a derecha en las hojas.

Ambigüedad: Una gramática GG es ambigua si existe alguna cadena wL(G)w \in L(G) que tiene dos o más árboles de derivación distintos (equivalentemente, dos derivaciones por la izquierda distintas). Un lenguaje es inherentemente ambiguo si TODA gramática que lo genera es ambigua.

V/F importantes sobre CFG (preguntados en examen)

  • Una CFG puede tener un conjunto de producciones infinito? FalsoPP es finito por definición.
  • Una CFG con producciones ε\varepsilon genera necesariamente ε\varepsilon? No necesariamente — depende de si SεS \Rightarrow^* \varepsilon.
  • Si GG es ambigua, se puede siempre encontrar una gramática no ambigua equivalente? No — existen lenguajes inherentemente ambiguos.

Forma Normal de Chomsky (CNF)

Definición CNF

Una CFG está en Forma Normal de Chomsky si toda producción tiene una de estas dos formas:

ABCoAaA \to BC \quad \text{o} \quad A \to a

donde A,B,CVA, B, C \in V (variables) y aΣa \in \Sigma (terminal). Adicionalmente, si εL(G)\varepsilon \in L(G), se permite SεS \to \varepsilon y SS no aparece en el lado derecho de ninguna producción.

Los 4 pasos de conversión a CNF

Paso 1 — Eliminar producciones ε\varepsilon:

  • Encontrar todas las variables anulables: AA es anulable si AεA \Rightarrow^* \varepsilon.
  • Para cada producción que contiene una variable anulable, agregar versiones donde esa variable se omite. Ej: si BB es anulable y hay AaBbA \to aBb, agregar AabA \to ab.
  • Eliminar todas las producciones AεA \to \varepsilon (excepto SεS \to \varepsilon si εL\varepsilon \in L).

Paso 2 — Eliminar producciones unitarias (ABA \to B):

  • Encontrar todos los pares unitarios: si ABA \Rightarrow^* B usando solo producciones unitarias.
  • Por cada par (A,B)(A, B) y cada producción no unitaria BαB \to \alpha, agregar AαA \to \alpha.
  • Eliminar todas las producciones unitarias.

Paso 3 — Reemplazar terminales en cuerpos mixtos:

  • Si una producción tiene terminales mezclados con variables o longitud 2\geq 2 (ej: AaBcA \to aBc), reemplazar cada terminal aa por una nueva variable CaC_a y agregar CaaC_a \to a.

Paso 4 — Binarizar producciones largas:

  • Si AB1B2BkA \to B_1 B_2 \cdots B_k con k3k \geq 3, descomponer con variables auxiliares:

AB1D1,D1B2D2,,Dk2Bk1BkA \to B_1 D_1, \quad D_1 \to B_2 D_2, \quad \ldots, \quad D_{k-2} \to B_{k-1} B_k

Mnemónico: “ε, unitarias, terminales, binarizar” = EUTB.

Teorema de pasos de derivación en CNF

Teorema: En una gramática en CNF, derivar una cadena ww con w=n|w| = n requiere exactamente 2n12n - 1 pasos de derivación:

  • n1n - 1 aplicaciones de reglas ABCA \to BC (cada una aumenta el número de símbolos en 1, empezando de 1 hasta llegar a nn)
  • nn aplicaciones de reglas AaA \to a (una por cada terminal de la cadena)

Caso particular para longitud par: Si w=2k|w| = 2k, se necesitan 2(2k)1=4k12(2k) - 1 = 4k - 1 pasos.

Ojo examen: Piden demostrar esto. La prueba es por inducción sobre nn:

  • Base (n=1n = 1): SaS \to a, es un solo paso =2(1)1=1= 2(1) - 1 = 1. ✓
  • Paso inductivo: Si SBCS \Rightarrow BC, entonces Bw1B \Rightarrow^* w_1 con w1=k|w_1| = k y Cw2C \Rightarrow^* w_2 con w2=nk|w_2| = n - k. Por HI, BB usa 2k12k - 1 pasos y CC usa 2(nk)12(n-k) - 1 pasos. Total: 1+(2k1)+(2(nk)1)=2n11 + (2k-1) + (2(n-k)-1) = 2n - 1. ✓

V/F sobre CNF (preguntado directamente)

  • “Si GG está en CNF y L(G)L(G) contiene cadenas de longitud impar, entonces tiene al menos una producción AaA \to a.” Verdadero — sin producciones AaA \to a, solo se generan no terminales (por ABCA \to BC), nunca se llega a terminales.
  • En CNF, toda cadena (par o impar) necesita producciones AaA \to a — de lo contrario no se generan terminales.

Diseño de CFGs — Patrones del examen

Patrón 1: Lenguajes con wa=wb|w|_a = |w|_b (igual cantidad de a’s y b’s)

Gramática clásica:

SaSbbSaSSεS \to aSb \mid bSa \mid SS \mid \varepsilon

Prueba de que L(G)={w{a,b}wa=wb}L(G) = \{w \in \{a,b\}^* \mid |w|_a = |w|_b\} — por inducción sobre w|w|:

  • Base: w=0w=ε|w| = 0 \Rightarrow w = \varepsilon, y SεS \Rightarrow \varepsilon. ✓
  • Paso inductivo: Sea w=n>0|w| = n > 0 con wa=wb|w|_a = |w|_b.
    • Si w=awbw = aw'b con wa=wb|w'|_a = |w'|_b: por HI SwS \Rightarrow^* w', entonces SaSbawb=wS \Rightarrow aSb \Rightarrow^* aw'b = w. ✓
    • Si w=bwaw = bw'a: análogo con SbSaS \to bSa.
    • Si w=w1w2w = w_1 w_2 donde ambos tienen a’s = b’s: SSSw1w2S \Rightarrow SS \Rightarrow^* w_1 w_2. ✓

Tip examen: Cuando piden “demostrar que GG genera LL”, probar ambas direcciones: L(G)LL(G) \subseteq L (toda cadena derivable cumple la propiedad) y LL(G)L \subseteq L(G) (toda cadena que cumple la propiedad es derivable).

Patrón 2: Lenguajes con condiciones tipo nmn \geq m o n2mn \leq 2m

Estrategia: generar la parte balanceada primero, luego el exceso.

Ejemplo — L={anbmnm0}L = \{a^n b^m \mid n \geq m \geq 0\}:

SaSaSbεS \to aS \mid aSb \mid \varepsilon

Idea: cada bb se “aparea” con una aa (regla aSbaSb), las aa‘s extras se generan por aSaS.

Ejemplo — L={anbmn2m}L = \{a^n b^m \mid n \leq 2m\}:

SaSbaaSbSbεS \to aSb \mid aaSb \mid Sb \mid \varepsilon

Cada bb puede “absorber” 0, 1 o 2 aa‘s.

Patrón 3: Uniones de lenguajes

Si L=L1L2L = L_1 \cup L_2, simplemente:

SS1S2S \to S_1 \mid S_2

donde S1S_1 genera L1L_1 y S2S_2 genera L2L_2. Funciona porque CFL es cerrado bajo unión.

Patrón 4: Regex \to CFG con tabla de derivaciones

Conversión sistemática:

  • Concatenación r1r2r_1 r_2: AA1A2A \to A_1 A_2
  • Unión r1r2r_1 \mid r_2: AA1A2A \to A_1 \mid A_2
  • Estrella rr^*: AA1AεA \to A_1 A \mid \varepsilon
  • Positiva r+r^+: AA1AA1A \to A_1 A \mid A_1 (o equivalente AA1BA \to A_1 B, BA1BεB \to A_1 B \mid \varepsilon)
  • Símbolo aa: AaA \to a

Después de convertir, hacer tabla de derivaciones para al menos 3 cadenas del lenguaje mostrando paso a paso cada derivación.

Patrón 5: Familias de gramáticas GnG_n

Examen define familias como Gn=(Vn,Σ,Pn,S)G_n = (V_n, \Sigma, P_n, S) parametrizadas por nn y piden probar propiedades (ej: “toda cadena generada tiene longitud par”).

Estrategia: inducción sobre la longitud de la derivación o sobre nn. Verificar con casos pequeños (G1G_1, G2G_2) para entender el patrón antes de generalizar.

Autómatas de Pila (PDA)

Definición formal — PDA

Autómata de Pila (PDA) — 7-tupla:

M=(Q,Σ,Γ,δ,q0,Z0,F)M = (Q, \Sigma, \Gamma, \delta, q_0, Z_0, F)

donde:

  • QQ — conjunto finito de estados
  • Σ\Sigma — alfabeto de entrada
  • Γ\Gamma — alfabeto de pila
  • δ:Q×(Σ{ε})×ΓP(Q×Γ)\delta: Q \times (\Sigma \cup \{\varepsilon\}) \times \Gamma \to \mathcal{P}(Q \times \Gamma^*) — función de transición
  • q0Qq_0 \in Q — estado inicial
  • Z0ΓZ_0 \in \Gamma — símbolo inicial de la pila
  • FQF \subseteq Q — estados de aceptación

Transición: δ(q,a,X)={(p,γ),}\delta(q, a, X) = \{(p, \gamma), \ldots\} — estando en estado qq, leyendo aa del input y XX del tope de la pila, paso al estado pp y reemplazo XX por γ\gamma en la pila. Si γ=ε\gamma = \varepsilon, hago pop. Si a=εa = \varepsilon, no consumo input (transición espontánea).

Descripción instantánea (ID): (q,w,γ)(q, w, \gamma) — estado actual, input restante, contenido de la pila (tope a la izquierda).

  • \vdash = un paso de computación
  • \vdash^* = cero o más pasos

Dos modos de aceptación:

  • Por estado final: wL(M)w \in L(M) si (q0,w,Z0)(qf,ε,α)(q_0, w, Z_0) \vdash^* (q_f, \varepsilon, \alpha) con qfFq_f \in F
  • Por pila vacía: wN(M)w \in N(M) si (q0,w,Z0)(q,ε,ε)(q_0, w, Z_0) \vdash^* (q, \varepsilon, \varepsilon)
  • Ambos modos son equivalentes en poder — se pueden convertir entre sí

DPDA vs NPDA: A diferencia de DFA/NFA, un DPDA es estrictamente menos poderoso que un NPDA. Ejemplo: {wwRw{0,1}}\{ww^R \mid w \in \{0,1\}^*\} necesita no determinismo (hay que “adivinar” el medio).

V/F sobre PDA (preguntado en examen)

  • “Un PDA puede aceptar {ε}\{\varepsilon\}?” — por pila vacía: hacer pop de Z0Z_0 inmediatamente (δ(q0,ε,Z0)={(q0,ε)}\delta(q_0, \varepsilon, Z_0) = \{(q_0, \varepsilon)\}). Por estado final: poner q0Fq_0 \in F.
  • “Todo DPDA puede convertirse en NPDA equivalente?” — todo DPDA es un caso particular de NPDA.
  • “Todo NPDA puede convertirse en DPDA equivalente?” No — NPDA es estrictamente más poderoso.

Equivalencia CFG \leftrightarrow PDA

Teorema de equivalencia

Todo lenguaje libre de contexto tiene un PDA que lo reconoce, y viceversa. Tres construcciones:

1. CFG \to PDA de estado único (LA CONSTRUCCIÓN MÁS PREGUNTADA)

Dada G=(V,Σ,P,S)G = (V, \Sigma, P, S), construir M=({q},Σ,VΣ,δ,q,S,)M = (\{q\}, \Sigma, V \cup \Sigma, \delta, q, S, \emptyset):

  • Un solo estado qq
  • Aceptación por pila vacía (sin estados finales)
  • Para cada producción AαPA \to \alpha \in P: δ(q,ε,A)(q,α)\delta(q, \varepsilon, A) \ni (q, \alpha)
  • Para cada terminal aΣa \in \Sigma: δ(q,a,a)(q,ε)\delta(q, a, a) \ni (q, \varepsilon)

Intuición: El PDA simula una derivación por la izquierda. La pila contiene la forma sentencial pendiente. Los no terminales se expanden (transiciones ε\varepsilon), los terminales se emparejan con el input (se consumen).

Ejemplo rápido: Para SaSbεS \to aSb \mid \varepsilon:

  • δ(q,ε,S)={(q,aSb),(q,ε)}\delta(q, \varepsilon, S) = \{(q, aSb), (q, \varepsilon)\}
  • δ(q,a,a)={(q,ε)}\delta(q, a, a) = \{(q, \varepsilon)\}
  • δ(q,b,b)={(q,ε)}\delta(q, b, b) = \{(q, \varepsilon)\}

2. PDA \to CFG

Variables de la forma [qiAqj][q_i A q_j] que representan “ir de qiq_i a qjq_j vaciando AA de la pila”.

Si δ(qi,a,A)(qk,B1B2Bm)\delta(q_i, a, A) \ni (q_k, B_1 B_2 \cdots B_m), generar producciones:

[qiAqj]a[qkB1qr1][qr1B2qr2][qrm1Bmqj][q_i A q_j] \to a\,[q_k B_1 q_{r_1}]\,[q_{r_1} B_2 q_{r_2}] \cdots [q_{r_{m-1}} B_m q_j]

para toda combinación de estados intermedios.

3. Demostrar L(M)=L(G)L(M) = L(G) (patrón de examen)

Usar el lema de correspondencia: hay una biyección entre derivaciones por la izquierda de GG y secuencias de configuraciones de MM.

Demostrar: SlmwS \Rightarrow_{lm}^* w     \iff (q,w,S)(q,ε,ε)(q, w, S) \vdash^* (q, \varepsilon, \varepsilon)

Ambas direcciones por inducción sobre el número de pasos.

Diseño de PDAs — Patrones del examen

Patrón: Diseñar NPDA para LL

Siempre dar:

  1. La 7-tupla completa
  2. Todas las transiciones (tabla o diagrama)
  3. Traza de al menos 2 cadenas de ejemplo

Ejemplo: L={anbmckk=nm}L = \{a^n b^m c^k \mid k = |n - m|\}

Idea: la pila cuenta la diferencia entre nn y mm.

  • Fase 1: leer aa‘s, apilar una marca por cada aa
  • Fase 2: leer bb‘s, desapilar por cada bb
    • Si la pila se vacía antes de acabar las bb‘s, apilar las bb‘s restantes con marca distinta
  • Fase 3: leer cc‘s, desapilar una marca por cada cc
  • Aceptar cuando input y pila están vacíos

Ejemplo: L={anbmm=3n}L = \{a^n b^m \mid m = 3n\}

Idea: por cada aa, empujar 3 marcas; por cada bb, sacar 1 marca.

δ(q0,a,Z0)={(q0,AAAZ0)}\delta(q_0, a, Z_0) = \{(q_0, AAAZ_0)\} δ(q0,a,A)={(q0,AAAA)}\delta(q_0, a, A) = \{(q_0, AAAA)\} δ(q0,ε,A)={(q1,A)}(transicioˊn a fase de b’s)\delta(q_0, \varepsilon, A) = \{(q_1, A)\} \quad \text{(transición a fase de b's)} δ(q1,b,A)={(q1,ε)}\delta(q_1, b, A) = \{(q_1, \varepsilon)\} δ(q1,ε,Z0)={(qf,ε)}(aceptar)\delta(q_1, \varepsilon, Z_0) = \{(q_f, \varepsilon)\} \quad \text{(aceptar)}

Tip: Para relaciones tipo m=knm = kn, empujar kk símbolos por cada lectura de una letra y sacar 1 por cada lectura de la otra.

Ejemplo: CFG \to NPDA de estado único (conversión directa)

Dado una CFG del examen, mecánicamente construir el PDA:

  1. Un estado qq
  2. Alfabeto de pila = VΣV \cup \Sigma
  3. Para cada producción AαA \to \alpha: transición ε\varepsilon que reemplaza AA por α\alpha
  4. Para cada terminal: transición que empareja y hace pop
  5. Aceptación por pila vacía

Luego trazar la aceptación de una cadena mostrando cada ID.

Propiedades de los Lenguajes Libres de Contexto

Propiedades de clausura

Cerrados bajo:

  • Unión: Si L1,L2L_1, L_2 son CFL, entonces L1L2L_1 \cup L_2 es CFL. (SS1S2S \to S_1 \mid S_2)
  • Concatenación: L1L2L_1 \cdot L_2 es CFL. (SS1S2S \to S_1 S_2)
  • Estrella de Kleene: LL^* es CFL. (SSS1εS \to SS_1 \mid \varepsilon)
  • Intersección con regular: Si LL es CFL y RR es regular, LRL \cap R es CFL. (Producto de PDA con DFA)

NO cerrados bajo:

  • Intersección entre CFLs — contraejemplo: L1={anbncm}L_1 = \{a^n b^n c^m\} y L2={ambncn}L_2 = \{a^m b^n c^n\} son CFL, pero L1L2={anbncn}L_1 \cap L_2 = \{a^n b^n c^n\} no es CFL.
  • Complemento — si fuera cerrado bajo complemento, por De Morgan sería cerrado bajo intersección. Contradicción.

Lema de Bombeo para CFL

Enunciado: Si LL es un CFL, existe p>0p > 0 tal que toda wLw \in L con wp|w| \geq p se puede descomponer como:

w=uvxyzw = uvxyz

con:

  1. vxyp|vxy| \leq p
  2. vy>0|vy| > 0 (al menos uno de v,yv, y es no vacío)
  3. uvixyizLuv^ixy^iz \in L para todo i0i \geq 0

Diferencia con lema regular: Acá hay dos piezas bombeables (vv e yy) que crecen juntas. Vienen de un no terminal que se repite en el árbol de derivación.

Estrategia para probar LL no es CFL:

  1. Asumir que LL es CFL, sea pp la longitud de bombeo
  2. Elegir wLw \in L con wp|w| \geq p (elegir inteligentemente!)
  3. Para toda descomposición w=uvxyzw = uvxyz con vxyp|vxy| \leq p y vy>0|vy| > 0
  4. Mostrar un ii tal que uvixyizLuv^ixy^iz \notin L

Ejemplo clásico: L={anbncnn0}L = \{a^n b^n c^n \mid n \geq 0\} no es CFL.

  • Elegir w=apbpcpw = a^p b^p c^p
  • Como vxyp|vxy| \leq p, la ventana vxyvxy toca a lo sumo 2 de los 3 símbolos
  • Bombear (i=2i = 2): los conteos se desequilibran porque no podemos aumentar los 3 simultáneamente

Truco rápido: Si necesitas probar que algo no es CFL, intenta intersectarlo con un regular para obtener {anbncn}\{a^n b^n c^n\} o similar.

Máquinas de Turing y Computabilidad

Definición — Máquina de Turing

Máquina de Turing (MT) — 7-tupla:

M=(Q,Σ,Γ,δ,q0,qaccept,qreject)M = (Q, \Sigma, \Gamma, \delta, q_0, q_{accept}, q_{reject})

donde:

  • QQ — conjunto finito de estados
  • Σ\Sigma — alfabeto de entrada (BΣB \notin \Sigma, donde BB es el blanco)
  • Γ\Gamma — alfabeto de cinta (ΣΓ\Sigma \subseteq \Gamma, BΓB \in \Gamma)
  • δ:Q×ΓQ×Γ×{L,R}\delta: Q \times \Gamma \to Q \times \Gamma \times \{L, R\} — función de transición
  • q0q_0 — estado inicial
  • qacceptq_{accept} — estado de aceptación
  • qrejectq_{reject} — estado de rechazo (qacceptqrejectq_{accept} \neq q_{reject})

Decidible (recursivo): Existe MT que siempre se detiene — acepta o rechaza.

Turing-reconocible (r.e.): Existe MT que acepta las cadenas de LL. Para wLw \notin L, puede rechazar o loopear.

LL y L\overline{L} ambos Turing-reconocibles \Rightarrow LL es decidible.

Jerarquía de Chomsky completa

TipoNombreAutómataProducciones
3RegularDFA / NFAAaBA \to aB o AaA \to a
2Libre de contextoPDA (NPDA)AαA \to \alpha, AVA \in V
1Sensible al contextoLBAαAβαγβ\alpha A \beta \to \alpha \gamma \beta, $
0Rec. enumerableMTSin restricciones

RegularCFLCSLRETodos\text{Regular} \subsetneq \text{CFL} \subsetneq \text{CSL} \subsetneq \text{RE} \subsetneq \text{Todos}

Tesis de Church-Turing

Todo procedimiento efectivo (algoritmo intuitivo) puede ser simulado por una Máquina de Turing. No es un teorema formal — es una tesis que formaliza “computable”. Toda evidencia la respalda: MT, cálculo lambda, funciones recursivas computan lo mismo.

Referencia rápida para el examen

Tuplas

  • CFG: G=(V,Σ,P,S)G = (V, \Sigma, P, S) — variables, terminales, producciones, símbolo inicial
  • PDA: M=(Q,Σ,Γ,δ,q0,Z0,F)M = (Q, \Sigma, \Gamma, \delta, q_0, Z_0, F) — estados, input, pila, transición, inicio, fondo pila, finales
  • MT: M=(Q,Σ,Γ,δ,q0,qaccept,qreject)M = (Q, \Sigma, \Gamma, \delta, q_0, q_{accept}, q_{reject})

CNF

  • Solo ABCA \to BC y AaA \to a
  • Pasos conversión: ε → unitarias → terminales → binarizar
  • Derivar w=n|w| = n: exactamente 2n12n - 1 pasos (n1n-1 reglas ABCA \to BC + nn reglas AaA \to a)
  • Para w=2k|w| = 2k: 4k14k - 1 pasos

CFG \to PDA (un solo estado)

  • Un estado qq, aceptación por pila vacía
  • Producciones = transiciones ε\varepsilon: δ(q,ε,A)(q,α)\delta(q, \varepsilon, A) \ni (q, \alpha)
  • Terminales = emparejar: δ(q,a,a)(q,ε)\delta(q, a, a) \ni (q, \varepsilon)

Clausura CFL

Operación¿Cerrado?
\cup
Concatenación
* (Kleene)
\cap con Regular
\cap entre CFLs
Complemento

Lema de bombeo CFL

w=uvxyzw = uvxyz, vxyp|vxy| \leq p, vy>0|vy| > 0, uvixyizLuv^ixy^iz \in L i0\forall i \geq 0

Dos piezas bombeables (vs una en regular). Ventana vxyvxy acotada por pp.

Checklist de diseño PDA

  1. Definir la 7-tupla completa
  2. Listar TODAS las transiciones
  3. Trazar mínimo 2 cadenas
  4. Verificar cadenas fuera del lenguaje son rechazadas

Checklist de prueba CFG genera LL

  1. L(G)LL(G) \subseteq L: toda derivación produce cadena válida (inducción sobre pasos)
  2. LL(G)L \subseteq L(G): toda cadena válida es derivable (inducción sobre longitud)