Introducción a la incompletitud · Capítulo 5
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.
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.
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 son recursivamente enumerables (es decir, es recursivamente axiomatizable), podemos escribir el programa es_teorema_peano(fórmula) que devuelve sí si fórmula es un teorema en , y que no para en caso contrario (véase la Proposición 4.29).
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 , la afirmación « para con entrada vacía» en una fórmula de .
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»
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?
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í'
es equivalente a decir que no_para_en_peano es un teorema. Por la solidez de , no_para_en_peano es verdadero.
Pero el hecho de que no_para_en_peano sea verdadero, junto con , 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.
La aritmética de Peano es incompleta: existen fórmulas verdaderas de 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 .
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 , 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 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».
Sea un sistema formal con sintaxis efectiva y lógica clásica. Diremos que es de tipo Turing2 si admite una codificación efectiva de programas y computaciones3 con las siguientes propiedades:
- A partir de un programa podemos construir computablemente una oración que expresa « para con entrada vacía» y una oración que expresa « acepta con entrada vacía».
- El sistema puede verificar las computaciones finitas: si termina con entrada vacía, ; si acepta, ; si rechaza, .
Para un sistema lógico, exigimos además que y 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 permite una codificación con estas propiedades.4
Para entender la última condición, se puede codificar como «existe una computación aceptante antes de cualquier rechazo». Si acepta, una traza finita proporciona un testigo. Si rechaza tras pasos, se verifica que no aceptó antes de y que cualquier aceptación posterior tendría ya un rechazo anterior; esa misma traza permite demostrar . 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 en sí. Esto nos indica que podríamos realizar esta demostración con otro sistema que no sea , siempre y cuando verifique tales condiciones. Indicamos este resultado a continuación.
Sea un sistema lógico que verifique las siguientes condiciones:
- es sólido.
- es recursivamente axiomatizable.
- es de tipo Turing.
Entonces es incompleto, es decir, existen fórmulas verdaderas de que no son teoremas.
Para reforzar este importante resultado, incluimos un resumen del proceso que hemos seguido para , 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 . 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 , convierte la afirmación « para con entrada vacía» en una fórmula de , 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 )
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 es sólido, tenemos que no_para_en_G es verdadero.
Pero si no_para_en_G es verdadero, por , 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
Comprobamos que no_para_en_G es verdadero pero no es un teorema. En efecto, es verdadero por . Sin embargo, no es un teorema. Para ello, usamos de nuevo . 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.
Sea un sistema formal clásico con sintaxis efectiva, recursivamente axiomatizable, sintácticamente consistente y sintácticamente completo. Entonces , para oraciones de su lenguaje, es decidible.
Demostración
Los teoremas de 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 examinamos derivaciones de tamaño acotado por a partir de los axiomas obtenidos hasta esa etapa. Toda demostración finita acaba siendo considerada.
Para decidir si una oración es un teorema, enumeramos las conclusiones hasta encontrar o . La completitud garantiza que alguna aparece; la consistencia garantiza que no aparecen ambas. Si encontramos , respondemos sí; si encontramos , 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.
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
Sea un sistema formal que verifique las siguientes condiciones:
- es sintácticamente consistente.
- es recursivamente axiomatizable.
- es de tipo Turing, en el sentido de la Definición 5.3.
Entonces es sintácticamente incompleto: existe una oración tal que ni ni son teoremas.
Demostración
Supongamos, para llegar a contradicción, que es sintácticamente completo. Por la Proposición 5.5, podemos decidir la demostrabilidad de sus oraciones.
Dado un programa , construimos efectivamente la oración que expresa « acepta con entrada vacía». El Programa 5.4 devuelve sí si y no en caso contrario. No ejecuta .
Comprobemos que cumple las condiciones de AdivinaConsistente:
- Si acepta, la verificación de su computación finita da . El predictor devuelve
sí. - Si rechaza, esa verificación da . Por consistencia, , y el predictor devuelve
no. - Si 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, no puede ser completo.
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 | sistema lógico | 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 | ||
| Conclusión | no (semánticamente) completo: | no sintácticamente completo: |
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.
Sea un sistema formal que verifique las siguientes condiciones:
- es sintácticamente consistente.
- es recursivamente axiomatizable.
- es una teoría clásica que extiende la aritmética de Robinson .
Entonces es sintácticamente incompleto, es decir, hay fórmulas de de modo que ni ni 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 -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:
- ¿Son completas las matemáticas? Esto es, ¿puede demostrarse cada sentencia matemática o su negación?
- ¿Son consistentes las matemáticas? Esto es, ¿no es posible probar simultáneamente una afirmación y su negación?
- ¿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 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
Barrow, J.D. (1992). Pi in the Sky: Counting, Thinking, and Being. Oxford University Press.
↩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.
↩La equivalencia la probamos en el Teorema 2.23.
↩Open Logic Project. Incompleteness and Computability, capítulos sobre representabilidad en e incompletitud. https://ic.openlogicproject.org/
↩Aaronson, S. (2011). Rosser's Theorem via Turing machines. https://scottaaronson.blog/?p=710
↩Es por ello por lo que lo llamamos teorema de «Gödel–Rosser», para distinguirlo del resultado original de Gödel.
↩Rosser, B. (1936). Extensions of some theorems of Gödel and Church. The Journal of Symbolic Logic, 1(3):87–91.
↩Hellman, G. (1981). How to Gödel a Frege-Russell: Gödel's Incompleteness Theorems and Logicism. Noûs, 15(4):451–468.
↩Penrose, R. (1989). The Emperor's New Mind: Concerning Computers, Minds, and the Laws of Physics. Oxford University Press.
↩Lucas, J.R. (1961). Minds, machines and Gödel. Philosophy, 36(137):112–127.
↩Hofstadter, D.R. (1999). Gödel, Escher, Bach: An Eternal Golden Braid (20th anniversary ed.). Basic Books.
↩Hofstadter, D.R. (2007). I Am a Strange Loop. Basic Books.
↩No existe consenso respecto a si esto es cierto, pero es sencillo argumentar los fallos de este razonamiento (véase Raatikainen 2022).
↩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/
↩