Disenar una CFG para el lenguaje L = {0^n 1^m 2^k | n < k o m < k}
Fuente: Parcial 2 — ST0270-1587 (2024-2)
Enunciado
Disenar una gramatica libre de contexto para el lenguaje:
L={0n1m2k∣n<k∨m<k}
donde n, m y k son numeros enteros mayores o iguales que cero.
Bono: Demostrar que cualquier cadena generada por la gramatica disenada pertenece al lenguaje L.
La estrategia: descomponer el OR en union de gramaticas
Cuando ves una condicion con “o” (n<k o m<k), piensa en union: disenar una gramatica para cada condicion por separado y luego unirlas con S→S1∣S2.
Para L1 (donde n<k): la idea es emparejar 0’s con 2’s usando 0S12, luego forzar al menos un 2 extra (eso garantiza n<k), y generar los 1’s libremente en el medio. Para L2 (donde m<k): lo mismo pero emparejando 1’s con 2’s, y generando los 0’s libremente al inicio.
El patron clave es: para forzar x<y, empareja x con y uno a uno y despues agrega al menos un y extra. Eso convierte una desigualdad estricta en algo que una CFG puede manejar.
L=L1∪L2 donde L1={0n1m2k∣n<k}, L2={0n1m2k∣m<k}.
SS1A1B1S2C2D2E2→S1∣S2→0S12∣A12→1A1∣B1→2B1∣ε→C2D2→0C2∣ε→1D22∣E22→2E2∣εVerificacion: S1 genera 0n1m2n+j+1 con j≥0, luego k=n+j+1>n. S2 genera 0n1m2m+j+1 con j≥0, luego k=m+j+1>m. ■
Gramatica
Solucion
Analisis del lenguaje
El lenguaje es L={0n1m2k∣n<k∨m<k}.
Podemos descomponerlo como la union de dos lenguajes:
- L1={0n1m2k∣n<k}
- L2={0n1m2k∣m<k}
Entonces L=L1∪L2.
Gramatica para L1: n<k
La condicion n<k significa k=n+j con j≥1. Necesitamos emparejar n ceros con n doses, agregar al menos un 2 extra, y generar cualquier cantidad de 1‘s en el medio:
S1A1B1→0S12∣A12→1A1∣B1→2B1∣εExplicacion:
- S1→0S12 empareja ceros con doses (n veces)
- S1→A12 agrega al menos un 2 adicional (j≥1)
- A1 genera cualquier cantidad de 1‘s
- B1 genera doses adicionales
Gramatica para L2: m<k
Analogamente, m<k significa k=m+j con j≥1:
S2C2D2E2→C2D2→0C2∣ε→1D22∣E22→2E2∣εExplicacion:
- C2 genera cualquier cantidad de 0‘s
- D2→1D22 empareja unos con doses (m veces)
- D2→E22 agrega al menos un 2 adicional
- E2 genera doses adicionales
Gramatica completa para L=L1∪L2
SS1A1B1S2C2D2E2→S1∣S2→0S12∣A12→1A1∣B1→2B1∣ε→C2D2→0C2∣ε→1D22∣E22→2E2∣εVerificacion con ejemplos
Cadena 2∈L (con n=0,m=0,k=1): n<k se cumple (0<1).
S⇒S1⇒A12⇒B12⇒2
✓
Cadena 112∈L (con n=0,m=2,k=1): m<k no se cumple, pero n<k si (0<1).
S⇒S1⇒A12⇒1A12⇒11A12⇒11B12⇒112
✓
Cadena 01222∈L (con n=1,m=0,k=3): n<k se cumple (1<3).
S⇒S1⇒0S12⇒0A122⇒0B122⇒02B122⇒01222
✓
Bono: Demostracion de correccion (bosquejo)
Debemos mostrar que L(G)⊆L.
Para cadenas generadas por S1: Por induccion sobre la derivacion, S1 genera cadenas de la forma 0nw2n donde w se genera a partir de A12. Dado que A1 produce 1m seguido de lo que produce B1 (que genera 2j con j≥0), y el 2 adicional garantiza al menos un 2 extra, la cadena final es 0n1m2n+j+1 con j≥0. Como k=n+j+1>n, se cumple n<k.
Para cadenas generadas por S2: Analogamente, C2 genera 0n, y D2 genera cadenas emparejando 1‘s con 2‘s mas al menos un 2 extra, resultando en 0n1m2m+j+1 con k=m+j+1>m, luego m<k.
En ambos casos, n<k o m<k, por lo que toda cadena generada pertenece a L. ■