Cet article propose une présentation technique pas à pas des concepts fondamentaux de la logique propositionnelle et de leur implémentation formelle à l’aide du langage de programmation et assistant de preuve Lean 4.
Que vous soyez un mathématicien cherchant à formaliser des preuves ou un programmeur plongeant dans la théorie des types, ce guide reconstruit la logique à partir des premiers principes. Nous commencerons par les constantes logiques de base et explorerons comment Lean 4 modélise élégamment les constructions logiques grâce à l’isomorphisme de Curry-Howard — le principe selon lequel les propositions sont des types et les preuves sont des programmes.
Avant de définir nos connecteurs logiques, nous devons mettre en place un environnement de base. Dans Lean 4, cela se fait généralement à l’aide de deux commandes spécifiques pour contrôler la portée (scope) et le comportement de calcul.
namespace Basic
noncomputable section
namespace Basic : Cette commande regroupe nos définitions, évitant ainsi les conflits de noms avec la bibliothèque intégrée de Lean (le Prelude). Elle nous permet de redéfinir des structures fondamentales comme True, False et And à partir de zéro à des fins pédagogiques.noncomputable section : Lean 4 est à la fois un assistant de preuve et un langage de programmation fonctionnelle. Par défaut, il essaie de générer du bytecode exécutable pour chaque définition. Marquer une section comme noncomputable indique au compilateur d’ignorer cette étape, ce qui est courant en logique formelle où nous nous intéressons aux propriétés mathématiques plutôt qu’à l’exécution à l’instant T (runtime).Dans cette section, nous allons définir les éléments fondamentaux de la logique, en faisant correspondre la notation mathématique standard au code Lean 4.
La proposition la plus simple est celle qui est universellement valide sur le plan logique. En termes de programmation, se comporte comme un type Unité (Unit type) — il possède exactement un état et ne transporte aucune donnée supplémentaire.
Définition :
inductive True : Prop where
| intro : True
Comme il est défini avec un seul constructeur (intro), la seule façon de « prouver » True est de fournir ce constructeur exact.
Exemples :
-- Proving True unconditionally
example : True := True.intro
-- Any proposition 'a' trivially implies True
example {a : Prop} : a → True := fun _ => True.intro
Alors que True est défini par l’existence triviale d’une preuve, False est défini par l’absence totale de preuve. C’est un type Vide (Empty type ou Void type).
Définition :
inductive False : Prop
Comme False n’a aucun constructeur, vous ne pouvez jamais l’instancier à partir de rien. Il représente une contradiction logique.
Le principe d’explosion (Ex Falso Quodlibet) :
Si jamais vous vous retrouvez en possession d’une preuve de False, la logique s’effondre et vous pouvez prouver n’importe quoi. Lean gère cela à l’aide du récurseur False.elim.
-- From a falsehood, any proposition 'a' follows (⊥ → a)
def False.elim {a : Prop} (false_proof : False) : a :=
false_proof.rec
Dans Lean 4, la négation n’est pas un concept primitif intégré. Elle est plutôt définie de manière fonctionnelle à l’aide de l’implication et de False. Pour prouver que la proposition est fausse (notée ), vous devez démontrer une fonction dans laquelle supposer mène directement à une contradiction ().
Définition :
def Not (a : Prop) : Prop := a → False
Théorèmes clés :
-- Proving Negation: If assuming 'a' proves False, then Not 'a' is true.
theorem Not.intro {a : Prop} (h : a → False) : Not a :=
fun ha => h ha
-- Double Negation Introduction (a → ¬¬a)
theorem not_not_intro {a : Prop} (ha : a) : Not (Not a) :=
fun na => na ha -- 'na' has type (a → False), so passing 'ha' yields False.
-- Modus Tollens: If (a → b) and (¬b), then (¬a)
theorem Not.imp {a b : Prop} (nb : Not b) (ab : a → b) : Not a :=
fun ha =>
have hb : b := ab ha
nb hb
Comme Lean repose sur la théorie des types, l’implication logique () est traitée littéralement comme une fonction. Pour prouver que implique , vous devez écrire une fonction qui prend une preuve arbitraire de et renvoie une preuve de .
Exemple d’implication chaînée : Si vous pouvez transformer en , et transformer en , vous pouvez transformer une fonction de en une fonction 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 conjonction logique, qui exige que et soient tous deux vrais, est modélisée sous forme de structure. En termes de programmation, il s’agit d’un type Produit (Product type) (une structure ou un tuple) qui contient deux éléments de preuve distincts.
Définition :
structure And (a b : Prop) : Prop where
intro ::
left : a
right : b
Schémas de preuve clés :
-- Introduction: Creating an And
example {a b : Prop} (ha : a) (hb : b) : And a b :=
And.intro ha hb
-- Symmetry: a ∧ b → b ∧ a
theorem And.symm {a b : Prop} (h : And a b) : And b a :=
And.intro h.right h.left
La disjonction logique exige qu’au moins l’une des propositions soit vraie. Contrairement à And, Or est un type Somme (Sum type) inductif (une union étiquetée), car il existe deux manières distinctes et alternatives de construire une preuve.
Définition :
inductive Or (a b : Prop) : Prop where
| inl (h : a) : Or a b
| inr (h : b) : Or a b
Pour prouver , vous enveloppez une preuve de dans le constructeur inl (inject-left), ou une preuve de dans le constructeur inr (inject-right).
Exemple :
-- Symmetry: 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 bi-implication, ou « si et seulement si » (Iff), signifie que deux propositions sont logiquement équivalentes. Elle est définie comme une structure contenant des implications dans les deux sens.
Définition :
structure Iff (a b : Prop) : Prop where
intro ::
mp : a → b
mpr : b → a
Exemple de réflexivité :
-- Every proposition is equivalent to itself (a ↔ a)
theorem Iff.refl {a : Prop} : Iff a a :=
Iff.intro (fun ha => ha) (fun ha => ha)
En reconstruisant la logique propositionnelle à partir de zéro dans Lean 4, nous révélons la beauté mécanique des systèmes formels :
And est une structure (struct), Or est une énumération (enum), True est le type unité (unit) et False est le type vide (void).La maîtrise de ces briques fondamentales fournit le tremplin indispensable pour aborder des théorèmes mathématiques plus complexes, la logique des prédicats et la vérification de systèmes logiciels complexes.
Obtenez l'édition hors ligne de Le Mode de Vie de Kaue—un guide pratique pour optimiser 🍏 Santé, 💰 Richesse, ❤️ Amour et 🧘 Sens.
Recevez une notification lorsque je publie de nouveaux essais, résumés de livres et guides pratiques pour bien vivre. Sans spam—désabonnez-vous à tout moment.
Vous avez une question, une perspective ou une suggestion ? Partagez vos réflexions ci-dessous. Les commentaires fonctionnent avec GitHub Discussions (sans publicité et sans spam)—cliquez sur Se connecter avec GitHub ci-dessous pour commenter ou réagir (créer un compte GitHub gratuit prend moins d'une minute).
Mis à jour le 11 oct. 2026.
AVERTISSEMENT : Le contenu de ce site est fourni à titre purement informatif et éducatif et ne constitue pas un avis médical, psychologique, financier, d'investissement, fiscal ou juridique. Les idées, la sélection et les opinions présentées ici n'engagent que moi et ne représentent pas celles de mon employeur. Les résumés de livres, de conférences et d'articles sont des commentaires éducatifs indépendants et restent la propriété intellectuelle de leurs auteurs respectifs. Des outils d'IA peuvent être utilisés pour aider à l'édition, à la mise en forme et à la synthèse ; bien que tous les efforts soient déployés pour garantir l'exactitude, des erreurs peuvent survenir. CONFIDENTIALITÉ : Ce site utilise des services tiers pour l'abonnement facultatif à la newsletter (follow.it), les commentaires (giscus / GitHub Discussions) et les médias intégrés (YouTube), qui peuvent traiter les adresses IP et les cookies des visiteurs conformément à leurs politiques de confidentialité respectives.