Existe uma definição clara de "computável" para modelos de computação que não estão completos?

9

Este é o seguimento de outra pergunta aqui , e espero que não seja muito filosófico. Como Raphael apontou em um comentário na minha pergunta anterior, eu realmente não entendo a definição de "computável", mas de acordo com alguns artigos que li, a definição também não é muito clara quando se trata de modelos de computação mais fracos do que turing máquinas devido à codificação da entrada e saída.

A definição típica de turing computável é a seguinte:

Definição 1: Uma função é chamada de turing computável se houver uma máquina de turing M que calcula f usando uma codificação adequada dos números naturais como seqüências de caracteres.f:NkNMf

As definições diferem no que exatamente é uma codificação adequada , mas a maioria se refere à codificação binária , codificação unária ou decimal como a codificação fixa e adequada. Também é possível mostrar que a fixação de uma codificação é necessária para a definição da computabilidade do turing. Mas o que torna, digamos, a codificação binária de números naturais especial, para que possamos axiomatizá-la como a codificação adequada? Provavelmente porque se encaixa na noção intuitiva do que computabilidade significa coincidentemente .

Agora, e se olharmos para modelos de computação mais fracos que as máquinas de turing? Por exemplo, vamos considerar o conjunto de máquinas de turing "aleijadas" com o alfabeto { 0 , 1 } que só pode se mover para a direita e uma definição de turing aleijada computável que seja consistente com a da computabilidade de turing:Mc{0,1}

Definição 2: Uma função é chamada de turing aleijado computável ou computável em M c se houver uma máquina de turing aleijada M que calcula f usando uma codificação adequada dos números naturais como uma string.f:NkNMcMf

Se definirmos "codificação adequada" como "codificação binária", a função não é computável em M c . Se axiomatizarmos "codificação adequada" como "codificação unária", então f é computável em M c . Isso parece estranho, considerando o fato de que todos podem consertar uma das infinitas codificações intuitivas à vontade. Deve ficar claro se um modelo de computação pode calcular ff:NN,nn+1Mcf Mcf ou não, sem se referir a uma codificação específica - pelo menos nunca vi alguém mencionar qual codificação é usada quando se afirma que "os programas de loop são mais fracos que as máquinas de turing".


Após esta introdução, posso finalmente formular minha pergunta: como definir "codificações adequadas" e "computabilidade" para modelos arbitrários de computação que não coincidem com a noção intuitiva de computabilidade? Isso é possível dentro da estrutura da computação turing?

Edit: Eu abreviei a introdução, não foi adicionada à pergunta.

Stefan Lutz
fonte

Respostas:

6

Um fato básico que você está perdendo aqui é que todas as codificações mencionadas são equivalentes da perspectiva da computabilidade: existe uma função computável que mapeia a codificação binária de um número para sua codificação unária ou vice-versa. Portanto, para definir a computabilidade, não importa qual dessas codificações você escolhe para números. Basta corrigir sua codificação favorita.

Computability é em sua essência uma propriedade das funções de string . Quando você define computabilidade em qualquer outro domínio, precisa corrigir uma codificação. Na prática, todas as codificações "razoáveis" são equivalentes no sentido do parágrafo anterior; portanto, a codificação exata não importa.f:ΣΣ

A codificação, no entanto, é importante em modelos restritos de computação. Para dar um exemplo extremo, suponha que você considere as máquinas de Turing com restrição de tempo: digamos que você queira que sua máquina termine no tempo para alguns c , em que n é o comprimento da entrada (como uma string). Não podemos mais alternar entre codificação binária e codificação unária, porque a codificação binária é muito mais compacta. Quando falamos sobre uma função computável de tempo polinomial de números inteiros , especificamos que os números inteiros são codificados em binário. Mesmo essa é uma escolha um tanto arbitrária, já que a codificação decimal levaria à mesma noção de computabilidade de tempo polinomial.O(nc)cn

Então, para responder à sua pergunta - a codificação é especificada como parte da definição do modelo restrito.

Yuval Filmus
fonte
"Um fato básico que você está perdendo aqui é que todas as codificações mencionadas são equivalentes da perspectiva da computabilidade: existe uma função computável que mapeia a codificação binária de um número para sua codificação unária ou vice-versa" - sim, eu tinha isso na versão original da minha pergunta, mas não vejo como isso é relevante para a pergunta sobre modelos mais fracos. Também está claro que a codificação deve ser especificada como parte da definição do modelo, mas a questão é como se pode chegar a uma definição tão razoável.
Stefan Lutz
11
Um puxa esta definição fora do chapéu. Como definições diferentes tendem a ser equivalentes, a definição exata não importa. Quando isso acontecer, haverá várias noções diferentes de complexidade. Por exemplo, para alguns algoritmos de gráfico, faz diferença se você receber uma matriz de adjacência ou uma lista de arestas.
Yuval Filmus
Para resumir: a) A definição de cada modelo de computação deve incluir sintaxe, semântica E uma codificação adequada. b) A definição de "codificação adequada" é completamente independente da sintaxe e da semântica do modelo. c) Não há como dar uma definição de "codificação adequada" que seja válida para todos os modelos de computação. Isso está correto?
Stefan Lutz
Concordo com a) eb), mas com c) apenas parcialmente. Você pode definir uma codificação adequada que serve como "codificação padrão", usada, a menos que seja feita uma menção explícita ao fato. No caso de números, existe uma codificação padrão - codificação binária.
Yuval Filmus
M
4

Primeiro de tudo, você não pode corrigir "codificação adequada" como seqüências binárias ou qualquer outra codificação. Isso ocorre porque você perderia muitos modelos de computação, porque diferentes modelos de computação podem ter modelos muito diferentes de entrada e saída. Em outras palavras, eles não podem "falar" seqüências de caracteres.

Por exemplo, os termos do cálculo lambda sem tipo são variáveis, ou a aplicação de um termo a outro, ou uma abstração de um termo lambda. Entrada e saída são termos, seqüências arbitrárias. Ainda assim, o cálculo lambda não tipado é Turing-completo porque existe uma "codificação adequada" que codifica números naturais como termos lambda de uma determinada forma, e sob essa codificação para cada função computável existe um termo lambda que o computa.

Você pode formalizar a "codificação adequada" se fixar as máquinas de Turing como seu modelo de referência de computação e exigir que a codificação e decodificação de e para cadeias binárias sejam executadas por uma máquina de Turing que sempre para. Por exemplo, uma máquina de Turing seria capaz de converter um número natural como uma sequência binária em um termo Lambda que expressa esse número, simular a redução no cálculo lambda e converter o resultado novamente em uma sequência binária.

Para modelos mais simples de computação, eu esperaria a mesma abordagem: pegue um modelo de referência de computação e corrija uma codificação dos números naturais e, em seguida, verifique se a codificação e decodificação é feita pelas instâncias desse modelo simples. Como você observou, para máquinas de Turing danificadas, o uso de números codificados unários e binários não produziria um modelo equivalente de computação.

Hoopje
fonte
É possível que você tenha mudado as coisas no último parágrafo? Você escreve que a codificação é feita pelo modelo simples, não pelo modelo de referência - no parágrafo anterior, você deseja que a codificação seja feita pelo modelo de referência, não pelo outro modelo (cálculo lambda).
Stefan Lutz
Se você está estudando modelos mais fracos de computação, não deseja usar máquinas de Turing em nenhum lugar, nem mesmo na fase de codificação / decodificação. Então você poderia realizar todos os cálculos na fase de codificação e qualquer modelo de cálculo seria Turing completo. Portanto, você precisa usar o modelo de referência mais simples para codificação / decodificação.
213 Hoopje
11
nNchurch:Nlambdatermchurch(n)toBinary:lambdatermlambdatermwΣ