¿Por qué podemos suponer que un algoritmo se puede representar como una cadena de bits?

17

Estoy empezando a leer un libro sobre Complejidad Computacional y Máquinas de Turing. Aquí está la cita:

Un algoritmo (es decir, una máquina) puede representarse como una cadena de bits una vez que decidimos sobre una codificación canónica.

Esta afirmación se proporciona como un hecho simple, pero no puedo entenderlo.

Por ejemplo, si tengo un algoritmo que toma como entrada y calcula o:( x + 1 ) 2X(X+1)2

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

¿Cómo se puede representar esto como una cadena usando el alfabeto ?{0 0,1}

Kenenbek Arzymatov
fuente
38
No conoce el conocimiento mínimo absoluto requerido para comprender cómo se codifica el texto. ¡Hoy es un gran día para aprender! joelonsoftware.com/2003/10/08/…
Eric Lippert
1
Creo que OP podría estar llegando a esto desde un punto de vista diferente basado en una ambigüedad en el texto citado. Supongo que OP significa 'cómo se puede construir toda la máquina y el algoritmo como una cadena de bits', no la entrada a la máquina de Turing en sí. El texto citado implica que todo el algoritmo puede ejecutarse automáticamente, pero un bit de lenguaje c codificado en utf no dice nada acerca de cómo una máquina realmente actuaría en esa cadena.
Sentinel
3
... Creo que todos aquí están malinterpretando la fuente y llevando la broma demasiado lejos, a expensas de la inexperiencia de Roma. La mayoría de estos comentarios y respuestas se refieren a la codificación del texto para una transmisión arbitraria, mientras que la cita se refiere a la codificación del algoritmo para el consumo de una máquina de Turing. La respuesta (actualmente) aceptada al menos la toca en la segunda oración.
Izkata
2
@Izkata No estoy seguro si sabe que, debido a la universalidad, estas dos declaraciones son equivalentes.
Konrad Rudolph el
15
Lo curioso es que para poder leer tu algoritmo codificado, necesariamente tenía que convertirse en una secuencia de bits tan pronto como lo escribiste. Nunca se representó de manera diferente, desde su teclado hasta mi monitor. Tenía una representación no binaria solo en nuestras mentes; y en el nivel fisiológico, cuando miras las sinapsis, incluso eso es discutible.
Peter - Restablece a Mónica el

Respuestas:

45

La respuesta más ingenua y simple a su pregunta es que el código proporcionado (y el código de máquina compilado) se representan de hecho como cadenas sintácticas de {0,1} *. Además, dado que está hablando de máquinas turing, los programas que ejecutan son una lista lineal de operaciones / instrucciones, no hay razón para que no puedan representarse como bits / bytes.

Daniel F
fuente
¿Cómo representa exactamente la máquina de Turing como una lista de instrucciones? La definición habitual es algo como esto .
svick
@svick Como se menciona en mi respuesta a continuación, utiliza una TM universal, que toma la descripción de una TM como entrada (codificada de manera adecuada)
dseuss
@svick ¿Un lenguaje de programación con instrucciones simples para mover un puntero a través de una cinta? Creo que un ejemplo de esto podría ser el lenguaje de programación esotérico Brainfuck . Código de ejemplo
LukStorms el
@LukStorms Ya no creo que puedas llamarlo "máquina de Turing".
svick
52

Ya tiene una representación de esa función como texto. Convierta cada carácter en un valor de un byte utilizando la codificación ASCII. Entonces el resultado es una secuencia de bytes, es decir, una secuencia de bits, es decir, una cadena sobre el alfabeto . Ese es un ejemplo de codificación.{0 0,1}

DW
fuente
Exactamente. Y como dije anteriormente, sucedió mientras Roma lo escribió. Incluso los glifos que veo en mi monitor son píxeles en blanco y negro, es decir, información binaria, enviada a través de una conexión de datos binarios desde una memoria binaria conectada a una red binaria a través de controladores binarios. ¿Es posible representar cada algoritmo como una cadena de bits? Más que eso: es inevitable a menos que se limite a los medios analógicos y la comunicación cara a cara.
Peter - Restablece a Mónica el
@ PeterA.Schneider El uso de medios analógicos o cara a cara no implica necesariamente que no haya codificación discreta incrustada. Usar un lenguaje natural no está lejos de usar una codificación discreta, ¿no es así?
Jean-Baptiste Yunès
32

No me puedo resistir ...

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

⢱⠀
⢸⠁
⠊

(Los puntos anteriores representan unos, los ceros en blanco).

a la izquierda
fuente
55
Divertido (+1) pero sirve para subrayar la naturaleza esencialmente arbitraria de la codificación.
John Coleman el
44
Diviértete escribiendo el compilador para esto :)
Barmar
1
@Barmar Suena como un desafío para codegolf.stackexchange.com
IMSoP
1
@RomaKarageorgievich esta es la función que hace la representación a los caracteres Braille. Aquí hay un contenedor simple que permite llamarlo desde la línea de comandos.
Leftaroundabout
13

Su computadora almacena todo como secuencias de 0y 1, incluida la pregunta que escribió para preguntar cómo lo hace. Por ejemplo, cada letra y símbolo está representado por 8 bits (estoy hablando de cómo solían ser las cosas, hoy en día es de 16 bits y más complicado). Puedes verlos aquí . Bueno, no muestran los bits, sino los códigos hexadecimales y octales. ¿Sabes cómo convertir un número a su representación digital?

Andrej Bauer
fuente
66
Son 16 bytes solo en Windows y en algunas bibliotecas como Qt o ICU, que usan UTF-16. Y ni siquiera todas las letras toman una sola unidad de código en general, incluso en UTF-32, por lo que pueden ser más largas. Así que creo que es mejor apegarse a ASCII en esta discusión, traer Unicode aquí conducirá a una gran complicación.
Ruslan
8

La hipótesis fundamental detrás de este concepto es la tesis de Church-Turing . Puede ser difícil ver que cualquier algoritmo pueda representarse como una cadena de bits, porque el término "algoritmo" puede considerarse en términos muy informales. En la tesis de Church-Turing, usan un concepto muy rigurosamente definido de lo que es un algoritmo (e incluso entonces ha habido algunas preguntas sobre las palabras). Sin embargo, su terminología ha tenido tanta influencia que a veces se argumenta que estas definiciones de palabras como "algoritmo" son tan efectivas que simplemente las aceptamos como la definición.

Church-Turing afirma que cada algoritmo puede implementarse como un cálculo en una máquina de Turing. Dado que la descripción de una máquina de Turing es un conjunto finito de valores, es trivial ver cómo mapear esta descripción en una secuencia de números y luego en una secuencia de 0 y 1.

Como las otras respuestas han mencionado, es trivial representar su algoritmo de ejemplo usando codificación ASCII u otras codificaciones.

Creo que la razón por la cual su libro da esta afirmación como un hecho proviene del hecho de que muchos simplemente usan la tesis de Church-Turing como base para su definición de un algoritmo. Si utiliza dicha definición, es un hecho tan obvio como "5 es un número" porque básicamente lo definió como tal.

Cort Ammon - Restablece a Monica
fuente
9
La tesis de Church-Turing no es un teorema y no implica ninguna definición para el concepto de algoritmo, que es informal. Tampoco veo la necesidad de invocar la tesis de Church-Turing para esto. La razón "profunda" por la que algunos objetos se pueden representar como cadenas finitas y otros no es que algunos conjuntos son contables y otros no.
Quicksort el
Estoy viendo que "un algoritmo puede codificarse como una cadena si especificamos una inyección entre los componentes de la especificación de la máquina y el conjunto de cadenas en un idioma". OP hace esto en su ejemplo, tomando la máquina representada por " $ (x + 1) ^ 2 $ " y volviéndola a representar como una cadena en el lenguaje de funciones bien formadas de C (o BCPL, C ++, et al.) .
Eric Towers el
1
@EricTowers Que requiere la tesis de Church-Turing. De lo contrario, no se puede estar seguro de que existe una especificación de máquina de un algoritmo para todos los algoritmos.
Cort Ammon - Restablece a Mónica el
1
Afirmo que un "algoritmo [que] requiere una cantidad infinitamente infinita de símbolos para expresarse" no puede expresarse. Tal expresión debe usar innumerables símbolos, de lo contrario, puede expresarse en un sublenguaje más pequeño. Además, cualquier expresión (no tonta) sobre un alfabeto infinito tiene una cantidad infinita de entropía en casi todos sus símbolos, por lo que desafía la expresión (es decir, en realidad no puede comunicarse con un destinatario). Todas las lógicas finitarias se niegan a operar en tales cadenas infinitas y no conozco una lógica infinita que permita trabajar en innumerables cadenas.
Eric Towers el
1
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
DW
4

Esta declaración se basa en la existencia de TM universales . Estas son básicamente TM programables que pueden simular cualquier otra TM con a lo sumo poli sobrecarga. Por lo tanto, su programa es simplemente parte de la entrada codificada como ceros y unos.

dseuss
fuente
1
@Discretelizard, no te sigo. Cualquier algoritmo se puede expresar como una entrada a una TM universal. Los idiomas pueden ser computables o no computables; No estoy familiarizado con ninguna noción estándar de computabilidad para algoritmos, así que no estoy seguro de a qué te refieres. ¿Qué significaría tener un algoritmo incomparable? ¿Quizás estás pensando en algoritmos que no necesariamente terminan? Pero una TM universal aún puede ejecutar dichos algoritmos.
DW
@Discretelizard Yo tampoco te sigo. Ser ejecutable en una máquina Turing es esencialmente la definición de un algoritmo. Supongo que podría hablar de un "algoritmo" para, por ejemplo, una máquina de Turing con un oráculo para el problema de detención pero, normalmente, "algoritmo" significa "lo que puede hacer en una máquina de Turing".
David Richerby
@DavidRicherby Cierto, supongo que la definición real del algoritmo es más estricta. Pero esta pregunta se refiere a por qué imponemos una restricción mucho más indulgente y decir que hay una restricción aún más fuerte no es muy instructivo, en mi opinión.
Lagarto discreto
4

Bueno, hablemos de algoritmos que no se pueden representar como una cadena de bits finita para ningún tipo de codificación.

Déjame escribir un algoritmo para ti ... Ah, pero si lo hago, puedo representar ese algoritmo con la codificación de mi texto escrito.

¿Qué tal representar mi algoritmo usando algunos 'medios analógicos', digamos por la posición de algunas monedas en mi escritorio? Aunque la posición de esas monedas puede ser modelada por algunos números reales (lo que en algunas codificaciones podría ser imposible de representar de manera finita), ¡esta descripción completa puede considerarse nuevamente una representación de mi algoritmo y puede codificarse nuevamente en una cadena de bits!

¡Espero que estos ejemplos aclaren que si algún algoritmo no puede ser representado por una cadena de bits finita, no tenemos forma de describir este algoritmo en absoluto!

Entonces, ¿por qué consideraríamos la existencia de algo de lo que no podemos hablar? Quizás interesante para la filosofía, pero no para la ciencia. Por lo tanto, definimos la noción de algoritmo de modo que pueda representarse mediante una cadena de bits, ya que al menos sabemos que podemos hablar sobre todos los algoritmos.


Aunque la respuesta anterior a la pregunta formulada, creo que la confusión sobre el ejemplo dado se debe principalmente al hecho de que una representación solo necesita representar de manera única algún algoritmo. ¡La forma de representación no necesita involucrar los cálculos reales invocados por el algoritmo! ¡Esto es muy útil, ya que significa que también podemos representar algoritmos no calificables !

Lagarto discreto
fuente
rUNr
1
UNrR
1
¡Si! ¡Encantador! Wittgenstein! "Wovon man nicht sprechen kann, darüber muss man schweigen".
Peter - Restablece a Mónica el
r
@Raphael Sí, y? No debería sorprendernos que no sea posible escribir una cantidad incontable de algoritmos. Y nuevamente, usted afirma que "expresa" algunos algoritmos que no se pueden escribir. No entiendo lo que quiere decir con "expreso", pero al menos parece implicar representación. Como mi reclamo comienza con el supuesto de que no se está representando un algoritmo , no veo cómo esto contradice mi reclamo.
Lagarto discreto
2

Otra forma de ver esto es a través de la teoría de la información. Todas las codificaciones de información / preguntas significativas / útiles se pueden convertir en 'secuencias' binarias.

Gran parte del campo va a la pregunta, "¿cuál es la forma de hacer la menor cantidad promedio de preguntas para comunicar una información significativa?" En la práctica, esto es lo mismo que "¿cuál es el enfoque óptimo para hacer la menor cantidad de preguntas de sí / no para comprender lo que se comunicó o dijo?"

eSurfsnake
fuente