Existen muchas técnicas para demostrar que un idioma no está libre de contexto, pero ¿cómo pruebo que un idioma no tiene contexto?
¿Qué técnicas hay para probar esto? Obviamente, una forma es exhibir una gramática libre de contexto para el lenguaje. ¿Existen técnicas sistemáticas para encontrar una gramática libre de contexto para un idioma dado?
Para los lenguajes regulares, no son formas sistemáticas para derivar un autómata regular de la gramática / de estado finito: por ejemplo, el Myhill-Nerode teorema proporciona una manera. ¿Existe alguna técnica correspondiente para los lenguajes sin contexto?
Mi motivación aquí es (con suerte) construir una pregunta de referencia que contenga una lista de técnicas que a menudo son útiles, cuando intento demostrar que un idioma dado no tiene contexto. Dado que tenemos muchas preguntas aquí que son casos especiales de esto, sería bueno si pudiéramos documentar el enfoque general o las técnicas generales que uno puede usar para enfrentar este tipo de problema.
Respuestas:
Un enfoque práctico que en muchos ejemplos funciona [pero no siempre lo sé] está tratando de encontrar la estructura de anidación de las cadenas en el lenguaje. Las "dependencias anidadas" deben generarse al mismo tiempo en diferentes partes de la cadena.
También tenemos la caja de herramientas básica :
concatenación: si puedes dividir el idioma en dos partes consecutivas usa esta producciónS→ S1S2
unión: dividido en partes disjuntasS→ S1∣ S2
iteración:S→ S1S∣ ε
Ejemplo 1
Aquí un ejemplo para la anidación (gracias Raphael).
Reemplace por 2 l . Ahora podemos soltar n en condiciones.n 2l n
Reemplace por k > o o k < o (¿confundido? O es 'oh' no 'cero'). Aplicar herramientas para la unión. Trabajamos con k > o aquí. También k > o iff k = s + o y s > 0 donde s es una nueva variable. Reemplace k por s + o .k≠o k>o or k<o o k>o k>o k=s+o s>0 s k s+o
Algunas reescrituras simples.
Ahora vemos la estructura de anidación y comenzamos a construir una gramática.
, T → b U , U → b U ∣ ε (ver: concatenación e iteración aquí)S1→TV T→bU U→bU∣ε
(generamos o b 's en ambos lados)V→bVb∣W o b
, Y → b c b c , Z → b c Z ∣ εX→YZ Y→bcbc Z→bcZ∣ε
Ejemplo 2
Una primera reescritura "obvia".
En lingüística, esto se denomina "dependencia de serie cruzada": el entrelazado (generalmente) indica fuertemente la ausencia de contexto. Por supuesto, m + k = k + my estamos salvados.k,m,k,m m+k=k+m
con producciones , X → a X b ∣ ε , Y → b Y c ∣ εS→XY X→aXb∣ε Y→bYc∣ε
De manera similar,K′= { aksildometro∣m=k+l}={akblclck∣k,l≥0}
con producciones , X → b X c ∣ εS→aSc∣X X→bXc∣ε
Comentario final: estas técnicas lo ayudan a encontrar una gramática libre de contexto que, con suerte, reconocerá su idioma. Es posible que aún se necesite una prueba de corrección para garantizar que la gramática realmente funcione para reconocer su idioma (nada más y nada menos).
fuente
Hay una caracterización de CFL que puede ser útil, el teorema de Chomsky-Schützenberger .
Lenguaje Dyck
Teorema de Chomsky-Schützenberger
Tenga en cuenta que el homomorfismo se extiende a las palabras (símbolo por símbolo) y luego a los idiomas (palabra por palabra).
Ejemplo
Considere . ConL={anbncm∣n,m∈N
el teorema implica que tiene contexto, en particular porqueL
.DT∩R={[n]n⟨m⟩m∣n,m∈N}
Ejemplo 2
Demuestre que tiene contexto.L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}
Aquí, necesitamos un tipo de paréntesis para , uno para b c , uno para b y otro para modelar el b que causa k ≠ o . Usamosa bc b b k≠o
y aplica el teorema. Con el fin de ver que , que no necesitamos más que el hecho de que los símbolos coincidentes (por ejemplo, [ y ] ) tienen que ocurrir con la misma frecuencia en cualquier w ∈ D T . Agregando esta restricción a las expresiones regulares por las que definimos R , obtenemosL=ψ(DT∩R) [ ] w∈DT R
y con eso
A gramáticas y autómatas
Si queremos tener un autómata o gramática al final, tenemos más trabajo por delante.
Hacia un autómata, construir el NPDA para y un NFA para R . El primero es estándar y tenemos algoritmos para el segundo, siempre que el lenguaje se proporcione en una representación adecuada (ver también aquí ). La intersección de ambos es otra construcción estándar y ψ se puede aplicar a cada transición individualmente.DT R ψ
Hacia una gramática, construya uno para (nuevamente, debería ser estándar), tome el de D T e intersectalos . Luego aplique ψ al conjunto de reglas (símbolo por símbolo).R DT ψ
Podría decirse que esto es fácil ya que algorítmico; la complejidad radica en encontrar adecuada , R y ψ . No sé si este enfoque es (a menudo) más simple que construir PDA / gramáticas directamente, pero puede permitir centrarse en las características importantes del lenguaje en cuestión. Prueba por ti mismo!T R ψ
fuente