Esta publicación ofrece un recorrido técnico por los conceptos fundamentales de la lógica proposicional y su implementación formal utilizando el lenguaje de programación y asistente de demostración de teoremas Lean 4.
Tanto si eres un matemático que busca formalizar demostraciones como un programador que se adentra en la teoría de tipos, esta guía reconstruye la lógica desde los primeros principios. Comenzaremos con las constantes lógicas básicas y exploraremos cómo Lean 4 modela con elegancia las construcciones lógicas mediante el isomorfismo de Curry-Howard: el principio de que las proposiciones son tipos y las demostraciones son programas.
Antes de definir nuestras conectivas lógicas, necesitamos configurar un entorno base. En Lean 4, esto suele hacerse mediante dos comandos específicos para controlar el ámbito (scope) y el comportamiento computacional.
namespace Basic
noncomputable section
namespace Basic: Este comando agrupa nuestras definiciones, evitando conflictos de nombres con la biblioteca integrada de Lean (el Prelude). Nos permite redefinir estructuras fundamentales como True, False y And desde cero con fines educativos.noncomputable section: Lean 4 es tanto un demostrador de teoremas como un lenguaje de programación funcional. Por defecto, intenta generar bytecode ejecutable para cada definición. Marcar una sección como noncomputable le indica al compilador que omita este paso, lo cual es habitual en la lógica formal, donde nos importan las propiedades matemáticas más que la ejecución en tiempo de ejecución.En esta sección definiremos los elementos fundacionales de la lógica, asociando la notación matemática estándar con el código en Lean 4.
True, ⊤)
🔗La proposición más simple es aquella que es universal y lógicamente válida. En términos de programación, se comporta como un tipo unidad (Unit type): tiene exactamente un estado y no transporta datos adicionales.
Definición:
inductive True : Prop where
| intro : True
Como se define con un único constructor (intro), la única forma de «demostrar» True es proporcionar exactamente este constructor.
Ejemplos:
-- Demostración incondicional de True
example : True := True.intro
-- Cualquier proposición 'a' implica trivialmente True
example {a : Prop} : a → True := fun _ => True.intro
False, ⊥)
🔗Mientras que True se define por la existencia trivial de una demostración, False se define por la ausencia total de ella. Es un tipo vacío (Empty type o Void type).
Definición:
inductive False : Prop
Como False no tiene constructores, nunca puedes instanciarlo de la nada. Representa una contradicción lógica.
El principio de explosión (Ex Falso Quodlibet):
Si alguna vez te encuentras con una demostración de False, la lógica se derrumba y puedes demostrar cualquier cosa. Lean gestiona esto mediante el recursor False.elim.
-- De una falsedad se sigue cualquier proposición 'a' (⊥ → a)
def False.elim {a : Prop} (false_proof : False) : a :=
false_proof.rec
En Lean 4, la negación no es un concepto primitivo integrado. En su lugar, se define funcionalmente mediante la implicación y False. Para demostrar que la proposición es falsa (denotado como ), debes construir una función en la que asumir conduzca directamente a una contradicción ().
Definición:
def Not (a : Prop) : Prop := a → False
Teoremas clave:
-- Demostración de la negación: si asumir 'a' demuestra False, entonces Not 'a' es verdadero.
theorem Not.intro {a : Prop} (h : a → False) : Not a :=
fun ha => h ha
-- Introducción de la doble negación (a → ¬¬a)
theorem not_not_intro {a : Prop} (ha : a) : Not (Not a) :=
fun na => na ha -- 'na' tiene tipo (a → False), por lo que pasarle 'ha' produce False.
-- Modus Tollens: Si (a → b) y (¬b), entonces (¬a)
theorem Not.imp {a b : Prop} (nb : Not b) (ab : a → b) : Not a :=
fun ha =>
have hb : b := ab ha
nb hb
Dado que Lean se basa en la teoría de tipos, la implicación lógica () se trata literalmente como una función. Para demostrar que implica , debes escribir una función que reciba una demostración arbitraria de y devuelva una demostración de .
Ejemplo de implicación encadenada: Si puedes transformar en , y transformar en , puedes transformar una función de en una de .
theorem imp_imp_imp {a b c d : Prop}
(ca : c → a) (bd : b → d) : (a → b) → (c → d) :=
fun ab => fun hc =>
have ha : a := ca hc
have hb : b := ab ha
bd hb
La conjunción lógica, que requiere que tanto como sean verdaderas, se modela como una estructura (structure). En términos de programación, se trata de un tipo producto (Product type) (un struct o tupla) que contiene dos pruebas independientes.
Definición:
structure And (a b : Prop) : Prop where
intro ::
left : a
right : b
Patrones de demostración clave:
-- Introducción: creación de un And
example {a b : Prop} (ha : a) (hb : b) : And a b :=
And.intro ha hb
-- Simetría: a ∧ b → b ∧ a
theorem And.symm {a b : Prop} (h : And a b) : And b a :=
And.intro h.right h.left
La disyunción lógica requiere que al menos una de las proposiciones sea verdadera. A diferencia de And, Or es un tipo suma (Sum type) inductivo (una unión etiquetada), porque existen dos formas distintas y alternativas de construir una demostración.
Definición:
inductive Or (a b : Prop) : Prop where
| inl (h : a) : Or a b
| inr (h : b) : Or a b
Para demostrar , envuelves una demostración de en el constructor inl (inject-left) o una demostración de en el constructor inr (inject-right).
Ejemplo:
-- Simetría: a ∨ b → b ∨ a
theorem Or.symm {a b : Prop} (h : Or a b) : Or b a :=
match h with
| Or.inl ha => Or.inr ha
| Or.inr hb => Or.inl hb
La doble implicación, o «si y solo si» (Iff), representa que dos proposiciones son lógicamente equivalentes. Se define como una estructura que contiene implicaciones en ambas direcciones.
Definición:
structure Iff (a b : Prop) : Prop where
intro ::
mp : a → b
mpr : b → a
Ejemplo de reflexividad:
-- Toda proposición es equivalente a sí misma (a ↔ a)
theorem Iff.refl {a : Prop} : Iff a a :=
Iff.intro (fun ha => ha) (fun ha => ha)
Al reconstruir la lógica proposicional desde cero en Lean 4, revelamos la belleza mecánica de los sistemas formales:
And es un struct, Or es un enum, True es el tipo unidad y False es el tipo vacío (void).Dominar estos bloques de construcción fundamentales proporciona los cimientos esenciales para abordar teoremas matemáticos más complejos, lógica de predicados y la verificación de sistemas de software complejos.
Obtén la edición sin conexión de El Estilo de Vida de Kaue—una guía práctica para optimizar 🍏 Salud, 💰 Riqueza, ❤️ Amor y 🧘 Sentido.
Recibe notificaciones cuando publique nuevos ensayos, resúmenes de libros y guías prácticas sobre cómo vivir bien. Sin spam—cancela cuando quieras.
¿Tienes alguna pregunta, perspectiva o sugerencia? Comparte tus ideas abajo. Los comentarios funcionan con GitHub Discussions (sin anuncios y sin spam)—haz clic en Iniciar sesión con GitHub abajo para comentar o reaccionar (crear una cuenta gratuita en GitHub toma menos de un minuto).
Actualizado el 11 oct 2026.
AVISO LEGAL: El contenido de este sitio tiene fines exclusivamente informativos y educativos y no constituye asesoramiento médico, psicológico, financiero, de inversión, fiscal ni legal. Las ideas, la selección y las opiniones aquí presentadas son exclusivamente mías y no representan las de mi empleador. Los resúmenes de libros, conferencias y artículos son comentarios educativos independientes y siguen siendo propiedad intelectual de sus respectivos autores. Se pueden utilizar herramientas de IA para ayudar en la edición, el formato y la síntesis; aunque se hace todo lo posible por garantizar la precisión, pueden producirse errores. PRIVACIDAD: Este sitio utiliza servicios de terceros para la suscripción opcional al boletín (follow.it), los comentarios (giscus / GitHub Discussions) y el contenido multimedia incrustado (YouTube), que pueden procesar las direcciones IP y las cookies de los visitantes de acuerdo con sus respectivas políticas de privacidad.