Sí, y After ( β ) son lenguajes libres de contexto. Así es como lo probaría. Primero, un lema (que es el quid). Si L es CF entonces:Before(β)After(β)L
Before(L,β)={γ | ∃δ.γβδ∈L}
y
After(L,β)={γ | ∃δ.δβγ∈L}
son CF.
¿Prueba? Para construya un transductor de estado finito no determinista T β que escanee una cadena, generando cada símbolo de entrada que vea y simultáneamente busque β de manera no determinista . Cada vez que T β ve el primer símbolo de β, se bifurca de manera no determinista y deja de emitir símbolos hasta que termina de ver β o ve que ve un símbolo que se desvía de β , deteniéndose en cualquier caso. Si T β ve βBefore(L,β)TββTββββTββen su totalidad, acepta al detenerse, que es la única forma en que acepta. Si ve una desviación de , lo rechaza.β
El lema se puede activar para manejar casos en los que podría superponerse consigo mismo (como a b a b ; siga buscando β incluso mientras se encuentra en el escaneo para un β anterior ) o aparece varias veces (en realidad, el original no determinista bifurcación ya maneja eso). βababββ
Está bastante claro que , y dado que las CFL están cerradas bajo transducción en estado finito, Before ( L , β ) es, por lo tanto, CF. Tβ(L)=Before(L,β)Before(L,β)
Un argumento similar se aplica a , o podría hacerse con reversiones de cadena de Before ( L , β ) , las CFL también se cierran bajo reversión:After(L,β)Before(L,β)
After(L,β)=rev(Before(rev(L),rev(β)))
En realidad, ahora que veo el argumento de reversión, sería aún más fácil comenzar con , ya que el transductor para eso es más simple de describir y verificar: genera la cadena vacía mientras busca un β . Cuando encuentra β, se bifurca de manera no determinista, una bifurcación continúa buscando copias adicionales de β , la otra bifurcación copia todos los caracteres posteriores textualmente de entrada a salida, aceptando todo el tiempo.After(L,β)βββ
Lo que queda es hacer que esto funcione tanto para formularios condenatorios como para CFL. Pero eso es bastante sencillo, ya que el lenguaje de las formas sentenciales de un CFG es en sí mismo un CFL. Puede demostrar eso reemplazando cada no terminal a lo largo de G diciendo X ′ , declarando que X es un terminal y agregando todas las producciones X ′ → X a la gramática.XGX′XX′→X
Tendré que pensar en su pregunta sobre la ambigüedad.