Permítanos sentir primero y Después ( β ) . Considere un árbol de derivación que contiene β ; "contiene" aquí significa que puede cortar subárboles para que β sea una subpalabra del frente del árbol. Entonces, el conjunto antes (después) son todos los frentes potenciales de la parte izquierda (derecha) del árbol de β :Before(β)After(β)βββ
[ fuente ]
Entonces, tenemos que construir una gramática para la parte del árbol alineada horizontalmente (verticalmente). Eso parece bastante fácil ya que ya tenemos una gramática para todo el árbol; solo tenemos que asegurarnos de que todas las formas oracionales sean palabras (cambiar los alfabetos), filtrar aquellas que no contienen (que es una propiedad regular ya que β es fijo) y cortar todo después (antes) de β , incluido β . Este corte también debería ser posible.ββββ
Ahora a una prueba formal. Transformaremos la gramática como se describe y utilizaremos las propiedades de cierre de para hacer el filtrado y el corte, es decir, realizamos una prueba no constructiva.CFL
Sea una gramática libre de contexto. Es fácil ver que SF ( G ) no tiene contexto; construya G ′ = ( N ′ , T ′ , δ ′ , N S ) así:G=(N,T,δ,S)SF(G)G′=(N′,T′,δ′,NS)
- norte′= {NUN∣ A ∈N}
- T′= N∪ T
- δ′= { α ( A ) → α ( β) ∣ A → β∈ δ}∪{NA→A∣A∈N}
con para todos t ∈ T y α ( A ) = N A para todos un ∈ N . Está claro que L ( G ' ) = SF ( G ) ; por lo tanto, el prefijo de cierre correspondiente Pref ( SF ( G ) ) y el sufijo de cierre Suff ( SF ( G ) ) también están libres de contexto¹.α(t)=tt∈Tα(A)=NAa∈NL(G′)=SF(G)Pref(SF(G))Suff(SF(G))
Ahora, para cualquier son L ( β ( N ∪ T ) ∗ ) y L ( ( N ∪ T ) ∗ β ) idiomas regulares. Como C F L está cerrado debajo de la intersección y el cociente derecho / izquierdo con idiomas regulares, obtenemosβ∈(N∪T)∗L(β(N∪T)∗)L((N∪T)∗β)CFL
Before(β)=(Pref(SF(G)) ∩ L((N∪T)∗β))/β∈CFL
y
.After(β)=(Suff(SF(G)) ∩ L(β(N∪T)∗))∖β∈CFL
¹ está cerrado por debajo del cociente derecho (e izquierdo) ; Pref ( L ) = L / Σ ∗ y similar para el prefijo de rendimiento Suff resp. cierre de sufijo.CFLPref(L)=L/Σ∗Suff
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
y
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,β)
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.X G X′ X X′→X
Tendré que pensar en su pregunta sobre la ambigüedad.
fuente