Este es un desafío de policías y ladrones basado en la definición de lenguajes y la prueba de que están completos.
Este es el hilo conductor de la policía. El hilo de los ladrones está aquí .
Policías
Como policía, prepararás dos cosas:
Una especificación formal de un lenguaje de programación u otro sistema computacional. (Los sistemas computacionales se definen a continuación).
Una prueba de que su sistema está Turing completo, de acuerdo con la definición algo estricta a continuación.
Publicará su especificación de su idioma, y los ladrones intentarán "descifrarla" demostrando su integridad de Turing. Si su envío no se resuelve en una semana, puede marcarlo como seguro y publicar su prueba. (Su respuesta puede ser invalidada si alguien encuentra un defecto en su prueba, a menos que pueda solucionarlo).
Este es un concurso de popularidad , por lo que el ganador será la respuesta que tenga más votos, y que no esté descifrada o invalidada. El desafío es abierto: no aceptaré una respuesta.
En aras de este desafío, un sistema computacional se definirá como cuatro cosas:
Un "conjunto de programas"
P
. Este será un conjunto infinitamente contable, por ejemplo, cadenas, enteros, árboles binarios, configuraciones de píxeles en una cuadrícula, etc. (Pero vea la restricción técnica a continuación).Un "conjunto de entrada"
I
, que también será un conjunto infinitamente contable, y no necesita ser el mismo conjunto queP
(aunque puede serlo).Un "conjunto de salida"
O
, que de manera similar será un conjunto infinitamente contable, y puede o no ser lo mismo queP
oI
Un procedimiento determinista, mecanicista para producir una salida
o
de programap
y de entradai
, dondep
,i
yo
son miembros deP
,I
yO
respectivamente. Este procedimiento debe ser tal que, en principio, pueda implementarse en una máquina de Turing u otro modelo abstracto de cómputo. El procedimiento puede, por supuesto, no detenerse, dependiendo del programa y su entrada.
Los conjuntos P
, I
y O
deben ser tales que pueda expresarlos como cadenas de manera computable. (Para las elecciones más sensatas, esto no importará; esta regla existe para evitar que elija conjuntos extraños, como el conjunto de máquinas de Turing que no se detienen).
La integridad de Turing se definirá de la siguiente manera:
- Para cualquier función parcial computable
f
deI
aO
, existe un programap
enP
tal que dadop
y entradai
, la salida esf(i)
sif(i)
tiene un valor. (De lo contrario, el programa no se detiene).
La palabra "computable" en la definición anterior significa "se puede calcular usando una máquina de Turing".
Tenga en cuenta que ni la regla 110 ni la etiqueta cíclica bit a bit están completadas por Turing por esta definición, porque no tienen la estructura de entrada-salida requerida. El cálculo de Lambda es Turing completo, siempre que definamos I
y O
seamos los números de la Iglesia . (No es completo de Turing si tomamos I
y O
para ser expresiones lambda en general).
Tenga en cuenta que no tiene que proporcionar una implementación de su idioma, pero puede incluir una en su respuesta si lo desea. Sin embargo, no debe confiar en la implementación para definir el lenguaje de ninguna manera: la especificación debe estar completa en sí misma, y si hay una contradicción entre la especificación y la implementación, esto debe tratarse como un error en la implementación.