Esse é um desafio de policiais e ladrões , baseado na definição de idiomas e na comprovação de que eles estão completos em Turing.
Este é o tópico dos policiais. A discussão dos ladrões está aqui .
Policiais
Como policial, você preparará duas coisas:
Uma especificação formal de uma linguagem de programação ou outro sistema computacional. (Os sistemas computacionais são definidos abaixo.)
Uma prova de que seu sistema está completo com Turing, de acordo com a definição um pouco rigorosa abaixo.
Você publicará sua especificação do seu idioma, e os ladrões tentarão "decifrá-lo", comprovando sua integridade em Turing. Se o seu envio não for quebrado dentro de uma semana, você pode marcá-lo como seguro e postar sua prova. (Sua resposta pode ser invalidada se alguém encontrar uma falha na sua prova, a menos que você possa corrigi-la.)
Este é um concurso de popularidade , portanto, o vencedor será a resposta que tem mais votos e que não está rachada ou invalidada. O desafio é aberto - não aceitarei uma resposta.
Para esse desafio, um sistema computacional será definido como quatro coisas:
Um "conjunto de programas"
P
. Este será um conjunto infinitamente contável, por exemplo, seqüências de caracteres, números inteiros, árvores binárias, configurações de pixels em uma grade etc. (Mas veja a restrição técnica abaixo).Um "conjunto de entrada"
I
, que também será um conjunto infinitamente contável e não precisará ser o mesmo conjunto queP
(embora possa ser).Um "conjunto de saída"
O
, que da mesma forma será um conjunto infinitamente contável e pode ou não ser o mesmo queP
ouI
A, procedimento mecanicista determinística para a produção de uma saída
o
de programap
e de entradai
, ondep
,i
eo
são membros doP
,I
eO
respectivamente. Este procedimento deve ser tal que possa, em princípio, ser implementado em uma máquina de Turing ou outro modelo abstrato de computação. Obviamente, o procedimento pode não ser interrompido, dependendo do programa e de sua entrada.
Os conjuntos P
, I
e O
deve ser tal que você pode expressar-los como cordas de uma maneira computável. (Para a maioria das escolhas sensatas, isso não importa; essa regra existe para impedir que você escolha conjuntos estranhos, como o conjunto de máquinas de Turing que não param.)
A integridade de Turing será definida da seguinte forma:
- Para qualquer função parcial computável
f
deI
atéO
, existe um programap
emP
que dadop
e entradai
, a saída éf(i)
sef(i)
tiver um valor. (Caso contrário, o programa não será interrompido.)
A palavra "computável" na definição acima significa "pode ser calculada usando uma máquina de Turing".
Observe que nem a regra 110 nem o tag cíclico bit a bit são Turing-completos por esta definição, porque eles não têm a estrutura de entrada-saída necessária. O cálculo Lambda é Turing completo, desde que definamos I
e O
sejam os números da Igreja . (Não é Turing-completo se usarmos I
e formos O
expressões lambda em geral.)
Observe que você não precisa fornecer uma implementação do seu idioma, mas pode incluir um na sua resposta, se quiser. No entanto, você não deve confiar na implementação para definir o idioma de forma alguma - a especificação deve ser completa em si mesma e, se houver uma contradição entre a especificação e a implementação, isso deve ser tratado como um bug na implementação.