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.
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:
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.
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 f 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.
fonte
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.
fonte