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.

34 min de lectura

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!»

David Hilbert, citado en Vinnikov (1999)1

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.

Definición4.1—Sistema formal

Un sistema formal, S\mathcal{S}, es una tripleta S=(L,A,R)\mathcal{S} = (\mathcal{L}, \mathcal{A}, \mathcal{R}), donde:

  • L\mathcal{L} es el lenguaje formal sobre un cierto alfabeto AA. Cada uno de los elementos del lenguaje se denomina fórmula bien formada (o fórmula).2
  • A\mathcal{A} es el conjunto de axiomas, que es un conjunto de fórmulas de L\mathcal{L}.
  • R\mathcal{R} es el conjunto de reglas de inferencia, que es un conjunto de funciones que mapean fórmulas de L\mathcal{L}, llamadas premisas, en fórmulas de L\mathcal{L}, llamadas derivaciones. Todas las funciones de R\mathcal{R} deben ser computables (ver Definición 3.9).

Si dadas dos fórmulas ϕ1,ϕ2∈L\phi_1, \phi_2\in\mathcal{L}, ϕ2\phi_2 se deriva a partir de ϕ1\phi_1, usaremos la notación ϕ1↦ϕ2\phi_1 \mapsto \phi_2. Si ϕ2\phi_2 se deriva a partir de ϕ1\phi_1 en un número finito de derivaciones, usaremos la notación ϕ1↦∗ϕ2\phi_1 \xmapsto{*}\phi_2.

Veamos un ejemplo de sistema formal que nos será extremadamente útil en este capítulo.

Sistema formal4.2—SumaBinaria\textbf{SumaBinaria}

Sea SumaBinaria=(L,A,R)\textbf{SumaBinaria}=(\mathcal{L}, \mathcal{A}, \mathcal{R}) el sistema formal compuesto por:

  • Lenguaje L\mathcal{L}: está formado sobre el alfabeto {0,1,+,=}\{\texttt{0}, \texttt{1}, \texttt{+}, \texttt{=}\}, y es el reconocido por la expresión regular3
N(+N)∗=N(+N)∗N(\texttt{+}N)^* = N(\texttt{+}N)^*

donde NN es una abreviatura de la expresión regular 1(0∣1)∗\texttt{1}(\texttt{0}|\texttt{1})^*.

  • Conjunto de axiomas A\mathcal{A}: está formado por un único axioma,
A={1=1}\mathcal{A} = \{\texttt{1=1}\}
  • Conjunto de reglas de inferencia R\mathcal{R}: son las siguientes:
(R1)A=B↦1+A=1+B(R2)AN‾+N‾B↦AN0B(R3)A1‾+N0‾B↦AN1B\begin{matrix} \text{(R1)} & A\texttt{=}B & \mapsto & \texttt{1+}A\texttt{=}\texttt{1+}B \\ \text{(R2)} & A\underline{N}\texttt{+}\underline{N}B & \mapsto & AN\texttt{0}B \\ \text{(R3)} & A\texttt{\underline{1}+}\underline{N\texttt{0}}B & \mapsto & AN\texttt{1}B \end{matrix}

donde usamos la siguiente notación: AA y BB son palabras del alfabeto {0,1,+,=}\{\texttt{0}, \texttt{1}, \texttt{+}, \texttt{=}\} y NN es una palabra que obedece la expresión regular 1(0∣1)∗\texttt{1}(\texttt{0}|\texttt{1})^*. Las partes subrayadas son coincidencias maximales de la expresión regular de NN.

Es importante recalcar la notación usada para describir las reglas de inferencia de SumaBinaria\textbf{SumaBinaria}, en concreto, sobre el significado de coincidencia maximal. Una coincidencia maximal, en este caso, es una subcadena que verifica la expresión regular de NN 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.

Definición4.3—Teorema y demostración

Dado un sistema formal S=(L,A,R)\mathcal{S}=(\mathcal{L}, \mathcal{A}, \mathcal{R}), una demostración de una fórmula de S\mathcal{S} es una secuencia finita de fórmulas de S\mathcal{S}, 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 ϕ∈L\phi\in \mathcal{L} se dice teorema (o fórmula demostrable) si existe una demostración en S\mathcal{S}.

Veamos un ejemplo de teorema en SumaBinaria\textbf{SumaBinaria}.

Ejemplo4.4

Sea 1+1+1=11 una fórmula de SumaBinaria\textbf{SumaBinaria}. Veamos que es un teorema:

Paso Fórmula Justificación
(F1) 1=1 (axioma)
↦\mapsto (F2) 1+1=1+1 (aplicar R1 a F1)
↦\mapsto (F3) 1+1=10 (aplicar R2 a F2)
↦\mapsto (F4) 1+1+1=1+10 (aplicar R1 a F3)
↦\mapsto (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 SumaBinaria\textbf{SumaBinaria} pretende comprobar fórmulas de la suma binaria. De este modo, una palabra como 11 representa el número 33, y una fórmula como 1+1+1=11 representa que 1+1+1=31+1+1=3. Observa que esto nos permite reconocer si una fórmula de SumaBinaria\textbf{SumaBinaria} 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 SumaBinaria\textbf{SumaBinaria} obtenemos el sistema lógico SumaBinariaLoˊgico\textbf{SumaBinariaLógico}.

Sistema lógico4.5—SumaBinariaLoˊgico\textbf{SumaBinariaLógico}

Sea SumaBinariaLoˊgico\textbf{SumaBinariaLógico} el sistema lógico que se obtiene al añadir la semántica de la aritmética al sistema formal SumaBinaria\textbf{SumaBinaria}.

Una fórmula en SumaBinariaLoˊgico\textbf{SumaBinariaLógico} 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:

Definición4.6—Sistema lógico

Un sistema lógico G=(S,I)\mathcal{G} = (\mathcal{S}, \mathcal{I}) consiste en un sistema formal S=(L,A,R)\mathcal{S}=(\mathcal{L}, \mathcal{A}, \mathcal{R}) y una semántica o asignación de verdad I\mathcal{I}, donde I\mathcal{I} es una función que asigna a fórmulas de L\mathcal{L} una interpretación, que es un valor del conjunto {verdadero,falso}\{\text{verdadero}, \text{falso}\}.

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:

Definición—Fórmula verdadera y fórmula falsa

Dado un sistema lógico G=(S,I)\mathcal{G}=(\mathcal{S}, \mathcal{I}) con S=(L,A,R)\mathcal{S}=(\mathcal{L}, \mathcal{A}, \mathcal{R}), decimos que la fórmula ϕ∈L\phi \in \mathcal{L} es verdadera si I(ϕ)\mathcal{I}(\phi) está bien definido y es I(ϕ)=verdadero\mathcal{I}(\phi)=\text{verdadero}. En caso contrario, decimos que la fórmula es falsa.

Veamos ejemplos de fórmulas verdaderas y falsas para SumaBinariaLoˊgico\textbf{SumaBinariaLógico}.

Ejemplo4.7

Sea 1+1+1=11 una fórmula de SumaBinariaLoˊgico\textbf{SumaBinariaLógico}. Claramente, esta fórmula es verdadera dado que la siguiente operación aritmética es cierta para el sistema de numeración binario:

1+1+1=111+1+1=11

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 SumaBinariaLoˊgico\textbf{SumaBinariaLógico}.

Sistema lógico4.8—SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto}

Sea SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto} el sistema lógico que se obtiene al añadir la regla de inferencia siguiente a SumaBinariaLoˊgico\textbf{SumaBinariaLógico}:

(R1b)A=B↦1+A=B\begin{matrix} \text{(R1b)} & A\texttt{=}B & \mapsto & \texttt{1+}A\texttt{=}B \end{matrix}
Sistema lógico4.9—SumaBinariaLoˊgicoRestringido\textbf{SumaBinariaLógico}\allowbreak\textbf{Restringido}

Sea SumaBinariaLoˊgicoRestringido\textbf{SumaBinariaLógico}\allowbreak\textbf{Restringido} el sistema lógico que se obtiene al eliminar la regla de inferencia (R3) a SumaBinariaLoˊgico\textbf{SumaBinariaLógico}.

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).

Ejemplo4.10

La fórmula 1+1=1 es un teorema y no es verdadera en SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto}.

Claramente, 1+1=11+1=1 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')
False
Ejemplo4.11

La fórmula 1+10=11 no es un teorema y es verdadera en SumaBinariaLoˊgicoRestringido\textbf{SumaBinariaLógico}\allowbreak\textbf{Restringido}.

La fórmula es verdadera dado que 1+10=111+10=11 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')
True

Es 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.

Definición4.12—Solidez

Un sistema lógico es sólido si todos sus teoremas son verdaderos. En caso contrario, decimos que es no sólido.

Definición4.13—Completitud

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 SumaBinariaLoˊgico\textbf{SumaBinariaLógico} 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.

Proposición

El sistema lógico SumaBinariaLoˊgico\textbf{SumaBinariaLó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 N+NN+N por el número par N0N0, y (R3) reemplaza 1+N01+N0 por el número impar N1N1. 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.

∎
Proposición4.14

El sistema lógico SumaBinariaLoˊgico\textbf{SumaBinariaLó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 1=11=1.

Ahora, comprobemos cada regla.

(R1) A=B↦1+A=1+BA\texttt{=}B \mapsto \texttt{1+}A\texttt{=}\texttt{1+}B

En este caso, si AA y BB son números binarios y asumimos que la fórmula A=BA\texttt{=}B es verdadera, entonces tenemos que A=BA=B. Por tanto, la fórmula 1+A=1+B\texttt{1+}A\texttt{=1+}B es verdadera, ya que es cierto que 1+A=1+B1+A=1+B.

(R2) AN‾+N‾B↦AN0BA\underline{N}\texttt{+}\underline{N}B \mapsto AN\texttt{0}B

El hecho de que las NN tengan coincidencias maximales nos lleva a comprobar si dado NN un número binario, asumiendo que N+NN\texttt{+}N es verdadera tenemos que N0N\texttt{0} es verdadera, o lo que es lo mismo, debemos comprobar que N+N=N0N\texttt{+}N=N\texttt{0}.

Un número binario NN se representa mediante mm dígitos, ya sean 00 o 11, siendo N=nm−1 nm−2 ... n1 n0N=n_{m-1}\:n_{m-2}\:...\:n_1\:n_0, y se verifica que:

N=nm−1⋅2m−1+nm−2⋅2m−2+...+n1⋅2+n0N = n_{m-1}\cdot2^{m-1} + n_{m-2}\cdot2^{m-2}+...+n_1\cdot2+n_0

Basta ver que:

N+N=2N=nm−1⋅2m+nm−2⋅2m−1+...+n1⋅22+n0⋅2N+N=2N=n_{m-1}\cdot2^{m} + n_{m-2}\cdot2^{m-1}+...+n_1\cdot2^2+n_0\cdot 2

y que el número N+NN+N corresponde exactamente a nm−1 nm−2 ... n1 n0 0=N0n_{m-1}\:n_{m-2}\:...\:n_1\:n_0\:0=N\texttt{0}.

(R3) A1‾+N0‾B↦AN1BA\texttt{\underline{1}+}\underline{N\texttt{0}}B \mapsto AN\texttt{1}B

De forma análoga a la regla anterior, comprobamos que:

1+N0=N0+1=nm−1⋅2m+nm−2⋅2m−1+...+n1⋅22+n0⋅2+1=N11+N\texttt{0}=N\texttt{0}+1=n_{m-1}\cdot2^{m} + n_{m-2}\cdot2^{m-1}+...+n_1\cdot2^2+n_0\cdot 2+1=N\texttt{1}
∎
Proposición4.15

El sistema lógico SumaBinariaLoˊgico\textbf{SumaBinariaLógico} es completo.

Demostración

Veremos que toda fórmula verdadera es un teorema. Vemos en primer lugar que toda fórmula verdadera ϕ\phi es del tipo

ϕ=N1+N2+...+Nk=M1+M2+...+Ml\phi=N_1\texttt{+}N_2\texttt{+}...\texttt{+}N_k\texttt{=}M_1\texttt{+}M_2\texttt{+}...\texttt{+}M_l

donde cada Ni,Mj  ∀i∈{1,2,...,k},j∈{1,2,...,l}N_i, M_j\;\forall i\in\{1, 2, ..., k\}, j\in\{1, 2, ..., l\} es un número binario (que verifica la expresión regular 1(0|1)*\texttt{1(0|1)}^\texttt{*}), y de modo que la siguiente fórmula aritmética es cierta:

N1+N2+...+Nk=M1+M2+...+MlN_1+N_2+...+N_k=M_1+M_2+...+M_l

Nuestro objetivo es probar que la fórmula ϕ\phi es un teorema. Para ello, vamos a probar que, dado un número binario nn que sea coincidencia maximal de la expresión regular 1(0|1)*\texttt{1(0|1)*}, éste puede derivarse a partir de la suma de nn unos, es decir, debemos probar que:

A1+1+...+1⏟nB↦∗An‾BA\underbrace{\texttt{1+1+}...\texttt{+1}}_{n}B\xmapsto{*}A\underline{n}B

Dado que, por ser esto cierto, tenemos que:

ψ=1+...+1⏟N1+1+...+1⏟N2+...+1+...+1⏟Nk=1+...+1⏟M1+...+1+...+1⏟Ml↦∗ϕ\psi=\underbrace{\texttt{1+...+1}}_{N_1}\texttt{+}\underbrace{\texttt{1+...+1}}_{N_2}\texttt{+}...\texttt{+}\underbrace{\texttt{1+...+1}}_{N_k}\texttt{=}\underbrace{\texttt{1+...+1}}_{M_1}\texttt{+}...\texttt{+}\underbrace{\texttt{1+...+1}}_{M_l}\xmapsto{*}\phi

Y como tenemos N1+N2+...+NkN_1+N_2+...+N_k unos a la izquierda de = y M1+M2+...+MlM_1+M_2+...+M_l a la derecha, y es

N1+N2+...+Nk=M1+M2+...+Ml=nN_1+N_2+...+N_k=M_1+M_2+...+M_l=n

tenemos que

ψ=1+1+...+1⏟n=1+1+...+1⏟n\psi=\underbrace{\texttt{1+1+}...\texttt{+1}}_{n}\texttt{=}\underbrace{\texttt{1+1+}...\texttt{+1}}_{n}

pero es claro que podemos obtener ψ\psi aplicando la regla (R1) n−1n-1 veces a partir del axioma 1=1\texttt{1=1}, luego es

1=1↦∗ψ=1+1+...+1⏟n=1+1+...+1⏟n↦∗ϕ\texttt{1=1}\xmapsto{*}\psi=\underbrace{\texttt{1+1+}...\texttt{+1}}_{n}\texttt{=}\underbrace{\texttt{1+1+}...\texttt{+1}}_{n}\xmapsto{*}\phi

y como 1=1↦∗ϕ\texttt{1=1}\xmapsto{*}\phi y es 1=1 un axioma, ϕ\phi es un teorema.

Probemos que, en efecto, es

A1+1+...+1⏟nB↦∗An‾BA\underbrace{\texttt{1+1+}...\texttt{+1}}_{n}B\xmapsto{*}A\underline{n}B

Para ello, primero observemos que, si mm es un número binario positivo, entonces puede que sea par o impar.

Si m>1m>1 es impar, entonces puede ser escrito con kk dígitos: m=bk−1 bk−2 ... b1 1m=b_{k-1}\:b_{k-2}\:...\:b_1\:\texttt{1}. Sea φ\varphi una fórmula de SumaBinariaLoˊgico\textbf{SumaBinariaLógico}, y supongamos que φ\varphi contiene un substring mm como coincidencia maximal de 1(0|1)*\texttt{1(0|1)}^\texttt{*}, es decir, φ=A m‾ B\varphi=A\:\underline{m}\:B. Entonces, φ\varphi puede ser derivado de un cierto φ′\varphi', φ′↦φ\varphi'\mapsto\varphi mediante la regla (R3), siendo

φ′=A 1+bk−1 bk−2 ... b1 0‾ B\varphi'=A\:\texttt{1+}\underline{b_{k-1}\:b_{k-2}\:...\:b_1\:\texttt{0}}\:B

En caso de que mm sea par, es claro que puede expresarse como la suma p+pp+p, cierto pp un cierto binario positivo. Entonces, si φ\varphi contiene un substring mm como coincidencia maximal de 1(0|1)*\texttt{1(0|1)}^\texttt{*}, φ=A m‾ B\varphi=A\:\underline{m}\:B, es φ′↦φ\varphi'\mapsto\varphi con

φ′=A p‾+p‾ B\varphi'=A\:\underline{p}\texttt{+}\underline{p}\:B

Sabiendo esto, cualquier ocurrencia de un entero positivo mm en una fórmula de SumaBinariaLoˊgico\textbf{SumaBinariaLógico} puede ser reducida a la suma de mm unos, es decir, dado φ=A m‾ B\varphi=A\:\underline{m}\:B, se tiene que:

A 1+1+...+1⏟m B↦∗φA\:\underbrace{\texttt{1+1+}...\texttt{+1}}_{m}\:B\xmapsto{*}\varphi

Esto es debido a que todo número natural mm puede ser reducido a la suma de mm unos aplicando recursivamente las operaciones anteriormente descritas (dividir por 22 en caso de ser par y restar 11 en caso de ser impar).

∎

Dado que los otros sistemas lógicos se «obtienen» a partir de SumaBinariaLoˊgico\textbf{SumaBinariaLógico}, las proposiciones siguientes son mucho más sencillas de demostrar. Como es evidente, el Ejemplo 4.10 y el Ejemplo 4.11 prueban que SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto} es no sólido y que SumaBinariaLoˊgicoRestringido\textbf{SumaBinariaLógico}\allowbreak\textbf{Restringido} es incompleto, respectivamente.

Veamos a continuación tales proposiciones.

Proposición

El sistema lógico SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto} es completo y no sólido.

Demostración

Es fácil ver que este sistema es completo a partir de la completitud de SumaBinariaLoˊgico\textbf{SumaBinariaLógico}. 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 ϕ\phi verdadera en SumaBinariaLoˊgico\textbf{SumaBinariaLógico} también lo es en SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto}.

Veamos si ϕ\phi es un teorema en SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto}. Por la completitud de SumaBinariaLoˊgico\textbf{SumaBinariaLógico}, ϕ\phi es un teorema en este sistema. Pero como SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto} tiene todas las reglas de SumaBinariaLoˊgico\textbf{SumaBinariaLógico} (y una más), ϕ\phi también es un teorema en SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto}.

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.

∎
Proposición

El sistema lógico SumaBinariaLoˊgicoRestringido\textbf{SumaBinariaLógico}\allowbreak\textbf{Restringido} 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 SumaBinariaLoˊgico\textbf{SumaBinariaLógico}.

Sea ϕ\phi un teorema de SumaBinariaLoˊgicoRestringido\textbf{SumaBinariaLógico}\allowbreak\textbf{Restringido}. Como SumaBinariaLoˊgico\textbf{SumaBinariaLógico} tiene todas las reglas de SumaBinariaLoˊgicoRestringido\textbf{SumaBinariaLógico}\allowbreak\textbf{Restringido} (y una más), ϕ\phi es un teorema en SumaBinariaLoˊgico\textbf{SumaBinariaLógico}. De la solidez de SumaBinariaLoˊgico\textbf{SumaBinariaLógico}, ϕ\phi es verdadero. Pero como SumaBinariaLoˊgicoRestringido\textbf{SumaBinariaLógico}\allowbreak\textbf{Restringido} tiene la misma semántica, ϕ\phi también será verdadero en este sistema.

∎

Los sistemas lógicos SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto} y SumaBinariaLoˊgicoRestringido\textbf{SumaBinariaLógico}\allowbreak\textbf{Restringido} los obtuvimos modificando la sintaxis de SumaBinariaLoˊgico\textbf{SumaBinariaLógico}. Introducimos ahora el último sistema de este tipo, que surge de modificar la semántica de SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto}.

Sistema lógico4.16—SumaBinariaLoˊgicoArreglado\textbf{SumaBinariaLógicoArreglado}

Sea SumaBinariaLoˊgicoArreglado\textbf{SumaBinariaLógicoArreglado} el sistema lógico que se obtiene a partir de SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto} 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» (≥\geq).

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.

Ejemplo4.17

La fórmula 1+1=1 es verdadera en SumaBinariaLoˊgicoArreglado\textbf{SumaBinariaLógicoArreglado}, 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')
False

Al modificar la semántica, hemos logrado «arreglar» el sistema SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto}, como bien dice su nombre. En efecto, SumaBinariaLoˊgicoArreglado\textbf{SumaBinariaLógicoArreglado} es completo y sólido.

Proposición

El sistema lógico SumaBinariaLoˊgicoArreglado\textbf{SumaBinariaLógicoArreglado} 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 ≥\geq. La completitud usa la misma reducción a sumas de unos que SumaBinariaLoˊgico\textbf{SumaBinariaLógico}, y después aplica (R1b) las veces suficientes para compensar la diferencia n−mn-m. El argumento detallado es la Proposición 4.18 a continuación.

∎
Proposición4.18

El sistema lógico SumaBinariaLoˊgicoArreglado\textbf{SumaBinariaLógicoArreglado} es completo.

Demostración

Para demostrar esto, usaremos el resultado obtenido en la proposición anterior. Toda fórmula verdadera ϕ\phi es del tipo

ϕ=N1+N2+...+Nk=M1+M2+...+Ml\phi=N_1\texttt{+}N_2\texttt{+}...\texttt{+}N_k\texttt{=}M_1\texttt{+}M_2\texttt{+}...\texttt{+}M_l

donde cada Ni,Mj  ∀i∈{1,2,...,k},j∈{1,2,...,l}N_i, M_j\;\forall i\in\{1, 2, ..., k\}, j\in\{1, 2, ..., l\} es un número binario (que verifica la expresión regular 1(0|1)*\texttt{1(0|1)}^\texttt{*}), y de modo que la siguiente fórmula aritmética es cierta:

N1+N2+...+Nk≥M1+M2+...+MlN_1+N_2+...+N_k\geq M_1+M_2+...+M_l

Vamos a llamar a ambas partes con nn y mm:

n=N1+N2+...+Nk,m=M1+M2+...+Mln=N_1+N_2+...+N_k, \qquad m=M_1+M_2+...+M_l

Como n≥mn\geq m, existe un p≥0p\geq 0 de modo que n=m+pn=m+p. Ya probamos en la proposición anterior que:

ψ=1+...+1⏟p+1+...+1⏟m=1+...+1⏟m↦∗ϕ\psi=\underbrace{\texttt{1+...+1}}_{p}\texttt{+}\underbrace{\texttt{1+...+1}}_{m}\texttt{=}\underbrace{\texttt{1+...+1}}_{m}\xmapsto{*}\phi

Ahora basta ver que:

1=1⟼∗(1)1+...+1⏟m=1+...+1⏟m⟼∗(2)ψ↦∗ϕ\texttt{1=1}\underset{(1)}{\overset{*}{\longmapsto}}\underbrace{\texttt{1+...+1}}_{m}\texttt{=}\underbrace{\texttt{1+...+1}}_{m}\underset{(2)}{\overset{*}{\longmapsto}}\psi\xmapsto{*}\phi

Donde en (1)(1) aplicamos m−1m-1 veces la regla (R1) y en (2)(2) aplicamos pp 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
SumaBinariaLoˊgico\textbf{SumaBinariaLógico} (reglas R1, R2, R3) sí sí sí
SumaBinariaLoˊgicoRoto\textbf{SumaBinariaLógicoRoto} (reglas R1, R1b, R2, R3) no sí sí
SumaBinariaLoˊgicoRestringido\textbf{SumaBinariaLógico}\allowbreak\textbf{Restringido} (reglas R1, R2) sí no sí
SumaBinariaLoˊgicoArreglado\textbf{SumaBinariaLógicoArreglado} (reglas R1, R1b, R2, R3 y una semántica diferente) sí sí sí
Peano\textbf{Peano} asumido no no
Tabla 4.1. Solidez, completitud y decidibilidad de los sistemas lógicos de este capítulo.

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 G\mathcal{G} podemos definir un problema de decisión, EsVerdaderoG\textsc{EsVerdadero}_\mathcal{G}.

Problema4.19—EsVerdaderoG_\mathcal{G}
  • Entrada: una fórmula ϕ\phi de G\mathcal{G}.
  • Salida: sí si I(ϕ)\mathcal{I}(\phi) está bien definido y I(ϕ)=verdadero\mathcal{I}(\phi)=\text{verdadero}, y no en caso contrario.

Para cada sistema lógico G\mathcal{G} 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.

Definición4.20—Decidibilidad de un sistema lógico

Decimos que un sistema lógico G\mathcal{G} es decidible si el problema de decisión EsVerdaderoG\textsc{EsVerdadero}_\mathcal{G} 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 EsTeoremaS\textsc{EsTeorema}_\mathcal{S} (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.

Problema4.21—EsTeoremaS_\mathcal{S}
  • Entrada: una fórmula ϕ\phi de S\mathcal{S}.
  • Salida: sí si ϕ\phi es un teorema de S\mathcal{S}, y no en caso contrario.

Veamos si los sistemas lógicos que hemos introducido en este capítulo son decidibles. En el caso de SumaBinariaLoˊgico\textbf{SumaBinariaLógico}, 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')
False

En 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')
True

4.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 Peano\textbf{Peano} 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.

Nota4.22—Algunos detalles de Peano\textbf{Peano}

La aritmética de Peano se compone de símbolos lógicos como ∀\forall, ∃\exists, ∨\vee, ∧\wedge, ¬\neg, ==, ⇒\Rightarrow y   ⟺  \iff. Los axiomas y reglas de inferencia de Peano\textbf{Peano} permiten deducir propiedades de los números naturales. Éstos se representan a partir del 00 mediante la función sucesora SS, de modo que 11 es S(0)S(0), 22 es S(S(0))S(S(0)), etc. De forma general, S(n)S(n) representa n+1n+1 para un natural n∈Nn\in\mathbb{N}.

Las reglas de inferencia incluyen fórmulas lógicas clásicas, tales como el modus ponens: dado aa y a⇒ba\Rightarrow b, podemos deducir bb.

En este sistema podemos producir fórmulas sobre aritmética muy interesantes. Vemos algunas de ellas a continuación.

Ejemplo4.23—Fórmulas de Peano

Algunas fórmulas de Peano\textbf{Peano} (expresadas en lenguaje natural):6

  1. (PF1) 1+1=21 + 1 = 2.
  2. (PF2) Para todo entero xx, es x2+1>0x^2 + 1 > 0.
  3. (PF3) 22 y 55 son divisores de 3030.
  4. (PF4) 1313 es primo.
  5. (PF5) Sea f(x)=x2+1f(x)=x^2+1. Entonces, f3(0)=5f^3(0)=5.7
  6. (PF6) Si n>2n>2, no existen enteros positivos x,y,zx,y,z tales que xn+yn=znx^n+y^n=z^n (el último teorema de Fermat).
  7. (PF7) Sea f(x)=x+2f(x)=x+2. Entonces, para todo entero positivo yy existe un entero positivo xx de modo que f(x)=yf(x)=y.

Para poder trabajar con Peano\textbf{Peano} 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
¬(p)\neg(p) NO (p) Negación
(p)∨(q)(p) \vee (q) (p) Ó (q) Disyunción
∀x:p\forall x : p PARA TODO (x) : (p) Cuantificador universal
S(a)S(a) S(a) Sucesor
∃x:p\exists x : p EXISTE (x) : (p) Cuantificador existencial
(p)⇒(q)(p) \Rightarrow (q) (p) => (q) Implicación
(p)  ⟺  (q)(p) \iff (q) (p) <=> (q) Coimplicación
(p)=(q)(p) = (q) (p) = (q) Igualdad
Tabla 4.2. Una forma de traducir los símbolos de la aritmética de Peano a strings.

Por ejemplo, consideremos la afirmación «no existen enteros xx e yy de modo que 2x=y2x=y e y=3y=3», que puede representarse en Peano\textbf{Peano} como ¬∃x,y:S(S(0))⋅x=y∧y=S(S(S(0)))\neg\exists x, y : S(S(0)) \cdot x = y \wedge y = S(S(S(0))) 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 Peano\textbf{Peano}, 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 Peano\textbf{Peano} es verdadera, necesitamos que sea cerrada: esto ocurre si todas sus variables son cuantificadas por un «para todo» (∀\forall) o un «existe» (∃\exists).10 Un ejemplo de esto es ∀x,y:x=y∧x+S(0)=y+S(0)\forall x,y : x=y \wedge x+S(0)=y+S(0), que es una fórmula cerrada pues xx e yy son cuantificadas, mientras que x=y∧x+S(0)=y+S(0)x=y \wedge x+S(0)=y+S(0) 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 Peano\textbf{Peano} 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 Peano\textbf{Peano}. La siguiente proposición muestra cómo hacerlo para un conjunto concreto de fórmulas sobre los programas que necesitaremos más adelante.11

Proposición4.24

Sea PP un programa de ordenador (o una máquina de Turing).12 La afirmación HH dada por

«PP para con entrada vacía»

puede ser traducida en una fórmula ϕH\phi_H equivalente en Peano\textbf{Peano}. (En este caso, con «equivalente» nos referimos a que HH es verdadera si y solo si ϕH\phi_H 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:

qR  :  X X X X a        ⟶        q_R : X X ˆX X aq_R\;:\;X\:X\:\boxed{X}\:X\:a \;\;\;\; \longrightarrow \;\;\;\; \texttt{q\_R : X X \^{}X X a}

Del mismo modo, podemos codificar los strings mediante números en un string binario (una palabra del alfabeto {0,1}\{\texttt{0}, \texttt{1}\}). 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 Paso\text{Paso}, 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 Paso\text{Paso} 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 c0c_0 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á Paso(c0)\text{Paso}(c_0), y tras dos pasos, será Paso(Paso(c0))\text{Paso}(\text{Paso}(c_0)). Podemos abreviar esto como Paso2(c0)\text{Paso}^2(c_0). Tras nn pasos, la configuración de la máquina será Pason(c0)\text{Paso}^n(c_0). 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

«PP para con entrada vacía»

es equivalente a

«Existe un natural nn de modo que Pason(c0)\text{Paso}^n(c_0) 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 Parado\text{Parado} que tiene como entrada un entero mm y como salida 00 ó 11. Parado(m)=1\text{Parado}(m)=1 si la configuración mm es de parada, y Parado(m)=0\text{Parado}(m)=0 en caso contrario.

Escribir esta función en Peano\textbf{Peano} 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 Parado(Pason(c0))\text{Parado}(\text{Paso}^n(c_0)) es una fórmula de Peano\textbf{Peano} para un natural n∈Nn\in\mathbb{N} y un binario c0c_0. Por tanto, la afirmación:

«Existe un natural nn de modo que Parado(Pason(c0))=1\text{Parado}(\text{Paso}^n(c_0))=1»

también puede traducirse a una fórmula de Peano\textbf{Peano}. Esta afirmación es equivalente a las anteriores, y es esta fórmula justamente la ϕH\phi_H que buscamos.

∎

De la prueba anterior, es evidente que la construcción de ϕH\phi_H a partir de HH 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

Problema4.25—EsTeoremaPeano
  • Entrada: una fórmula ϕ\phi de Peano\textbf{Peano}.
  • Salida: sí si ϕ\phi es una fórmula bien formada y cerrada en Peano\textbf{Peano}, y se trata de un teorema de Peano\textbf{Peano}; no en caso contrario.
Problema4.26—EsVerdaderoPeano
  • Entrada: una fórmula ϕ\phi de Peano\textbf{Peano}.
  • Salida: sí si ϕ\phi es una fórmula bien formada, cerrada y verdadera en Peano\textbf{Peano}; no en caso contrario.

Dada una afirmación ϕ\phi en Peano\textbf{Peano}, los problemas anteriores preguntan si ϕ\phi 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 Peano\textbf{Peano} no es decidible (como ya adelantamos en la Tabla 4.1).11

Proposición4.27

Peano\textbf{Peano} es no decidible.

Demostración

Procederemos mediante la reducción ParadaEnVacıˊo\textsc{ParadaEnVacío} (Problema 3.25) ≤TEsVerdaderoPeano\leq_T \textsc{EsVerdaderoPeano}.

Probaremos que esta reducción se implementa en el Programa 4.1. La función main tiene como entrada un programa PP. Usando la Proposición 4.24, convertimos la afirmación H=“P para con entrada vacıˊa”H = \text{``P para con entrada vacía''} en una fórmula ϕH\phi_H equivalente en la aritmética de Peano. Es importante notar que parada_a_peano es una función computable, como comentamos anteriormente. Claramente, PP para si y solo si ϕH\phi_H 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)
Proposición4.28

EsTeoremaPeano es no decidible.

Demostración

De forma similar a la Proposición 4.27, usaremos la reducción ParadaEnVacıˊo≤TEsVerdaderoPeano\textsc{ParadaEnVacío} \leq_T \textsc{EsVerdaderoPeano}.

Antes de esto, debemos apreciar una propiedad de las afirmaciones de la forma «PP para con entrada vacía». Llamemos a tal afirmación H(P)H(P),15 y mostraremos que para cualquier programa PP, si ϕH(P)\phi_{H(P)} es verdadera en Peano\textbf{Peano}, entonces es un teorema en Peano\textbf{Peano}. Es importante notar que este no es el caso para todas las fórmulas (si no, Peano\textbf{Peano} sería completo).

El motivo por el que esto ocurre justamente para las fórmulas ϕH(P)\phi_{H(P)} es porque, simplemente, debemos simular PP hasta que pare, algo que podemos definir mediante aritmética de Peano: simplemente calculamos Parado(Pason(c0))\text{Parado}(\text{Paso}^n(c_0)) para cada n∈Nn\in\mathbb{N} de forma incremental, hasta que el resultado sea 11.

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 ϕH(P)\phi_{H(P)} 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

Proposición4.29

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 Peano\textbf{Peano} 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 11, luego de longitud 22, 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.

∎
Programa4.2—es_teorema_peano.py
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 Peano\textbf{Peano}: es recursivamente axiomatizable.

Definición4.30—Recursivamente axiomatizable

Un sistema formal S\mathcal{S} 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 G\mathcal{G} es recursivamente axiomatizable no es más que decir que el problema EsTeoremaG\textsc{EsTeorema}_\mathcal{G} es semidecidible. Esta propiedad es fundamental para la prueba que realizaremos del Primer Teorema de Incompletitud (Teorema 5.2), pues si Peano\textbf{Peano} 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 Peano\textbf{Peano} es un sistema lógico, nos podemos preguntar por su solidez y completitud. La pregunta sobre si Peano\textbf{Peano} es completo es el objeto central de este trabajo, y se tratará en el Capítulo 5.

Preguntarnos por la solidez de Peano\textbf{Peano} es una pregunta compleja. En este trabajo, asumiremos su solidez, dado que es razonable que los teoremas de Peano\textbf{Peano} 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

Definición4.31—Completitud sintáctica

Sea S\mathcal{S} un sistema formal. Siempre que sea posible,21 decimos que S\mathcal{S} es sintácticamente completo si, para toda fórmula ϕ\phi de S\mathcal{S}, es ϕ\phi o ¬ϕ\neg\phi un teorema.22

Para esta definición, el lenguaje formal debe incluir una noción bien definida de negación (¬\neg). 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.

Definición4.32—Consistencia sintáctica

Sea S\mathcal{S} un sistema formal. Siempre que sea posible, decimos que S\mathcal{S} es sintácticamente consistente si, para toda fórmula ϕ\phi de S\mathcal{S}, no es posible que tanto ϕ\phi como ¬ϕ\neg\phi sean teoremas.

Definición4.33—Consistencia semántica

Sea G\mathcal{G} un sistema lógico. Siempre que sea posible, decimos que G\mathcal{G} es semánticamente consistente si, para toda fórmula ϕ\phi de G\mathcal{G}, no es posible que tanto ϕ\phi como ¬ϕ\neg\phi 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 G\mathcal{G} es sintácticamente completo si, dada una fórmula ϕ\phi de G\mathcal{G}, ϕ\phi o ¬ϕ\neg\phi son teoremas. Análogamente, G\mathcal{G} es sintácticamente consistente si no es posible que tanto ϕ\phi como ¬ϕ\neg\phi sean teoremas.

Las definiciones que hemos hecho hasta este punto (sin incluir la de decidibilidad) se encuentran resumidas en la Figura 4.34.

Nota4.34—Propiedades de los sistemas lógicos definidos en este capítulo

Sean G\mathcal{G} un sistema lógico y ϕ\phi una fórmula de G\mathcal{G}.

G soˊlido      :      ϕ teorema⇒ϕ verdadero\mathcal{G}\text{ sólido} \;\;\;:\;\;\; \phi\text{ teorema}\Rightarrow\phi\text{ verdadero}

(Definición 4.12)

G (semaˊnticamente) completo      :      ϕ verdadero⇒ϕ teorema\mathcal{G}\text{ (semánticamente) completo} \;\;\;:\;\;\; \phi\text{ verdadero}\Rightarrow\phi\text{ teorema}

(Definición 4.13)

G sintaˊcticamente completo*      :      ϕ o ¬ϕ son teoremas\mathcal{G}\text{ sintácticamente completo*} \;\;\;:\;\;\; \phi\text{ o }\neg\phi\text{ son teoremas}

(Definición 4.31)

G sintaˊcticamente consistente*      :      no son ϕ y ¬ϕ teoremas\mathcal{G}\text{ sintácticamente consistente*} \;\;\;:\;\;\; \text{no son }\phi\text{ y }\neg\phi\text{ teoremas}

(Definición 4.32)

G semaˊnticamente consistente      :      no son ϕ y ¬ϕ verdaderos\mathcal{G}\text{ semánticamente consistente} \;\;\;:\;\;\; \text{no son }\phi\text{ y }\neg\phi\text{ verdaderos}

(Definición 4.33)

*definición también aplicable a sistemas formales

Notas al pie

  1. Vinnikov, V. (1999). We shall know: Hilbert's apology. Mathematical Intelligencer, 21(1):42–46.

    ↩
  2. Siempre que hablamos de fórmulas nos referimos a fórmulas bien formadas.

    ↩
  3. Aquí el símbolo de suma + es un literal, no el operador ++.

    ↩
  4. Cuando una fórmula no está bien definida o no tiene una interpretación definida, podemos asumir que es falsa.

    ↩
  5. 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.

    ↩
  6. Se pueden traducir sencillamente a aritmética de Peano. Por ejemplo, (PF2) es ∀x:x2+1>0\forall x : x^2+1>0, y (PF6) es ∀n>2:¬∃x,y,z>0:xn+yn=zn\forall n>2 : \neg\exists x,y,z>0 : x^n+y^n=z^n. Aunque las operaciones de comparación y exponenciación no estén inicialmente definidas en Peano\textbf{Peano}, podemos definirlas mediante fórmulas del sistema.

    ↩
  7. f3f^3 significa iterar ff tres veces: f3(x)=f(f(f(x)))f^3(x)=f(f(f(x))).

    ↩
  8. 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.

    ↩
  9. Wiles, A. (1995). Modular elliptic curves and Fermat's Last Theorem. Annals of Mathematics, 141(3):443–551.

    ↩
  10. 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.

    ↩
  11. MacCormick, J. (2018). What Can Be Computed? Princeton University Press.

    ↩ ↩2 ↩3
  12. Probamos la equivalencia en el Teorema 2.23.

    ↩
  13. Henderson, J. (2013). Gödel's First Incompleteness Theorem in Python. https://github.com/johnyf/godel_py

    ↩
  14. Observa que EsTeoremaPeano=EsTeoremaPeano\textsc{EsTeoremaPeano} = \textsc{EsTeorema}_{\textbf{Peano}} y EsVerdaderoPeano=EsVerdaderoPeano\textsc{EsVerdaderoPeano} = \textsc{EsVerdadero}_{\textbf{Peano}} (véanse el Problema 4.21 y el Problema 4.19).

    ↩
  15. Usamos HH del inglés halting.

    ↩
  16. Si S\mathcal{S} es infinito, el programa correrá infinitamente.

    ↩
  17. Turing, A.M. (1937). On computable numbers, with an application to the Entscheidungsproblem. Proceedings of the London Mathematical Society, 42(1):230–265.

    ↩
  18. Puedes ver tales axiomas en Aritmética de Peano.

    ↩
  19. Nótese la ironía.

    ↩
  20. Kleene, S.C. (1971). Introduction to Metamathematics. North-Holland.

    ↩
  21. Es decir, que en el sistema formal esté bien definida la noción de negación (¬\neg).

    ↩
  22. Es posible que tanto ϕ\phi como ¬ϕ\neg\phi sean teoremas.

    ↩