33 votos

¿Cómo es contable el conjunto de todos los programas?

Me cuesta ver cómo el número de programas no es incontable, ya que para cada número real se puede crear un programa que imprima ese número. ¿No establece eso inmediatamente un número incontable de programas?

79 votos

Oh, ¿puedes? $\hspace{0cm}$

38 votos

No se puede. Hay (muchos) números reales no computables.

3 votos

47voto

Bryan Farrell Puntos 31

No conozco su definición de "programa", pero estoy bastante seguro de que cualquier programa será una cadena de caracteres de longitud finita sobre un alfabeto finito. Para cualquier conjunto finito $X$ el conjunto $X^*$ de todas las cadenas de longitud finita sobre $X$ es contable (por el mismo tipo de argumento que utilizarías para demostrar que los racionales son contables).

0 votos

Sí. Estoy de acuerdo con @Tara B. Un programa no será más que una colección de caracteres de cierta longitud arbitraria. Así que simplemente tomamos la combinación de todos ellos y la contamos. Pero esta longitud de arbitraje puede ser cualquier número entero. Así que, en esencia, el número de programas debería ser infinito.

4 votos

@IcyFlame: pero la pregunta era si el número es contable, no finito.

0 votos

"Estoy bastante seguro de que cualquier programa será una cadena de caracteres de longitud finita sobre algún alfabeto finito" es sólo la definición clásica de lo que se considera que puede ser un programa, hay otros modelos de computación sin tales restricciones.

35voto

DanV Puntos 281

Si estás programando en un lenguaje que tiene las siguientes restricciones:

  1. Sólo hay un número finito de caracteres en el lenguaje.
  2. Todos los programas son finitos.

Entonces el conjunto de todos los programas es contable, ya que es un subconjunto de todas las cadenas finitas del lenguaje que a su vez es contable.

Además, ¿qué significa "imprimir un número real"? Si tiene una expansión decimal infinita (por ejemplo un número irracional) entonces imprimirlo nunca se detiene, ¿es este un comportamiento legal para tu programa? Si no, entonces ciertamente no puedes escribir un programa que imprima cada número real.

Si se le permite imprimir una salida de longitud infinita, y su programa es finito, entonces usted tiene que calcular el número de alguna manera, pero sólo hay un número contable de números que usted puede calcular sus valores. Así que de nuevo, no puedes imprimir todos los números reales.

0 votos

Creo que quiere decir algo así como "para cada n, hay un n+1": para cada n que existe, puedo hacer un programa que imprima n. Como hay infinitos n, hay infinitos programas. Por desgracia, CS se basa en las obras reales y los programas físicos no pueden codificar el número de Graham como un número entero.

0 votos

@RyanAmos: Pero es que no es cierto que se pueda hacer un programa que imprima cualquier n sin tener en cuenta los límites físicos del cálculo. ¿Qué hay de un decimal infinitamente continuo? (De todos modos, nosotros conozca hay infinitos programas. La cuestión es si hay incontablemente infinito ).

2 votos

@Ryan: La informática teórica es una parte de las matemáticas; los aspectos físicos de la programación son... menos. Obviamente si estamos interesados en lo que podemos codificar nosotros mismos entonces es obvio que una persona sólo puede teclear en menos de $2^{100}$ pulsaciones de teclas en toda su vida, por lo que incluso si se combinan varias vidas de tecleo sólo se cubre una cantidad ínfima de números posibles. Pero esta no es la cuestión aquí.

19voto

John R. Strohm Puntos 1559

De mi respuesta aquí .

El conjunto de todos los programas es contablemente infinito. Para ver por qué, observe primero que cada programa debe tener una longitud finita. En segundo lugar, observe que el conjunto de todos los programas posibles es infinito, ya que no importa lo que $n \in \mathbb{N}$ que elija, siempre podrá escribir un programa más largo que $n$ . A continuación $S_n$ sea el conjunto de todos los programas de longitud $n$ . Cada $S_n$ es finito. El conjunto de todos los programas de todas las longitudes posibles es una unión contable de conjuntos $S_n$ :

$$ S = \bigcup_{n=0}^\infty S_n $$

Dado que la unión contable de conjuntos contables (o finitos) es a lo sumo contable, concluimos que el conjunto de todos los programas es contable.

1 votos

Hola @Ayman, ¿cómo sabes que "El conjunto de todos los programas de todas las longitudes posibles es un contable unión de conjuntos $S_n$ "? ¿No es eso lo que quieres demostrar en primer lugar? Gracias

11voto

thorb65 Puntos 111

En un lenguaje de programación que funciona traduciendo unidades de compilación enteras (como archivos fuente) cada vez, el conjunto de programas posibles es contable. Un flujo infinitamente largo no se considera un programa válido, porque el compilador nunca termina y, por tanto, nunca hay una forma ejecutable.

En un lenguaje de programación que puede interpretar (o compilar, sobre la marcha) un flujo de código indefinidamente largo (como el de una sesión interactiva) y producir comportamientos útiles antes de llegar al final del flujo, el conjunto de programas es incontable.

Así, por ejemplo, el conjunto de posibles sesiones interactivas Lisp (que son programas de facto) es incontable, mientras que el conjunto de posibles programas C es contable.

Cada programa finitamente largo corresponde a un número entero, por lo que puede haber una correspondencia de uno a uno entre programas y números enteros. Los programas infinitamente largos corresponden a los números reales.

3 votos

No tengo claro que existan realmente flujos de código indefinidamente largos (como los de una sesión interactiva). En realidad, en todos los teclados que se han fabricado sólo se han introducido un número finito de pulsaciones.

2 votos

@Jay: Me sorprendería que "el compilador termina" estuviera en la definición de programa bien formado del estándar C++.

4 votos

@Jay por ese razonamiento, $\pi$ no existe, porque sólo se han calculado e impreso un número finito de dígitos.

7voto

Lockie Puntos 636

Véase esta respuesta o cualquiera de las otras buenas respuestas a esa pregunta. (Ignora las malas respuestas.) No todos los números reales son computables, así que no puedes hacer lo que propones.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X