¿Se pueden completar los idiomas regulares?

32

Estaba leyendo sobre Iota y Jot y encontré esta sección confusa:

A diferencia de Iota, donde el árbol sintáctico para una cadena puede ramificarse tanto a la izquierda como a la derecha, la sintaxis de Jot se ramifica uniformemente a la izquierda. Como resultado, Iota es estrictamente libre de contexto, pero Jot es un lenguaje normal.

Tengo entendido que tanto Iota como Jot están completos. Pero aparentemente, uno no tiene contexto y el otro es regular. ¿Seguramente los idiomas normales no pueden ser completos?

sdleihssirhc
fuente
3
Tenga en cuenta que un lenguaje que describe una máquina de turing se puede escribir trivialmente en un lenguaje normal, por ejemplo i = {0,1, -1}, b = {final de entrada} (i + bi + bi) + b (i +) describe un conjunto de reglas no vacío seguido de una entrada no vacía. O, más bien, puede interpretarlo así si tiene un intérprete, que, como mencionan las respuestas, es un concepto separado para la clase del lenguaje.
Cubic
1
@Cubic: para el caso, las máquinas de Turing pueden numerarse de manera que cada número represente exactamente una máquina (es decir, son contables), y esos números pueden expresarse en notación unaria. Nunca estudié adecuadamente estas cosas, así que tengo que trabajar sobre las definiciones, pero creo que 1*0es un lenguaje normal ;-) Aunque no es un lenguaje de programación muy amigable ni para el programador ni para el compilador-escritor.
Steve Jessop

Respuestas:

40

En resumen, la respuesta es sí.

Pero está mezclando dos significados completamente no relacionados del término "lenguaje" (sí, esto es confuso):

  • Un conjunto de cuerdas. "Lenguaje libre de contexto" significa "un conjunto de cadenas que pueden reconocerse utilizando una gramática libre de contexto".
  • Una forma de especificar un cálculo. "Lenguaje completo de Turing" significa "una forma de especificar programas en los que se puede especificar la máquina de Turing".

Tenga en cuenta que puede hablar sobre "el lenguaje C ++" desde dos puntos de vista completamente no relacionados, utilizando los dos significados no relacionados de la palabra "lenguaje":

  • C ++ como un conjunto de cadenas que son legales según la gramática de C ++
  • C ++ como una forma de especificar programas.

Los rasgos del "lenguaje C ++" desde estos dos puntos de vista no están relacionados.

Más ejemplos para ayudarlo a separar estos conceptos:

  • La expresión "[az] + @ [az]. [Az]" describe un conjunto de cadenas reconocibles por autómatas finitos, es decir, un lenguaje normal. Sin embargo, es solo eso: un conjunto de cadenas: no es una forma de especificar programas (a menos que asigne una forma de interpretar cada cadena como un programa), por lo que no tiene sentido hablar sobre si es o no Turing- completar.
  • El lenguaje de los diagramas de flujo es una forma de especificar programas; dependiendo del sabor particular de los diagramas de flujo, puede o no ser Turing completo. Sin embargo, los diagramas de flujo no son cadenas, por lo que no tiene ningún sentido hablar de diagramas de flujo en el sentido "lenguaje como un conjunto de cadenas".
jkff
fuente
3
(([a-z][0-9]*)*[A-Z][0-9]*([a-z][0-9]*)*->([a-zA-Z][0-9]*)*)*
Agregaría
2
También tenga en cuenta que esto es posible porque codificamos cualquier máquina de Turing como una cadena binaria, y podemos asegurarnos de que cada cadena binaria represente una máquina de Turing. Entonces, el lenguaje obviamente normal de puede tener una semántica de Turing Complete adjunta. {0,1}
jmite
10

Si bien el conjunto de programas legales en Jot es regular, Jot en sí mismo es Turing completo. Eso significa que cada función computable se puede expresar en Jot. Incluso podemos encontrar un lenguaje en el que todas las cadenas binarias sean legales, pero el lenguaje en sí es Turing completo (ejercicio). Estás confundiendo sintaxis y semántica.

Por cierto, los lenguajes libres de contexto tampoco (probablemente) no tienen NP completo, ya que tienen un algoritmo de análisis de tiempo polinómico.

Yuval Filmus
fuente
9

La sintaxis sola (como está codificada en los árboles de sintaxis) de los lenguajes de programación modernos está lejos de todo lo que hacen. De hecho, los lenguajes formales definidos por el conjunto de todos los programas en un idioma dado que se compilan sin errores rara vez incluso están libres de contexto .

La semántica estática y dinámica factor en la ecuación. Son invisibles en el árbol de sintaxis, pero determinan si un fragmento de código es realmente un programa y lo que calcula. En pocas palabras, el contexto libre resp. El lenguaje formal regular que se define por "sintaxis" proporciona una aproximación excesiva del lenguaje de programación.

Ahora para responder a su pregunta: sí, es posible. Considere, por ejemplo, cualquier numeración Gödel de máquinas Turing; obtienes el "lenguaje de programación" de todos los números naturales, cada uno representando una TM. De acuerdo, no es un buen lenguaje para programar, pero ciertamente es un lenguaje completo de Turing que es regular, incluso trivial.

Rafael
fuente
3
  1. Un lenguaje de programación es completo de Turing si es lo suficientemente expresivo como para especificar cada función computable por las máquinas de Turing. Aquí estamos discutiendo el poder de los lenguajes especificados en los lenguajes de programación . Por ejemplo, no es difícil escribir un intérprete para máquinas Turing en Python, por lo que Python es un lenguaje de programación completo de Turing.

  2. La sintaxis de un lenguaje de programación , es decir, el conjunto de cadenas correspondientes a programas válidos en el lenguaje de programación, es en sí mismo un lenguaje. Por ejemplo, considere el conjunto de todos los posibles programas de Python. La sintaxis de un lenguaje de programación puede ser sensibles al contexto , libre de contexto , normal , etc. Estamos interesados en la dificultad de comprobar que una determinada cadena es un programa válido en el lenguaje de programación (esto se hace por los compiladores / intérpretes). Cuando decimos que la sintaxis de un lenguaje de programación no tiene contexto, significa que hay una gramática libre de contexto para su sintaxis e implica que hay autómatas para verificar la validez de los programas,

Tenga en cuenta que la simplicidad de la sintaxis de un lenguaje de programación no implica una restricción en el poder computacional de los programas especificados en esos lenguajes de programación.

Kaveh
fuente
1

La respuesta es sí. Verá, como dice la respuesta aceptada, una gramática es independiente de su significado. En las propias palabras de Chomsky:

Creo que nos vemos obligados a concluir que una gramática es autónoma e independiente del significado ...

Chomsky, estructuras sintácticas (1956)

Si una gramática puede producir suficientes oraciones para describir todas las cosas que se pueden calcular, entonces podemos asignar arbitrariamente significado computacional a sus oraciones, una para cada cosa que se puede calcular.

En cuanto a un ejemplo concreto real, el lenguaje popular whitespacetiene una gramática regular y quizás incluso x86 assembly languages(necesita verificación).

Eric
fuente
No creo que ese pasaje signifique que la gramática de Go es un lenguaje regular en el sentido formal; Creo que solo significa que la gramática no es irregular , es decir, consistente. Si la sintaxis de Go fuera realmente un lenguaje regular en la jerarquía de Chomsky, sería incapaz de generar, por ejemplo, paréntesis balanceados y anidados.
tsleyson
Sí, hay recurrencia en la gramática de Go. Actualizando publicación.
Eric