Fuja do tarpit (Policiais)


9

Esse é um desafio de , 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 , 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 que P(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 que PouI

  • A, procedimento mecanicista determinística para a produção de uma saída ode programa pe de entrada i, onde p, ie osão membros do P, Ie Orespectivamente. 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, Ie Odeve 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 fde Iaté O, existe um programa pem Pque dado pe entrada i, a saída é f(i)se f(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 Ie Osejam os números da Igreja . (Não é Turing-completo se usarmos Ie formos Oexpressõ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.


9
Desculpe pessoal, mas o concurso de popularidade é um critério objetivo de ganhar. Ser um pop-con não desafia o tópico e nunca o fez. A meta-discussão mais recente tem um consenso de +27 a favor disso, portanto, embora vocês cinco prefiram que seja diferente, realmente não têm pernas para se apoiar. Como esta questão foi encerrada contra a política acordada, solicito que seja reaberta.
1813 Nathaniel

2
(nota que WhatWizard fechada por uma razão diferente.)
user202729

2
Por favor, não use votos próximos como um botão "Não concordo" ou "Não gosto deste". Votos apertados devem ser usados ​​para aplicar a política do site. Se você não concorda com uma política, leve-a à meta - não feche os desafios que estão no tópico por consenso da comunidade.
Mego

11
@Mego Votei em encerrar isso como muito amplo, mas também acho que isso não está de acordo com nossas regras existentes para pop-cons. Esperamos que os concursos de popularidade tenham "Uma especificação clara da meta que deve ser alcançada"; essa questão é um X do modo mais criativo. É claro para mim que não há outro objetivo senão ser uma resposta válida e que a tag pop-con está anexada apenas para mantê-la aberta.
Ad Hoc Garf Hunter

2
@WhatWizard, o objetivo que deve ser alcançado é não estar obviamente completo com Turing, com a não-obviedade avaliada por não ser quebrada dentro de uma semana. Isso não está claro?
Nathaniel #

Respostas:


10

Aritmética com os olhos vendados

Possivelmente uma linguagem bastante fácil para começar, relativamente falando. (Existem limites para a dificuldade de uma linguagem que posso tornar, porque tenho que provar que estou me completando!)

Para esse idioma, o conjunto de programas é o conjunto de programas aritméticos com os olhos vendados, conforme indicado na seção "programa" abaixo, o conjunto de entrada é o conjunto de números inteiros positivos e o conjunto de saída é o conjunto de números inteiros (o conjunto inteiro, não apenas números inteiros positivos).

Essa linguagem é bastante interessante - talvez até praticamente útil - porque tem uma falta total ou parcial de fluxo de controle, sendo inteiramente baseada em cálculos em números que você não pode ver. Isso o torna potencialmente útil como uma linguagem para implementar programas dentro de sistemas de criptografia homomórfica .

Especificação

Aritmética com os olhos vendados é uma linguagem de programação esotérica com as seguintes especificações:

Armazenamento de dados

O estado de um programa aritmético de olhos vendados em execução consiste em seis variáveis, cada uma das quais pode armazenar um número inteiro. (Não há limites para o quão grande ou pequena estes números inteiros pode obter, em particular, eles podem ir negativo.) As variáveis são chamados a, b, c, d, e, e i.

No início do programa, aa einclusiva são cada inicializado a 0, e ié inicializado para um inteiro positivo tirado de entrada do usuário. (Se nenhuma entrada estiver disponível, iserá inicializada como 1.)

Se o programa interromper a execução (isso só pode ocorrer devido à divisão por zero), o valor iimediatamente antes da tentativa da divisão será usado como saída do programa.

Programa

Um programa aritmético com os olhos vendados é uma lista de comandos, cada um com uma das seguintes formas (em que v pode ser substituído por qualquer nome de variável, potencialmente um nome diferente cada vez que é usado):

  • v = v + v
  • v = v - v
  • v = v * v
  • v = v / v

Observe que cada operando dos comandos deve ser uma variável; esse idioma não permite o uso de números inteiros literais.

A execução do programa é executada executando cada um dos comandos em sequência e, em seguida, retornando ao início e continuando a executar os comandos em sequência novamente, ad infinitum (ou até que haja uma tentativa de dividir por zero, o que encerra o programa) .

Cada comando tem a mesma semântica que você esperaria da notação, que não é diferente da usada pelas linguagens de programação mais práticas: são tomados os valores da segunda e terceira variáveis ​​mencionadas no comando, uma operação aritmética (adicionar / subtrair / multiplicar / dividir respectivamente para as quatro formas de comando) é aplicado a elas e o valor resultante armazenado na primeira variável. Divisão aqui é divisão inteira, arredondando para 0.

Não há nenhum tipo de fluxo de controle além da saída do programa; os comandos sempre circulam em seqüência, até que uma divisão por zero (se houver) ocorra e finalize o programa. Em particular, não há como ler diretamente variáveis, apenas para usá-las como fonte de cálculos cujos resultados afetam os valores atribuídos a outras variáveis.


Você pode verificar se minha resposta está faltando alguma coisa?
usar o seguinte comando

@ user202729: (comentando aqui porque não tenho o representante para comentar lá) Você não pode simular um "movimento se falso" de um "flip" e um "movimento se verdadeiro" porque você não pode desfazer o flip depois que você se mudar. Então, você precisará de outra maneira de lidar com isso (por exemplo, uma maneira de inverter os testes, isso não deve ser difícil). Mais notavelmente, porém, essa é uma prova de integridade de Turing em termos de comportamento de parada, mas a definição na pergunta exige que você também possa fazer E / S, portanto, você precisa provar que pode fazer isso.
precisa saber é

Espero que a parte de E / S (agora) esteja ok. Quanto à outra questão, percebo que o interior se não são mesmo necessárias, estados intermediários resolver todo o problema (embora eu não tenho certeza de como palavra que)
user202729

@ user202729: ainda não está perfeitamente correto (por exemplo, a pergunta exige que você possa gerar números negativos, e você também precisa alterar a finalidade de imodo que o número do estado - que sempre será "interrompido" - não faça parte da saída), mas está perto o suficiente para que eu não marque isso como seguro, pois você claramente obteria uma rachadura completa com tempo suficiente e esclarecimentos suficientes das regras. Não quero vencer este desafio em termos técnicos.
precisa saber é

Isso está muito próximo das restrições que de.ioccc.org/years-spoiler.html#1992_buzzard.1 usa. Essa implementação usa números inteiros de tamanho fixo e, portanto, não é completa para Turing, e essa é seriamente restringida no número de variáveis ​​que você possui, mas acho que a prova é, no entanto, semelhante.
b_jonas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.