Una verdad que no se puede demostrar

La pieza central de la serie: partiendo de un programa autorreferencial concreto en Python, demostramos una versión semántica y otra sintáctica del Primer Teorema de Incompletitud de Gödel. Después enunciamos el resultado clásico de Gödel–Rosser, exploramos la relación con el segundo problema de Hilbert y discutimos las implicaciones filosóficas para el debate mente–máquina.

18 min de lectura

Si una «religión» se define como un sistema de ideas que contiene afirmaciones indemostrables, entonces Gödel nos enseñó que las matemáticas no sólo son una religión, sino que son la única religión que puede demostrar que lo es.

John D. Barrow, Pi in the Sky (2011)1

Desde Leibniz y Boole hasta Hilbert, distintos matemáticos imaginaron que sería posible determinar la veracidad de fórmulas matemáticas de forma automática. Nosotros ahora nos preguntamos lo mismo: hemos trabajado con sistemas lógicos sencillos que son decidibles, es decir, para los que un programa puede determinar si una fórmula es verdadera o falsa. En el caso de sistemas lógicos de más complejidad, como la aritmética de Peano, esto no es posible. Esto se debe a que la existencia de problemas computacionales indecidibles conduce directamente a la existencia de afirmaciones matemáticas no decidibles.

5.1 #Una primera aproximación

Antes de proceder a la demostración de una primera versión del Primer Teorema de Incompletitud, discutiremos de forma detallada el Programa 5.1. En la Línea 3 importamos la función es_teorema_peano, cuya existencia probamos en la Proposición 4.29. Recuerda que, como los axiomas de Peano\textbf{Peano} son recursivamente enumerables (es decir, Peano\textbf{Peano} es recursivamente axiomatizable), podemos escribir el programa es_teorema_peano(fórmula) que devuelve sí si fórmula es un teorema en Peano\textbf{Peano}, y que no para en caso contrario (véase la Proposición 4.29).

Programa5.1—godel_peano.py
import utilidades
 
from es_teorema_peano import es_teorema_peano  # NO es un oráculo
from parada_a_peano import parada_a_peano      # NO es un oráculo
 
def godel_peano(entrada):
programa_godel = utilidades.leer('godel_peano.py')
para_en_peano = parada_a_peano(programa_godel)
no_para_en_peano = 'NO (' + para_en_peano + ')'
 
if es_teorema_peano(no_para_en_peano) == 'sí':
return 'para'
else:
utilidades.ciclar()

La Línea 4 importa la función parada_a_peano, cuya existencia ya discutimos tras la Proposición 4.24. Esta función traduce, dado un programa PP, la afirmación «PP para con entrada vacía» en una fórmula de Peano\textbf{Peano}.

En la Línea 7 guardamos el propio programa godel_peano.py en la variable programa_godel. En la Línea 8 usamos la función parada_a_peano recién comentada, y en la Línea 9 negamos la fórmula para_en_peano. De este modo:

no_para_en_peano significa que «godel_peano.py no para con entrada vacía»

(⋆1)(\star 1)

Ahora es cuando las cosas se ponen interesantes. Si no_para_en_peano es un teorema, la función es_teorema_peano devolverá sí, y de este modo el programa verificará la condición de la Línea 11 y devolverá para, haciendo que el programa pare. Si no_para_en_peano no es un teorema, se entrará en un bucle infinito (es_teorema_peano no parará, y por lo tanto tampoco godel_peano.py). Es claro que la Línea 14 nunca se ejecutará, pero la incluimos para enfatizar este hecho.

Ahora nos preguntamos: ¿cuál es el comportamiento de godel_peano.py con entrada vacía?

Proposición5.1

El Programa 5.1 no para con entrada vacía.

Demostración

Asumimos que godel_peano.py para con entrada vacía, y entraremos en contradicción. La única forma de que pare es en la Línea 12, algo que ocurre solamente si:

es_teorema_peano(no_para_en_peano) == 'sí'

(⋆2)(\star 2)

(⋆2)(\star 2) es equivalente a decir que no_para_en_peano es un teorema. Por la solidez de Peano\textbf{Peano}, no_para_en_peano es verdadero.

Pero el hecho de que no_para_en_peano sea verdadero, junto con (⋆1)(\star 1), nos dice que godel_peano.py no para con entrada vacía, encontrando la contradicción esperada.

∎

Ahora estamos en condiciones de probar el resultado principal de este trabajo.

Teorema5.2—Incompletitud de la aritmética de Peano

La aritmética de Peano es incompleta: existen fórmulas verdaderas de Peano\textbf{Peano} que no son teoremas. Concretamente, la fórmula guardada en la variable no_para_en_peano en la Línea 9 del Programa 5.1 es un ejemplo de una fórmula verdadera pero no demostrable (no es un teorema) en Peano\textbf{Peano}.

Demostración

Debemos mostrar que no_para_en_peano es verdadero y no es un teorema.

Para probar que es verdadero, por la Proposición 5.1, sabemos que godel_peano.py no para con entrada vacía. Recordando (⋆1)(\star 1), inmediatamente obtenemos que no_para_en_peano es verdadero.

Para probar que no es un teorema, de nuevo usamos el hecho de que godel_peano.py no para con entrada vacía. Esto nos indica que, en la Línea 11, la llamada a la función

es_teorema_peano(no_para_en_peano)

no puede devolver sí. Pero esto inmediatamente implica que no_para_en_peano no es demostrable, lo que completa la prueba.

∎

Acabamos de demostrar que Peano\textbf{Peano} es incompleto, como ya anticipamos en la Tabla 4.1. Las consecuencias de este hecho las exploramos en detalle en la Sección 5.4. Sin embargo, paremos un momento a analizar qué es lo que acabamos de probar.

5.2 #Versión semántica

Para encontrar una fórmula verdadera y no demostrable, hemos necesitado un sistema lógico que sea, en primer lugar, recursivamente axiomatizable. Si no, no hubiésemos podido crear un programa capaz de saber cuándo una fórmula del sistema es un teorema. Por otra parte, hemos asumido que el sistema es sólido, lo cual es algo esperable. Además, necesitamos traducir efectivamente las afirmaciones sobre programas y formalizar la verificación de computaciones finitas (véase la Proposición 4.24). Reunimos estas condiciones en la siguiente definición de sistema «de tipo Turing».

Definición5.3—Sistema de tipo Turing

Sea S\mathcal{S} un sistema formal con sintaxis efectiva y lógica clásica. Diremos que S\mathcal{S} es de tipo Turing2 si admite una codificación efectiva de programas y computaciones3 con las siguientes propiedades:

  • A partir de un programa PP podemos construir computablemente una oración HPH_P que expresa «PP para con entrada vacía» y una oración APA_P que expresa «PP acepta con entrada vacía».
  • El sistema puede verificar las computaciones finitas: si PP termina con entrada vacía, S⊢HP\mathcal{S}\vdash H_P; si acepta, S⊢AP\mathcal{S}\vdash A_P; si rechaza, S⊢¬AP\mathcal{S}\vdash\neg A_P.

Para un sistema lógico, exigimos además que HPH_P y APA_P tengan esos significados en su interpretación. Esta definición no exige que el sistema resuelva las computaciones que no terminan.

No basta con que esas afirmaciones puedan escribirse en el lenguaje: necesitamos una traducción computable y que las ejecuciones finitas tengan las consecuencias demostrables indicadas. Una teoría clásica que extienda la aritmética de Robinson QQ permite una codificación con estas propiedades.4

Para entender la última condición, se puede codificar APA_P como «existe una computación aceptante antes de cualquier rechazo». Si PP acepta, una traza finita proporciona un testigo. Si rechaza tras rr pasos, se verifica que no aceptó antes de rr y que cualquier aceptación posterior tendría ya un rechazo anterior; esa misma traza permite demostrar ¬AP\neg A_P. La capacidad de formalizar este razonamiento forma parte de la hipótesis, no se deduce de la mera consistencia.

Observemos que, sin embargo, en ningún momento hemos utilizado el sistema Peano\textbf{Peano} en sí. Esto nos indica que podríamos realizar esta demostración con otro sistema que no sea Peano\textbf{Peano}, siempre y cuando verifique tales condiciones. Indicamos este resultado a continuación.

Teorema5.4—Versión semántica del Primer Teorema de Incompletitud

Sea G\mathcal{G} un sistema lógico que verifique las siguientes condiciones:

  1. G\mathcal{G} es sólido.
  2. G\mathcal{G} es recursivamente axiomatizable.
  3. G\mathcal{G} es de tipo Turing.

Entonces G\mathcal{G} es incompleto, es decir, existen fórmulas verdaderas de G\mathcal{G} que no son teoremas.

Para reforzar este importante resultado, incluimos un resumen del proceso que hemos seguido para Peano\textbf{Peano}, de forma general, en la demostración de este teorema.

Demostración

En el Programa 5.2 importamos dos funciones. Por una parte, en la Línea 3 importamos la función es_teorema_G, que comprueba si una fórmula es un teorema en G\mathcal{G}. Esta función parará si la fórmula es un teorema, y se ejecutará indefinidamente en caso de que no lo sea. La existencia de esta función la garantiza (2).

Por otra, en la Línea 4 importamos la función parada_a_G que, dado un programa PP, convierte la afirmación «PP para con entrada vacía» en una fórmula de G\mathcal{G}, algo que es posible por (3).

En la Línea 9 tenemos que:

no_para_en_G significa que «incompleto_semantico.py no para con entrada vacía» (en G\mathcal{G})

(⋆3)(\star 3)

Si no_para_en_G es un teorema, la función es_teorema_G(no_para_en_G) (Línea 11) parará y devolverá sí, mientras que la misma función ciclará en caso de que no lo sea.

La pregunta que debemos hacernos es: ¿qué le pasa a incompleto_semantico.py cuando entrada es vacía?

Si asumimos que incompleto_semantico.py para con entrada vacía, la única forma de que lo haga es porque en la Línea 11 es es_teorema_G(no_para_en_G) == 'sí', lo cual solo puede pasar si no_para_en_G es un teorema. Pero, por (1), y dado que G\mathcal{G} es sólido, tenemos que no_para_en_G es verdadero.

Pero si no_para_en_G es verdadero, por (⋆3)(\star 3), esto querría decir que incompleto_semantico.py no para con entrada vacía, entrando en contradicción, por lo que debe ser:

incompleto_semantico.py no para con entrada vacía

(⋆4)(\star 4)

Comprobamos que no_para_en_G es verdadero pero no es un teorema. En efecto, es verdadero por (⋆4)(\star 4). Sin embargo, no es un teorema. Para ello, usamos de nuevo (⋆4)(\star 4). El hecho de que incompleto_semantico.py no pare indica que es imposible que la condición de la Línea 11, es_teorema_G(no_para_en_G) == 'sí', se verifique —en otras palabras, no_para_en_G no es un teorema.

∎
import utilidades
 
from es_teorema_G import es_teorema_G  # NO es un oráculo
from parada_a_G import parada_a_G      # NO es un oráculo
 
def incompleto_semantico(entrada):
programa = utilidades.leer('incompleto_semantico.py')
para_en_G = parada_a_G(programa)
no_para_en_G = 'NO (' + para_en_G + ')'
 
if es_teorema_G(no_para_en_G) == 'sí':
return 'para'
else:
utilidades.ciclar()

Nuestro resultado nos dice que, si tenemos un sistema lógico que sea recursivamente axiomatizable y de tipo Turing, no podemos esperar que pueda ser sólido y completo al mismo tiempo. Es decir, si todos los teoremas del sistema son verdaderos, siempre podremos encontrar fórmulas del sistema que sean verdaderas pero no sean teoremas.

Podemos aplicar el Teorema 5.4 a otros sistemas lógicos, siempre que verifiquen las hipótesis. Uno de ellos es, por ejemplo, el sistema de axiomas de Zermelo–Fraenkel.

5.3 #Versión sintáctica

El resultado anterior usa solidez. Ahora queremos obtener incompletitud sintáctica a partir de la hipótesis más débil de consistencia. La diferencia importa: un sistema consistente puede demostrar afirmaciones falsas sin demostrar una contradicción.

Primero necesitamos un procedimiento para decidir la demostrabilidad si, además, suponemos que el sistema es completo.

Proposición5.5

Sea S\mathcal{S} un sistema formal clásico con sintaxis efectiva, recursivamente axiomatizable, sintácticamente consistente y sintácticamente completo. Entonces EsTeoremaS\textsc{EsTeorema}_\mathcal{S}, para oraciones de su lenguaje, es decidible.

Demostración

Los teoremas de S\mathcal{S} se pueden enumerar efectivamente. Si sus axiomas son solo recursivamente enumerables, intercalamos la enumeración de axiomas con la generación de derivaciones finitas: en la etapa nn examinamos derivaciones de tamaño acotado por nn a partir de los axiomas obtenidos hasta esa etapa. Toda demostración finita acaba siendo considerada.

Para decidir si una oración ϕ\phi es un teorema, enumeramos las conclusiones hasta encontrar ϕ\phi o ¬ϕ\neg\phi. La completitud garantiza que alguna aparece; la consistencia garantiza que no aparecen ambas. Si encontramos ϕ\phi, respondemos sí; si encontramos ¬ϕ\neg\phi, respondemos no.

El Programa 5.3 expresa este procedimiento. En la Línea 1 usamos un enumerador que acaba produciendo cada teorema, y en la Línea 5 construimos la negación sintáctica de la oración. No suponemos un verificador decidible de pruebas sin especificar cómo se certifica el uso de axiomas enumerables.

∎
Programa5.3—es_teorema_S.py — pseudocódigo
from enumera_teoremas_S import enumera_teoremas_S  # NO es un oráculo
from sintaxis_S import negar
 
def es_teorema_S(formula):
negacion_formula = negar(formula)
for teorema in enumera_teoremas_S():
if teorema == formula:
return 'sí'
if teorema == negacion_formula:
return 'no'

Ahora utilizamos la imposibilidad de resolver AdivinaConsistente mediante un predictor computable total (Proposición 3.28).5

Teorema5.6—Versión sintáctica del Primer Teorema de Incompletitud

Sea S\mathcal{S} un sistema formal que verifique las siguientes condiciones:

  1. S\mathcal{S} es sintácticamente consistente.
  2. S\mathcal{S} es recursivamente axiomatizable.
  3. S\mathcal{S} es de tipo Turing, en el sentido de la Definición 5.3.

Entonces S\mathcal{S} es sintácticamente incompleto: existe una oración ϕ\phi tal que ni ϕ\phi ni ¬ϕ\neg\phi son teoremas.

Demostración

Supongamos, para llegar a contradicción, que S\mathcal{S} es sintácticamente completo. Por la Proposición 5.5, podemos decidir la demostrabilidad de sus oraciones.

Dado un programa PP, construimos efectivamente la oración APA_P que expresa «PP acepta con entrada vacía». El Programa 5.4 devuelve sí si S⊢AP\mathcal{S}\vdash A_P y no en caso contrario. No ejecuta PP.

Comprobemos que cumple las condiciones de AdivinaConsistente:

  • Si PP acepta, la verificación de su computación finita da S⊢AP\mathcal{S}\vdash A_P. El predictor devuelve sí.
  • Si PP rechaza, esa verificación da S⊢¬AP\mathcal{S}\vdash\neg A_P. Por consistencia, S⊬AP\mathcal{S}\nvdash A_P, y el predictor devuelve no.
  • Si PP cicla, cualquiera de las dos respuestas está permitida. El predictor termina igualmente, porque el procedimiento de demostrabilidad es total bajo la suposición de completitud.

Así obtendríamos un predictor computable total para AdivinaConsistente, contradiciendo la Proposición 3.28. Por tanto, S\mathcal{S} no puede ser completo.

∎
Programa5.4—adivina_consistente.py — pseudocódigo
from acepta_a_S import acepta_a_S  # traducción efectiva
from es_teorema_S import es_teorema_S  # bajo la suposición de completitud
 
def adivina_consistente(programa):
formula_acepta = acepta_a_S(programa)
return es_teorema_S(formula_acepta)

El caso de los programas que ciclan es esencial. No hemos supuesto que una prueba de parada implique una parada real, ni que el sistema pueda reconocer todas las ejecuciones infinitas. Consultar una prueba de parada y ejecutar después el programa podría dejar al predictor bloqueado: la consistencia por sí sola no garantiza la verdad de esa prueba. Aquí la respuesta depende únicamente de una búsqueda de demostraciones que termina por la completitud supuesta.

Hemos probado dos versiones del Primer Teorema de Incompletitud. Resumimos las diferencias entre ambas a continuación.

Teorema 5.4 Teorema 5.6
Tipo de sistema G\mathcal{G} sistema lógico S\mathcal{S} sistema formal
Hipótesis rec. axiom., de tipo Turing, y sólido rec. axiom., de tipo Turing, y sintácticamente consistente
Condición lógica ϕ teorema⇒ϕ verdadero\phi\text{ teorema}\Rightarrow\phi\text{ verdadero} ∄ϕ:ϕ y ¬ϕ son teoremas\nexists\phi:\phi\text{ y }\neg\phi\text{ son teoremas}
Conclusión G\mathcal{G} no (semánticamente) completo: ∃ϕ:ϕ es verdadero y no es teorema\exists\phi:\phi\text{ es verdadero y no es teorema} S\mathcal{S} no sintácticamente completo: ∃ϕ:ni ϕ ni ¬ϕ son teoremas\exists\phi:\text{ni }\phi\text{ ni }\neg\phi\text{ son teoremas}
Tabla 5.1. Comparativa entre las dos versiones del Primer Teorema de Incompletitud

La formulación clásica que corresponde a este resultado es el teorema de Gödel–Rosser. Lo enunciamos a continuación con la hipótesis aritmética explícita.

Teorema5.7—Primer Teorema de Incompletitud (Gödel–Rosser)

Sea S\mathcal{S} un sistema formal que verifique las siguientes condiciones:

  1. S\mathcal{S} es sintácticamente consistente.
  2. S\mathcal{S} es recursivamente axiomatizable.
  3. S\mathcal{S} es una teoría clásica que extiende la aritmética de Robinson QQ.

Entonces S\mathcal{S} es sintácticamente incompleto, es decir, hay fórmulas ϕ\phi de S\mathcal{S} de modo que ni ϕ\phi ni ¬ϕ\neg\phi son teoremas.

Tal y como en nuestra versión sintáctica, requerimos que el sistema sea sintácticamente consistente y recursivamente axiomatizable. El teorema original de Gödel exigía como hipótesis una forma más fuerte de consistencia sintáctica llamada ω\omega-consistencia. Esta forma más general del teorema se debe al trabajo de John B. Rosser, autor del hoy conocido como truco de Rosser.67

La tercera hipótesis exige que el sistema sea capaz de probar ciertas afirmaciones de aritmética elemental. Esto se debe a que Gödel pretendía probar que ninguna axiomatización efectiva y consistente suficientemente expresiva de la aritmética podía ser completa (véase el Capítulo 1), por lo que usó en su demostración una forma de numerar los teoremas que hoy en día se conoce como numeración de Gödel.

5.4 #Consecuencias

El Primer Teorema de Incompletitud tiene profundas implicaciones matemáticas y filosóficas.

5.4.1 #Relación con el segundo problema de Hilbert

Ya introdujimos en el Capítulo 1 los célebres problemas de Hilbert, y en concreto el segundo de ellos, que volveremos a referenciar a continuación:

  1. ¿Son completas las matemáticas? Esto es, ¿puede demostrarse cada sentencia matemática o su negación?
  2. ¿Son consistentes las matemáticas? Esto es, ¿no es posible probar simultáneamente una afirmación y su negación?
  3. ¿Son decidibles las matemáticas? Esto es, ¿existe un método automático que pueda aplicarse a cualquier afirmación matemática, y que determine si es cierta? Este problema se conoce como el Entscheidungsproblem.

Es necesario puntualizar que la formulación de Hilbert de este problema es relativa a la aritmética. Es claro que, para tal caso, el Teorema 5.7 nos garantiza la existencia de fórmulas no demostrables, respondiendo negativamente a (1)8. Por otra parte, en la Proposición 4.27 probamos que la verdad en Peano\textbf{Peano} no es decidible, probando que la respuesta a la pregunta (3) es negativa. La pregunta (2) queda fuera del objeto de este trabajo.

Sin embargo, es interesante ver estas preguntas sin necesidad de limitarnos a la aritmética. Hemos introducido los sistemas lógicos justamente para poder formalizar el concepto de verdad y demostración, que son el alma de las matemáticas.

Podremos encontrar respuestas análogas para sistemas formales recursivamente enumerables y de tipo Turing. En tal caso, el Teorema 5.6 responde negativamente a la pregunta (1), mientras que una generalización de la Proposición 4.27 (similar a la que hicimos en el Teorema 5.4 a partir del Teorema 5.2) nos permite responder negativamente a la pregunta (3).

5.4.2 #Relación con la mente humana y con la tesis de Church–Turing

Algunos autores entran en conclusiones mucho más epistemológicas, y que conciernen a la mente humana. Roger Penrose y John Lucas910 argumentan que el papel de la conciencia es no algorítmico cuando formamos juicios matemáticos, pudiendo generalizarlo al papel de la conciencia humana.

Para ello, los autores comentan que en cualquier sistema formal existen proposiciones indemostrables, esto es, para las que su algoritmo no puede proporcionar una respuesta. Si el funcionamiento de la mente humana fuese completamente algorítmico, entonces el algoritmo (o sistema formal) que utilice para formar sus juicios no podría tratar tal proposición. Sin embargo, la mente humana puede deducir que tal proposición es verdadera. Esta contradicción nos puede indicar que la mente humana, en cuanto al razonamiento matemático, no estaba utilizando un algoritmo en primer lugar.

Douglas Hofstadter1112 presenta los teoremas de Gödel como un ejemplo de «extraño bucle», una estructura jerárquica y autorreferencial que existe en un sistema formal. Argumenta que esta es la misma estructura que origina la conciencia, el sentido del «yo», en la mente humana: la autorreferencia proviene de la forma en que el cerebro abstrae y categoriza los estímulos en «símbolos», o grupos de neuronas, que corresponden a conceptos, en lo que es de facto un sistema formal, que eventualmente forma símbolos que corresponden a la propia entidad que realiza la percepción.

La diferencia entre las matemáticas y la conciencia reside, según Hofstadter, en el sentido en el que se realiza el razonamiento: si es «hacia arriba», desde los axiomas hacia las proposiciones y teoremas más complejas, o «hacia abajo», en el sentido contrario.

Las matemáticas funcionan hacia arriba: para derivar si una fórmula es un teorema debemos partir de los axiomas e ir razonando hasta llegar a ella. La mente humana, según el físico, funciona hacia abajo, desde un nivel más alto —de deseos, conceptos, personalidades, ideas y pensamientos— hasta el nivel más bajo de interacciones entre neuronas e incluso partículas fundamentales. Los seres humanos estamos hechos para percibir «cosas grandes» en lugar de «cosas pequeñas», incluso a pesar de que en el dominio de lo pequeño parece residir el motor de la realidad.

Ambos argumentos están íntimamente relacionados con la tesis de Church–Turing (véase la Sección 2.4). Si la mente humana es una máquina de Turing, todos los procedimientos de nuestro cerebro no serían más que algoritmos, y mediante los teoremas de Gödel, nuestra forma de razonar sería limitada —¡existen afirmaciones que no podemos demostrar!—. Esto puede inducir conclusiones más fantásticas, hablando algunos autores de que los teoremas de Gödel, aunque no permitan probarlo, son una fuerte evidencia de la existencia de dios.13 14

Los ejemplos de la versión semántica están en godel_peano.py y semantic_incomplete.py, dentro de intro-to-incompleteness. Los programas de la versión sintáctica se presentan aquí como pseudocódigo actualizado; no se presupone que coincidan con los archivos de ese repositorio.

Notas al pie

  1. Barrow, J.D. (1992). Pi in the Sky: Counting, Thinking, and Being. Oxford University Press.

    ↩
  2. Usamos «de tipo Turing» como abreviatura propia de las condiciones efectivas y de verificación de computaciones indicadas en la definición; no es una denominación estándar.

    ↩
  3. La equivalencia la probamos en el Teorema 2.23.

    ↩
  4. Open Logic Project. Incompleteness and Computability, capítulos sobre representabilidad en QQ e incompletitud. https://ic.openlogicproject.org/

    ↩
  5. Aaronson, S. (2011). Rosser's Theorem via Turing machines. https://scottaaronson.blog/?p=710

    ↩
  6. Es por ello por lo que lo llamamos teorema de «Gödel–Rosser», para distinguirlo del resultado original de Gödel.

    ↩
  7. Rosser, B. (1936). Extensions of some theorems of Gödel and Church. The Journal of Symbolic Logic, 1(3):87–91.

    ↩
  8. Hellman, G. (1981). How to Gödel a Frege-Russell: Gödel's Incompleteness Theorems and Logicism. Noûs, 15(4):451–468.

    ↩
  9. Penrose, R. (1989). The Emperor's New Mind: Concerning Computers, Minds, and the Laws of Physics. Oxford University Press.

    ↩
  10. Lucas, J.R. (1961). Minds, machines and Gödel. Philosophy, 36(137):112–127.

    ↩
  11. Hofstadter, D.R. (1999). Gödel, Escher, Bach: An Eternal Golden Braid (20th anniversary ed.). Basic Books.

    ↩
  12. Hofstadter, D.R. (2007). I Am a Strange Loop. Basic Books.

    ↩
  13. No existe consenso respecto a si esto es cierto, pero es sencillo argumentar los fallos de este razonamiento (véase Raatikainen 2022).

    ↩
  14. Raatikainen, P. (2022). Gödel's Incompleteness Theorems. In E.N. Zalta (ed.), The Stanford Encyclopedia of Philosophy (Spring 2022). https://plato.stanford.edu/archives/spr2022/entries/goedel-incompleteness/

    ↩