Introducción a la incompletitud · Capítulo 4
Demostrar no es lo mismo que ser verdad
Introducimos sistemas formales, sistemas lógicos y la aritmética de Peano, distinguiendo con cuidado las nociones de demostrabilidad y verdad. A partir de ejemplos con SumaBinaria y sus variantes, estudiamos solidez, completitud y decidibilidad, y demostramos que la aritmética de Peano es semidecidible pero ni completa ni decidible — preparando el terreno para el teorema de incompletitud.
No debemos creer a quienes hoy, con porte filosófico y tono deliberativo, profetizan la caída de la cultura y aceptan el ignorabimus. Para nosotros no hay ignorabimus, y en mi opinión tampoco lo hay en la ciencia natural. En oposición al necio ignorabimus nuestro lema será: «¡debemos saber — sabremos!»
En este capítulo nos preguntamos si podemos expresar de forma algorítmica los conceptos de demostración y verdad: si existe una forma automática de resolver teoremas y comprobar afirmaciones. Como explicamos en el Capítulo 1, este fue uno de los ejes centrales de las matemáticas de principios del siglo XX.
Las matemáticas consisten en deducir teoremas a partir de una cierta lista de axiomas. Para poder definir precisamente este concepto, recurrimos a los sistemas formales (Sección 4.1).
Sin embargo, nos interesa especialmente saber si las afirmaciones (o fórmulas) de un sistema son verdaderas. Para esto, necesitaremos definir los sistemas lógicos (Sección 4.2).
Una vez realizada la distinción entre demostrable y verdadero, nos preguntamos por la relación que estos dos conceptos tienen en un determinado sistema lógico: a partir de esto, comprenderemos en la Sección 4.3 los conceptos de solidez y completitud, y finalmente preguntaremos si podemos comprobar si una fórmula es verdadera de forma algorítmica, pudiendo decir si un sistema lógico es decidible o no (véase el Capítulo 3). A lo largo de esta sección introduciremos múltiples ejemplos de sistemas lógicos que reforzarán los conceptos ya mencionados, todos girando en torno a una operación aritmética sencilla.
A continuación, introduciremos un sistema lógico de especial importancia: la aritmética de Peano (Sección 4.4). Este sistema es capaz de demostrar una gran cantidad de teoremas de la teoría de números, por lo que nos resultará especialmente interesante saber si todas sus afirmaciones verdaderas son demostrables (este es, justamente, el Primer Teorema de Incompletitud, que demostramos en el Capítulo 5). Para ello, encontraremos una forma de traducir el problema de parada (Sección 3.6) en una fórmula de este sistema.
Finalmente, introduciremos más propiedades de los sistemas introducidos en la Sección 4.5.
4.1 Sistemas formales
A lo largo de este trabajo hemos presentado múltiples demostraciones, pero ¿qué es exactamente una demostración? Cuando hablamos de demostrar algo, nos referimos a hacerlo de forma matemática. Al contrario que las pruebas científicas, las pruebas matemáticas son exactas y comprobables. De este modo, podemos preguntarnos si un ordenador puede realizar demostraciones de forma automática.
Para responder a todas estas preguntas, necesitaremos crear una estructura matemática que nos permita formalizar el concepto de demostración.
Un sistema formal, , es una tripleta , donde:
- es el lenguaje formal sobre un cierto alfabeto . Cada uno de los elementos del lenguaje se denomina fórmula bien formada (o fórmula).2
- es el conjunto de axiomas, que es un conjunto de fórmulas de .
- es el conjunto de reglas de inferencia, que es un conjunto de funciones que mapean fórmulas de , llamadas premisas, en fórmulas de , llamadas derivaciones. Todas las funciones de deben ser computables (ver Definición 3.9).
Si dadas dos fórmulas , se deriva a partir de , usaremos la notación . Si se deriva a partir de en un número finito de derivaciones, usaremos la notación .
Veamos un ejemplo de sistema formal que nos será extremadamente útil en este capítulo.
Sea el sistema formal compuesto por:
- Lenguaje : está formado sobre el alfabeto , y es el reconocido por la expresión regular3
donde es una abreviatura de la expresión regular .
- Conjunto de axiomas : está formado por un único axioma,
- Conjunto de reglas de inferencia : son las siguientes:
donde usamos la siguiente notación: y son palabras del alfabeto y es una palabra que obedece la expresión regular . Las partes subrayadas son coincidencias maximales de la expresión regular de .
Es importante recalcar la notación usada para describir las reglas de inferencia de , en concreto, sobre el significado de coincidencia maximal. Una coincidencia maximal, en este caso, es una subcadena que verifica la expresión regular de y no puede extenderse en más direcciones. En el caso de la fórmula 100+11+1001=101, tenemos cuatro coincidencias maximales de este tipo: 100, 11, 1001 y 101, en ese orden.
Sería posible describir estas reglas mediante expresiones regulares, pero esto haría que la notación fuese menos sencilla e intuitiva.
Una vez definido un sistema formal, será posible probar (o demostrar) algunas de sus fórmulas, a las que llamaremos teoremas.
Dado un sistema formal , una demostración de una fórmula de es una secuencia finita de fórmulas de , donde cada una de las fórmulas es un axioma, o se sigue de aplicar una regla de inferencia a las fórmulas que aparecen anteriormente en la secuencia.
Una fórmula se dice teorema (o fórmula demostrable) si existe una demostración en .
Veamos un ejemplo de teorema en .
Sea 1+1+1=11 una fórmula de . Veamos que es un teorema:
| Paso | Fórmula | Justificación | |
|---|---|---|---|
| (F1) | 1=1 |
(axioma) | |
| (F2) | 1+1=1+1 |
(aplicar R1 a F1) | |
| (F3) | 1+1=10 |
(aplicar R2 a F2) | |
| (F4) | 1+1+1=1+10 |
(aplicar R1 a F3) | |
| (F5) | 1+1+1=11 |
(aplicar R3 a F4) |
Observa que, aunque no esté en la definición, las demostraciones de los teoremas suelen ir acompañadas de notas que ayudan a comprobar la prueba. El repositorio intro-to-incompleteness proporciona binary_addition.py con la función es_teorema. Para probar si una fórmula es un teorema en alguno de los sistemas de este capítulo, especifica el nombre del sistema seguido de la fórmula.
A continuación, algunos ejemplos de uso de esta función:
>>> from suma_binaria import es_teorema
>>> es_teorema('SumaBinaria', '1+1+1=11')
(F1) 1=1 (Axioma)
-> (F2) 1+1=1+1 (R1)
-> (F3) 1+1+1=1+1+1 (R1)
-> (F4) 1+1+1=1+10 (R2)
-> (F5) 1+1+1=11 (R3)
'teorema'
>>> es_teorema('SumaBinaria', '11+1=10')
'no demostrado en las primeras 109322 fórmulas generadas'
>>> es_teorema('SumaBinaria', 'mal-formada')
'fórmula mal formada'
>>> es_teorema('SistemaQueNoExiste', 'lo-que-sea')
'el sistema no existe'La prueba de 1+1+1=11 que realiza es_teorema es diferente de la del Ejemplo 4.4. Esto es perfectamente posible: un teorema puede tener diversas demostraciones. Este hecho se evidencia de la propia Definición 4.3: una fórmula es un teorema si «existe una demostración».
4.2 Sistemas lógicos
Como dice el propio nombre, el sistema pretende comprobar fórmulas de la suma binaria. De este modo, una palabra como 11 representa el número , y una fórmula como 1+1+1=11 representa que . Observa que esto nos permite reconocer si una fórmula de es verdadera: simplemente la interpretamos como si se tratase de una fórmula aritmética, y la declaramos como cierta si es una fórmula aritmética correcta. De este modo, fórmulas como 10+1=11 son verdaderas, mientras que otras como 11+1=10 no lo son.
En el apartado anterior, no mencionamos el concepto de verdad de forma intencionada: un sistema formal no tiene ninguna noción de certeza. Esto es porque las definiciones de teorema y fórmula verdadera son completamente diferentes.
Los teoremas solo dependen de la sintaxis: «¿podemos demostrar un teorema a partir de unos ciertos axiomas y unas reglas de inferencia?» La verdad, sin embargo, depende de la semántica: «¿es esta fórmula cierta cuando es interpretada dándole cierto significado a sus símbolos?»
Por definición, los sistemas formales solo dependen de la sintaxis. En esta sección, introduciremos los sistemas lógicos, que no son nada más que sistemas formales a los que le añadimos una semántica. Cuando añadimos la semántica de la aritmética que hemos comentado al sistema formal obtenemos el sistema lógico .
Sea el sistema lógico que se obtiene al añadir la semántica de la aritmética al sistema formal .
Una fórmula en es verdadera si es cierta vista como una fórmula aritmética de la suma de números binarios.
Formalmente, podemos definir estos sistemas como:
Un sistema lógico consiste en un sistema formal y una semántica o asignación de verdad , donde es una función que asigna a fórmulas de una interpretación, que es un valor del conjunto .
La asignación de verdad no debe ser necesariamente computable (Definición 3.9) y puede estar definida para todas las fórmulas o para un subconjunto de ellas.4
Una vez que incorporamos a un sistema formal una asignación de verdad, podemos decir cuándo una fórmula es verdadera. Precisamos esto en la definición siguiente:
Dado un sistema lógico con , decimos que la fórmula es verdadera si está bien definido y es . En caso contrario, decimos que la fórmula es falsa.
Veamos ejemplos de fórmulas verdaderas y falsas para .
Sea 1+1+1=11 una fórmula de . Claramente, esta fórmula es verdadera dado que la siguiente operación aritmética es cierta para el sistema de numeración binario:
En suma_binaria.py también se proporciona una función para comprobar la veracidad de las fórmulas en sistemas lógicos, llamada es_verdadero. Un ejemplo:
>>> from suma_binaria import es_verdadero
>>> es_verdadero('SumaBinariaLógico', '1+1+1=11')
True
>>> es_verdadero('SumaBinariaLógico', '11+1=10')
False
>>> es_verdadero('SumaBinariaLógico', 'mal-formada')
False
>>> es_verdadero('SumaBinaria', '1+1+1=11')
'el sistema no existe o no es un sistema lógico'Introduciremos más sistemas lógicos que resultarán de añadir (Sistema 4.8) y eliminar (Sistema 4.9) reglas de .
Sea el sistema lógico que se obtiene al añadir la regla de inferencia siguiente a :
Sea el sistema lógico que se obtiene al eliminar la regla de inferencia (R3) a .
Estos sistemas son especialmente interesantes, pues en ellos podemos encontrar tanto fórmulas demostrables y no verdaderas (Ejemplo 4.10) como fórmulas verdaderas y no demostrables (Ejemplo 4.11).
La fórmula 1+1=1 es un teorema y no es verdadera en .
Claramente, no es una operación cierta de la suma binaria, y por tanto no es una fórmula verdadera. Sin embargo, se trata de un teorema porque podemos demostrarlo directamente a partir del axioma mediante la nueva regla (R1b) introducida.
from suma_binaria import es_teorema, es_verdadero
es_teorema('SumaBinariaLógicoRoto', '1+1=1')
(F1) 1=1 (Axioma)
-> (F2) 1+1=1 (R1b)
'teorema'
es_verdadero('SumaBinariaLógicoRoto', '1+1=1')
FalseLa fórmula 1+10=11 no es un teorema y es verdadera en .
La fórmula es verdadera dado que es una operación correcta en la suma binaria. Sin embargo, no es un teorema porque, al eliminar (R3), no podemos reemplazar los 0 con 1.
from suma_binaria import es_teorema, es_verdadero
es_teorema('SumaBinariaLógicoRestringido', '1+10=11')
'no demostrado en las primeras 154639 fórmulas generadas'
es_verdadero('SumaBinariaLógicoRestringido', '1+10=11')
TrueEs importante notar que la función es_teorema no puede demostrar que una fórmula no es demostrable debido a la forma en la que la hemos diseñado. El código anterior no prueba que 1+10=11 no sea un teorema — la prueba de este ejemplo sí.
4.3 Solidez, completitud y decidibilidad
Hemos encontrado sistemas lógicos en los que hay fórmulas verdaderas y no demostrables, y viceversa. Esto nos conduce a la definición de dos importantes propiedades de los sistemas lógicos.
Un sistema lógico es sólido si todos sus teoremas son verdaderos. En caso contrario, decimos que es no sólido.
Un sistema lógico es (semánticamente) completo5 si todas las fórmulas verdaderas son teoremas. En caso contrario, decimos que es incompleto.
Veamos si los sistemas lógicos que hemos presentado hasta ahora son sólidos y completos. Un resumen de todos los resultados se puede ver en la Tabla 4.1.
Probar que es sólido y completo consiste en comprobar el axioma y cada regla de inferencia frente al significado previsto de la suma binaria. Un boceto basta para ver la idea; los argumentos completos son la Proposición 4.14 y la Proposición 4.15 más abajo.
El sistema lógico es sólido y completo.
Demostración
Boceto. El único axioma es 1=1, que es verdadero. Cada una de (R1)–(R3) preserva la verdad de las identidades de la suma binaria: (R1) suma uno a ambos lados, (R2) reemplaza por el número par , y (R3) reemplaza por el número impar . Recíprocamente, toda identidad verdadera puede reducirse a una suma de unos invirtiendo esas reglas, y esa suma se deriva del axioma mediante (R1). Las demostraciones detalladas se dan a continuación.
El sistema lógico es sólido.
Demostración
Para probar que el sistema es sólido, veremos que todas las reglas de inferencia mapean fórmulas verdaderas a fórmulas verdaderas. En primer lugar, vemos que el axioma 1=1 es verdadero, pues es cierto que .
Ahora, comprobemos cada regla.
(R1)
En este caso, si y son números binarios y asumimos que la fórmula es verdadera, entonces tenemos que . Por tanto, la fórmula es verdadera, ya que es cierto que .
(R2)
El hecho de que las tengan coincidencias maximales nos lleva a comprobar si dado un número binario, asumiendo que es verdadera tenemos que es verdadera, o lo que es lo mismo, debemos comprobar que .
Un número binario se representa mediante dígitos, ya sean o , siendo , y se verifica que:
Basta ver que:
y que el número corresponde exactamente a .
(R3)
De forma análoga a la regla anterior, comprobamos que:
El sistema lógico es completo.
Demostración
Veremos que toda fórmula verdadera es un teorema. Vemos en primer lugar que toda fórmula verdadera es del tipo
donde cada es un número binario (que verifica la expresión regular ), y de modo que la siguiente fórmula aritmética es cierta:
Nuestro objetivo es probar que la fórmula es un teorema. Para ello, vamos a probar que, dado un número binario que sea coincidencia maximal de la expresión regular , éste puede derivarse a partir de la suma de unos, es decir, debemos probar que:
Dado que, por ser esto cierto, tenemos que:
Y como tenemos unos a la izquierda de = y a la derecha, y es
tenemos que
pero es claro que podemos obtener aplicando la regla (R1) veces a partir del axioma , luego es
y como y es 1=1 un axioma, es un teorema.
Probemos que, en efecto, es
Para ello, primero observemos que, si es un número binario positivo, entonces puede que sea par o impar.
Si es impar, entonces puede ser escrito con dígitos: . Sea una fórmula de , y supongamos que contiene un substring como coincidencia maximal de , es decir, . Entonces, puede ser derivado de un cierto , mediante la regla (R3), siendo
En caso de que sea par, es claro que puede expresarse como la suma , cierto un cierto binario positivo. Entonces, si contiene un substring como coincidencia maximal de , , es con
Sabiendo esto, cualquier ocurrencia de un entero positivo en una fórmula de puede ser reducida a la suma de unos, es decir, dado , se tiene que:
Esto es debido a que todo número natural puede ser reducido a la suma de unos aplicando recursivamente las operaciones anteriormente descritas (dividir por en caso de ser par y restar en caso de ser impar).
Dado que los otros sistemas lógicos se «obtienen» a partir de , las proposiciones siguientes son mucho más sencillas de demostrar. Como es evidente, el Ejemplo 4.10 y el Ejemplo 4.11 prueban que es no sólido y que es incompleto, respectivamente.
Veamos a continuación tales proposiciones.
El sistema lógico es completo y no sólido.
Demostración
Es fácil ver que este sistema es completo a partir de la completitud de . Observamos que ambos sistemas lógicos tienen la misma semántica, es decir, tienen las mismas fórmulas verdaderas. De este modo, una fórmula verdadera en también lo es en .
Veamos si es un teorema en . Por la completitud de , es un teorema en este sistema. Pero como tiene todas las reglas de (y una más), también es un teorema en .
Sin embargo, el sistema lógico es no sólido. En el Ejemplo 4.10 vimos una fórmula que es un teorema y no es verdadera.
El sistema lógico es incompleto y sólido.
Demostración
La incompletitud de este sistema se sigue del Ejemplo 4.11. La solidez se sigue de la solidez de .
Sea un teorema de . Como tiene todas las reglas de (y una más), es un teorema en . De la solidez de , es verdadero. Pero como tiene la misma semántica, también será verdadero en este sistema.
Los sistemas lógicos y los obtuvimos modificando la sintaxis de . Introducimos ahora el último sistema de este tipo, que surge de modificar la semántica de .
Sea el sistema lógico que se obtiene a partir de modificando su semántica. Interpretaremos las fórmulas como fórmulas aritméticas de la suma de números binarios, pero el símbolo = será interpretado como «mayor o igual que» ().
En este último sistema lógico podríamos haber modificado el símbolo = por >=. Sin embargo, no lo hacemos de forma intencionada, y para recordar que la sintaxis y la semántica son independientes — podemos asignar el valor de verdad que queramos.
Veamos un ejemplo sencillo e ilustrativo de fórmula verdadera y de fórmula falsa.
La fórmula 1+1=1 es verdadera en , mientras que 1=1+1 es falsa.
from suma_binaria import es_verdadero
es_verdadero('SumaBinariaLógicoArreglado', '1+1=1')
True
es_verdadero('SumaBinariaLógicoArreglado', '1=1+1')
FalseAl modificar la semántica, hemos logrado «arreglar» el sistema , como bien dice su nombre. En efecto, es completo y sólido.
El sistema lógico es completo y sólido.
Demostración
Es sencillo ver que este sistema lógico es sólido. Basta ver que la regla (R1b) nos permite probar afirmaciones como 1+1=1. Esta regla siempre añade más 1 a la izquierda de = que a la derecha. De este modo, en todo teorema del sistema la parte izquierda del igual será mayor o igual que la parte derecha, coincidiendo con la definición de la asignación de verdad (semántica).
Boceto. La solidez de (R1b) es inmediata: solo añade unos a la izquierda de =, que interpretamos como . La completitud usa la misma reducción a sumas de unos que , y después aplica (R1b) las veces suficientes para compensar la diferencia . El argumento detallado es la Proposición 4.18 a continuación.
El sistema lógico es completo.
Demostración
Para demostrar esto, usaremos el resultado obtenido en la proposición anterior. Toda fórmula verdadera es del tipo
donde cada es un número binario (que verifica la expresión regular ), y de modo que la siguiente fórmula aritmética es cierta:
Vamos a llamar a ambas partes con y :
Como , existe un de modo que . Ya probamos en la proposición anterior que:
Ahora basta ver que:
Donde en aplicamos veces la regla (R1) y en aplicamos veces la regla (R1b).
A modo de resumen, vemos en la tabla siguiente la completitud y solidez de los sistemas presentados (junto con otra información que veremos más adelante).
| Sólido | Completo | Decidible | |
|---|---|---|---|
| (reglas R1, R2, R3) | sí | sí | sí |
| (reglas R1, R1b, R2, R3) | no | sí | sí |
| (reglas R1, R2) | sí | no | sí |
| (reglas R1, R1b, R2, R3 y una semántica diferente) | sí | sí | sí |
| asumido | no | no |
Adicionalmente a las propiedades de solidez y consistencia, podemos introducir una propiedad computacional: la de decidibilidad. Ya sabemos qué significa decidible para un problema de decisión: que podemos resolverlo con un programa que siempre para y tiene salida correcta. Para un sistema lógico podemos definir un problema de decisión, .
- Entrada: una fórmula de .
- Salida:
sísi está bien definido y , ynoen caso contrario.
Para cada sistema lógico obtenemos un problema de decisión distinto. Una vez definido este problema, es natural definir la decidibilidad de un sistema lógico mediante la decidibilidad del problema.
Decimos que un sistema lógico es decidible si el problema de decisión es decidible.
De este modo, un sistema lógico es decidible si existe un programa que decide si una fórmula es verdadera o no. Es importante notar que algunos autores definen como sistema decidible aquel en el que el problema (que definimos a continuación) es decidible. Como hemos visto, la verdad y la demostración son conceptos diferentes, y nosotros nos referiremos siempre a la verdad al preguntarnos por si un sistema lógico es decidible.
- Entrada: una fórmula de .
- Salida:
sísi es un teorema de , ynoen caso contrario.
Veamos si los sistemas lógicos que hemos introducido en este capítulo son decidibles. En el caso de , es sencillo crear un programa que sea capaz de comprobar si las fórmulas que se insertan están bien formadas, y que comprueba si la operación aritmética es correcta. De hecho, este programa está implementado: es la función es_verdadero de suma_binaria.py:
>>> from suma_binaria import es_verdadero
>>> es_verdadero('SumaBinariaLógico', '1+1+1=11')
True
>>> es_verdadero('SumaBinariaLógico', '11+1=10')
FalseEn el caso del resto de sistemas lógicos, crear programas que los decidan resulta igual de sencillo. Las implementaciones a estos programas se encuentran igualmente en es_verdadero. Vemos a continuación más ejemplos de la ejecución de esta función en el resto de sistemas lógicos.
>>> from suma_binaria import es_verdadero
>>> es_verdadero('SumaBinariaLógico', '11=1+1')
False
>>> es_verdadero('SumaBinariaLógicoRoto', '11=1+1')
False
>>> es_verdadero('SumaBinariaLógicoRestringido', '11=1+1')
False
>>> es_verdadero('SumaBinariaLógicoArreglado', '11=1+1')
True4.4 La aritmética de Peano
Los sistemas lógicos que hemos explorado son de poca utilidad. Lo que queremos es trabajar con sistemas lógicos que permitan probar resultados interesantes en matemáticas. Los matemáticos, lógicos y filósofos han estudiado multitud de sistemas lógicos desde finales del siglo XIX, pero dos destacan por su importancia: los axiomas de Zermelo–Fraenkel, de teoría de conjuntos, y la aritmética de Peano, de teoría de números. En este apartado nos centraremos en el último, pues la aritmética de Peano contiene fórmulas sobre enteros, adición, multiplicación, etc.
Llamaremos al sistema lógico de la aritmética de Peano. Puedes encontrar la descripción completa de este sistema en Aritmética de Peano. En la Figura 4.22 puedes encontrar algunos detalles de tal descripción.
La aritmética de Peano se compone de símbolos lógicos como , , , , , , y . Los axiomas y reglas de inferencia de permiten deducir propiedades de los números naturales. Éstos se representan a partir del mediante la función sucesora , de modo que es , es , etc. De forma general, representa para un natural .
Las reglas de inferencia incluyen fórmulas lógicas clásicas, tales como el modus ponens: dado y , podemos deducir .
En este sistema podemos producir fórmulas sobre aritmética muy interesantes. Vemos algunas de ellas a continuación.
Algunas fórmulas de (expresadas en lenguaje natural):6
- (PF1) .
- (PF2) Para todo entero , es .
- (PF3) y son divisores de .
- (PF4) es primo.
- (PF5) Sea . Entonces, .7
- (PF6) Si , no existen enteros positivos tales que (el último teorema de Fermat).
- (PF7) Sea . Entonces, para todo entero positivo existe un entero positivo de modo que .
Para poder trabajar con en programas en Python, deberemos encontrar una forma de codificar los diversos símbolos, que especificamos en la Tabla 4.2.
| Símbolo | Codificación | Descripción |
|---|---|---|
NO (p) |
Negación | |
(p) Ó (q) |
Disyunción | |
PARA TODO (x) : (p) |
Cuantificador universal | |
S(a) |
Sucesor | |
EXISTE (x) : (p) |
Cuantificador existencial | |
(p) => (q) |
Implicación | |
(p) <=> (q) |
Coimplicación | |
(p) = (q) |
Igualdad |
Por ejemplo, consideremos la afirmación «no existen enteros e de modo que e », que puede representarse en como y que admite la siguiente codificación en string:
NO EXISTE x,y : S(S(0))*x = y Y y = S(S(S(0)))
Las fórmulas de , por ser de un sistema lógico, pueden ser verdaderas o falsas. En el Ejemplo 4.23, las primeras seis fórmulas (de (PF1) a (PF6)) son verdaderas,89 mientras que la última (la fórmula (PF7)) es falsa.
Para poder probar si una fórmula de es verdadera, necesitamos que sea cerrada: esto ocurre si todas sus variables son cuantificadas por un «para todo» () o un «existe» ().10 Un ejemplo de esto es , que es una fórmula cerrada pues e son cuantificadas, mientras que no es una fórmula cerrada. Esta distinción es importante porque, si una fórmula no es cerrada, no podemos saber si es verdadera. Solo consideraremos fórmulas cerradas en de aquí en adelante.
Una vez que aceptamos que la aritmética de Peano puede expresar afirmaciones matemáticas como las del Ejemplo 4.23, podemos continuar para expresar las salidas de un programa en . La siguiente proposición muestra cómo hacerlo para un conjunto concreto de fórmulas sobre los programas que necesitaremos más adelante.11
Sea un programa de ordenador (o una máquina de Turing).12 La afirmación dada por
« para con entrada vacía»
puede ser traducida en una fórmula equivalente en . (En este caso, con «equivalente» nos referimos a que es verdadera si y solo si es verdadera.)
Demostración
Haremos un boceto de la prueba, dado que realizarla con un rigor estricto sería largo y tedioso.
En este caso, es más sencillo probar esto mediante máquinas de Turing. Recuerda que podemos definir cada momento de la ejecución de la máquina mediante una configuración. En el caso de una máquina de Turing de una sola cinta, podemos codificar de forma sencilla una configuración cualquiera: podemos usar una codificación similar a la especificada en la Proposición 2.21, añadiendo el carácter ^ para indicar la posición del cabezal. A modo de ejemplo, se especifica a continuación un ejemplo de codificación de una configuración del Ejemplo 2.11:
Del mismo modo, podemos codificar los strings mediante números en un string binario (una palabra del alfabeto ). Así, es razonable asumir que la configuración de una máquina de Turing puede ser representada por un número en string binario. La función de transición de la máquina de Turing toma una de estas configuraciones en binario como string de entrada, y tiene como salida la nueva configuración, codificada de la misma forma. Desde este punto de vista, la función de transición es una función de enteros en enteros. Llamaremos a esta función , dado que evaluar esta función una sola vez es equivalente a un paso de cálculo en la máquina de Turing. Observa que la función puede escribirse mediante aritmética de Peano: no es más que una función simple que depende de unos pocos bits de entrada.
Supongamos que es el entero que representa la configuración inicial de la máquina. Tras un paso de cálculo, la configuración de la máquina será , y tras dos pasos, será . Podemos abreviar esto como . Tras pasos, la configuración de la máquina será . Es importante destacar que cada una de las configuraciones puede ser expresada mediante aritmética de Peano.
Por otra parte, es evidente que la afirmación
« para con entrada vacía»
es equivalente a
«Existe un natural de modo que es una configuración de parada»
Por «configuración de parada» nos referimos a que la máquina de Turing no puede seguir ejecutando transiciones: ha parado. Comprobar esto también es sencillo. Vamos a escribir una función que tiene como entrada un entero y como salida ó . si la configuración es de parada, y en caso contrario.
Escribir esta función en tampoco es difícil: ya en la Definición 2.7 dijimos que una máquina para si no hay ninguna transición definida para la configuración en la que se encuentre. Es evidente que podemos traducir esta afirmación a una fórmula de la aritmética de Peano.
De este modo, hemos probado que es una fórmula de para un natural y un binario . Por tanto, la afirmación:
«Existe un natural de modo que »
también puede traducirse a una fórmula de . Esta afirmación es equivalente a las anteriores, y es esta fórmula justamente la que buscamos.
De la prueba anterior, es evidente que la construcción de a partir de se realiza de una forma completamente algorítmica, que podría en principio ser implementada por un programa en Python. Sea tal programa parada_a_peano.py. En intro-to-incompleteness no se proporciona un programa que implemente esto, ya que hacerlo es una tarea compleja.13 Sin embargo, en el resto de este capítulo, importaremos la función main parada_a_peano cuando sea necesario.
Definiremos a continuación dos problemas de decisión importantes: EsTeoremaPeano y EsVerdaderoPeano.14
- Entrada: una fórmula de .
- Salida:
sísi es una fórmula bien formada y cerrada en , y se trata de un teorema de ;noen caso contrario.
- Entrada: una fórmula de .
- Salida:
sísi es una fórmula bien formada, cerrada y verdadera en ;noen caso contrario.
Dada una afirmación en , los problemas anteriores preguntan si es demostrable y/o verdadera. Resulta que ambos problemas son no decidibles. La no decidibilidad de EsVerdaderoPeano nos indica, mediante la Definición 4.20, que no es decidible (como ya adelantamos en la Tabla 4.1).11
es no decidible.
Demostración
Procederemos mediante la reducción (Problema 3.25) .
Probaremos que esta reducción se implementa en el Programa 4.1. La función main tiene como entrada un programa . Usando la Proposición 4.24, convertimos la afirmación en una fórmula equivalente en la aritmética de Peano. Es importante notar que parada_a_peano es una función computable, como comentamos anteriormente. Claramente, para si y solo si es verdadero, lo que demuestra la reducción. El resultado se sigue de la Proposición 3.22.
from es_verdadero_peano import es_verdadero_peano # oráculo
from parada_a_peano import parada_a_peano # NO es un oráculo
def parada_en_vacio_a_es_verdadero_peano(programa):
para_en_peano = parada_a_peano(programa)
return es_verdadero_peano(para_en_peano)EsTeoremaPeano es no decidible.
Demostración
De forma similar a la Proposición 4.27, usaremos la reducción .
Antes de esto, debemos apreciar una propiedad de las afirmaciones de la forma « para con entrada vacía». Llamemos a tal afirmación ,15 y mostraremos que para cualquier programa , si es verdadera en , entonces es un teorema en . Es importante notar que este no es el caso para todas las fórmulas (si no, sería completo).
El motivo por el que esto ocurre justamente para las fórmulas es porque, simplemente, debemos simular hasta que pare, algo que podemos definir mediante aritmética de Peano: simplemente calculamos para cada de forma incremental, hasta que el resultado sea .
Ahora podemos realizar la reducción usando el Programa 4.1, sustituyendo es_verdadero_peano por es_teorema_peano. Como las fórmulas verdaderas del tipo son teoremas, la reducción es correcta.
El caso de EsTeoremaPeano es menos grave, pues el problema es, de hecho, semidecidible (ver Definición 3.20). Esto quiere decir que podemos escribir un programa que compruebe si una fórmula es un teorema (en caso de que la fórmula no sea un teorema, el programa no tiene por qué parar).11
EsTeoremaPeano es semidecidible.
Demostración
Es fácil ver que el Programa 4.2 hace a EsTeoremaPeano semidecidible. La idea es iterar sobre todos los posibles strings, hasta ver si uno de ellos es una prueba de la fórmula de entrada.
Importamos la función es_prueba_peano, que dada una fórmula y una demostración en comprueba si la demostración prueba que la fórmula es un teorema. Claramente, esta función no es un oráculo. De hecho, su implementación es sencilla: basta probar si cada una de las fórmulas de la demostración es un axioma o se sigue de las fórmulas anteriores a través de las reglas de inferencia del sistema, comprobando que la última fórmula coincida con la fórmula que queremos probar.
En el bucle vamos iterando por todos los strings para ver si son prueba de la fórmula fórmula. Estos strings se enumeran en orden shortlex: primero se enumeran en orden lexicográfico todos los strings de longitud , luego de longitud , etc. Esta ordenación la proporciona la función siguiente_string de utilidades.
Si fórmula es un teorema, su demostración se encontrará eventualmente y el programa devolverá sí. En caso contrario, el programa no parará, pero esto no es un problema, ya que pretendemos mostrar la semidecibilidad del problema, la cual no requiere que el programa pare para instancias negativas.
import utilidades
from es_prueba_peano import es_prueba_peano # NO es un oráculo
def es_teorema_peano(fórmula):
demostración = ''
while True:
if es_prueba_peano(demostración, fórmula) == 'sí':
return 'sí'
demostración = utilidades.siguiente_string(demostración)El hecho de que EsTeoremaPeano sea semidecidible es extremadamente importante, y se debe a una propiedad sintáctica de : es recursivamente axiomatizable.
Un sistema formal es recursivamente axiomatizable si sus axiomas son recursivamente enumerables, esto es, si existe un programa que enumera sus axiomas.16
Decir que un sistema lógico es recursivamente axiomatizable no es más que decir que el problema es semidecidible. Esta propiedad es fundamental para la prueba que realizaremos del Primer Teorema de Incompletitud (Teorema 5.2), pues si no fuese recursivamente axiomatizable, no podríamos usar la función es_teorema_peano.
El problema EsTeorema guarda una fuerte relación con el Entscheidungsproblem (ver Capítulo 1). Este problema pretende encontrar un algoritmo general que, dada una afirmación matemática, determine si es un teorema. Por la Proposición 4.28, EsTeoremaPeano es no decidible, lo cual prueba el Entscheidungsproblem en el caso particular de la aritmética de Peano. El argumento que hemos realizado es similar al que hizo Turing en 17.
Finalmente, dado que es un sistema lógico, nos podemos preguntar por su solidez y completitud. La pregunta sobre si es completo es el objeto central de este trabajo, y se tratará en el Capítulo 5.
Preguntarnos por la solidez de es una pregunta compleja. En este trabajo, asumiremos su solidez, dado que es razonable que los teoremas de sean verdaderos.18
4.5 Completitud sintáctica y consistencia
Los libros de lógica son extremadamente inconsistentes19 al definir propiedades de sistemas lógicos (incluso al definir qué es un sistema formal y un sistema lógico). Por ahora, hemos definido las propiedades de solidez, completitud (semántica) y decidibilidad. Existe otra definición de completitud que depende únicamente de la sintaxis, y que por tanto es aplicable para sistemas formales.20
Para esta definición, el lenguaje formal debe incluir una noción bien definida de negación (). Es el caso de teorías de primer orden como la aritmética de Peano o la teoría de conjuntos de Zermelo–Fraenkel, aunque la negación también está disponible en otros lenguajes lógicos.
Para esta clase de sistemas también es posible definir una nueva propiedad: la consistencia. Nuevamente, podemos definir dos tipos de consistencia, una sintáctica y una semántica.
Sea un sistema formal. Siempre que sea posible, decimos que es sintácticamente consistente si, para toda fórmula de , no es posible que tanto como sean teoremas.
Sea un sistema lógico. Siempre que sea posible, decimos que es semánticamente consistente si, para toda fórmula de , no es posible que tanto como sean verdaderas.
En otras palabras, un sistema es consistente si no da lugar a demostraciones o a verdades contradictorias. En un sistema sólido y completo, una fórmula es consistente sintácticamente si y solo si lo es semánticamente.
Es importante hacer una apreciación respecto a las definiciones de completitud y consistencia sintácticas: a pesar de que las definimos para sistemas formales, es sencillo extender esta definición a sistemas lógicos, teniendo en cuenta su sintaxis.
De este modo, decimos que un sistema lógico es sintácticamente completo si, dada una fórmula de , o son teoremas. Análogamente, es sintácticamente consistente si no es posible que tanto como sean teoremas.
Las definiciones que hemos hecho hasta este punto (sin incluir la de decidibilidad) se encuentran resumidas en la Figura 4.34.
Sean un sistema lógico y una fórmula de .
*definición también aplicable a sistemas formales
Notas al pie
Vinnikov, V. (1999). We shall know: Hilbert's apology. Mathematical Intelligencer, 21(1):42–46.
↩Siempre que hablamos de fórmulas nos referimos a fórmulas bien formadas.
↩Aquí el símbolo de suma
↩+es un literal, no el operador .Cuando una fórmula no está bien definida o no tiene una interpretación definida, podemos asumir que es falsa.
↩Más adelante introducimos la noción de completitud sintáctica (Definición 4.31). Siempre que llamemos a un sistema completo, sin especificar, nos referiremos a su completitud semántica.
↩Se pueden traducir sencillamente a aritmética de Peano. Por ejemplo, (PF2) es , y (PF6) es . Aunque las operaciones de comparación y exponenciación no estén inicialmente definidas en , podemos definirlas mediante fórmulas del sistema.
↩significa iterar tres veces: .
↩El último teorema de Fermat tiene especial relevancia histórica: fue formulado en 1637 y no fue resuelto hasta el año 1995 por Andrew Wiles.
↩Wiles, A. (1995). Modular elliptic curves and Fermat's Last Theorem. Annals of Mathematics, 141(3):443–551.
↩Recuerda que en la Definición 4.6 dijimos que la asignación de verdad puede estar definida para un subconjunto de las fórmulas.
↩MacCormick, J. (2018). What Can Be Computed? Princeton University Press.
↩ ↩2 ↩3Probamos la equivalencia en el Teorema 2.23.
↩Henderson, J. (2013). Gödel's First Incompleteness Theorem in Python. https://github.com/johnyf/godel_py
↩Observa que y (véanse el Problema 4.21 y el Problema 4.19).
↩Usamos del inglés halting.
↩Si es infinito, el programa correrá infinitamente.
↩Turing, A.M. (1937). On computable numbers, with an application to the Entscheidungsproblem. Proceedings of the London Mathematical Society, 42(1):230–265.
↩Puedes ver tales axiomas en Aritmética de Peano.
↩Nótese la ironía.
↩Kleene, S.C. (1971). Introduction to Metamathematics. North-Holland.
↩Es decir, que en el sistema formal esté bien definida la noción de negación ().
↩Es posible que tanto como sean teoremas.
↩