Por que podemos assumir que um algoritmo pode ser representado como uma sequência de bits?

17

Estou começando a ler um livro sobre Complexidade Computacional e Máquinas de Turing. Aqui está citação:

Um algoritmo (ou seja, uma máquina) pode ser representado como uma sequência de bits, uma vez que decidimos alguma codificação canônica.

Essa afirmação é fornecida como um fato simples, mas não consigo entender.

Por exemplo, se eu tiver um algoritmo que aceite como entrada e calcule ( x + 1 ) 2 ou:x(x+1)2

int function (int x){
   x = x + 1; 
   return x**2; 
}

Como isso pode ser representado como string usando o alfabeto ?{0,1}

Kenenbek Arzymatov
fonte
38
Você não conhece o conhecimento mínimo absoluto necessário para entender como o texto é codificado. Hoje é um ótimo dia para aprender! joelonsoftware.com/2003/10/08/…
Eric Lippert
1
Eu acho que o OP pode chegar a isso de um ponto de vista diferente, com base em uma ambiguidade no texto citado. Eu acho que OP significa 'como toda a máquina e o algoritmo podem ser construídos como uma sequência de bits', não a entrada para a própria máquina de Turing. O texto citado implica que todo o algoritmo pode ser auto-executado, mas um pouco de linguagem c codificada em utf não diz nada sobre como uma máquina realmente atuaria nessa cadeia.
Sentinel
3
... Acho que todos aqui estão entendendo mal a fonte e levando a piada longe demais, às custas da inexperiência de Roma. A maioria desses comentários e respostas está falando sobre a codificação do texto para transmissão arbitrária, enquanto a citação está falando sobre a codificação do algoritmo para consumo por uma máquina de turing. A resposta (atualmente) aceita pelo menos toca na segunda frase.
Izkata
2
@ Izkata Não tenho certeza se você está ciente de que, devido à universalidade, essas duas declarações são equivalentes.
Konrad Rudolph
15
O engraçado é que, para eu poder ler o seu algoritmo codificado, ele necessariamente teve que ser transformado em uma sequência de bits assim que você o digitou. Ele nunca foi representado de maneira diferente - do teclado ao meu monitor. Só tinha uma representação não binária em nossas mentes; e no nível fisiológico, quando você olha sinapses, até isso é discutível.
Peter - Restabelece Monica

Respostas:

45

A resposta mais ingênua e simples para sua pergunta é que o código fornecido (e o código de máquina compilado) são de fato representados como sequências sintáticas de {0,1} *. Além disso, como você está falando de máquinas de turing, os programas executados são uma lista linear de operações / instruções, não há razão para que elas não possam ser representadas como bits / bytes.

Daniel F
fonte
Como exatamente você representa a máquina de Turing como uma lista de instruções? A definição usual é algo como isto .
svick
@svick Como mencionado na minha resposta abaixo, você usar uma TM universal, que leva a descrição de um TM como entrada (codificado de forma adequada)
dseuss
@svick Uma linguagem de programação com instruções simples para mover um ponteiro pela fita? Acredito que um exemplo disso poderia ser a linguagem de programação esotérica Brainfuck . Exemplo de código
LukStorms
@LukStorms Acho que você não pode mais chamar isso de "máquina de Turing".
svick
52

Você já tem uma representação dessa função como texto. Converta cada caractere em um valor de um byte usando a codificação ASCII. Então o resultado é uma sequência de bytes, ou seja, uma sequência de bits, ou seja, uma string sobre o alfabeto . Esse é um exemplo de codificação.{0 0,1}

DW
fonte
Exatamente. E como eu disse acima, aconteceu enquanto Roma a escrevia. Até os glifos que vejo no meu monitor são pixels em preto e branco, ou seja, informações binárias, enviadas por uma conexão de dados binários a partir de uma memória binária conectada a uma rede binária através de controladores binários. É possível representar todos os algoritmos como uma sequência de bits? Mais do que isso: é inevitável, a menos que você se limite à mídia analógica e à comunicação cara a cara.
Peter - Restabelece Monica
@ PeterA.Schneider O uso de mídia analógica ou presencial não implica necessariamente que não haja codificação discreta incorporada. Usar uma linguagem natural não está longe de usar uma codificação discreta, não é?
Jean-Baptiste Yunès
32

Não consigo resistir ...

⡂⡀⣀⢀⣄⡀⣰⡉⡀⠀⡀⡀⣀⠀⢀⣀⢀⣄⡀⡂⢀⣀⡀⢀⢀⡀⠀⡰⣀⠀⣀⠀⡂⡀⣀⢀⣄⡰⡀⢠⠂
⡇⡏⠀⡇⡇⠀⢸⠀⡇⢀⡇⡏⠀⡇⣏⠀⠀⡇⠀⡇⣏⠀⣹⢸⠁⢸⠀⡇⢈⠷⡁⠀⡇⡏⠀⡇⡇⠀⡇⢼⠀
⠁⠁⠀⠁⠈⠁⠈⠀⠈⠁⠁⠁⠀⠁⠈⠉⠀⠈⠁⠁⠈⠉⠁⠈⠀⠈⠀⠱⠉⠀⠉⠀⠁⠁⠀⠁⠈⠱⠁⠘⠄
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢤⡀⡤⠀⣀⣀⣀⠀⢤⡀⡤⠀⠀⢰⠀⠀⢹⠠⠀
⠀⠀⠀⣠⠛⣄⠀⠒⠒⠒⠀⣠⠛⣄⠀⠉⢹⠉⠁⢸⢀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀
⠀⠀⠀⣄⢄⠤⢄⢴⠤⢠⠀⢠⢠⡠⢠⡠⢄⠀⢤⡀⡤⢺⡖⠐⣷⠂⠊⢉⡆
⠀⠀⠀⡇⠸⣍⣉⠸⣀⠸⣀⢼⢸⠀⢸⠀⢸⠀⣠⠛⣄⠀⠀⠀⠀⠀⣴⣋⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

⢱⠀
⢸⠁
⠊

(Os pontos acima representam uns, os espaços em branco são zerados).

leftaroundabout
fonte
5
Divertido (+1), mas serve para sublinhar a natureza essencialmente arbitrária da codificação.
John Coleman
4
Divirta-se escrevendo o compilador para isso :)
Barmar
1
@Barmar Parece um desafio para codegolf.stackexchange.com
IMSoP
1
@RomaKarageorgievich, aqui está a função que faz a renderização para caracteres Braille. Aqui está um invólucro simples que permite chamá-lo na linha de comando.
leftaroundabout
13

Seu computador armazena tudo como seqüências de 0e 1, incluindo a pergunta que você digitou para perguntar como é feita. Por exemplo, cada letra e símbolo é representado por 8 bits (estou falando sobre como as coisas costumavam ser, hoje em dia são 16 bits e mais complicado). Você pode vê- los aqui . Bem, eles não estão mostrando os bits, mas os códigos hexadecimal e octal. Você sabe como converter um número em sua representação digital?

Andrej Bauer
fonte
6
São 16 bytes apenas no Windows e em algumas bibliotecas como Qt ou ICU, que usam UTF-16. E nem todas as letras usam uma única unidade de código em geral, mesmo em UTF-32, portanto elas podem ser mais longas. Então, acho que é melhor seguir o ASCII nesta discussão, trazer o Unicode aqui levará a uma complicação.
Ruslan #
8

A hipótese fundamental por trás desse conceito é a tese de Church-Turing . Pode ser difícil perceber que qualquer algoritmo pode ser representado como uma sequência de bits, porque o termo "algoritmo" pode ser pensado em termos muito informais. Na tese de Church-Turing, eles usam um conceito muito rigorosamente definido sobre o que é um algoritmo (e mesmo assim houve algumas perguntas sobre palavras). No entanto, sua terminologia tem obtido tanto influência que às vezes é argumentado que essas definições para palavras como "algoritmo" são tão eficazes que nós simplesmente aceitá-los como a definição.

Church-Turing afirma que todo algoritmo pode ser implementado como um cálculo em uma máquina de Turing. Dado que a descrição de uma Máquina de Turing é um conjunto finito de valores, é trivial ver como mapear essa descrição em uma sequência de números e, em seguida, em uma sequência de 0 e 1s.

Como as outras respostas mencionaram, é trivial representar seu exemplo de algoritmo usando codificação ASCII ou outras codificações.

Penso que a razão pela qual seu livro apresenta essa afirmação como fato deriva do fato de que muitos simplesmente usam a tese de Church-Turing como base para a definição de um algoritmo. Se você usar essa definição, é um fato tão óbvio quanto "5 é um número" porque você basicamente a definiu como tal.

Cort Ammon - Restabelecer Monica
fonte
9
A tese de Church-Turing não é um teorema e não envolve nenhuma definição para o conceito de algoritmo, que é informal. Também não vejo a necessidade de invocar a tese de Church-Turing para isso. A razão "profunda" pela qual alguns objetos podem ser representados como seqüências finitas e outros não, é que alguns conjuntos são contáveis ​​e outros não.
quicksort
Estou vendo "um algoritmo pode ser codificado como uma string se especificarmos uma injeção entre os componentes da especificação da máquina e o conjunto de strings em um idioma". OP faz isso em seu exemplo, usando a máquina representada por " $ (x + 1) ^ 2 $ " e re-representando-a como uma string no idioma das funções C (ou BCPL, C ++, et al.) Bem formadas .
22618 Eric
1
@EricTowers O que requer a tese de Church-Turing. Caso contrário, não se pode ter certeza de que existe uma especificação de máquina de um algoritmo para todos os algoritmos.
Cort Ammon - Restabelece Monica
1
Afirmo que um "algoritmo [que] exige um número incontável e infinito de símbolos para expressar" não pode ser expresso. Essa expressão deve usar muitos símbolos incontáveis; caso contrário, pode ser expressa em uma sub-linguagem menor. Além disso, qualquer expressão (não boba) sobre um alfabeto infinito tem uma quantidade infinita de entropia em quase todos os seus símbolos, portanto desafia a expressão (ou seja, na verdade, não pode se comunicar com um destinatário). Todas as lógicas financeiras se recusam a operar em tais cadeias infinitas e não estou ciente de uma lógica infinitária que permita trabalhar em inúmeras cadeias.
Eric Towers
1
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
DW
4

Esta afirmação é baseada na existência de TMs universais . São basicamente TMs programáveis ​​que podem simular qualquer outra TM com no máximo sobrecarga de poli. Portanto, seu programa é simplesmente parte da entrada codificada como zeros e uns.

dseuss
fonte
1
@Discretelizard, eu não sigo você. Qualquer algoritmo é expressável como uma entrada para uma TM universal. Os idiomas podem ser computáveis ​​ou desconectáveis; Eu não estou familiarizado com nenhuma noção padrão de computabilidade para algoritmos, então não tenho certeza do que você está entendendo. O que significaria ter um algoritmo incontestável? Talvez você esteja pensando em algoritmos que não necessariamente terminam? Mas uma TM universal ainda pode executar esses algoritmos.
DW
@Discretelizard Também não te sigo. Ser executável em uma máquina de Turing é essencialmente a definição de um algoritmo. Suponho que você possa falar sobre um "algoritmo" para, digamos, uma máquina de Turing com um oráculo para o problema de parada, mas, normalmente, "algoritmo" significa "algo que você pode fazer em uma máquina de Turing".
precisa saber é o seguinte
@DavidRicherby True, a definição real de algoritmo é mais rigorosa, suponho. Mas esta questão diz respeito ao motivo pelo qual impomos uma restrição muito mais branda e dizer que existe uma restrição ainda mais forte não é muito instrutivo, na minha opinião.
Lagarto discreto
4

Bem, vamos falar sobre algoritmos que não podem ser representados como uma cadeia de bits finita para qualquer tipo de codificação.

Deixe-me digitar esse algoritmo para você ... Ah, mas se eu fizer isso, posso representar esse algoritmo com a codificação do meu texto digitado.

Que tal representar meu algoritmo usando alguns "meios analógicos", digamos pela posição de algumas moedas na minha mesa. Embora a posição dessas moedas possa ser modelada por alguns números reais (que em alguns codificações pode ser impossível de representar finitamente), toda essa descrição pode ser novamente considerada uma representação do meu algoritmo e pode ser codificada em uma cadeia de bits novamente!

Espero que esses exemplos deixem claro que, se algum algoritmo não puder ser representado por uma cadeia de bits finita, não teremos meios de descrever esse algoritmo!

Então, por que consideraríamos a existência de algo que não podemos falar? Talvez interessante para a filosofia, mas não para a ciência. Assim, definimos a noção de algoritmo forma que ela possa ser representada por uma cadeia de bits, pois pelo menos sabemos que somos capazes de falar sobre todos os algoritmos.


Embora a resposta acima responda à pergunta, acho que a confusão sobre o exemplo dado se deve principalmente ao fato de uma representação precisar apenas representar exclusivamente algum algoritmo. A maneira de representação não precisa envolver os cálculos reais invocados pelo algoritmo! Isso é muito útil, pois significa que também podemos representar algoritmos incontestáveis !

Lagarto discreto
fonte
rAr
1
ArR
1
Sim! Adorável! Wittgenstein! "Wovon man nicht sprechen kann, darüber muss man schweigen."
Peter - Restabelece Monica
r
@ Rafael Sim, e? Não deveria surpreender que não seja possível escrever um número incontável de algoritmos. E, novamente, você afirma que "expressa" alguns algoritmos que não podem ser anotados. Não entendo o que você quer dizer com "expresso", mas parece ao menos implicar representação. Como minha afirmação começa com a suposição de que um algoritmo não está sendo representado, não vejo como isso contradiz minha afirmação.
Lagarto discreto
2

Outra maneira de ver isso é através da teoria da informação. Todas as codificações de informações / perguntas significativas / úteis podem ser transformadas em 'sequências' binárias.

Grande parte do campo vai para a pergunta "qual é a maneira de fazer o menor número médio de perguntas para comunicar uma informação significativa?" Na prática, é o mesmo que "qual é a abordagem ideal para fazer o menor número de perguntas de sim / não para entender o que foi comunicado ou dito?"

eSurfsnake
fonte