diff --git a/MyIA.AI.Notebooks/SymbolicAI/Lean/Lean-4-Quantifiers.ipynb b/MyIA.AI.Notebooks/SymbolicAI/Lean/Lean-4-Quantifiers.ipynb index 5c6a6522ee..a0c3d30465 100644 --- a/MyIA.AI.Notebooks/SymbolicAI/Lean/Lean-4-Quantifiers.ipynb +++ b/MyIA.AI.Notebooks/SymbolicAI/Lean/Lean-4-Quantifiers.ipynb @@ -24,13 +24,13 @@ "\n", "Ce notebook etend la logique propositionnelle du notebook précédent a la **logique du premier ordre** en introduisant les **quantificateurs** : le quantificateur universel (\"pour tout\") et le quantificateur existentiel (\"il existe\").\n", "\n", - "Ces quantificateurs permettent d'exprimer des proprietes sur des **ensembles infinis** d'objets, ce qui est essentiel pour les mathematiques.\n", + "Ces quantificateurs permettent d'exprimer des propriétés sur des **ensembles infinis** d'objets, ce qui est essentiel pour les mathematiques.\n", "\n", "### Objectifs d'apprentissage\n", "\n", "1. Maitriser le quantificateur universel `forall` et son utilisation\n", "2. Maitriser le quantificateur existentiel `Exists` et la construction de temoins\n", - "3. Manipuler les proprietes arithmetiques sur `Nat`\n", + "3. Manipuler les propriétés arithmetiques sur `Nat`\n", "4. Utiliser les hypotheses anonymes et les references\n", "5. Comprendre l'interaction entre quantificateurs\n", "\n", @@ -39,7 +39,7 @@ "- Notebooks **Lean-1**, **Lean-2** et **Lean-3** completes\n", "- Familiarite avec les concepts de base de la logique du premier ordre\n", "\n", - "### Duree estimee : 40-45 minutes\n", + "### Duree estimée : 40-45 minutes\n", "\n", "\n", "## Plan de ce Notebook\n", @@ -47,7 +47,7 @@ "- **1** [Quantificateur Universel forall](#1-forall)\n", "- **2** [Quantificateur Existentiel exists](#2-exists)\n", "- **3** [Combinaison de Quantificateurs](#3-combinaison)\n", - "- **4** [Egalite et Substitution](#4-egalite)\n", + "- **4** [Égalité et Substitution](#4-égalité)\n", "- **5** [Arithmetique sur Nat](#5-arithmetique)\n", "- **6** [Techniques Avancees](#6-techniques-avancees)\n", "- **7** [Exercices](#7-exercices)\n", @@ -79,9 +79,9 @@ "\n", "## 1. Le Quantificateur Universel `forall`\n", "\n", - "### 1.1 Definition et syntaxe\n", + "### 1.1 Définition et syntaxe\n", "\n", - "Le quantificateur universel `forall x : A, P x` (note aussi `\\forall x : A, P x` ou avec le symbole Unicode `∀`) exprime que la propriete `P` est vraie pour **tout** élément `x` du type `A`.\n", + "Le quantificateur universel `forall x : A, P x` (note aussi `\\forall x : A, P x` ou avec le symbole Unicode `∀`) exprime que la propriété `P` est vraie pour **tout** élément `x` du type `A`.\n", "\n", "En Lean, `forall` est simplement un alias pour le Pi-type dans `Prop`.\n", "\n", @@ -276,7 +276,7 @@ "source": [ "### 1.2 Introduction du forall\n", "\n", - "Pour prouver `forall x : A, P x`, on doit fournir une **fonction** qui, etant donne un `x : A` arbitraire, produit une preuve de `P x`.\n", + "Pour prouver `forall x : A, P x`, on doit fournir une **fonction** qui, etant donné un `x : A` arbitraire, produit une preuve de `P x`.\n", "\n", "C'est exactement comme programmer une fonction!\n", "\n", @@ -409,7 +409,7 @@ "tags": [] }, "source": [ - "### 1.3 Elimination du forall\n", + "### 1.3 Élimination du forall\n", "\n", "Pour utiliser `forall x : A, P x`, on l'**applique** a une valeur concrete `a : A` pour obtenir `P a`.\n", "\n", @@ -539,17 +539,17 @@ } ], "source": [ - "-- Definition rappel (pour execution isolee)\n", + "-- Définition rappel (pour exécution isolee)\n", "theorem add_zero_forall_copy : forall n : Nat, n + 0 = n :=\n", " fun _n => rfl\n", "\n", "-- Si on a une preuve de forall, on peut l'instancier\n", "theorem use_forall : 5 + 0 = 5 :=\n", - " add_zero_forall_copy 5 -- Appliquer le theoreme a 5\n", + " add_zero_forall_copy 5 -- Appliquer le théorème a 5\n", "\n", "#eval 5 + 0 -- 5 (Lean calcule)\n", "\n", - "-- Exemple avec une propriete quelconque\n", + "-- Exemple avec une propriété quelconque\n", "-- On peut en deduire P 42 a partir de forall n, P n\n", "theorem instance_of_forall (P : Nat -> Prop)\n", " (h : forall n : Nat, P n) : P 42 := h 42" @@ -569,7 +569,7 @@ "tags": [] }, "source": [ - "### 1.4 Proprietes avec plusieurs quantificateurs\n", + "### 1.4 Propriétés avec plusieurs quantificateurs\n", "\n", "Quand on a plusieurs variables quantifiees, on peut les introduire une par une ou en groupe. Les hypotheses intermediaires (`have`) permettent de structurer les preuves complexes.\n", "\n", @@ -700,7 +700,7 @@ "#check forall x y : Nat, P x y -- Prop\n", "#check forall x : Nat, forall y : Nat, P x y -- meme chose\n", "\n", - "-- Prouver une propriete avec deux quantificateurs\n", + "-- Prouver une propriété avec deux quantificateurs\n", "theorem comm_add : forall x y : Nat, x + y = y + x :=\n", " fun x y => Nat.add_comm x y -- Lemme de la bibliotheque\n", "\n", @@ -724,7 +724,7 @@ "\n", "## 2. Le Quantificateur Existentiel `Exists`\n", "\n", - "### 2.1 Definition et syntaxe\n", + "### 2.1 Définition et syntaxe\n", "\n", "Le quantificateur existentiel `Exists (fun x => P x)` (note `\\exists x, P x`) exprime qu'il **existe au moins un** élément `x` tel que `P x` soit vrai.\n", "\n", @@ -1090,7 +1090,7 @@ "tags": [] }, "source": [ - "### 2.3 Elimination du Exists\n", + "### 2.3 Élimination du Exists\n", "\n", "Pour utiliser une preuve de `\\exists x : A, P x`, on fait une **analyse par cas** : on suppose qu'on a un `x` quelconque et une preuve de `P x`, puis on doit montrer le but.\n", "\n", @@ -1224,12 +1224,12 @@ "-- Si il existe n pair, alors il existe m tel que 2 * m existe\n", "-- (exemple simplifie)\n", "\n", - "-- Elimination avec Exists.elim\n", + "-- Élimination avec Exists.elim\n", "theorem exists_elim_example\n", " (h : ∃ n : Nat, n > 0) : True :=\n", " Exists.elim h (fun _n _hn => True.intro)\n", "\n", - "-- Elimination avec match (plus lisible)\n", + "-- Élimination avec match (plus lisible)\n", "theorem exists_elim_match\n", " (h : ∃ n : Nat, n > 0) : ∃ m : Nat, m >= 0 :=\n", " match h with\n", @@ -1257,7 +1257,7 @@ }, "source": [ "\n", - "## 3. Proprietes Arithmetiques sur Nat\n", + "## 3. Propriétés Arithmetiques sur Nat\n", "\n", "### 3.1 Lemmes de base\n", "\n", @@ -1637,7 +1637,7 @@ "tags": [] }, "source": [ - "\n", + "\n", "## 4. Combinaison de Quantificateurs\n", "\n", "L'ordre des quantificateurs est crucial : `forall x, exists y, P x y` (pour tout x il existe un y) est différent de `exists y, forall x, P x y` (il existe un y pour tous les x).\n", @@ -1901,7 +1901,7 @@ " fun x => match h with\n", " | ⟨y, hy⟩ => ⟨y, hy x⟩\n", "\n", - "-- L'inverse n'est pas vrai en general!\n", + "-- L'inverse n'est pas vrai en général!\n", "-- Exemple : P x y := x <= y\n", "-- forall x, exists y, x <= y -- Vrai : y = x marche\n", "-- exists y, forall x, x <= y -- Faux : aucun y ne majore tous les x" @@ -2384,7 +2384,7 @@ }, "source": [ "\n", - "## 6. Egalite et Quantificateurs\n", + "## 6. Égalité et Quantificateurs\n", "\n", "### 6.1 Réécriture avec l'égalité\n", "\n", @@ -2526,7 +2526,7 @@ "tags": [] }, "source": [ - "Cette preuve illustre la **substitution sous un quantificateur** : de l'egalite `a = b` et de l'hypothese universelle `∀ n, P n`, on derive `P b` (appliquer `hp`, puis reecrire par l'egalite). C'est le patron standard `intro` puis `rw` pour faire traverser une egalite sous un binder -- technique omnipresente dans les preuves sur les structures parametrees.\n", + "Cette preuve illustre la **substitution sous un quantificateur** : de l'égalité `a = b` et de l'hypothese universelle `∀ n, P n`, on derive `P b` (appliquer `hp`, puis reecrire par l'égalité). C'est le patron standard `intro` puis `rw` pour faire traverser une égalité sous un binder -- technique omnipresente dans les preuves sur les structures parametrees.\n", "\n", "### L'extension de l'égalité sous quantificateur — le transport `▸`\n", "\n", @@ -2553,7 +2553,7 @@ "tags": [] }, "source": [ - "### 6.2 Egalite fonctionnelle### Pourquoi l'extensionnalité fonctionnelle est un axiome\n", + "### 6.2 Égalité fonctionnelle### Pourquoi l'extensionnalité fonctionnelle est un axiome\n", "\n", "L'**extensionnalité fonctionnelle** énonce : `∀ f g : A → B, (∀ x, f x = g x) → f = g`. Informellement : deux fonctions qui coïncident sur **tous** les arguments sont **égales**. C'est l'axiome **`funext`** de Lean 4 (constante dans `Lean.Extensionality`). Lean-2 a introduit `rfl` pour l'égalité définitionnelle ; `funext` étend `rfl` à l'égalité **propositionnelle** des fonctions.\n", "\n", @@ -2703,7 +2703,7 @@ "\n", "## 7. Exemples Complets\n", "\n", - "### 7.1 Proprietes de divisibilite\n", + "### 7.1 Propriétés de divisibilite\n", "\n", "### Divisibilité — la définition existentielle\n", "\n", @@ -2824,7 +2824,7 @@ } ], "source": [ - "-- Definition : a divise b\n", + "-- Définition : a divise b\n", "def divides (a b : Nat) : Prop := ∃ k : Nat, b = a * k\n", "\n", "notation:50 a \" | \" b => divides a b\n", @@ -2849,7 +2849,7 @@ "tags": [] }, "source": [ - "La divisibilite est encodee **existentiellement** : `a ∣ b` signifie « il existe un entier `k` tel que `b = a * k` ». Cette definition pose `divides` comme une **proposition** (`Prop`), pas un booléen -- c'est un outil de raisonnement. La notation infixe `a ∣ b` (caractère `∣`, U+2223) se lit « a divise b ». Pour prouver `a ∣ b`, on fournit le **temoin** `k` ; pour l'utiliser, on extrait `k` par analyse de l'existence.\n", + "La divisibilite est encodee **existentiellement** : `a ∣ b` signifie « il existe un entier `k` tel que `b = a * k` ». Cette définition pose `divides` comme une **proposition** (`Prop`), pas un booléen -- c'est un outil de raisonnement. La notation infixe `a ∣ b` (caractère `∣`, U+2223) se lit « a divise b ». Pour prouver `a ∣ b`, on fournit le **temoin** `k` ; pour l'utiliser, on extrait `k` par analyse de l'existence.\n", "\n", "### Utilisation de `divides` — extraction de témoin et projection\n", "\n", @@ -2998,7 +2998,7 @@ } ], "source": [ - "-- Definition rappel (necessaire si cellule executee isolement)\n", + "-- Définition rappel (necessaire si cellule executee isolement)\n", "def mydivides (a b : Nat) : Prop := ∃ k : Nat, b = a * k\n", "infix:50 \" mydiv \" => mydivides\n", "\n", @@ -3019,7 +3019,7 @@ "tags": [] }, "source": [ - "La **transitivite** (`a ∣ b -> b ∣ c -> a ∣ c`) se prouve en deroulant la definition existentielle : si `b = a * k` et `c = b * j`, alors `c = a * (k * j)`, et le temoin final est `k * j`. C'est le patron universel des transitivites sur relations définies par existence : **combiner les temoins**. La recurrence sur la structure des hypotheses produit mecaniquement le temoin composite.\n", + "La **transitivite** (`a ∣ b -> b ∣ c -> a ∣ c`) se prouve en deroulant la définition existentielle : si `b = a * k` et `c = b * j`, alors `c = a * (k * j)`, et le temoin final est `k * j`. C'est le patron universel des transitivites sur relations définies par existence : **combiner les temoins**. La recurrence sur la structure des hypotheses produit mecaniquement le temoin composite.\n", "\n", "### `divides` — clôture par composition multiplicative\n", "\n", @@ -4265,26 +4265,26 @@ } ], "source": [ - "-- Definition rappel pour execution isolee\n", + "-- Définition rappel pour exécution isolee\n", "def mydivides' (a b : Nat) : Prop := exists k : Nat, b = a * k\n", "infix:50 \" mydiv' \" => mydivides'\n", "\n", "-- Exercice 1 : Existence d'un pair divisible par 2\n", - "-- TODO etudiant : prouver qu'il existe n tel que 2 mydiv' n\n", + "-- TODO étudiant : prouver qu'il existe n tel que 2 mydiv' n\n", "-- Indice : utiliser le temoin 4\n", "theorem exists_even_practice : exists n : Nat, 2 mydiv' n := by\n", " sorry\n", "\n", "-- Exercice 2 : Distribution du forall sur la conjonction\n", "variable (A : Type) (P Q : A -> Prop)\n", - "-- TODO etudiant : prouver la distribution\n", + "-- TODO étudiant : prouver la distribution\n", "-- Indice : utiliser fun hp hq x => \n", "theorem forall_and_practice :\n", " (forall x : A, P x) -> (forall x : A, Q x) -> (forall x : A, P x /\\ Q x) := by\n", " sorry\n", "\n", "-- Exercice 3 : Negation du forall implique existence\n", - "-- TODO etudiant : prouver la contraposition\n", + "-- TODO étudiant : prouver la contraposition\n", "-- Indice : utiliser byContradiction\n", "open Classical in\n", "theorem not_forall_exists_not_practice\n", @@ -4327,7 +4327,7 @@ "source": [ "## Resume\n", "\n", - "| Concept | Syntaxe | Introduction | Elimination |\n", + "| Concept | Syntaxe | Introduction | Élimination |\n", "|---------|---------|--------------|-------------|\n", "| **forall** | `\\forall x : A, P x` | `fun x => ...` | Application `h a` |\n", "| **exists** | `\\exists x : A, P x` | `⟨temoin, preuve⟩` | `match h with \\| ⟨x, hx⟩ => ...` |\n", @@ -4391,4 +4391,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file