Estoy buscando una gramática sensible al contexto que describa el siguiente lenguaje: .
Tengo problemas con el hecho de que no se permiten reglas como y, por lo tanto, no puedo colocar ningún término que indique el "medio" de la palabra. ¿Hay algún truco para el problema?
Respuestas:
De hecho, hay un truco simple que le permite agregar información adicional en una posición determinada: simplemente reemplace una letra adyacente a la posición y márquela con la información y la letra original.
En su ejemplo, tenga una no terminal para el medio, pero como no se puede eliminar, también cuenta como una letra normal. Por lo tanto, tenemos dos copias y para indicar las letras reemplazadas. Al final de la derivación, los marcadores deben reemplazarse por el contenido de su letra, por producciones simples como .M a M b M a → aMETRO METROuna METROsi METROuna→ a
En la mayoría de los casos, la aplicación de a debe realizarse al final del proceso de derivación. En algunas construcciones esto no necesita ser "cronometrado": cuando la desaparece demasiado pronto, la derivación no puede encontrar una posición adecuada y el proceso no se detendrá con éxito. En otros casos, uno necesita un tipo de control. Esto a veces se hace introduciendo un no terminal como señal que se mueve a lo largo de las letras. Una vez más, esta señal también debe llevar un terminal, de lo contrario, terminará en los mismos problemas.MMETROuna→ a METRO
Mover la información es fácil en las llamadas gramáticas monótonas ( con ) utilizando reglas como , que puede ser visto como que salta sobre . Para las gramáticas sensibles al contexto adecuadas, es necesario dividir esto en tres pasos: . en cada producción se cambia una letra en un contexto apropiado. Se necesita bastante imaginación para ver que este proceso no interactúa con otras partes de la derivación. Por ejemplo, ¿qué sucede cuando la en el último paso se involucra por primera vez en otro paso de derivación?| α | ≤ β | X A → A X X A X A → X A X , X A X → A A X , A A X → A X Aα → β El | α | ≤βEl | XA → A X X UNA XA → XUNAX, XUNAX→ A AX, A AX→ A X UNA
Esto podría no funcionar para palabras muy cortas, cuando hay más información que posiciones disponibles. La solución más simple para eso es ignorar cadenas cortas en su construcción y generarlas por separado.
fuente
Respuesta predeterminada corta: cree un LBA que acepte el idioma y utilice la simulación utilizada para demostrar que las gramáticas sensibles al contexto y el LBA definen el mismo conjunto de idiomas. Pero eso, por supuesto, no es lo que buscas.
En este caso específico, trate de pensar en usar una gramática lineal derecha para dos veces, una para la izquierda y otra para la mitad derecha. Todo lo que tiene que hacer es asegurarse de que ambas gramáticas deriven "en sincronía".Σ∗
Esto se puede hacer cambiando un token de control. Es decir, las gramáticas de la izquierda escogen una regla, generan el token de control de ajuste y lo pasan a la gramática correcta. La gramática correcta ve el token de control y ejecuta la regla de ajuste. Tenga en cuenta que también puede implementar la comunicación bidireccional de esta manera, pero no es necesario aquí.
Hay un problema con las gramáticas sensibles al contexto: nunca pueden eliminar no terminales (excepto si la palabra vacía está en el idioma). Por lo tanto, tenemos que crear solo los no terminales que necesitemos; ninguno puede ser redundante.S→ ε
Una forma de lograr esto es usar el mismo truco que para ciertas pruebas sobre LBA: generar todos los no terminales que va a necesitar primero , es decir, preparar la "cinta". Más tarde, "muévete" en esa cinta. Solo "al final", reemplace todos los no terminales por terminales.
¿Ves cómo extender esto a ? ¿ también para ? ¿Puedes usar la misma construcción para cualquier para normal ?Lk= { wk∣ w ∈ Σ∗} L = ⋃i ≥ 1Lk Lk L
fuente
Aunque no sé cómo se verá la gramática sensible al contexto, puede eludir su problema con el símbolo siguiente manera.X
fuente