Mi problema es cómo puedo probar que una gramática no es ambigua. Tengo la siguiente gramática:
y hacer esto con una gramática inequívoca, creo que es correcto:
Sé que una gramática inequívoca tiene un árbol de análisis por cada término.
fuente
Mi problema es cómo puedo probar que una gramática no es ambigua. Tengo la siguiente gramática:
y hacer esto con una gramática inequívoca, creo que es correcto:
Sé que una gramática inequívoca tiene un árbol de análisis por cada término.
Hay (al menos) una manera de demostrar falta de ambigüedad de una gramática para el lenguaje L . Consiste en dos pasos:
El primer paso es bastante claro: demuestre que la gramática genera (al menos) las palabras que desea, eso es lo correcto.
El segundo paso muestra que tiene tantos árboles de sintaxis para palabras de longitud n como L tiene palabras de longitud n , con 1. esto implica falta de ambigüedad. Utiliza la función de estructura de G que se remonta a Chomsky y Schützenberger [1], a saber
con el número de árboles de sintaxis que G tiene para palabras de longitud n . Por supuesto que necesitas tener | L n | para que esto funcione
Lo bueno es que es (generalmente) fácil de obtener para lenguajes libres de contexto, aunque encontrar una forma cerrada para t n puede ser difícil. Transforme G en un sistema de ecuaciones de funciones con una variable por no terminal:
Esto puede parecer desalentador, pero en realidad es solo una transformación sintáctica, como quedará claro en el ejemplo. La idea es que los símbolos terminales generados se cuentan en el exponente de y debido a que el sistema tiene la misma forma que G , z n ocurre con tanta frecuencia en la suma que G puede generar n terminales . Verifique Kuich [2] para más detalles.
Resolver este sistema de ecuaciones (¡álgebra computacional!) Produce ; ahora "solo" tiene que extraer el coeficiente (en forma cerrada y general). La TCS Cheat Sheet y el álgebra computacional a menudo pueden hacerlo.
Considere la gramática simple con reglas
.
Está claro que (paso 1, prueba por inducción). Hay 2 n palíndromos de longitudnsines par,0 de locontrario.
Configurar el sistema de ecuaciones produce
cuya solución es
.
Los coeficientes de coinciden con el número de palíndromos, por lo que G no es ambiguo.
Esta es una buena pregunta, pero algunos Google le habrían dicho que no existe un método general para decidir la ambigüedad , por lo que debe hacer su pregunta más específica.
fuente
Para algunas gramáticas, es posible una prueba por inducción (sobre la longitud de la palabra).
Esto se vuelve más difícil si
Puede ayudar a fortalecer el reclamo de todas las formas de sentencia (si la gramática no tiene no terminales no productivos) y no terminales "raíz".
Creo que la conversión a la forma normal de Greibach mantiene (una) ambigüedad, ya que aplicar este paso primero puede encargarse de la recursión izquierda muy bien.
La clave es identificar una característica de cada palabra que corrige (al menos) un paso de derivación. El resto sigue inductivamente.
fuente
Básicamente, es un problema de generación infantil. Comience con la primera expresión y genere sus hijos ... Siga haciéndolo recursivamente (DFS), y después de varias iteraciones, vea si puede generar la misma expresión expandida a partir de dos hijos diferentes. Si puede hacer eso, es ambiguo. Sin embargo, no hay forma de determinar el tiempo de ejecución de este algoritmo. Suponga que es seguro, después de quizás generar 30 niveles de niños :) (Por supuesto, podría bombardear el 31)
fuente