Computabilidad

Guillermo Morales-Luna
Departamento de Computación
Centro de Investigación y Estudios Avanzados del IPN, Cinvestav-IPN
gmorales@cs.cinvestav.mx

6 de julio de 2014

Resumen

Hacemos un recuento de la importancia que la noción de Computabilidad ha tenido en la Computación Moderna, en las Matemáticas, la Lógica y la Física. Nuestro interés es mostrar a la Computabilidad como una disciplina científica, característica de nuestra época.

1 Introducción

En [4], Jorge Luis Borges narra una encantadora parábola, que en línea está disponible en [3], cuyo protagonista es Paracelso, médico y naturista suizo que vivió en la primera mitad del siglo XVI, cuyo nombre latino original era Philippus Aureolus Theophrastus Bombastus von Hohenheim. Puesto de una manera muy resumida, de la parábola surge la cuestión de si acaso en las cenizas de una rosa puede subyacer la información para reconstruir la rosa (con este resumen extremo sólo pretendo invitar al lector a acercarse a ese fascinante cuento de Borges). En [6], Gregory Chaitin recuerda La rosa de Paracelso y bosqueja un formalismo para plantear la reconstrucción de la rosa. Acaso Paracelso aparece en la parábola borgiana por su búsqueda, en la vida real, de la “esencia de la vida” [5]. La experiencia nos ha hecho evidente que, en la Botánica, una semilla conlleva a la planta que crece a partir de ella, y en la Zoología, un huevo fecundado conlleva asímismo a un miembro de la especie correspondiente, aunque, evidentemente, el desarrollo de ese individuo estará también determinado por su interacción con el medio ambiente, por el entorno social de su especie y por diversos factores, algunos de ellos sumamente azarosos e imponderables.

¿Un edificio está acaso en los planos del arquitecto que lo diseña? ¿La Nación Ideal está ya en los Planes de Desarrollo del candidato a gobernarla?

Al analizar o estudiar un cierto objeto, uno se puede preguntar cuáles son los postulados a suponer para determinar (o acaso “producir”) a ese objeto, o incluso si acaso tiene sentido la pretensión de formular tales postulados.

Presentamos a continuación la noción de sistemas de programación, luego discutimos la controversia entre aleatoriedad y determinismo, y pasamos a reseñar el “pancomputacionalismo”. Al final bosquejamos algunas someras conclusiones.

2 Sistemas de programación

Se puede decir que un objeto es formalmente descriptible si existe una determinada cantidad de información que lo determina de manera única. Esto último significa que, a partir de una palabra de longitud finita sobre un alfabeto finito, un programa inicia su cómputo a partir de ella y finaliza con el objeto. Es convencional tomar como alfabeto el de los bits (síncopa de la frase inglesa binary digits, utilizada universalmente) consistente de solo dos símbolos, representados éstos de maneras diversas, por ejemplo, { sí , no } o {0,1}. La información es pues la colección de palabras de bits y de reglas o precedimientos para transformarlas o manipularlas.

En un sistema formal de programación se tiene inicialmente una colección de instrucciones primitivas y una colección de reglas de composición. Los programas se construyen de manera recurrente: Una instrucción primitiva es en sí misma un programa, y el resultado de aplicar una regla de composición sobre programas construidos previamente es también un programa. Cada regla de composición puede tener asociada una precondición y también una postcondición: Para aplicar la regla es necesario que se satisfaga la precondición, y luego de ser aplicada ha de regir la postcondición.

Ejemplos elementales de este tipo de construcciones son los siguientes:

Juegos de mesa
En un juego de mesa, digamos consistente de un tablero y de fichas o piezas sobre de él, una tirada legal es una instrucción primitiva, y la concatenación de tiradas, así como la alternancia con la que tiran los jugadores, son reglas de composición. Las partidas vienen a ser los programas. Fija una configuración inicial en el tablero, la aplicación de un tal programa, la hará transitar a una configuración final. Algunas configuraciones se definen como de gane para alguno de los jugadores. Naturalmente, el propósito de cada jugador es derivar el juego a una de las configuraciones que le sean de gane. El ajedrez, las damas, el dominó, los naipes, etc., se ajustan a este esquema.
Resolución de laberintos
Un laberinto consiste de muros, pasajes, y cámaras. Un pasaje puede ser de entrada o de salida a una o varias cámaras. Una instrucción primitiva es el recorrido por un pasaje. Las reglas de composición son propiamente las selecciones de pasajes (o tal vez, pensando en un Dédalo, los saltos de muros). Los programas son entonces esquemas para realizar recorridos a partir de algunos puntos iniciales. El propósito de un Teseo es entonces el de localizar un programa que lo lleve de una entrada inicial del laberinto a una salida final, librando algunos obstáculos.
Sistemas de planeación
Estos son sistemas computacionales en los que un agente (digamos un robot) ha de seleccionar una sucesión de tareas admisibles que le permitan, a partir de una configuración inicial de su mundo, acceder a una meta, es decir, a una configuración especial que es el objetivo a ser alcanzado.

Veamos algunos ejemplos de mayor relevancia.

En la ingeniería de procesadores, se diseña en uno un conjunto básico de instrucciones primitivas (identificadas usualmente mediante algunas nombres mnemotécnicos consistentes de unas cuantas letras), y de mecanismos de control que implementan algunas reglas de composición. El esquema de programación resultante es el lenguaje ensamblador del procesador.

Los lenguajes de programación de computadoras se ajustan al esquema de programación que hemos descrito. Los sistemas de Axel Thue (1863–1922) son prácticamente juegos de sustitución de cadenas de caracteres por otras tales cadenas. Las reglas sintácticas que describen las sustituciones son llamadas reglas de producción. Estos sistemas pueden verse como esquemas de programación donde las instrucciones primitivas son las propias reglas de producción y las reglas de composición indican la forma en que se han de aplicar esas reglas. Los programas son entonces esquemas de derivación de algunas palabras a partir de otras. Fijo un conjunto inicial de palabras, el lenguaje derivado de ese conjunto es el resultante de aplicar consecutivamente las reglas de producción a palabras en ese conjunto inicial y a las derivadas previamente. En el estudio de los lenguajes formales, se tiene que las gramáticas formales son propiamente sistemas de Thue en donde las reglas de producción se aplican de manera “unidireccional” y el conjunto inicial sólo consta de un símbolo, llamado obviamente inicial. En las gramáticas formales se introduce la llamada Jerarquía de Chomsky (Noam Chomsky (1928–)), la cual clasifica a las gramáticas de acuerdo con la complejidad de sus reglas de producción. Las gramáticas formales juegan un papel esencial en los compiladores e intérpretes de la computación moderna.

En el campo de la Genética, el célebre código genético, presentado en la década de los 60 por Watson y Crick se ajusta también a este esquema. Las funciones de síntesis de proteínas básicas están codificados por los codones (tercetas de nucleótidos) y las reglas de composición especifican la formación y la expresión de genes. Los programas son pues mecanismos de conversión de secuencias de nucleótidos en secuencias de aminoácidos, que en última instancia determinan la reproducción celular y con esto la de los seres vivos.

En la Lógica Matemática, la formación de teorías puede verse también como un esquema de programación. Las instrucciones primitivas son la selección de axiomas, y las reglas de composición son, precisamente, las reglas de inferencia de la lógica de que se trate. Los programas son pues esquemas de demostraciones. Fija una colección de axiomas (los cuales son fórmulas bien formadas, es decir cadenas de caracteres), los teoremas son las fórmulas finales en las demostraciones. La teoría resultante es la colección de teoremas. En la lógica, un enunciado es una consecuencia de un conjunto de hipótesis siempre que el enunciado posea una demostración ampliando el conjunto de elementos primitivos con el conjunto dado de hipótesis.

Acaso la primera teoría formal matemática fue formulada en los Elementos de Euclides (S. III AC) y corresponde a la, llamada con toda justeza, Geometría Euclidiana. En un juego intelectual maravilloso, Euclides postula una serie de axiomas, presupone reglas de inferencia, y muestra uno a uno teoremas geométricos que corresponden a la geometría práctica, con aplicaciones a las mediciones, a la arquitectura, a la navegación, a la explicación de los movimientos celestes, y a otras muchas aplicaciones más. Entre los enunciados conjeturados, y por lo tanto carentes de demostración ahí, están el de la independencia del axioma de las paralelas y el de la cuadratura del círculo. Sólo hasta el S. XIX se mostró que, en efecto, el axioma de las paralelas es independiente de los demás y que, utilizando sólo regla y compás, es imposible cuadrar el círculo (construir un cuadrado cuya área sea la de un círculo dado). La independencia del axioma de las paralelas se vió construyendo geometrías alternativas donde no se cumpla ese axioma: dados una recta y un punto fuera de ella, bien puede no haber recta alguna paralela a la primera que pase por el punto, o bien puede haber más de una. Tales geometrías, llamadas no-euclidianas, son tan consistentes como la euclidiana, en el sentido de que un modelo euclidiano puede transformarse en uno no-euclidiano, y viceversa. Uno de los fundadores de la geometría no-euclidiana, János Bolyai (1802–1860) dijo alguna vez: he construido un mundo nuevo a partir de la nada, y, en efecto, con esto asumía un rol de Creador.

La Aritmética de Giuseppe Peano (1858–1932) se presenta como una teoría resultante de una lógica según fue descrita arriba. Su modelo estándar es el de los números naturales y busca formalizar todas las propiedades de los números.

Como un penúltimo ejemplo de esquema de programación quisiera mencionar el de las funciones recursivas. Las instrucciones primitivas están dadas por la función cero (a cada elemento se le asocia el número cero), la función sucesor (a cada elemento súmesele 1), y las funciones proyecciones (a cada lista de elementos, asóciesele su i-ésimo elemento). Las reglas de composición son la propia composición de funciones, un esquema de recursión y otro de minimización (dada una función f de dos argumentos, y dado un argumento x, se busca el primer argumento segundo y tal que f(x,y) = 0). La clase de funciones recursivas es la más pequeña que contiene a las primitivas y es cerrada bajo las reglas de composición.

Finalmente, están las máquinas de Turing, las cuales están definidas mediante un esquema de programación [8]. Puede verse que las máquinas de Turing son equivalentes a las funciones recursivas en el sentido de que, por un lado, toda función recursiva es calculable mediante una máquina de Turing, y, por otro lado, toda máquina de Turing es simulable por una función recursiva. Hay otros paradigmas de computación, pero los más poderosos se han demostrado equivalentes al de las máquinas de Turing, por lo que desde la década de los 50 se asumió la llamada Tesis de Alonzo Church (1903–1995): lo efectivamente computable es lo calculable por máquinas de Turing. Por esto, se considera a Alan M. Turing (1912–1954) como el inventor de la computación moderna.

Fijo un esquema de programación, los programas son entonces entes puramente sintácticos, son el resultado de tomar algunas instrucciones primitivas y componerlas según la elección que se haga de reglas de composición. Los programas son entonces cadenas bien formadas de símbolos, sujetas, por lo general, a procesos de generación y de análisis sintáctico descriptibles mediante procesos (o gramáticas) formales. Esto tiene dos implicaciones importantes:

Ahora bien, a todo sistema formal de programación se le puede dotar de una semántica procedimental la cual consiste en “realizar” a las instrucciones primitivas en el sistema como funciones básicas en un modelo del sistema y a las reglas de composición en procedimientos de control que rijan la ejecución de programas. Así, un arreglo de valores en un modelo, que se da como entrada a un programa, ha de evolucionar en el espacio de configuraciones posibles en una trayectoria cuyo extremo final será el arreglo de valores en el modelo producido como salida del programa, si acaso el programa termina. En caso contrario, se dice que el programa diverge para esa entrada. De esta manera, en un modelo del sistema de programación, cada programa determina una función que a cada arreglo de entrada le asocia un arreglo de salida en el caso de que no diverja el programa en esa entrada. Tal función se dice ser calculada por el programa. Una función entre arreglos de valores del modelo, se dice ser programable, o computable, si hay un programa que la calcule.

Volviendo a la definición dada al inicio de esta sección, se tiene que un objeto es descriptible en un sistema de programación cuando y sólo cuando el objeto sea computable. Así pues, dado que el conjunto de programas es numerable, los objetos descriptibles forman un conjunto también numerable, por lo que si la colección de objetos no fuese numerable, necesariamente han de existir muchos objetos que no son descriptibles.

Por ejemplo, un número real es computable si hay un programa que dado n como entrada produce el n-ésimo dígito a la derecha del punto decimal de ese número. Así, los enteros y los racionales son computables y π también lo es. Por lo anterior, la colección de números computables es numerable. Sin embargo, la colección de números reales no lo es (su cardinalidad es la “del contínuo”), por lo que existen muchos número reales que no son computables.

Al definir un sistema de programación, los problemas siguientes aparecen naturalmente:

Computabilidad (decisión)
Dada una función, decidir si ésta es computable.
Computabilidad (búsqueda)
Dada una función, encontrar (o diseñar) un programa que la calcule, si acaso fuese computable.
Optimización
Dada una función computable, encontrar el mejor programa que la calcule. Aquí la optimización se refiere a programas y ésta puede ser tanto en tiempo (ejecutar el menor número posible de instrucciones primitivas en el cálculo de la función) como en espacio (ocupar la menor cantidad de caracteres al escribir el programa, o bien ocupar el menor número posible de localidades en su ejecución).
Equivalencia
Dados dos programas, decidir si calculan una misma función. Observamos aquí que la dificultad del problema estriba en que si el modelo es infinito, ninguna recolección finita de muestras de que los valores calculados por los programas coinciden en mismas entradas, habrán de agotar todas las posibilidades.

Dependiendo de la complejidad del sistema de programación, estos problemas pueden ser resolubles efectivamente, aún cuando lo sean con diferentes grados de complejidad, o pueden ser, incluso, irresolubles. Los sistemas en los que el problema de decisión de computabilidad sea resoluble se dicen ser decidibles.

Asumiendo una actitud platónica, se podría pensar que una vez que se fija el sistema de programación, la colección de funciones computables queda completamente determinada, cobra una existencia ideal, por lo que el problema de decisión se reduce a la mera verificacin de que una función pertenece o no a esa colección. El mecanismo de verificación daría propia y efectivamente una solución al problema de decisión. La decidibilidad del sistema se reduce pues a precisar la noción de mecanismo de verificación.

Asumiendo una actitud constructivista, se podría pensar que la colección de funciones computables se va “descubriendo” o “construyendo” gradualmente, por lo que el problema de decisión se reduciría a ir construyendo “parcelas” dirigidas de esa colección para decidir si la función de prueba está o no en ella.

Por otro lado, si cada programa tiene asociado un código numérico, y la correspondencia entre programas y códigos numéricos respectivos es efectivamente descriptible entonces habrá de existir una máquina universal dentro del sistema. Una tal máquina, digamos U es tal que U(p,x) = p(x), cualquiera que sea el programa p en el sistema, donde pes el código numérico de p, y x es cualquier entrada. En otras palabras, U tiene la capacidad de simular cualquier programa. Las máquinas de Turing tienen esta propiedad y la tienen también las lógicas de primer orden recursivamente axiomatizables.

En cambio, codificando adecuadamente la llamada paradoja del mentiroso (“¿te miento cuando te digo que te miento?”), resulta que el Problema de la Parada en máquinas de Turing es irresoluble, es decir, no puede existir una máquina PP tal que PP(p,x) = 1 cuando y sólo cuando p(x) converja y PP(p,x) = 0 cuando y sólo cuando p(x) diverja. Turing mismo demostró esta limitante a su sistema de programación. Considerando a la Aritmética de Peano, Kurt Gödel (1906–1978), para demostrar la incompletitud de la aritmética, en el sentido de que hay enunciados universalmente válidos que no son demostrables y además no hay manera de demostrar la consistencia de la aritmética con métodos codificados dentro de ella, lo que implicó la irrealizabilidad del programa de David Hilbert (1862–1943).

3 Aleatoriedad y determinismo

Supongamos dada una lista de tres enteros tal que a1 = 2, a2 = 4, y a3 = 6, y que entonces se formula la pregunta ¿cuál ha de ser el siguiente término?

Se podría decir que cualquiera. En efecto, si t fuese un entero cualquiera, al tomar


 ( t 4) 3 2 (11t 38) p(X) = 6 - 3 X
        +(8 - t)X + -6- - 3- X + (8 - t) ( ) = 8--t - X3 + 6X2 -
        76--11tX + 6 6 8 - t
se tiene un polinomio de grado 3 que daría la regla cúbica a1 = p(1) = 2, a2 = p(2) = 4, a3 = p(3) = 6 y a4 = p(4) = t (se puede ver fácilmente que si t = 8 entonces se simplificaría a p(X) = p0(X) = 2X). De hecho, si r(X) fuese un polinomio de grado n - 3 entonces el polinomio
p (X
          ) = p(X )+ r(X)(x3 - 6x2 + 11x - 6) 1
sería un polinomio de grado n que daría los cuatro primeros valores de la sucesión dada. Así que cualquier valor al cuarto término se ajustaría a una regla matemática bien determinada. Sin embargo, intuitivamente se tendería a pensar que la regla p(X) = 2X debería prevalecer para describir a la sucesión dada, y esto por ninguna otra razón que por su mera simplicidad.

Gottfried Wilhelm von Leibniz (1646–1716), considerado en la actualidad el primer científico de computación, planteaba que la percepción de los objetos ha de involucrar sus representaciones más simples: cualquier cosa debe ser hecha de la manera más simple posible, y por ende no más simple que ésa.

Esto plantea el problema de optimización mencionado en la sección anterior, el cual es irresoluble en el ámbito de las máquinas de Turing, es decir, de acuerdo con la Tesis de Church, en el ámbito de la computación efectiva.

Es común que al resolver un problema, se busque la solución más simple, y cuando se logra se tiene la idea de que esa solución es también elegante. La búsqueda de soluciones elegantes puede ser tal vez un primer elemento distintivo de la inteligencia natural del razonamiento puramente mecánico o algor´ tmico. Las soluciones elegantes surgen de esa peculiaridad que llamamos talento. Si bien éste se refina con la experiencia de quien lo posee, también es resultado de muchos factores (educativos, sociales, genéticos, etc.). Sin embargo también es cierto que muchas estrategias heurísticas en la resolución de problemas pueden formalizarse y dotar a un resolvedor artificial de esas “piezas de consejo” para mecanizar procesos de resolución que puedan imitar los utilizados por la inteligencia natural.

En el contexto entre computabilidad y no-computabilidad se ubica la noción de aleatoriedad. Para ilustrar la diferencia entre un proceso aleatorio y uno computable, acudamos a un juego mental. Un verificador le pide a un seleccionador que elija un número real con distribución uniforme en el intervalo real [0,1], y habiéndolo elegido, el seleccionador se lo “ha de dar” al verificador para que compruebe que el número elegido está en [0,1]. Sea ξ [0,1] el número elegido. Ya que la distribución del número elegido es uniforme, para cada intervalo [a,b] [0,1], la probabilidad de que ξ esté en ese intervalo es b - a. Luego si el intervalo fuese una mónada, digamos a = b = x [0,1] entonces la probabilidad de que el número elegido sea x es b - a = 0. Sin embargo, en el juego mental propuesto, el seleccionador siempre ha de elegir un número x. Se tiene pues que un evento de probabilidad cero no necesariamente es uno imposible. Pero esto no es lo más importante en la presente discusión. Lo más importante es la manera en la que el seleccionador le da el número elegido al verificador. Si entendemos por esto que le da una descripción completa, acaso en lenguaje natural, o en un lenguaje formal, se tendrá que tal descripción es propiamente un programa para calcular el número elegido. En otras palabras, si el seleccionador pudiera comunicar el número elegido, eso sería una prueba de que el número elegido es computable. Por tanto, el probador sólo podría elegir a su número en una colección numerable de puntos en [0,1]. Ya que todo conjunto numerable es uno de medida cero, se tendría que el juego mental descrito estaría descartando un conjunto de medida 1.

Se ve aquí que en tanto se precise más un proceso aleatorio, éste será mayormente determinista, con lo que dejará de ser aleatorio.

El famoso debate entre Einstein y Bohr de los años 30 [11] acerca de las variables ocultas y del enfoque probabilista en la Mecánica Cuántica se encuadra ciertamente en esta dicotomía entre aleatoriedad y determinismo.

Esto pone una limitación esencial a la generación mecánica de variables aleatorias. Los generadores mecánicos de variables aleatorias han de ser pues seudoaleatorios, los cuales serán menos efectivos en tanto se les precise más.

Actualmente, en protocolos diversos de Seguridad Informática es crucial contar con buenos generadores de variables aleatorias. La limitante mencionada implica también limitantes a la robustez de esos protocolos.

4 Pancomputacionalismo

Desde el punto de vista físico la información es esencial y en la evolución de cualquier sistema físico hay un cierto procesamiento de información. Por esto es que el mismo Universo puede verse como una computadora gigantesca sobre la cual se ha intentado estimar su capacidad de procesamiento [910]. Konrad Zuse (1910-1995) [13], inventor de una de las primeras computadoras en el mundo, planteó desde 1969 la idea del Universo como un sistema de procesamiento de la información. La información puede darse mediante palabras formadas por bits, y el procesamiento mediante tasas de operaciones por segundo (el Teorema de Margolus y Levitin establece que éstas no pueden exceder 1034 operaciones por segundo por cada joule de energía). En [10] aparece un estimativo de la cantidad de información actualmente presente en el Universo y de la capacidad de procesamiento de este último.

Este enfoque ha dado lugar a la llamada Ontología Digital que presupone que el Universo es discreto, tanto en tiempo como en espacio, y que su evolución es algorítmica. La Tesis de Zuse reza:

El Universo está siendo computado de manera determinista por un tipo de inmensa computadora discreta.

John Archibald Wheeler (1911-2008) [7] acuñó el término hoyo negro para denotar a esas singularidades del Universo pero también el célebre juego de palabras en inglés Its are from bits (donde la palabra its es un plural forzado del pronombre neutro inglés it, con lo que la frase sería algo así como “los los vienen de los bits”). Weeler fue un físico relativista que participó en el Proyecto Manhattan y fue el creador de la Geometrodinámica que pretendía reducir fenómenos físicos a las propiedades de curvatura del espacio-tiempo. Planteaba que cualquier partícula o cualquier fenómeno físico debe su existencia a una mera elección de bits, es decir a responder a cuestionamientos que sólo admiten respuestas sí o no. Aunque esto parece irreal y fantástico, a niveles de la longitud de Planck (10-35 mts) o de tiempos de decaimiento del bosón de Higgs (10-22 seg), el enunciado parece también ser certero. En estos niveles, libres de la manifestación de la materia, la información en bits es inmaterial, aunque esa misma información ha de producir la misma materia (!).

Adentrándose en el campo de la Filosofía, la Ontología Digital se ha visto como una forma de neopitagorismo. Aquí se descarta la existencia de entes infinitos, infinitesimales, continuidades o variables aleatorias. La Ontología Digital posee demostradas capacidades de descripción y de predicción de la realidad física. Mas frente a los modelos analíticos de esa realidad, podría suceder que esto sea tan solo una manifestación de una aproximación fiel a esa realidad. La “aproximación” es una “realidad simulada”, pero cuando la aproximación es suficientemente buena, la realidad simulada y la propia realidad pueden ser indistinguibles.

En 1956, Asimov publicó una pequeña historia, The Last Question [1] (de la cual hay varias versiones en castellano, como La última pregunta [2]), donde una computadora va evolucionando, digamos que a la par del Universo, y llega a convertirse en el Universo mismo. En su final ... es el Universo que renace. Una situación que desde finales del S. XX se ha planteado en la Física como algo muy plausible [12].

5 Conclusiones

En la actualidad vivimos en la Era Digital y estamos tendiendo a reducir todo Conocimiento a un enfoque computacional, ya no solo a la Física y a la Biología, sino a las mismas relaciones sociales, debido al incremento de las posibilidades modernas de comunicación. Esto recuerda a las pinturas sacras del Renacimiento donde aparecen personajes y lugares bíblicos con vestimentas y construcciones contemporáneas a los artistas. Vemos todo de manera digital y computacional porque nos hemos acostumbrado a ello.

Sin embargo, también es cierto que, además de sus inmensas aportaciones tecnoloógicas, la Computabilidad, ha demostrado alcances y límites de las Matemáticas y de la Lógica.

Referencias

[1]   Isaac Asimov. The Complete Stories, Volume 1. Doubleday Foundation, 1990. “The Last Question” puede leerse en línea en http://www.multivax.com/last_question.html.

[2]   Isaac Asimov. Cuentos completos I. Zeta, 2010. Trad. Carlos Gardini. “La última pregunta” puede leerse en línea en http://www.fis.puc.cl/~jalfaro/fiz1111/charla/laultimapregunta.pdf.

[3]   Jorge Luis Borges. La rosa de Paracelso. http://www.materialdelectura.unam.mx/index.php?option=com_content&task=view&id=65&Itemid=30&limit=1&limitstart=6, 1983.

[4]   Jorge Luis Borges. Obras Completas, Tomo III. Emecé, 1996.

[5]   Joseph F. Borzelleca. Paracelsus: Herald of modern toxicology. Toxicological Sciences, 53(1):2–4, 2000.

[6]   G. Chaitin. Meta Math!: The Quest for Omega. Vintage. Knopf Doubleday Publishing Group, 2008.

[7]   K. Ford and J.A. Wheeler. Geons, Black Holes, and Quantum Foam: A Life in Physics. W. W. Norton, 2010.

[8]   J.E. Hopcroft and J.D. Ullman. Introducción a la teoría de autómatas, lenguajes y computación. Compañía Editorial Continental, 1993.

[9]   Rolf Landauer. Dissipation and noise immunity in computation and communication. Nature, 335:779–784, 1988.

[10]   Seth Lloyd. Computational capacity of the universe. Phys. Rev. Lett., 88:237901, May 2002.

[11]   Hrvoje Nikolić. EPR before EPR: a 1930 Einstein–Bohr thought experiment revisited. European Journal of Physics, 33(5):1089, 2012.

[12]   F.J. Tipler. The physics of immortality: modern cosmology, God, and the resurrection of the dead. Doubleday Anchor Books. Anchor Books, 1994.

[13]   Konrad Zuse. The Computer – My Life. Springer-Verlag New York, Inc., New York, NY, USA, 1993.