¿Hay algún lenguaje que pueda expresar su propio compilador Turing-complete?


12

Un comentario sobre tex.SE me hizo preguntarme. La declaración es esencialmente:

Si puedo escribir un compilador para el lenguaje X en el lenguaje X, entonces X está completo de Turing.

En términos de computabilidad y lenguajes formales, esto es:

Si decide L L T M y M L , entonces F L = R E .MLLTMMLFL=RE

Aquí denota el lenguaje de todas las codificaciones máquina de Turing y F L denota el conjunto de funciones calculadas por máquinas en L .LTMFLL

¿Es esto cierto?


cierre, piense / acuerde que debe haber algo parecido a esto, cualquier lenguaje "no trivial" o "suficientemente complejo" que pueda expresar su propio simulador está completo. un compilador generalmente es parte de un simulador. de hecho, es un "patrón de diseño" que se encuentra en muchas pruebas de integridad de TM pero que tal vez no se ha generalizado / formalizado. tal vez un tema para análisis / discusión adicional en Computer Science Chat . sospechoso / conjetura, hay algunos otros temas interesantes algo así como "todo lenguaje no trivial / suficientemente complejo recursivo y recursivamente enumerable puede ser mapeado / reducido a todos los demás".
vzn

1
Creé un lenguaje esotérico llamado InterpretMe, que no puede hacer nada más que expresar su propio intérprete, por lo que ciertamente no está completo.
Ortografía no contextual

¿Puedes explicar la segunda declaración? ¿Cuál es ? ¿Cómo se relaciona esta declaración con la primera? M
reinierpost

@reinierpost típicamente denota el número de M , dado que algunos (admisible) que codifica. Por lo tanto, L T M = { M | M  es una máquina de Turing } . Por F L denoto el conjunto de funciones calculadas por el lenguaje L de las máquinas de Turing. MMLTM={MM is a Turing machine}FLL
Raphael

Una mejor manera de expresar el reclamo sería: "Si hay un TM con M L y L M = L , entonces F L = R E .MMLLM=LFL=RE
Rafael

Respuestas:


13

La declaración informal no es cierta, como se muestra en el siguiente lenguaje de programación. Cualquier cadena de, digamos, caracteres ASCII es un programa válido y el significado de cada programa es: "Generar un programa que solo genera una copia de su entrada". Por lo tanto, cada programa en este idioma es un compilador para el idioma, pero el idioma no es completo de Turing.

M2xxMLMFL


(ϕi)i0Q(x,y)pϕpyQ(p,y)Qx=ypϕp(y)=Q(p,y)ϕpp


1
¿En qué sentido cada programa en ese idioma es un compilador para ese idioma? Cada programa es un programa que ingresa un programa en ese idioma y genera un programa diferente en ese idioma, sí, pero generalmente los quines no se consideran compiladores.
user253751

1
cc(P)={xreturn P}P(x)=Pc

1
@immibis (tardíamente) creo que tienes razón. Parece que lo que quise escribir fue que la semántica de cada programa es simplemente "dar salida a su entrada". Eso parece lo suficientemente parecido a lo que escribí que probablemente fue lo que quise decir en primer lugar. O tal vez tuve mucha suerte de que la distancia de edición de mi respuesta incorrecta a la respuesta correcta fuera tan pequeña. :-)
David Richerby

1
La respuesta ahora dice "ignora su entrada y genera una copia de su entrada", no puede hacer ambas cosas.
user253751

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.