Lean-15c : le lake Grothendieck par ses énoncés (companion formel natif)

Navigation : << Lean-15b Grothendieck en Lean | Lean-15d Visite guidee visuelle >> | Index

Ce notebook est le companion formel natif du lake grothendieck_lean/, en kernel lean4-wsl. Il complète le notebook Python Lean-15b : là où 15b charge et explique les sources, celui-ci importe le lake réel et montre, à travers un parcours représentatif de ses modules, des énoncés qui compilent — la visibilité promise par l’épic #11703.

Un lake enrichi n’existe, pour un lecteur, que si un notebook le montre. Chaque #check ci-dessous affiche le type exact d’un lemme de grothendieck_lean, tel que Mathlib 4 le formalise — on ne lit pas un résumé, on lit l’énoncé compilé.

Comment lire ce notebook. Chaque section suit le même rituel : un paragraphe explique ce que disent les théorèmes (éventuellement ce qu’ils coûtent historiquement), puis une cellule #check interroge le lake — la sortie qui s’affiche sous la cellule est la signature élaborée, pas une citation. La lecture peut être séquentielle (les notions s’empilent : adjonctions → monades → cribles → topologies → faisceaux → cohomologie), mais chaque section est aussi autoporteuse via son lien module. Le kernel lean4-wsl exécute un REPL Lean 4 réel appuyé sur le build du lake — même toolchain (lean-toolchain), mêmes .olean que lake build produit localement.

Positionnement dans la série. Lean-15 (Tribute) présentait la personne et le programme ; Lean-15b (Python) démonte le lake fichier par fichier ; ce companion atteste que le tout compile et ne triche pas. Les trois étages sont représentés : le socle catégorique (§2-3), la machinerie des sites (§4-5), l’édifice cohomologique (§6-7), jusqu’aux ancrages géométriques (§8) et aux micro-preuves de calibration qui ferment la boucle (§9).

1. Import du lake

Le lake entier s’importe par son umbrella racine Grothendieck, qui réexporte ses modules et leurs preuves. C’est une ligne — mais elle est lourdement chargée : derrière elle, le REPL charge plusieurs milliers d’oléans (Mathlib inclus via les dépendances du lake), et chaque #check ultérieur résout ses noms dans cet environnement. Si l’import répond {"env": 0} sans message d’erreur, l’environnement est prêt : les sections suivantes n’ont plus qu’à l’interroger. C’est la différence entre lire un lake et l’avoir chargé : à partir d’ici, chaque identifiant résout (ou échoue) contre le vrai lake, pas contre une doc.

import Grothendieck
import Grothendieck.FlasqueQuotient
import Grothendieck.GodementFunctor
import Grothendieck.GodementMono
import Grothendieck
import Grothendieck.FlasqueQuotient
import Grothendieck.GodementFunctor
import Grothendieck.GodementMono
--% env 0
Raw input {"cmd": "import Grothendieck\nimport Grothendieck.FlasqueQuotient\nimport Grothendieck.GodementFunctor\nimport Grothendieck.GodementMono"}
Raw output {"env": 0}

2. Fondations categoriques

Le vocabulaire commun sur lequel tout le reste s’assemble — et le premier endroit où le formalisme paie, car chacun de ces énoncés transporte des données que la prose omet.

Ce que disent les théorèmes. leftAdjoint_preserves_colimits : un foncteur adjoint à gauche préserve les colimites (et symétriquement rightAdjoint_preserves_limits pour l’adjoint à droite). C’est le théorème « RAPL » des catégories — l’exemple canonique : les foncteurs oubli libres (free ⊣ forget) préservent les colimites, ce qui donne toutes les présentations d’algèbres par générateurs et relations. adj_toEquivalence enchaîne : une adjonction dont unité et counité sont des isomorphismes est une équivalence de catégories — le critère pratique pour prouver C ≌ D sans exhiber les deux foncteurs réciproques.

Le lemme de Yoneda (yoneda_equiv_apply, yoneda_full) est le résultat fondateur de la théorie : le plongement C → [Cᵒᵖ, Set] est plein et fidèle — un objet est déterminé par la façon dont les autres le voient. representableByYoneda en donne la reconnaissance. C’est ce plongement qui, appliqué à un site, devient le faisceau de Yoneda — le pont vers la section 6.

Les limites (limit_object, colimit_object) fournissent les cônes universels ; les extensions de Kan (kan_extension_left) étendent un foncteur le long d’un autre de façon universelle — l’outil qui rend rigoureux « prolonger par adjonction », et le cadre des formules de calcul de colimites par points. Leur signature dans la sortie #check montre les univers (u₁ u₂) : Mathlib 4 les gère explicitement.

-- Adjunction : une adjonction distribue sur les limites côté droit et les colimites côté gauche
#check Grothendieck.Adjunction.leftAdjoint_preserves_colimits
#check Grothendieck.Adjunction.rightAdjoint_preserves_limits
#check Grothendieck.Adjunction.adj_toEquivalence
-- YonedaLemma : le plongement de Yoneda est plein
#check Grothendieck.yoneda_equiv_apply
#check Grothendieck.yoneda_full
#check Grothendieck.representableByYoneda
-- Equivalences : les équivalences forment une structure symétrique et transitive
#check Grothendieck.Equivalences.equivalence_symm
#check Grothendieck.Equivalences.equivalence_trans
-- Limits : objets limites (cônes universels)
#check Grothendieck.Limits.limit_object
#check Grothendieck.Limits.colimit_object
-- KanExtensions : l'extension de Kan gauche, adjoint à la précomposition
#check Grothendieck.KanExtensions.kan_extension_left
#check Grothendieck.KanExtensions.lan_functor
-- Adjunction : une adjonction distribue sur les limites côté droit et les colimites côté gauche
Grothendieck.Adjunction.leftAdjoint_preserves_colimits.{v₁, v₂, u₁, u₂, u_1, u_2} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {L : CategoryTheory.Functor C D} {R : CategoryTheory.Functor D C} (h : L ⊣ R) : CategoryTheory.Limits.PreservesColimitsOfSize.{u_1, u_2, v₁, v₂, u₁, u₂} L
Grothendieck.Adjunction.rightAdjoint_preserves_limits.{v₁, v₂, u₁, u₂, u_1, u_2} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {L : CategoryTheory.Functor C D} {R : CategoryTheory.Functor D C} (h : L ⊣ R) : CategoryTheory.Limits.PreservesLimitsOfSize.{u_1, u_2, v₂, v₁, u₂, u₁} R
Grothendieck.Adjunction.adj_toEquivalence.{v₁, v₂, u₁, u₂} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {L : CategoryTheory.Functor C D} {R : CategoryTheory.Functor D C} (h : L ⊣ R) [∀ (X : C), CategoryTheory.IsIso (h.unit.app X)] [∀ (Y : D), CategoryTheory.IsIso (h.counit.app Y)] : C ≌ D
-- YonedaLemma : le plongement de Yoneda est plein
Grothendieck.yoneda_equiv_apply.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X : C} {F : CategoryTheory.Functor Cᵒᵖ (Type u_2)} (η : CategoryTheory.yoneda.obj X ⟶ F) : CategoryTheory.yonedaEquiv η = (CategoryTheory.ConcreteCategory.hom (η.app (Opposite.op X))) (CategoryTheory.CategoryStruct.id X)
Grothendieck.yoneda_full.{u_1, u_2} (C : Type u_1) [CategoryTheory.Category.{u_2, u_1} C] : CategoryTheory.yoneda.Full
Grothendieck.representableByYoneda.{u_1, u_2} (C : Type u_1) [CategoryTheory.Category.{u_2, u_1} C] (Y : C) : (CategoryTheory.yoneda.obj Y).RepresentableBy Y
-- Equivalences : les équivalences forment une structure symétrique et transitive
Grothendieck.Equivalences.equivalence_symm.{v₁, v₂, u₁, u₂} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] (e : C ≌ D) : D ≌ C
Grothendieck.Equivalences.equivalence_trans.{v₁, v₂, u₁, u₂, u_1, u_2} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {E : Type u_1} [CategoryTheory.Category.{u_2, u_1} E] (e : C ≌ D) (f : D ≌ E) : C ≌ E
-- Limits : objets limites (cônes universels)
Grothendieck.Limits.limit_object.{v, v', u, u'} {J : Type u} [CategoryTheory.Category.{v, u} J] {C : Type u'} [CategoryTheory.Category.{v', u'} C] (F : CategoryTheory.Functor J C) [CategoryTheory.Limits.HasLimit F] : C
Grothendieck.Limits.colimit_object.{v, v', u, u'} {J : Type u} [CategoryTheory.Category.{v, u} J] {C : Type u'} [CategoryTheory.Category.{v', u'} C] (F : CategoryTheory.Functor J C) [CategoryTheory.Limits.HasColimit F] : C
-- KanExtensions : l'extension de Kan gauche, adjoint à la précomposition
Grothendieck.KanExtensions.kan_extension_left.{v₁, v₂, v₃, u₁, u₂, u₃} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {H : Type u₃} [CategoryTheory.Category.{v₃, u₃} H] (L : CategoryTheory.Functor C D) (F : CategoryTheory.Functor C H) [L.HasLeftKanExtension F] : CategoryTheory.Functor D H
Grothendieck.KanExtensions.lan_functor.{v₁, v₂, v₃, u₁, u₂, u₃} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {H : Type u₃} [CategoryTheory.Category.{v₃, u₃} H] (L : CategoryTheory.Functor C D) [∀ (F : CategoryTheory.Functor C H), L.HasLeftKanExtension F] : CategoryTheory.Functor (CategoryTheory.Functor C H) (CategoryTheory.Functor D H)
--% env 1
Raw input {"cmd": "-- Adjunction : une adjonction distribue sur les limites c\u00f4t\u00e9 droit et les colimites c\u00f4t\u00e9 gauche\n#check Grothendieck.Adjunction.leftAdjoint_preserves_colimits\n#check Grothendieck.Adjunction.rightAdjoint_preserves_limits\n#check Grothendieck.Adjunction.adj_toEquivalence\n-- YonedaLemma : le plongement de Yoneda est plein\n#check Grothendieck.yoneda_equiv_apply\n#check Grothendieck.yoneda_full\n#check Grothendieck.representableByYoneda\n-- Equivalences : les \u00e9quivalences forment une structure sym\u00e9trique et transitive\n#check Grothendieck.Equivalences.equivalence_symm\n#check Grothendieck.Equivalences.equivalence_trans\n-- Limits : objets limites (c\u00f4nes universels)\n#check Grothendieck.Limits.limit_object\n#check Grothendieck.Limits.colimit_object\n-- KanExtensions : l'extension de Kan gauche, adjoint \u00e0 la pr\u00e9composition\n#check Grothendieck.KanExtensions.kan_extension_left\n#check Grothendieck.KanExtensions.lan_functor", "env": 0}
Raw output {"messages": [{"severity": "info", "pos": {"line": 2, "column": 0}, "endPos": {"line": 2, "column": 6}, "data": "Grothendieck.Adjunction.leftAdjoint_preserves_colimits.{v₁, v₂, u₁, u₂, u_1, u_2} {C : Type u₁}\n [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D]\n {L : CategoryTheory.Functor C D} {R : CategoryTheory.Functor D C} (h : L ⊣ R) :\n CategoryTheory.Limits.PreservesColimitsOfSize.{u_1, u_2, v₁, v₂, u₁, u₂} L"}, {"severity": "info", "pos": {"line": 3, "column": 0}, "endPos": {"line": 3, "column": 6}, "data": "Grothendieck.Adjunction.rightAdjoint_preserves_limits.{v₁, v₂, u₁, u₂, u_1, u_2} {C : Type u₁}\n [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D]\n {L : CategoryTheory.Functor C D} {R : CategoryTheory.Functor D C} (h : L ⊣ R) :\n CategoryTheory.Limits.PreservesLimitsOfSize.{u_1, u_2, v₂, v₁, u₂, u₁} R"}, {"severity": "info", "pos": {"line": 4, "column": 0}, "endPos": {"line": 4, "column": 6}, "data": "Grothendieck.Adjunction.adj_toEquivalence.{v₁, v₂, u₁, u₂} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C]\n {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {L : CategoryTheory.Functor C D} {R : CategoryTheory.Functor D C}\n (h : L ⊣ R) [∀ (X : C), CategoryTheory.IsIso (h.unit.app X)] [∀ (Y : D), CategoryTheory.IsIso (h.counit.app Y)] :\n C ≌ D"}, {"severity": "info", "pos": {"line": 6, "column": 0}, "endPos": {"line": 6, "column": 6}, "data": "Grothendieck.yoneda_equiv_apply.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X : C}\n {F : CategoryTheory.Functor Cᵒᵖ (Type u_2)} (η : CategoryTheory.yoneda.obj X ⟶ F) :\n CategoryTheory.yonedaEquiv η =\n (CategoryTheory.ConcreteCategory.hom (η.app (Opposite.op X))) (CategoryTheory.CategoryStruct.id X)"}, {"severity": "info", "pos": {"line": 7, "column": 0}, "endPos": {"line": 7, "column": 6}, "data": "Grothendieck.yoneda_full.{u_1, u_2} (C : Type u_1) [CategoryTheory.Category.{u_2, u_1} C] : CategoryTheory.yoneda.Full"}, {"severity": "info", "pos": {"line": 8, "column": 0}, "endPos": {"line": 8, "column": 6}, "data": "Grothendieck.representableByYoneda.{u_1, u_2} (C : Type u_1) [CategoryTheory.Category.{u_2, u_1} C] (Y : C) :\n (CategoryTheory.yoneda.obj Y).RepresentableBy Y"}, {"severity": "info", "pos": {"line": 10, "column": 0}, "endPos": {"line": 10, "column": 6}, "data": "Grothendieck.Equivalences.equivalence_symm.{v₁, v₂, u₁, u₂} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C]\n {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] (e : C ≌ D) : D ≌ C"}, {"severity": "info", "pos": {"line": 11, "column": 0}, "endPos": {"line": 11, "column": 6}, "data": "Grothendieck.Equivalences.equivalence_trans.{v₁, v₂, u₁, u₂, u_1, u_2} {C : Type u₁}\n [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {E : Type u_1}\n [CategoryTheory.Category.{u_2, u_1} E] (e : C ≌ D) (f : D ≌ E) : C ≌ E"}, {"severity": "info", "pos": {"line": 13, "column": 0}, "endPos": {"line": 13, "column": 6}, "data": "Grothendieck.Limits.limit_object.{v, v', u, u'} {J : Type u} [CategoryTheory.Category.{v, u} J] {C : Type u'}\n [CategoryTheory.Category.{v', u'} C] (F : CategoryTheory.Functor J C) [CategoryTheory.Limits.HasLimit F] : C"}, {"severity": "info", "pos": {"line": 14, "column": 0}, "endPos": {"line": 14, "column": 6}, "data": "Grothendieck.Limits.colimit_object.{v, v', u, u'} {J : Type u} [CategoryTheory.Category.{v, u} J] {C : Type u'}\n [CategoryTheory.Category.{v', u'} C] (F : CategoryTheory.Functor J C) [CategoryTheory.Limits.HasColimit F] : C"}, {"severity": "info", "pos": {"line": 16, "column": 0}, "endPos": {"line": 16, "column": 6}, "data": "Grothendieck.KanExtensions.kan_extension_left.{v₁, v₂, v₃, u₁, u₂, u₃} {C : Type u₁}\n [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {H : Type u₃}\n [CategoryTheory.Category.{v₃, u₃} H] (L : CategoryTheory.Functor C D) (F : CategoryTheory.Functor C H)\n [L.HasLeftKanExtension F] : CategoryTheory.Functor D H"}, {"severity": "info", "pos": {"line": 17, "column": 0}, "endPos": {"line": 17, "column": 6}, "data": "Grothendieck.KanExtensions.lan_functor.{v₁, v₂, v₃, u₁, u₂, u₃} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C]\n {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {H : Type u₃} [CategoryTheory.Category.{v₃, u₃} H]\n (L : CategoryTheory.Functor C D) [∀ (F : CategoryTheory.Functor C H), L.HasLeftKanExtension F] :\n CategoryTheory.Functor (CategoryTheory.Functor C H) (CategoryTheory.Functor D H)"}], "env": 1}

3. Categories comma, monades, monoidales

Les structures qui organisent les morphismes plutôt que les objets.

Ce que disent les théorèmes. Une catégorie comma (F ↓ G) a pour objets les triples (X, Y, f : F X → G Y) et pour morphismes les paires qui font commuter le carré. fstFunctor et sndFunctor en sont les deux projections vers les catégories sources. C’est l’usine à catégories de la géométrie : le site de Zariski se construit comme une comma (§8), la catégorie des points d’un topos aussi.

Une adjonction engendre une monade (toMonad_underlying) : composer R ∘ L avec l’unité donne un monoïde dans les endofoncteurs. La catégorie de Kleisli (kleisli_type) est la plus petite catégorie dans laquelle cette monade devient « passage au résultat » — le cadre sémantique des effets en programmation, et l’exemple le plus simple de ce qu’un topos généralise.

Les catégories monoïdales portent deux contraintes de cohérence : le pentagone (l’associativité de ⊗ itère cohéremment — les cinq chemins de (A⊗B)⊗C)⊗D → A⊗(B⊗(C⊗D)) coïncident) et le tressage (braiding_iso : A⊗B ≅ B⊗A, de façon cohérente avec l’associativité). La sortie de pentagon_field est littéralement le diagramme commutatif habituel, encodé comme un champ de structure — la cohérence n’est pas un théorème ici, c’est une donnée transportée par la structure.

-- Comma : les catégories comma avec leurs deux projections
#check Grothendieck.Comma.fstFunctor
#check Grothendieck.Comma.sndFunctor
#check Grothendieck.Comma.comma_category_field
-- Monads : une adjonction engendre une monade et une catégorie de Kleisli
#check Grothendieck.Monads.toMonad_underlying
#check Grothendieck.Monads.kleisli_type
-- MonoidalCategories : la cohérence monoïdale : pentagone et tressage
#check Grothendieck.MonoidalCategories.tensor_product
#check Grothendieck.MonoidalCategories.braiding_iso
#check Grothendieck.MonoidalCategories.pentagon_field
-- Comma : les catégories comma avec leurs deux projections
Grothendieck.Comma.fstFunctor.{v₁, v₂, v₃, u₁, u₂, u₃} {A : Type u₁} [CategoryTheory.Category.{v₁, u₁} A] {B : Type u₂} [CategoryTheory.Category.{v₂, u₂} B] {T : Type u₃} [CategoryTheory.Category.{v₃, u₃} T] {L : CategoryTheory.Functor A T} {R : CategoryTheory.Functor B T} : CategoryTheory.Functor (CategoryTheory.Comma L R) A
Grothendieck.Comma.sndFunctor.{v₁, v₂, v₃, u₁, u₂, u₃} {A : Type u₁} [CategoryTheory.Category.{v₁, u₁} A] {B : Type u₂} [CategoryTheory.Category.{v₂, u₂} B] {T : Type u₃} [CategoryTheory.Category.{v₃, u₃} T] {L : CategoryTheory.Functor A T} {R : CategoryTheory.Functor B T} : CategoryTheory.Functor (CategoryTheory.Comma L R) B
Grothendieck.Comma.comma_category_field.{v₁, v₂, v₃, u₁, u₂, u₃} {A : Type u₁} [CategoryTheory.Category.{v₁, u₁} A] {B : Type u₂} [CategoryTheory.Category.{v₂, u₂} B] {T : Type u₃} [CategoryTheory.Category.{v₃, u₃} T] {L : CategoryTheory.Functor A T} {R : CategoryTheory.Functor B T} : CategoryTheory.Category.{max v₁ v₂, max (max u₂ u₁) v₃} (CategoryTheory.Comma L R)
-- Monads : une adjonction engendre une monade et une catégorie de Kleisli
Grothendieck.Monads.toMonad_underlying.{v₁, u₁} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₁} [CategoryTheory.Category.{v₁, u₁} D] {L : CategoryTheory.Functor C D} {R : CategoryTheory.Functor D C} (h : L ⊣ R) : CategoryTheory.Functor C C
Grothendieck.Monads.kleisli_type.{v₁, u₁} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C] (T : CategoryTheory.Monad C) : Type u₁
-- MonoidalCategories : la cohérence monoïdale : pentagone et tressage
Grothendieck.MonoidalCategories.tensor_product.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.MonoidalCategory C] (X Y : C) : C
Grothendieck.MonoidalCategories.braiding_iso.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.MonoidalCategory C] [CategoryTheory.BraidedCategory C] (X Y : C) : CategoryTheory.MonoidalCategoryStruct.tensorObj X Y ≅ CategoryTheory.MonoidalCategoryStruct.tensorObj Y X
Grothendieck.MonoidalCategories.pentagon_field.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.MonoidalCategoryStruct C] (Y₁ Y₂ Y₃ Y₄ : C) : Prop
--% env 2
Raw input {"cmd": "-- Comma : les cat\u00e9gories comma avec leurs deux projections\n#check Grothendieck.Comma.fstFunctor\n#check Grothendieck.Comma.sndFunctor\n#check Grothendieck.Comma.comma_category_field\n-- Monads : une adjonction engendre une monade et une cat\u00e9gorie de Kleisli\n#check Grothendieck.Monads.toMonad_underlying\n#check Grothendieck.Monads.kleisli_type\n-- MonoidalCategories : la coh\u00e9rence mono\u00efdale : pentagone et tressage\n#check Grothendieck.MonoidalCategories.tensor_product\n#check Grothendieck.MonoidalCategories.braiding_iso\n#check Grothendieck.MonoidalCategories.pentagon_field", "env": 1}
Raw output {"messages": [{"severity": "info", "pos": {"line": 2, "column": 0}, "endPos": {"line": 2, "column": 6}, "data": "Grothendieck.Comma.fstFunctor.{v₁, v₂, v₃, u₁, u₂, u₃} {A : Type u₁} [CategoryTheory.Category.{v₁, u₁} A] {B : Type u₂}\n [CategoryTheory.Category.{v₂, u₂} B] {T : Type u₃} [CategoryTheory.Category.{v₃, u₃} T]\n {L : CategoryTheory.Functor A T} {R : CategoryTheory.Functor B T} :\n CategoryTheory.Functor (CategoryTheory.Comma L R) A"}, {"severity": "info", "pos": {"line": 3, "column": 0}, "endPos": {"line": 3, "column": 6}, "data": "Grothendieck.Comma.sndFunctor.{v₁, v₂, v₃, u₁, u₂, u₃} {A : Type u₁} [CategoryTheory.Category.{v₁, u₁} A] {B : Type u₂}\n [CategoryTheory.Category.{v₂, u₂} B] {T : Type u₃} [CategoryTheory.Category.{v₃, u₃} T]\n {L : CategoryTheory.Functor A T} {R : CategoryTheory.Functor B T} :\n CategoryTheory.Functor (CategoryTheory.Comma L R) B"}, {"severity": "info", "pos": {"line": 4, "column": 0}, "endPos": {"line": 4, "column": 6}, "data": "Grothendieck.Comma.comma_category_field.{v₁, v₂, v₃, u₁, u₂, u₃} {A : Type u₁} [CategoryTheory.Category.{v₁, u₁} A]\n {B : Type u₂} [CategoryTheory.Category.{v₂, u₂} B] {T : Type u₃} [CategoryTheory.Category.{v₃, u₃} T]\n {L : CategoryTheory.Functor A T} {R : CategoryTheory.Functor B T} :\n CategoryTheory.Category.{max v₁ v₂, max (max u₂ u₁) v₃} (CategoryTheory.Comma L R)"}, {"severity": "info", "pos": {"line": 6, "column": 0}, "endPos": {"line": 6, "column": 6}, "data": "Grothendieck.Monads.toMonad_underlying.{v₁, u₁} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₁}\n [CategoryTheory.Category.{v₁, u₁} D] {L : CategoryTheory.Functor C D} {R : CategoryTheory.Functor D C} (h : L ⊣ R) :\n CategoryTheory.Functor C C"}, {"severity": "info", "pos": {"line": 7, "column": 0}, "endPos": {"line": 7, "column": 6}, "data": "Grothendieck.Monads.kleisli_type.{v₁, u₁} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C]\n (T : CategoryTheory.Monad C) : Type u₁"}, {"severity": "info", "pos": {"line": 9, "column": 0}, "endPos": {"line": 9, "column": 6}, "data": "Grothendieck.MonoidalCategories.tensor_product.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C]\n [CategoryTheory.MonoidalCategory C] (X Y : C) : C"}, {"severity": "info", "pos": {"line": 10, "column": 0}, "endPos": {"line": 10, "column": 6}, "data": "Grothendieck.MonoidalCategories.braiding_iso.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C]\n [CategoryTheory.MonoidalCategory C] [CategoryTheory.BraidedCategory C] (X Y : C) :\n CategoryTheory.MonoidalCategoryStruct.tensorObj X Y ≅ CategoryTheory.MonoidalCategoryStruct.tensorObj Y X"}, {"severity": "info", "pos": {"line": 11, "column": 0}, "endPos": {"line": 11, "column": 6}, "data": "Grothendieck.MonoidalCategories.pentagon_field.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C]\n [CategoryTheory.MonoidalCategoryStruct C] (Y₁ Y₂ Y₃ Y₄ : C) : Prop"}], "env": 2}

4. Cribles, topologies et generation

Le sol grothendieckien : on remplace « un recouvrement est une famille » par « un crible est un ensemble de flèches saturé par composition », et toute la théorie des sites devient calcul de treillis.

Ce que disent les théorèmes. Un crible (sieve) sur X est un ensemble de flèches vers X tel que si f ∈ S alors f ∘ g ∈ S pour tout g composable. La génération est monotone : agrandir le générateur agrandid le crible engendré. L’ordre des topologies a un plus petit élément (la triviale : seuls les isomorphismes couvrent), un plus grand (la discrète : tout couvre) et entre les deux la dense — le lake formalise triviale ≤ discrète (§9), chaque inégalité étant un lemme. Le pullback de cribles transporte un crible le long d’une flèche, et c’est ce qui rend la stabilité par changement de base possible.

Pourquoi cette section est le cœur du lake. La famille Covers* (section suivante) redéfinira chaque notion en « forme flèche » — mais la forme crible reste le langage dans lequel les topologies se comparent. La génération d’une topologie à partir d’une coverage (CoverageGen) est le pont pratique : c’est ainsi qu’on spécifie un site (donner les recouvrements de base) et que le lake reconstruit la topologie complète.

-- SieveGenerate : la génération d'un crible est monotone
#check Grothendieck.generate_monotone
-- SieveOps : la topologie triviale est la plus petite
#check Grothendieck.trivial_le_any
-- SieveLattice : le pullback de cribles est une structure d'action
#check Grothendieck.pullback_pullback
-- TopologyLattice : l'ordre des topologies est porté par les recouvrements
#check Grothendieck.TopologyLattice.le_covers
-- DenseTopology : dense est strictement entre triviale et discrète
#check Grothendieck.DenseTopology.dense_le_discrete
-- CoverageGen : une coverage engendre une topologie de Grothendieck
#check Grothendieck.coverageToTopology
-- SieveGenerate : la génération d'un crible est monotone
Grothendieck.generate_monotone.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X : C} {R₁ R₂ : CategoryTheory.Presieve X} (h : R₁ ≤ R₂) : CategoryTheory.Sieve.generate R₁ ≤ CategoryTheory.Sieve.generate R₂
-- SieveOps : la topologie triviale est la plus petite
Grothendieck.trivial_le_any.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C) : CategoryTheory.GrothendieckTopology.trivial C ≤ J
-- SieveLattice : le pullback de cribles est une structure d'action
Grothendieck.pullback_pullback.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y Z : C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) (g : Z ⟶ Y) : CategoryTheory.Sieve.pullback g (CategoryTheory.Sieve.pullback f S) = CategoryTheory.Sieve.pullback (CategoryTheory.CategoryStruct.comp g f) S
-- TopologyLattice : l'ordre des topologies est porté par les recouvrements
Grothendieck.TopologyLattice.le_covers.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} {J₁ J₂ : CategoryTheory.GrothendieckTopology C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) : J₁ ≤ J₂ → J₁.Covers S f → J₂.Covers S f
-- DenseTopology : dense est strictement entre triviale et discrète
Grothendieck.DenseTopology.dense_le_discrete.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] : CategoryTheory.GrothendieckTopology.dense ≤ CategoryTheory.GrothendieckTopology.discrete C
-- CoverageGen : une coverage engendre une topologie de Grothendieck
Grothendieck.coverageToTopology.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] (K : CategoryTheory.Coverage C) : CategoryTheory.GrothendieckTopology C
--% env 3
Raw input {"cmd": "-- SieveGenerate : la g\u00e9n\u00e9ration d'un crible est monotone\n#check Grothendieck.generate_monotone\n-- SieveOps : la topologie triviale est la plus petite\n#check Grothendieck.trivial_le_any\n-- SieveLattice : le pullback de cribles est une structure d'action\n#check Grothendieck.pullback_pullback\n-- TopologyLattice : l'ordre des topologies est port\u00e9 par les recouvrements\n#check Grothendieck.TopologyLattice.le_covers\n-- DenseTopology : dense est strictement entre triviale et discr\u00e8te\n#check Grothendieck.DenseTopology.dense_le_discrete\n-- CoverageGen : une coverage engendre une topologie de Grothendieck\n#check Grothendieck.coverageToTopology", "env": 2}
Raw output {"messages": [{"severity": "info", "pos": {"line": 2, "column": 0}, "endPos": {"line": 2, "column": 6}, "data": "Grothendieck.generate_monotone.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X : C}\n {R₁ R₂ : CategoryTheory.Presieve X} (h : R₁ ≤ R₂) :\n CategoryTheory.Sieve.generate R₁ ≤ CategoryTheory.Sieve.generate R₂"}, {"severity": "info", "pos": {"line": 4, "column": 0}, "endPos": {"line": 4, "column": 6}, "data": "Grothendieck.trivial_le_any.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C]\n (J : CategoryTheory.GrothendieckTopology C) : CategoryTheory.GrothendieckTopology.trivial C ≤ J"}, {"severity": "info", "pos": {"line": 6, "column": 0}, "endPos": {"line": 6, "column": 6}, "data": "Grothendieck.pullback_pullback.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y Z : C}\n (S : CategoryTheory.Sieve X) (f : Y ⟶ X) (g : Z ⟶ Y) :\n CategoryTheory.Sieve.pullback g (CategoryTheory.Sieve.pullback f S) =\n CategoryTheory.Sieve.pullback (CategoryTheory.CategoryStruct.comp g f) S"}, {"severity": "info", "pos": {"line": 8, "column": 0}, "endPos": {"line": 8, "column": 6}, "data": "Grothendieck.TopologyLattice.le_covers.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C}\n {J₁ J₂ : CategoryTheory.GrothendieckTopology C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) :\n J₁ ≤ J₂ → J₁.Covers S f → J₂.Covers S f"}, {"severity": "info", "pos": {"line": 10, "column": 0}, "endPos": {"line": 10, "column": 6}, "data": "Grothendieck.DenseTopology.dense_le_discrete.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] :\n CategoryTheory.GrothendieckTopology.dense ≤ CategoryTheory.GrothendieckTopology.discrete C"}, {"severity": "info", "pos": {"line": 12, "column": 0}, "endPos": {"line": 12, "column": 6}, "data": "Grothendieck.coverageToTopology.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C]\n (K : CategoryTheory.Coverage C) : CategoryTheory.GrothendieckTopology C"}], "env": 3}

5. La forme fleche des recouvrements (famille Covers*)

Le cœur original du lake : remplacer « une famille de flèches couvre » par un prédicat binaire J.Covers S f — la flèche f est couverte par la structure S. Chaque topologie de la section 4 possède sa version arrow (atomique, Zariski, dense, coverage, pré-coverage, pré-topologie), et chaque opération a ses lois.

Ce que disent les théorèmes. covers_iff_covers_id : recouvrir f équivaut à recouvrir l’identité après pullback — la forme flèche est auto-équivalente à la forme famille, mais se compose mieux. covers_bind est l’axiome de liaison : si f est couverte et que chaque flèche du recouvrement est elle-même couverte, alors f est couverte — c’est la transitivité des recouvrements, l’ingrédient qui distingue une topologie d’une simple coverage. covers_top : le recouvrement maximal existe (tout couvre). sInf_covers : le treillis — l’intersection de familles couvrantes couvre. cover_pullback_covers : la stabilité par changement de base, l’axiome le plus important pour la géométrie (un recouvrement reste un recouvrement après pullback le long de n’importe quelle flèche — sans elle, pas de faisceaux). pushforward_pullback_fixed : l’image directe et le pullback sont adjoints sur les recouvrements.

Pourquoi c’est la famille la plus étendue du lake. C’est ici que la pédagogie des topologies de Grothendieck devient opératoire : chaque loi correspond à une manipulation concrète de recouvrements, et le lake prouve chacune comme théorème — pas comme axiome. La sortie #check de cette section est la plus longue du notebook : c’est la preuve que la formalisation de la « famille » au sens de SAGA est complète jusqu’à l’associativité de la liaison.

-- CoversArrow : forme flèche : recouvrir `f` équivaut à recouvrir `id`
#check Grothendieck.CoversArrow.covers_iff_covers_id
-- CoversAtomicArrow : la topologie atomique en forme flèche
#check Grothendieck.CoversAtomicArrow.atomic_covering
#check Grothendieck.CoversAtomicArrow.covers_iff_atomic
-- CoversBind : l'axiome de liaison des topologies en forme flèche
#check Grothendieck.CoversBind.covers_bind
-- CoversLattice : structure de treillis sur les recouvrements
#check Grothendieck.CoversLattice.sInf_covers
-- CoversOrder : le recouvrement maximal est top
#check Grothendieck.CoversOrder.covers_top
-- CoversPullback : stabilité par pullback des recouvrements
#check Grothendieck.CoversPullback.cover_pullback_covers
-- CoversPushforward : image directe des recouvrements
#check Grothendieck.CoversPushforward.pushforward_pullback_fixed
#check Grothendieck.CoversPushforward.pullback_pushforward_fixed
-- CoversTopologies : recouvrements de la topologie dense
#check Grothendieck.CoversTopologies.dense_covers_iff
-- CoversZariskiArrow : le site de Zariski en forme flèche
#check Grothendieck.CoversZariskiArrow.covers_iff_zariski
-- CoversCoverageArrow : la conversion coverage → topologie en forme flèche
#check Grothendieck.CoversCoverageArrow.covers_iff_toGrothendieck
-- CoversPrecoverageArrow : la conversion pré-coverage → topologie
#check Grothendieck.CoversPrecoverageArrow.covers_iff_toGrothendieck
-- CoversPretopologyArrow : la conversion pré-topologie → topologie
#check Grothendieck.CoversPretopologyArrow.covers_toGrothendieck_of_of
-- PullbackCoversLaws : l'associativité du pullback de recouvrements
#check Grothendieck.PullbackCoversLaws.covers_pullback_assoc
-- PullbackFunctor : le foncteur pullback et ses unités
#check Grothendieck.PullbackFunctor.pullback_triple
-- PullbackFunctorLaws : les lois du foncteur pullback
#check Grothendieck.PullbackFunctorLaws.covers_pullback_comp
-- CoversArrow : forme flèche : recouvrir `f` équivaut à recouvrir `id`
Grothendieck.CoversArrow.covers_iff_covers_id.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} (J : CategoryTheory.GrothendieckTopology C) (S : CategoryTheory.Sieve X) (f : Y ⟶ X) : J.Covers S f ↔ J.Covers (CategoryTheory.Sieve.pullback f S) (CategoryTheory.CategoryStruct.id Y)
-- CoversAtomicArrow : la topologie atomique en forme flèche
Grothendieck.CoversAtomicArrow.atomic_covering.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] (hro : CategoryTheory.GrothendieckTopology.RightOreCondition C) {X : C} (S : CategoryTheory.Sieve X) : S ∈ (CategoryTheory.GrothendieckTopology.atomic ⋯) X ↔ ∃ Y f, S.arrows f
Grothendieck.CoversAtomicArrow.covers_iff_atomic.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] (hro : CategoryTheory.GrothendieckTopology.RightOreCondition C) {X Y : C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) : (CategoryTheory.GrothendieckTopology.atomic ⋯).Covers S f ↔ ∃ Z g, S.arrows (CategoryTheory.CategoryStruct.comp g f)
-- CoversBind : l'axiome de liaison des topologies en forme flèche
Grothendieck.CoversBind.covers_bind.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} (J : CategoryTheory.GrothendieckTopology C) (S : CategoryTheory.Sieve X) (f : Y ⟶ X) (hS : J.Covers S f) (T : ⦃Z : C⦄ → ⦃g : Z ⟶ X⦄ → S.arrows g → CategoryTheory.Sieve Z) (hT : ∀ ⦃Z : C⦄ ⦃g : Z ⟶ X⦄ (hg : S.arrows g), J.Covers (T hg) (CategoryTheory.CategoryStruct.id Z)) : J.Covers (CategoryTheory.Sieve.bind S.arrows T) f
-- CoversLattice : structure de treillis sur les recouvrements
Grothendieck.CoversLattice.sInf_covers.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {s : Set (CategoryTheory.GrothendieckTopology C)} {X Y : C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) : (sInf s).Covers S f ↔ ∀ J ∈ s, J.Covers S f
-- CoversOrder : le recouvrement maximal est top
Grothendieck.CoversOrder.covers_top.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} (J : CategoryTheory.GrothendieckTopology C) (f : Y ⟶ X) : J.Covers ⊤ f
-- CoversPullback : stabilité par pullback des recouvrements
Grothendieck.CoversPullback.cover_pullback_covers.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} (J : CategoryTheory.GrothendieckTopology C) (S : J.Cover X) (f : Y ⟶ X) : J.Covers (↑(S.pullback f)) (CategoryTheory.CategoryStruct.id Y)
-- CoversPushforward : image directe des recouvrements
Grothendieck.CoversPushforward.pushforward_pullback_fixed.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} {f : Y ⟶ X} [CategoryTheory.Mono f] (S : CategoryTheory.Sieve Y) : CategoryTheory.Sieve.pullback f (CategoryTheory.Sieve.pushforward f S) = S
Grothendieck.CoversPushforward.pullback_pushforward_fixed.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} {f : Y ⟶ X} [CategoryTheory.IsSplitEpi f] (R : CategoryTheory.Sieve X) : CategoryTheory.Sieve.pushforward f (CategoryTheory.Sieve.pullback f R) = R
-- CoversTopologies : recouvrements de la topologie dense
Grothendieck.CoversTopologies.dense_covers_iff.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) : CategoryTheory.GrothendieckTopology.dense.Covers S f ↔ ∀ {Z : C} (g : Z ⟶ Y), ∃ W h, S.arrows (CategoryTheory.CategoryStruct.comp h (CategoryTheory.CategoryStruct.comp g f))
-- CoversZariskiArrow : le site de Zariski en forme flèche
Grothendieck.CoversZariskiArrow.covers_iff_zariski.{u} {X Y : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) : AlgebraicGeometry.Scheme.zariskiTopology.Covers S f ↔ ∃ R ∈ AlgebraicGeometry.Scheme.zariskiPretopology.coverings Y, R ≤ (CategoryTheory.Sieve.pullback f S).arrows
-- CoversCoverageArrow : la conversion coverage → topologie en forme flèche
Grothendieck.CoversCoverageArrow.covers_iff_toGrothendieck.{u, v} {C : Type u} [CategoryTheory.Category.{v, u} C] (K : CategoryTheory.Coverage C) {X Y : C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) : K.toGrothendieck.Covers S f ↔ K.Saturate Y (CategoryTheory.Sieve.pullback f S)
-- CoversPrecoverageArrow : la conversion pré-coverage → topologie
Grothendieck.CoversPrecoverageArrow.covers_iff_toGrothendieck.{u, v} {C : Type u} [CategoryTheory.Category.{v, u} C] (J : CategoryTheory.Precoverage C) {X Y : C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) : J.toGrothendieck.Covers S f ↔ J.Saturate Y (CategoryTheory.Sieve.pullback f S)
-- CoversPretopologyArrow : la conversion pré-topologie → topologie
Grothendieck.CoversPretopologyArrow.covers_toGrothendieck_of_of.{u, v} {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasPullbacks C] (K : CategoryTheory.Pretopology C) {X : C} {R : CategoryTheory.Presieve X} (hR : R ∈ K.coverings X) : K.toGrothendieck.Covers (CategoryTheory.Sieve.generate R) (CategoryTheory.CategoryStruct.id X)
-- PullbackCoversLaws : l'associativité du pullback de recouvrements
Grothendieck.PullbackCoversLaws.covers_pullback_assoc.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {W X Y Z : C} (J : CategoryTheory.GrothendieckTopology C) (S : CategoryTheory.Sieve Z) (f : Y ⟶ Z) (g : X ⟶ Y) (h : W ⟶ X) : J.Covers (CategoryTheory.Sieve.pullback g (CategoryTheory.Sieve.pullback f S)) h ↔ J.Covers (CategoryTheory.Sieve.pullback (CategoryTheory.CategoryStruct.comp g f) S) h
-- PullbackFunctor : le foncteur pullback et ses unités
Grothendieck.PullbackFunctor.pullback_triple.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y Z W : C} (J : CategoryTheory.GrothendieckTopology C) (S : J.Cover W) (f : X ⟶ Y) (g : Y ⟶ Z) (h : Z ⟶ W) : ((S.pullback h).pullback g).pullback f = S.pullback (CategoryTheory.CategoryStruct.comp f (CategoryTheory.CategoryStruct.comp g h))
-- PullbackFunctorLaws : les lois du foncteur pullback
Grothendieck.PullbackFunctorLaws.covers_pullback_comp.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y Z : C} (J : CategoryTheory.GrothendieckTopology C) (f : X ⟶ Y) (g : Y ⟶ Z) (S : J.Cover Z) : J.Covers (↑S) (CategoryTheory.CategoryStruct.comp f g) ↔ J.Covers (↑(S.pullback g)) f
--% env 4
Raw input {"cmd": "-- CoversArrow : forme fl\u00e8che : recouvrir `f` \u00e9quivaut \u00e0 recouvrir `id`\n#check Grothendieck.CoversArrow.covers_iff_covers_id\n-- CoversAtomicArrow : la topologie atomique en forme fl\u00e8che\n#check Grothendieck.CoversAtomicArrow.atomic_covering\n#check Grothendieck.CoversAtomicArrow.covers_iff_atomic\n-- CoversBind : l'axiome de liaison des topologies en forme fl\u00e8che\n#check Grothendieck.CoversBind.covers_bind\n-- CoversLattice : structure de treillis sur les recouvrements\n#check Grothendieck.CoversLattice.sInf_covers\n-- CoversOrder : le recouvrement maximal est top\n#check Grothendieck.CoversOrder.covers_top\n-- CoversPullback : stabilit\u00e9 par pullback des recouvrements\n#check Grothendieck.CoversPullback.cover_pullback_covers\n-- CoversPushforward : image directe des recouvrements\n#check Grothendieck.CoversPushforward.pushforward_pullback_fixed\n#check Grothendieck.CoversPushforward.pullback_pushforward_fixed\n-- CoversTopologies : recouvrements de la topologie dense\n#check Grothendieck.CoversTopologies.dense_covers_iff\n-- CoversZariskiArrow : le site de Zariski en forme fl\u00e8che\n#check Grothendieck.CoversZariskiArrow.covers_iff_zariski\n-- CoversCoverageArrow : la conversion coverage \u2192 topologie en forme fl\u00e8che\n#check Grothendieck.CoversCoverageArrow.covers_iff_toGrothendieck\n-- CoversPrecoverageArrow : la conversion pr\u00e9-coverage \u2192 topologie\n#check Grothendieck.CoversPrecoverageArrow.covers_iff_toGrothendieck\n-- CoversPretopologyArrow : la conversion pr\u00e9-topologie \u2192 topologie\n#check Grothendieck.CoversPretopologyArrow.covers_toGrothendieck_of_of\n-- PullbackCoversLaws : l'associativit\u00e9 du pullback de recouvrements\n#check Grothendieck.PullbackCoversLaws.covers_pullback_assoc\n-- PullbackFunctor : le foncteur pullback et ses unit\u00e9s\n#check Grothendieck.PullbackFunctor.pullback_triple\n-- PullbackFunctorLaws : les lois du foncteur pullback\n#check Grothendieck.PullbackFunctorLaws.covers_pullback_comp", "env": 3}
Raw output {"messages": [{"severity": "info", "pos": {"line": 2, "column": 0}, "endPos": {"line": 2, "column": 6}, "data": "Grothendieck.CoversArrow.covers_iff_covers_id.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C}\n (J : CategoryTheory.GrothendieckTopology C) (S : CategoryTheory.Sieve X) (f : Y ⟶ X) :\n J.Covers S f ↔ J.Covers (CategoryTheory.Sieve.pullback f S) (CategoryTheory.CategoryStruct.id Y)"}, {"severity": "info", "pos": {"line": 4, "column": 0}, "endPos": {"line": 4, "column": 6}, "data": "Grothendieck.CoversAtomicArrow.atomic_covering.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C]\n (hro : CategoryTheory.GrothendieckTopology.RightOreCondition C) {X : C} (S : CategoryTheory.Sieve X) :\n S ∈ (CategoryTheory.GrothendieckTopology.atomic ⋯) X ↔ ∃ Y f, S.arrows f"}, {"severity": "info", "pos": {"line": 5, "column": 0}, "endPos": {"line": 5, "column": 6}, "data": "Grothendieck.CoversAtomicArrow.covers_iff_atomic.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C]\n (hro : CategoryTheory.GrothendieckTopology.RightOreCondition C) {X Y : C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) :\n (CategoryTheory.GrothendieckTopology.atomic ⋯).Covers S f ↔ ∃ Z g, S.arrows (CategoryTheory.CategoryStruct.comp g f)"}, {"severity": "info", "pos": {"line": 7, "column": 0}, "endPos": {"line": 7, "column": 6}, "data": "Grothendieck.CoversBind.covers_bind.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C}\n (J : CategoryTheory.GrothendieckTopology C) (S : CategoryTheory.Sieve X) (f : Y ⟶ X) (hS : J.Covers S f)\n (T : ⦃Z : C⦄ → ⦃g : Z ⟶ X⦄ → S.arrows g → CategoryTheory.Sieve Z)\n (hT : ∀ ⦃Z : C⦄ ⦃g : Z ⟶ X⦄ (hg : S.arrows g), J.Covers (T hg) (CategoryTheory.CategoryStruct.id Z)) :\n J.Covers (CategoryTheory.Sieve.bind S.arrows T) f"}, {"severity": "info", "pos": {"line": 9, "column": 0}, "endPos": {"line": 9, "column": 6}, "data": "Grothendieck.CoversLattice.sInf_covers.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C]\n {s : Set (CategoryTheory.GrothendieckTopology C)} {X Y : C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) :\n (sInf s).Covers S f ↔ ∀ J ∈ s, J.Covers S f"}, {"severity": "info", "pos": {"line": 11, "column": 0}, "endPos": {"line": 11, "column": 6}, "data": "Grothendieck.CoversOrder.covers_top.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C}\n (J : CategoryTheory.GrothendieckTopology C) (f : Y ⟶ X) : J.Covers ⊤ f"}, {"severity": "info", "pos": {"line": 13, "column": 0}, "endPos": {"line": 13, "column": 6}, "data": "Grothendieck.CoversPullback.cover_pullback_covers.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C]\n {X Y : C} (J : CategoryTheory.GrothendieckTopology C) (S : J.Cover X) (f : Y ⟶ X) :\n J.Covers (↑(S.pullback f)) (CategoryTheory.CategoryStruct.id Y)"}, {"severity": "info", "pos": {"line": 15, "column": 0}, "endPos": {"line": 15, "column": 6}, "data": "Grothendieck.CoversPushforward.pushforward_pullback_fixed.{u_1, u_2} {C : Type u_1}\n [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} {f : Y ⟶ X} [CategoryTheory.Mono f] (S : CategoryTheory.Sieve Y) :\n CategoryTheory.Sieve.pullback f (CategoryTheory.Sieve.pushforward f S) = S"}, {"severity": "info", "pos": {"line": 16, "column": 0}, "endPos": {"line": 16, "column": 6}, "data": "Grothendieck.CoversPushforward.pullback_pushforward_fixed.{u_1, u_2} {C : Type u_1}\n [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} {f : Y ⟶ X} [CategoryTheory.IsSplitEpi f]\n (R : CategoryTheory.Sieve X) : CategoryTheory.Sieve.pushforward f (CategoryTheory.Sieve.pullback f R) = R"}, {"severity": "info", "pos": {"line": 18, "column": 0}, "endPos": {"line": 18, "column": 6}, "data": "Grothendieck.CoversTopologies.dense_covers_iff.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C]\n {X Y : C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) :\n CategoryTheory.GrothendieckTopology.dense.Covers S f ↔\n ∀ {Z : C} (g : Z ⟶ Y),\n ∃ W h, S.arrows (CategoryTheory.CategoryStruct.comp h (CategoryTheory.CategoryStruct.comp g f))"}, {"severity": "info", "pos": {"line": 20, "column": 0}, "endPos": {"line": 20, "column": 6}, "data": "Grothendieck.CoversZariskiArrow.covers_iff_zariski.{u} {X Y : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X)\n (f : Y ⟶ X) :\n AlgebraicGeometry.Scheme.zariskiTopology.Covers S f ↔\n ∃ R ∈ AlgebraicGeometry.Scheme.zariskiPretopology.coverings Y, R ≤ (CategoryTheory.Sieve.pullback f S).arrows"}, {"severity": "info", "pos": {"line": 22, "column": 0}, "endPos": {"line": 22, "column": 6}, "data": "Grothendieck.CoversCoverageArrow.covers_iff_toGrothendieck.{u, v} {C : Type u} [CategoryTheory.Category.{v, u} C]\n (K : CategoryTheory.Coverage C) {X Y : C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) :\n K.toGrothendieck.Covers S f ↔ K.Saturate Y (CategoryTheory.Sieve.pullback f S)"}, {"severity": "info", "pos": {"line": 24, "column": 0}, "endPos": {"line": 24, "column": 6}, "data": "Grothendieck.CoversPrecoverageArrow.covers_iff_toGrothendieck.{u, v} {C : Type u} [CategoryTheory.Category.{v, u} C]\n (J : CategoryTheory.Precoverage C) {X Y : C} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) :\n J.toGrothendieck.Covers S f ↔ J.Saturate Y (CategoryTheory.Sieve.pullback f S)"}, {"severity": "info", "pos": {"line": 26, "column": 0}, "endPos": {"line": 26, "column": 6}, "data": "Grothendieck.CoversPretopologyArrow.covers_toGrothendieck_of_of.{u, v} {C : Type u} [CategoryTheory.Category.{v, u} C]\n [CategoryTheory.Limits.HasPullbacks C] (K : CategoryTheory.Pretopology C) {X : C} {R : CategoryTheory.Presieve X}\n (hR : R ∈ K.coverings X) :\n K.toGrothendieck.Covers (CategoryTheory.Sieve.generate R) (CategoryTheory.CategoryStruct.id X)"}, {"severity": "info", "pos": {"line": 28, "column": 0}, "endPos": {"line": 28, "column": 6}, "data": "Grothendieck.PullbackCoversLaws.covers_pullback_assoc.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C]\n {W X Y Z : C} (J : CategoryTheory.GrothendieckTopology C) (S : CategoryTheory.Sieve Z) (f : Y ⟶ Z) (g : X ⟶ Y)\n (h : W ⟶ X) :\n J.Covers (CategoryTheory.Sieve.pullback g (CategoryTheory.Sieve.pullback f S)) h ↔\n J.Covers (CategoryTheory.Sieve.pullback (CategoryTheory.CategoryStruct.comp g f) S) h"}, {"severity": "info", "pos": {"line": 30, "column": 0}, "endPos": {"line": 30, "column": 6}, "data": "Grothendieck.PullbackFunctor.pullback_triple.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C]\n {X Y Z W : C} (J : CategoryTheory.GrothendieckTopology C) (S : J.Cover W) (f : X ⟶ Y) (g : Y ⟶ Z) (h : Z ⟶ W) :\n ((S.pullback h).pullback g).pullback f =\n S.pullback (CategoryTheory.CategoryStruct.comp f (CategoryTheory.CategoryStruct.comp g h))"}, {"severity": "info", "pos": {"line": 32, "column": 0}, "endPos": {"line": 32, "column": 6}, "data": "Grothendieck.PullbackFunctorLaws.covers_pullback_comp.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C]\n {X Y Z : C} (J : CategoryTheory.GrothendieckTopology C) (f : X ⟶ Y) (g : Y ⟶ Z) (S : J.Cover Z) :\n J.Covers (↑S) (CategoryTheory.CategoryStruct.comp f g) ↔ J.Covers (↑(S.pullback g)) f"}], "env": 4}

6. Faisceaux, faisceautisation, sous-canonicalite

Au-dessus du site, les faisceaux : les préfaisceaux qui « collent » les sections locales en sections globales. Cette section est le cœur conceptuel du topos — un faisceau n’est pas une donnée, c’est une manière de répondre aux recouvrements.

Ce que disent les théorèmes. sheaf_is_separated : un faisceau est en particulier séparé — deux sections qui coïncident localement coïncident (la moitié « unicité » de la condition de faisceau ; isSheaf_of_le raffine : si la topologie est plus petite, le faisceau l’est aussi). sheafHom_isSheaf : le faisceau interne des homomorphismes ℋ𝗈𝗆(F, G) est un faisceau — l’objet qui rend les morphismes de faisceaux eux-mêmes manipulables géométriquement. sheafification_universal est le théorème d’existence clé : la faisceautisation est adjointe à l’inclusion Sheaf α J ↪ Presheaf α — tout préfaisceau se transforme en faisceau de façon universelle. C’est « the plus construction » : itérée une fois pour les topologies finitaires, transfinie en général. plus_preserves_finite_limits : l’exactitude à gauche — la faisceautisation préserve les limites finies, ce qui fait des faisceaux une catégorie abélienne-en-esprit, le prérequis pour la cohomologie de la section 7. isConstant_iff_counit_iso : un faisceau constant est caractérisé par son adjonction avec le foncteur sections constantes. canonical_is_subcanonical : la sous-canonicalité — le faisceau de Yoneda est un faisceau pour la topologie canonique, la topologie la plus fine pour laquelle ça reste vrai. C’est le plongement de Yoneda (§2) qui devient faisceau — la boucle est bouclée.

-- SheafBasics : un faisceau est en particulier séparé
#check Grothendieck.sheaf_is_separated
#check Grothendieck.isSheaf_of_le
-- SheafHom : le faisceau interne des homomorphismes
#check Grothendieck.SheafHom.sheafHom_isSheaf
-- Sheafification : la propriété universelle de la faisceautisation
#check Grothendieck.sheafification_universal
-- ConstantSheaf : un faisceau constant caractérisé par son adjonction
#check Grothendieck.ConstantSheaf.isConstant_iff_counit_iso
-- LeftExact : la faisceautisation préserve les limites finies (exactitude à gauche)
#check Grothendieck.plus_preserves_finite_limits
-- Subcanonical : sous-canonicalité : le plongement de Yoneda est un faisceau
#check Grothendieck.Subcanonical.subcanonical_of_yoneda_sheaf
-- CanonicalProps : la topologie canonique est sous-canonique
#check Grothendieck.canonical_is_subcanonical
-- SheafBasics : un faisceau est en particulier séparé
Grothendieck.sheaf_is_separated.{u_1, u_2, u_3} {C : Type u_1} [CategoryTheory.Category.{u_3, u_1} C] {J : CategoryTheory.GrothendieckTopology C} {P : CategoryTheory.Functor Cᵒᵖ (Type u_2)} (h : CategoryTheory.Presieve.IsSheaf J P) : CategoryTheory.Presieve.IsSeparated J P
Grothendieck.isSheaf_of_le.{u_1, u_2, u_3} {C : Type u_1} [CategoryTheory.Category.{u_3, u_1} C] {J₁ J₂ : CategoryTheory.GrothendieckTopology C} (h : J₁ ≤ J₂) {P : CategoryTheory.Functor Cᵒᵖ (Type u_2)} (hP : CategoryTheory.Presieve.IsSheaf J₂ P) : CategoryTheory.Presieve.IsSheaf J₁ P
-- SheafHom : le faisceau interne des homomorphismes
Grothendieck.SheafHom.sheafHom_isSheaf.{v, v', u, u'} {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {A : Type u'} [CategoryTheory.Category.{v', u'} A] (F G : CategoryTheory.Sheaf J A) : CategoryTheory.Presheaf.IsSheaf J (CategoryTheory.sheafHom F G).obj
-- Sheafification : la propriété universelle de la faisceautisation
Grothendieck.sheafification_universal.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] (J : CategoryTheory.GrothendieckTopology C) : CategoryTheory.presheafToSheaf J (Type (max u v)) ⊣ CategoryTheory.sheafToPresheaf J (Type (max u v))
-- ConstantSheaf : un faisceau constant caractérisé par son adjonction
Grothendieck.ConstantSheaf.isConstant_iff_counit_iso.{v, v', u, u'} {C : Type u} [CategoryTheory.Category.{v, u} C] (J : CategoryTheory.GrothendieckTopology C) {D : Type u'} [CategoryTheory.Category.{v', u'} D] [CategoryTheory.HasWeakSheafify J D] [(CategoryTheory.constantSheaf J D).Faithful] [(CategoryTheory.constantSheaf J D).Full] (F : CategoryTheory.Sheaf J D) {T : C} (hT : CategoryTheory.Limits.IsTerminal T) : CategoryTheory.Sheaf.IsConstant J F ↔ CategoryTheory.IsIso ((CategoryTheory.constantSheafAdj J D hT).counit.app F)
-- LeftExact : la faisceautisation préserve les limites finies (exactitude à gauche)
Grothendieck.plus_preserves_finite_limits.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] (J : CategoryTheory.GrothendieckTopology C) : CategoryTheory.Limits.PreservesFiniteLimits (J.plusFunctor (Type (max u v)))
-- Subcanonical : sous-canonicalité : le plongement de Yoneda est un faisceau
Grothendieck.Subcanonical.subcanonical_of_yoneda_sheaf.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] (J : CategoryTheory.GrothendieckTopology C) (h : ∀ (X : C), CategoryTheory.Presieve.IsSheaf J (CategoryTheory.yoneda.obj X)) : J.Subcanonical
-- CanonicalProps : la topologie canonique est sous-canonique
Grothendieck.canonical_is_subcanonical.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] : (CategoryTheory.Sheaf.canonicalTopology C).Subcanonical
--% env 5
Raw input {"cmd": "-- SheafBasics : un faisceau est en particulier s\u00e9par\u00e9\n#check Grothendieck.sheaf_is_separated\n#check Grothendieck.isSheaf_of_le\n-- SheafHom : le faisceau interne des homomorphismes\n#check Grothendieck.SheafHom.sheafHom_isSheaf\n-- Sheafification : la propri\u00e9t\u00e9 universelle de la faisceautisation\n#check Grothendieck.sheafification_universal\n-- ConstantSheaf : un faisceau constant caract\u00e9ris\u00e9 par son adjonction\n#check Grothendieck.ConstantSheaf.isConstant_iff_counit_iso\n-- LeftExact : la faisceautisation pr\u00e9serve les limites finies (exactitude \u00e0 gauche)\n#check Grothendieck.plus_preserves_finite_limits\n-- Subcanonical : sous-canonicalit\u00e9 : le plongement de Yoneda est un faisceau\n#check Grothendieck.Subcanonical.subcanonical_of_yoneda_sheaf\n-- CanonicalProps : la topologie canonique est sous-canonique\n#check Grothendieck.canonical_is_subcanonical", "env": 4}
Raw output {"messages": [{"severity": "info", "pos": {"line": 2, "column": 0}, "endPos": {"line": 2, "column": 6}, "data": "Grothendieck.sheaf_is_separated.{u_1, u_2, u_3} {C : Type u_1} [CategoryTheory.Category.{u_3, u_1} C]\n {J : CategoryTheory.GrothendieckTopology C} {P : CategoryTheory.Functor Cᵒᵖ (Type u_2)}\n (h : CategoryTheory.Presieve.IsSheaf J P) : CategoryTheory.Presieve.IsSeparated J P"}, {"severity": "info", "pos": {"line": 3, "column": 0}, "endPos": {"line": 3, "column": 6}, "data": "Grothendieck.isSheaf_of_le.{u_1, u_2, u_3} {C : Type u_1} [CategoryTheory.Category.{u_3, u_1} C]\n {J₁ J₂ : CategoryTheory.GrothendieckTopology C} (h : J₁ ≤ J₂) {P : CategoryTheory.Functor Cᵒᵖ (Type u_2)}\n (hP : CategoryTheory.Presieve.IsSheaf J₂ P) : CategoryTheory.Presieve.IsSheaf J₁ P"}, {"severity": "info", "pos": {"line": 5, "column": 0}, "endPos": {"line": 5, "column": 6}, "data": "Grothendieck.SheafHom.sheafHom_isSheaf.{v, v', u, u'} {C : Type u} [CategoryTheory.Category.{v, u} C]\n {J : CategoryTheory.GrothendieckTopology C} {A : Type u'} [CategoryTheory.Category.{v', u'} A]\n (F G : CategoryTheory.Sheaf J A) : CategoryTheory.Presheaf.IsSheaf J (CategoryTheory.sheafHom F G).obj"}, {"severity": "info", "pos": {"line": 7, "column": 0}, "endPos": {"line": 7, "column": 6}, "data": "Grothendieck.sheafification_universal.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C]\n (J : CategoryTheory.GrothendieckTopology C) :\n CategoryTheory.presheafToSheaf J (Type (max u v)) ⊣ CategoryTheory.sheafToPresheaf J (Type (max u v))"}, {"severity": "info", "pos": {"line": 9, "column": 0}, "endPos": {"line": 9, "column": 6}, "data": "Grothendieck.ConstantSheaf.isConstant_iff_counit_iso.{v, v', u, u'} {C : Type u} [CategoryTheory.Category.{v, u} C]\n (J : CategoryTheory.GrothendieckTopology C) {D : Type u'} [CategoryTheory.Category.{v', u'} D]\n [CategoryTheory.HasWeakSheafify J D] [(CategoryTheory.constantSheaf J D).Faithful]\n [(CategoryTheory.constantSheaf J D).Full] (F : CategoryTheory.Sheaf J D) {T : C}\n (hT : CategoryTheory.Limits.IsTerminal T) :\n CategoryTheory.Sheaf.IsConstant J F ↔ CategoryTheory.IsIso ((CategoryTheory.constantSheafAdj J D hT).counit.app F)"}, {"severity": "info", "pos": {"line": 11, "column": 0}, "endPos": {"line": 11, "column": 6}, "data": "Grothendieck.plus_preserves_finite_limits.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C]\n (J : CategoryTheory.GrothendieckTopology C) :\n CategoryTheory.Limits.PreservesFiniteLimits (J.plusFunctor (Type (max u v)))"}, {"severity": "info", "pos": {"line": 13, "column": 0}, "endPos": {"line": 13, "column": 6}, "data": "Grothendieck.Subcanonical.subcanonical_of_yoneda_sheaf.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C]\n (J : CategoryTheory.GrothendieckTopology C)\n (h : ∀ (X : C), CategoryTheory.Presieve.IsSheaf J (CategoryTheory.yoneda.obj X)) : J.Subcanonical"}, {"severity": "info", "pos": {"line": 15, "column": 0}, "endPos": {"line": 15, "column": 6}, "data": "Grothendieck.canonical_is_subcanonical.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] :\n (CategoryTheory.Sheaf.canonicalTopology C).Subcanonical"}], "env": 5}

7. Points, images directes et cohomologie

Les outils calculatoires du topos : si un topos ne se calcule pas directement, ses points et sa cohomologie, si.

Ce que disent les théorèmes. is_colimit_presheaf_fiber : la fibre d’un point (l’ensemble des sections « au-dessus » d’un point du topos) est une colimite filtrante — c’est le théorème des points : tout topos de faisceaux a assez de points, et la fibre résume ce que le point « voit ». pushforward_functor_field et exceptionalDirectImage : les foncteurs image directe — pousser un faisceau le long d’un morphisme de sites — l’image directe exceptionnelle étant la version raffinée pour les morphismes non propres.

H⁰ est la section globale (H0_equiv_global_sections) : le H⁰ de la cohomologie de faisceaux n’est pas analogue aux sections globales, il est l’espace des sections globales — le théorème qui fonde toute l’analogie « cohomologie = obstruction à recoller ». cechComplexObj : l’objet du complexe de Čech, la machine combinatoire qui approche la cohomologie par les recouvrements. mv_sequence_exact : la suite de Mayer-Vietoris est exacte — sur un carré de recouvrement, les cohomologies s’assemblent en suite exacte ; c’est l’outil de calcul effectif (celui qui calcule H*(ℙ¹) par recouvrements de deux affines). preserves_finite_limits_and_colimits : les foncteurs de points préservent limites et colimites — la régularité qui rend le calcul par points fidèle.

-- SitePoints : la fibre d'un point est une colimite
#check Grothendieck.is_colimit_presheaf_fiber
-- DirectImage : le foncteur image directe
#check Grothendieck.DirectImage.pushforward_functor_field
-- ExceptionalDirect : l'image directe exceptionnelle
#check Grothendieck.ExceptionalDirect.exceptionalDirectImage
-- SheafCohomology.Basic : H⁰ est la section globale
#check Grothendieck.SheafCohomology.H0_equiv_global_sections
-- SheafCohomology.Cech : l'objet du complexe de Čech
#check Grothendieck.SheafCohomology.Cech.cechComplexObj
-- SheafCohomology.MayerVietoris : l'exactitude de la suite de Mayer-Vietoris
#check Grothendieck.SheafCohomology.MayerVietoris.mv_sequence_exact
-- MayerVietorisSquare : le complexe court du carré de Mayer-Vietoris
#check Grothendieck.MayerVietorisSquare.mv_short_complex
-- SitePoints : la fibre d'un point est une colimite
Grothendieck.is_colimit_presheaf_fiber.{v, u, w} {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} (Φ : J.Point) (P : CategoryTheory.Functor Cᵒᵖ (Type (max u w))) : CategoryTheory.Limits.IsColimit (Φ.presheafFiberCocone P)
-- DirectImage : le foncteur image directe
Grothendieck.DirectImage.pushforward_functor_field.{u} {X Y : AlgebraicGeometry.Scheme} (f : X ⟶ Y) : CategoryTheory.Functor X.Modules Y.Modules
-- ExceptionalDirect : l'image directe exceptionnelle
Grothendieck.ExceptionalDirect.exceptionalDirectImage.{v₁, v₂, v₃, u₁, u₂, u₃} {C : Type u₁} [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {H : Type u₃} [CategoryTheory.Category.{v₃, u₃} H] (f : CategoryTheory.Functor C D) [∀ (F : CategoryTheory.Functor Cᵒᵖ H), f.op.HasLeftKanExtension F] : CategoryTheory.Functor (CategoryTheory.Functor Cᵒᵖ H) (CategoryTheory.Functor Dᵒᵖ H)
-- SheafCohomology.Basic : H⁰ est la section globale
Grothendieck.SheafCohomology.H0_equiv_global_sections.{w', w, v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} (F : CategoryTheory.Sheaf J AddCommGrpCat) {T : C} (hT : CategoryTheory.Limits.IsTerminal T) [CategoryTheory.HasSheafify J AddCommGrpCat] [CategoryTheory.HasExt (CategoryTheory.Sheaf J AddCommGrpCat)] : F.H 0 ≃+ ↑(F.obj.obj (Opposite.op T))
-- SheafCohomology.Cech : l'objet du complexe de Čech
Grothendieck.SheafCohomology.Cech.cechComplexObj.{w, v, v', u, u'} {C : Type u} [CategoryTheory.Category.{v, u} C] {A : Type u'} [CategoryTheory.Category.{v', u'} A] [CategoryTheory.Limits.HasProducts A] [CategoryTheory.Preadditive A] [CategoryTheory.Limits.HasFiniteProducts C] {ι : Type w} (U : ι → C) (P : CategoryTheory.Functor Cᵒᵖ A) (n : ℕ) : A
-- SheafCohomology.MayerVietoris : l'exactitude de la suite de Mayer-Vietoris
Grothendieck.SheafCohomology.MayerVietoris.mv_sequence_exact.{w, v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} [CategoryTheory.HasWeakSheafify J (Type v)] [CategoryTheory.HasSheafify J AddCommGrpCat] [CategoryTheory.HasExt (CategoryTheory.Sheaf J AddCommGrpCat)] (S : J.MayerVietorisSquare) (F : CategoryTheory.Sheaf J AddCommGrpCat) (n₀ n₁ : ℕ) (h : n₀ + 1 = n₁) : (S.sequence F n₀ n₁ h).Exact
-- MayerVietorisSquare : le complexe court du carré de Mayer-Vietoris
Grothendieck.MayerVietorisSquare.mv_short_complex.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} [CategoryTheory.HasWeakSheafify J (Type v)] [CategoryTheory.HasSheafify J AddCommGrpCat] (S : J.MayerVietorisSquare) : CategoryTheory.ShortComplex (CategoryTheory.Sheaf J AddCommGrpCat)
--% env 6
Raw input {"cmd": "-- SitePoints : la fibre d'un point est une colimite\n#check Grothendieck.is_colimit_presheaf_fiber\n-- DirectImage : le foncteur image directe\n#check Grothendieck.DirectImage.pushforward_functor_field\n-- ExceptionalDirect : l'image directe exceptionnelle\n#check Grothendieck.ExceptionalDirect.exceptionalDirectImage\n-- SheafCohomology.Basic : H\u2070 est la section globale\n#check Grothendieck.SheafCohomology.H0_equiv_global_sections\n-- SheafCohomology.Cech : l'objet du complexe de \u010cech\n#check Grothendieck.SheafCohomology.Cech.cechComplexObj\n-- SheafCohomology.MayerVietoris : l'exactitude de la suite de Mayer-Vietoris\n#check Grothendieck.SheafCohomology.MayerVietoris.mv_sequence_exact\n-- MayerVietorisSquare : le complexe court du carr\u00e9 de Mayer-Vietoris\n#check Grothendieck.MayerVietorisSquare.mv_short_complex", "env": 5}
Raw output {"messages": [{"severity": "info", "pos": {"line": 2, "column": 0}, "endPos": {"line": 2, "column": 6}, "data": "Grothendieck.is_colimit_presheaf_fiber.{v, u, w} {C : Type u} [CategoryTheory.Category.{v, u} C]\n {J : CategoryTheory.GrothendieckTopology C} (Φ : J.Point) (P : CategoryTheory.Functor Cᵒᵖ (Type (max u w))) :\n CategoryTheory.Limits.IsColimit (Φ.presheafFiberCocone P)"}, {"severity": "info", "pos": {"line": 4, "column": 0}, "endPos": {"line": 4, "column": 6}, "data": "Grothendieck.DirectImage.pushforward_functor_field.{u} {X Y : AlgebraicGeometry.Scheme} (f : X ⟶ Y) :\n CategoryTheory.Functor X.Modules Y.Modules"}, {"severity": "info", "pos": {"line": 6, "column": 0}, "endPos": {"line": 6, "column": 6}, "data": "Grothendieck.ExceptionalDirect.exceptionalDirectImage.{v₁, v₂, v₃, u₁, u₂, u₃} {C : Type u₁}\n [CategoryTheory.Category.{v₁, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] {H : Type u₃}\n [CategoryTheory.Category.{v₃, u₃} H] (f : CategoryTheory.Functor C D)\n [∀ (F : CategoryTheory.Functor Cᵒᵖ H), f.op.HasLeftKanExtension F] :\n CategoryTheory.Functor (CategoryTheory.Functor Cᵒᵖ H) (CategoryTheory.Functor Dᵒᵖ H)"}, {"severity": "info", "pos": {"line": 8, "column": 0}, "endPos": {"line": 8, "column": 6}, "data": "Grothendieck.SheafCohomology.H0_equiv_global_sections.{w', w, v, u} {C : Type u} [CategoryTheory.Category.{v, u} C]\n {J : CategoryTheory.GrothendieckTopology C} (F : CategoryTheory.Sheaf J AddCommGrpCat) {T : C}\n (hT : CategoryTheory.Limits.IsTerminal T) [CategoryTheory.HasSheafify J AddCommGrpCat]\n [CategoryTheory.HasExt (CategoryTheory.Sheaf J AddCommGrpCat)] : F.H 0 ≃+ ↑(F.obj.obj (Opposite.op T))"}, {"severity": "info", "pos": {"line": 10, "column": 0}, "endPos": {"line": 10, "column": 6}, "data": "Grothendieck.SheafCohomology.Cech.cechComplexObj.{w, v, v', u, u'} {C : Type u} [CategoryTheory.Category.{v, u} C]\n {A : Type u'} [CategoryTheory.Category.{v', u'} A] [CategoryTheory.Limits.HasProducts A]\n [CategoryTheory.Preadditive A] [CategoryTheory.Limits.HasFiniteProducts C] {ι : Type w} (U : ι → C)\n (P : CategoryTheory.Functor Cᵒᵖ A) (n : ℕ) : A"}, {"severity": "info", "pos": {"line": 12, "column": 0}, "endPos": {"line": 12, "column": 6}, "data": "Grothendieck.SheafCohomology.MayerVietoris.mv_sequence_exact.{w, v, u} {C : Type u} [CategoryTheory.Category.{v, u} C]\n {J : CategoryTheory.GrothendieckTopology C} [CategoryTheory.HasWeakSheafify J (Type v)]\n [CategoryTheory.HasSheafify J AddCommGrpCat] [CategoryTheory.HasExt (CategoryTheory.Sheaf J AddCommGrpCat)]\n (S : J.MayerVietorisSquare) (F : CategoryTheory.Sheaf J AddCommGrpCat) (n₀ n₁ : ℕ) (h : n₀ + 1 = n₁) :\n (S.sequence F n₀ n₁ h).Exact"}, {"severity": "info", "pos": {"line": 14, "column": 0}, "endPos": {"line": 14, "column": 6}, "data": "Grothendieck.MayerVietorisSquare.mv_short_complex.{v, u} {C : Type u} [CategoryTheory.Category.{v, u} C]\n {J : CategoryTheory.GrothendieckTopology C} [CategoryTheory.HasWeakSheafify J (Type v)]\n [CategoryTheory.HasSheafify J AddCommGrpCat] (S : J.MayerVietorisSquare) :\n CategoryTheory.ShortComplex (CategoryTheory.Sheaf J AddCommGrpCat)"}], "env": 6}

8. Geometrie : schemas, Zariski, construction, points

L’ancrage géométrique : tout ce qui précède devient de la géométrie algébrique effective.

Ce que disent les théorèmes. scheme_hom_continuous : un morphisme de schémas est une application continue sur les espaces topologiques sous-jacents — le formalisme donne gratuitement le socle topologique. zariski_topology_eq : la topologie de Zariski est une topologie de Grothendieck — l’identification qui rend le site de Zariski un objet du langage des sections 4-5, pas une analogie. grothendieck_field et forget_family : la construction de Grothendieck — le préfaisceau X ↦ ∐ familles qui associe à chaque objet ses familles de flèches ; c’est le germe de la construction Spec, le pont fonctoriel entre algèbre et géométrie. has_enough_points_field : une famille conservatrice de points — assez de points pour que l’isomorphisme sur tous les points implique l’isomorphisme ; c’est le théorème des points suffisants, le passage « local → global » pour les propriétés vérifiables fibre par fibre (W_iff_field : une propriété W vaut ssi elle vaut sur chaque point).

Pourquoi ce “Tour”. Ces modules sont volontairement une ** visite guidée** plutôt qu’un traité : ils attestent que le lake descend jusqu’aux objets géométriques concrets (schémas, Zariski), et que la chaîne complète Yoneda → sites → faisceaux → cohomologie → géométrie tient dans un seul environnement Lean 4 chargé d’un seul import.

-- SchemesTour : les morphismes de schémas sont continus
#check Grothendieck.scheme_hom_continuous
-- ZariskiSite : la topologie de Zariski est une topologie de Grothendieck
#check Grothendieck.zariski_topology_eq
-- Construction : la construction du préfaisceau de Grothendieck
#check Grothendieck.Construction.grothendieck_field
#check Grothendieck.Construction.forget_family
-- Conservative : une famille conservatrice de points
#check Grothendieck.Conservative.has_enough_points_field
#check Grothendieck.Conservative.W_iff_field
-- SchemesTour : les morphismes de schémas sont continus
Grothendieck.scheme_hom_continuous.{u_1} {X Y : AlgebraicGeometry.Scheme} (f : X ⟶ Y) : Continuous ⇑f
-- ZariskiSite : la topologie de Zariski est une topologie de Grothendieck
Grothendieck.zariski_topology_eq.{u_1} : AlgebraicGeometry.Scheme.zariskiTopology = AlgebraicGeometry.Scheme.zariskiPretopology.toGrothendieck
-- Construction : la construction du préfaisceau de Grothendieck
Grothendieck.Construction.grothendieck_field.{v, v₂, u, u₂} {C : Type u} [CategoryTheory.Category.{v, u} C] (F : CategoryTheory.Functor C CategoryTheory.Cat) : Type (max u₂ u)
Grothendieck.Construction.forget_family.{v, v₂, u, u₂} {C : Type u} [CategoryTheory.Category.{v, u} C] (F : CategoryTheory.Functor C CategoryTheory.Cat) : CategoryTheory.Functor (CategoryTheory.Grothendieck F) C
-- Conservative : une famille conservatrice de points
Grothendieck.Conservative.has_enough_points_field.{v, u, w} {C : Type u} [CategoryTheory.Category.{v, u} C] (J : CategoryTheory.GrothendieckTopology C) : Prop
Grothendieck.Conservative.W_iff_field.{v, v', u, u', w, u_1} {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} (P : CategoryTheory.ObjectProperty J.Point) {A : Type u'} [CategoryTheory.Category.{v', u'} A] [CategoryTheory.LocallySmall.{w, v, u} C] [CategoryTheory.Limits.HasColimitsOfSize.{w, w, v', u'} A] {FC : A → A → Type u_1} {CC : A → Type w} [(X Y : A) → FunLike (FC X Y) (CC X) (CC Y)] [CategoryTheory.ConcreteCategory A FC] [(CategoryTheory.forget A).ReflectsIsomorphisms] [CategoryTheory.Limits.PreservesFilteredColimitsOfSize.{w, w, v', w, u', w + 1} (CategoryTheory.forget A)] [J.HasSheafCompose (CategoryTheory.forget A)] (hP : P.IsConservativeFamilyOfPoints) [CategoryTheory.HasWeakSheafify J A] [CategoryTheory.Limits.HasProducts A] {F G : CategoryTheory.Functor Cᵒᵖ A} (f : F ⟶ G) : J.W f ↔ ∀ (Φ : P.FullSubcategory), CategoryTheory.IsIso (Φ.obj.presheafFiber.map f)
--% env 7
Raw input {"cmd": "-- SchemesTour : les morphismes de sch\u00e9mas sont continus\n#check Grothendieck.scheme_hom_continuous\n-- ZariskiSite : la topologie de Zariski est une topologie de Grothendieck\n#check Grothendieck.zariski_topology_eq\n-- Construction : la construction du pr\u00e9faisceau de Grothendieck\n#check Grothendieck.Construction.grothendieck_field\n#check Grothendieck.Construction.forget_family\n-- Conservative : une famille conservatrice de points\n#check Grothendieck.Conservative.has_enough_points_field\n#check Grothendieck.Conservative.W_iff_field", "env": 6}
Raw output {"messages": [{"severity": "info", "pos": {"line": 2, "column": 0}, "endPos": {"line": 2, "column": 6}, "data": "Grothendieck.scheme_hom_continuous.{u_1} {X Y : AlgebraicGeometry.Scheme} (f : X ⟶ Y) : Continuous ⇑f"}, {"severity": "info", "pos": {"line": 4, "column": 0}, "endPos": {"line": 4, "column": 6}, "data": "Grothendieck.zariski_topology_eq.{u_1} :\n AlgebraicGeometry.Scheme.zariskiTopology = AlgebraicGeometry.Scheme.zariskiPretopology.toGrothendieck"}, {"severity": "info", "pos": {"line": 6, "column": 0}, "endPos": {"line": 6, "column": 6}, "data": "Grothendieck.Construction.grothendieck_field.{v, v₂, u, u₂} {C : Type u} [CategoryTheory.Category.{v, u} C]\n (F : CategoryTheory.Functor C CategoryTheory.Cat) : Type (max u₂ u)"}, {"severity": "info", "pos": {"line": 7, "column": 0}, "endPos": {"line": 7, "column": 6}, "data": "Grothendieck.Construction.forget_family.{v, v₂, u, u₂} {C : Type u} [CategoryTheory.Category.{v, u} C]\n (F : CategoryTheory.Functor C CategoryTheory.Cat) : CategoryTheory.Functor (CategoryTheory.Grothendieck F) C"}, {"severity": "info", "pos": {"line": 9, "column": 0}, "endPos": {"line": 9, "column": 6}, "data": "Grothendieck.Conservative.has_enough_points_field.{v, u, w} {C : Type u} [CategoryTheory.Category.{v, u} C]\n (J : CategoryTheory.GrothendieckTopology C) : Prop"}, {"severity": "info", "pos": {"line": 10, "column": 0}, "endPos": {"line": 10, "column": 6}, "data": "Grothendieck.Conservative.W_iff_field.{v, v', u, u', w, u_1} {C : Type u} [CategoryTheory.Category.{v, u} C]\n {J : CategoryTheory.GrothendieckTopology C} (P : CategoryTheory.ObjectProperty J.Point) {A : Type u'}\n [CategoryTheory.Category.{v', u'} A] [CategoryTheory.LocallySmall.{w, v, u} C]\n [CategoryTheory.Limits.HasColimitsOfSize.{w, w, v', u'} A] {FC : A → A → Type u_1} {CC : A → Type w}\n [(X Y : A) → FunLike (FC X Y) (CC X) (CC Y)] [CategoryTheory.ConcreteCategory A FC]\n [(CategoryTheory.forget A).ReflectsIsomorphisms]\n [CategoryTheory.Limits.PreservesFilteredColimitsOfSize.{w, w, v', w, u', w + 1} (CategoryTheory.forget A)]\n [J.HasSheafCompose (CategoryTheory.forget A)] (hP : P.IsConservativeFamilyOfPoints)\n [CategoryTheory.HasWeakSheafify J A] [CategoryTheory.Limits.HasProducts A] {F G : CategoryTheory.Functor Cᵒᵖ A}\n (f : F ⟶ G) : J.W f ↔ ∀ (Φ : P.FullSubcategory), CategoryTheory.IsIso (Φ.obj.presheafFiber.map f)"}], "env": 7}

9. Calibration et couverture bundlee

Les micro-preuves qui ferment la boucle — petites en taille, capitales en fonction : elles calibrent les définitions abstraites contre des cas limites que l’on sait juger à la main.

Ce que disent les théorèmes. trivial_le_discrete : la topologie triviale est plus petite que la discrète — un théorème de un sourire, mais qui vérifie que l’ordre du treillis des topologies va dans le bon sens. pullback_top : tirer en arrière le recouvrement maximal redonne le maximal — la stabilité par changement de base ne perd pas le sommet du treillis. top_covers : l’axiome « top couvre » de la structure de topologie, prouvé ici pour la couverture bundlée. cover_iff_coe_mem : la couverture bundlée J.Cover X = { S : Sieve X // S ∈ J X } est équivalente à l’appartenance du crible — le subtype est fidèle à la théorie, on n’a rien perdu en bundlant. bind_mem_iff : la liaison des couvertures bundlées est l’application membre-pour-membre de la théorie des cribles.

Pourquoi clôturer par la calibration. Un lake qui prouve tout sauf ses propres fondations de définition serait un château sur nuage : ces micro-preuves attestent que les définitions choisies (couverture bundlée, ordre des topologies) sont les bonnes — chaque lemme trivial est un test de non-régression de la formalisation entière.

-- Calibration : micro-preuves : triviale ≤ discrète, pullback de top
#check Grothendieck.trivial_le_discrete
#check Grothendieck.pullback_top
-- CategoryAndSites : les axiomes de topologie (top couvre)
#check Grothendieck.top_covers
-- Cover : la couverture bundlée : `J.Cover X = { S : Sieve X // S ∈ J X }`
#check Grothendieck.Cover.cover_iff_coe_mem
#check Grothendieck.Cover.bind_mem_iff
-- Calibration : micro-preuves : triviale ≤ discrète, pullback de top
Grothendieck.trivial_le_discrete.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] : CategoryTheory.GrothendieckTopology.trivial C ≤ CategoryTheory.GrothendieckTopology.discrete C
Grothendieck.pullback_top.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} (f : Y ⟶ X) : CategoryTheory.Sieve.pullback f ⊤ = ⊤
-- CategoryAndSites : les axiomes de topologie (top couvre)
Grothendieck.top_covers.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C) (X : C) : ⊤ ∈ J.sieves X
-- Cover : la couverture bundlée : `J.Cover X = { S : Sieve X // S ∈ J X }`
Grothendieck.Cover.cover_iff_coe_mem.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X : C} (J : CategoryTheory.GrothendieckTopology C) (S : CategoryTheory.Sieve X) : S ∈ J X ↔ ∃ T, ↑T = S
Grothendieck.Cover.bind_mem_iff.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} (J : CategoryTheory.GrothendieckTopology C) {S : J.Cover X} (T : (I : S.Arrow) → J.Cover I.Y) (f : Y ⟶ X) : (↑(S.bind T)).arrows f ↔ ∃ Z e1 e2, ∃ (hS : (↑S).arrows e2), (↑(T { Y := Z, f := e2, hf := hS })).arrows e1 ∧ CategoryTheory.CategoryStruct.comp e1 e2 = f
--% env 8
Raw input {"cmd": "-- Calibration : micro-preuves : triviale \u2264 discr\u00e8te, pullback de top\n#check Grothendieck.trivial_le_discrete\n#check Grothendieck.pullback_top\n-- CategoryAndSites : les axiomes de topologie (top couvre)\n#check Grothendieck.top_covers\n-- Cover : la couverture bundl\u00e9e : `J.Cover X = { S : Sieve X // S \u2208 J X }`\n#check Grothendieck.Cover.cover_iff_coe_mem\n#check Grothendieck.Cover.bind_mem_iff", "env": 7}
Raw output {"messages": [{"severity": "info", "pos": {"line": 2, "column": 0}, "endPos": {"line": 2, "column": 6}, "data": "Grothendieck.trivial_le_discrete.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] :\n CategoryTheory.GrothendieckTopology.trivial C ≤ CategoryTheory.GrothendieckTopology.discrete C"}, {"severity": "info", "pos": {"line": 3, "column": 0}, "endPos": {"line": 3, "column": 6}, "data": "Grothendieck.pullback_top.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C} (f : Y ⟶ X) :\n CategoryTheory.Sieve.pullback f ⊤ = ⊤"}, {"severity": "info", "pos": {"line": 5, "column": 0}, "endPos": {"line": 5, "column": 6}, "data": "Grothendieck.top_covers.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C]\n (J : CategoryTheory.GrothendieckTopology C) (X : C) : ⊤ ∈ J.sieves X"}, {"severity": "info", "pos": {"line": 7, "column": 0}, "endPos": {"line": 7, "column": 6}, "data": "Grothendieck.Cover.cover_iff_coe_mem.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X : C}\n (J : CategoryTheory.GrothendieckTopology C) (S : CategoryTheory.Sieve X) : S ∈ J X ↔ ∃ T, ↑T = S"}, {"severity": "info", "pos": {"line": 8, "column": 0}, "endPos": {"line": 8, "column": 6}, "data": "Grothendieck.Cover.bind_mem_iff.{u_1, u_2} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] {X Y : C}\n (J : CategoryTheory.GrothendieckTopology C) {S : J.Cover X} (T : (I : S.Arrow) → J.Cover I.Y) (f : Y ⟶ X) :\n (↑(S.bind T)).arrows f ↔\n ∃ Z e1 e2,\n ∃ (hS : (↑S).arrows e2),\n (↑(T { Y := Z, f := e2, hf := hS })).arrows e1 ∧ CategoryTheory.CategoryStruct.comp e1 e2 = f"}], "env": 8}

10. Integrite des preuves : #print axioms

Le moment de vérité : un théorème Lean n’est honnête que si l’on sait sur quoi il repose. #print axioms énumère les axiomes dont dépend un nom — et dans Lean 4 il n’en existe que trois de « standards » : propext (extensionnalité des Prop), Classical.choice (choix global) et Quot.sound (les quotients sont sains). Toute autre entrée — et surtout sorryAx, l’axiome du « trou laissé à compléter » — serait un signal d’alarme : soit un sorry caché, soit un axiome sur mesure qui fait prouver n’importe quoi.

On interroge trois énoncés représentatifs des trois étages du lake : trivial_le_discrete (calibration), adj_toEquivalence (adjonctions), H0_equiv_global_sections (cohomologie).

-- Chaque theoreme du lake ne depend que des axiomes standards de Lean
#print axioms Grothendieck.trivial_le_discrete
#print axioms Grothendieck.Adjunction.adj_toEquivalence
#print axioms Grothendieck.SheafCohomology.H0_equiv_global_sections
-- Chaque theoreme du lake ne depend que des axiomes standards de Lean
'Grothendieck.trivial_le_discrete' depends on axioms: [propext, Classical.choice, Quot.sound]
'Grothendieck.Adjunction.adj_toEquivalence' depends on axioms: [propext, Classical.choice, Quot.sound]
'Grothendieck.SheafCohomology.H0_equiv_global_sections' depends on axioms: [propext, Classical.choice, Quot.sound]
--% env 9
Raw input {"cmd": "-- Chaque theoreme du lake ne depend que des axiomes standards de Lean\n#print axioms Grothendieck.trivial_le_discrete\n#print axioms Grothendieck.Adjunction.adj_toEquivalence\n#print axioms Grothendieck.SheafCohomology.H0_equiv_global_sections\n", "env": 8}
Raw output {"messages": [{"severity": "info", "pos": {"line": 2, "column": 0}, "endPos": {"line": 2, "column": 6}, "data": "'Grothendieck.trivial_le_discrete' depends on axioms: [propext, Classical.choice, Quot.sound]"}, {"severity": "info", "pos": {"line": 3, "column": 0}, "endPos": {"line": 3, "column": 6}, "data": "'Grothendieck.Adjunction.adj_toEquivalence' depends on axioms: [propext, Classical.choice, Quot.sound]"}, {"severity": "info", "pos": {"line": 4, "column": 0}, "endPos": {"line": 4, "column": 6}, "data": "'Grothendieck.SheafCohomology.H0_equiv_global_sections' depends on axioms: [propext, Classical.choice, Quot.sound]"}], "env": 9}

Lecture de la sortie

La sortie ci-dessus répond trois fois la même chose : depends on axioms: [propext, Classical.choice, Quot.sound]. Détaillons ce que chaque axiome affirme — et pourquoi leur présence est une bonne nouvelle, pas une réserve :

  • propext (extensionnalité des propositions) : deux Props équivalentes sont égales. C’est ce qui permet à Lean de traiter les énoncés à équivalence logique près — sans lui, aucune bibliothèque sérieuse ne se construit.
  • Classical.choice (axiome du choix global) : toute relation totale admet un choix. C’est le prix du raisonnement classique (tiers exclu, preuves par contradiction) — Mathlib l’assume partout.
  • Quot.sound : les quotients (colimites de relations d’équivalence) sont sains. C’est lui qui rend possibles les constructions à la ℤ = ℕ × ℕ / ~ — et donc une grande partie de l’algèbre.

Ce qui compte est ce qui est absent : pas de sorryAx (aucun trou), pas d’axiome sur mesure (rien n’est admis qui ne soit dans le standard). Autrement dit : chaque preuve du lake se déplie, en principe, jusqu’à ces trois axiomes et aux règles de la logique. C’est ce que « la preuve ne triche pas » signifie mécaniquement — et c’est pourquoi on l’affiche après la cellule qui la produit : la sortie est la preuve, ce paragraphe en est la lecture.

11. Exercices

Cinq exercices pour manipuler les énoncés du lake, du décommentage guidé à la micro-preuve. Ce sont des stubs volontaires (convention C.1 : pass, pas d’erreur) : le notebook s’exécute de bout en bout, à vous de décommenter et de compléter. Les trois premiers sont des explorations guidées du lake par #check ; les deux derniers demandent d’écrire une (toute petite) preuve en Lean — les indices donnent les tactiques.

-- Exercice 1 : verifier que la symetrie d'une equivalence est involutive
-- (indice : la declaration existe dans le namespace Equivalences)
-- #check Grothendieck.Equivalences.equivalence_symm_symm

-- Exercice 2 : trouver la declaration de la topologie canonique
-- (indice : elle s'appelle canonical_is_subcanonical)
-- #check Grothendieck.canonical_is_subcanonical

-- Exercice 3 : quel enonce relie H0 aux sections globales ?
-- #check Grothendieck.SheafCohomology.H0_equiv_global_sections

-- Exercice 4 : micro-preuve — la triviale est bien une topologie
-- (indice : trivial_le_discrete existe deja ; cherchez l'ordre)
-- example : True := trivial  -- TODO etudiant : remplacez trivial par une preuve de trivial_le_discrete

-- Exercice 5 : micro-preuve — composer deux equivalences
-- (indice : equivalence_trans ; tactique exact)
-- example : True := trivial  -- TODO etudiant : utilisez equivalence_trans pour prouver une transitivity

-- Le notebook reste executable : les stubs ne levent aucune erreur (C.1)
example : True := trivial
-- Exercice 1 : verifier que la symetrie d'une equivalence est involutive
-- (indice : la declaration existe dans le namespace Equivalences)
-- #check Grothendieck.Equivalences.equivalence_symm_symm
-- Exercice 2 : trouver la declaration de la topologie canonique
-- (indice : elle s'appelle canonical_is_subcanonical)
-- #check Grothendieck.canonical_is_subcanonical
-- Exercice 3 : quel enonce relie H0 aux sections globales ?
-- #check Grothendieck.SheafCohomology.H0_equiv_global_sections
-- Exercice 4 : micro-preuve — la triviale est bien une topologie
-- (indice : trivial_le_discrete existe deja ; cherchez l'ordre)
-- example : True := trivial  -- TODO etudiant : remplacez trivial par une preuve de trivial_le_discrete
-- Exercice 5 : micro-preuve — composer deux equivalences
-- (indice : equivalence_trans ; tactique exact)
-- example : True := trivial  -- TODO etudiant : utilisez equivalence_trans pour prouver une transitivity
-- Le notebook reste executable : les stubs ne levent aucune erreur (C.1)
example : True := trivial
--% env 10
Raw input {"cmd": "-- Exercice 1 : verifier que la symetrie d'une equivalence est involutive\n-- (indice : la declaration existe dans le namespace Equivalences)\n-- #check Grothendieck.Equivalences.equivalence_symm_symm\n\n-- Exercice 2 : trouver la declaration de la topologie canonique\n-- (indice : elle s'appelle canonical_is_subcanonical)\n-- #check Grothendieck.canonical_is_subcanonical\n\n-- Exercice 3 : quel enonce relie H0 aux sections globales ?\n-- #check Grothendieck.SheafCohomology.H0_equiv_global_sections\n\n-- Exercice 4 : micro-preuve \u2014 la triviale est bien une topologie\n-- (indice : trivial_le_discrete existe deja ; cherchez l'ordre)\n-- example : True := trivial -- TODO etudiant : remplacez trivial par une preuve de trivial_le_discrete\n\n-- Exercice 5 : micro-preuve \u2014 composer deux equivalences\n-- (indice : equivalence_trans ; tactique exact)\n-- example : True := trivial -- TODO etudiant : utilisez equivalence_trans pour prouver une transitivity\n\n-- Le notebook reste executable : les stubs ne levent aucune erreur (C.1)\nexample : True := trivial", "env": 9}
Raw output {"env": 10}

Annexe — SheafCondition : le coeur egaliseur rendu visible (#11703)

Le scan de visibilite du lake (scan_lake_notebook_visibility.py) comptait SheafCondition.lean parmi les modules invisibles : ses trois enonces n’etaient cites nulle part dans ce compagnon. C’est pourtant la Partie 63 du lake, et son sujet en est le coeur conceptuel : la condition de faisceau exprimee comme un diagramme produit-egaliseur. Pour tout crible couvrant S ∈ J X, un prefaisceau P est un faisceau si le diagramme de restriction

P(X)  →  ∏ᵢ P(U_i)  ⇉  ∏ᵢⱼ P(U_i ×_X U_j)

est un egaliseur : une section sur X est exactement une famille de sections locales deux a deux compatibles sur les produits fibres. Le module enregistre trois ponts derives de Mathlib (Stacks 00VM / 00VL) :

  1. sheaf_iff_equalizer_sieve — forme cribles : Presieve.IsSheaf J P si et seulement si chaque fork de restriction w P S est un diagramme egaliseur ;
  2. sheaf_iff_equalizer_arrows — forme familles d’arrows sous HasPullbacks C : la meme assertion pour une famille couvrante π : X i ⟶ B ;
  3. sheaf_pretopology_iff — forme pretopologie : verifier la condition sur chaque famille couvrante d’une base de couvertures suffit.
-- SheafCondition (Partie 63) : les trois ponts produit-egaliseur du lake,
-- module invisible du scan de visibilite (#11703) -- voici ses enonces executes.
#check @Grothendieck.sheaf_iff_equalizer_sieve
#check @Grothendieck.sheaf_iff_equalizer_arrows
#check @Grothendieck.sheaf_pretopology_iff

-- Integrite (meme protocole que la section 10) : aucun pont ne depend de sorryAx
#print axioms Grothendieck.sheaf_iff_equalizer_sieve
#print axioms Grothendieck.sheaf_iff_equalizer_arrows
#print axioms Grothendieck.sheaf_pretopology_iff
-- SheafCondition (Partie 63) : les trois ponts produit-egaliseur du lake,
-- module invisible du scan de visibilite (#11703) -- voici ses enonces executes.
@Grothendieck.sheaf_iff_equalizer_sieve : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C) (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))), CategoryTheory.Presieve.IsSheaf J P ↔ ∀ ⦃X : C⦄, ∀ S ∈ J X, Nonempty (CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P S.arrows) ⋯))
@Grothendieck.sheaf_iff_equalizer_arrows : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))) [inst_1 : CategoryTheory.Limits.HasPullbacks C] {B : C} {I : Type (max u_2 u_1)} (X : I → C) (π : (i : I) → X i ⟶ B), CategoryTheory.Presieve.IsSheafFor P (CategoryTheory.Presieve.ofArrows X π) ↔ Nonempty (CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.Presieve.Arrows.forkMap P X π) ⋯))
@Grothendieck.sheaf_pretopology_iff : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))) [inst_1 : CategoryTheory.Limits.HasPullbacks C] (K : CategoryTheory.Pretopology C), CategoryTheory.Presieve.IsSheaf K.toGrothendieck P ↔ ∀ ⦃X : C⦄, ∀ R ∈ K.coverings X, CategoryTheory.Presieve.IsSheafFor P R
-- Integrite (meme protocole que la section 10) : aucun pont ne depend de sorryAx
'Grothendieck.sheaf_iff_equalizer_sieve' depends on axioms: [propext, Classical.choice, Quot.sound]
'Grothendieck.sheaf_iff_equalizer_arrows' depends on axioms: [propext, Classical.choice, Quot.sound]
'Grothendieck.sheaf_pretopology_iff' depends on axioms: [propext, Classical.choice, Quot.sound]
--% env 11
Raw input {"cmd": "-- SheafCondition (Partie 63) : les trois ponts produit-egaliseur du lake,\n-- module invisible du scan de visibilite (#11703) -- voici ses enonces executes.\n#check @Grothendieck.sheaf_iff_equalizer_sieve\n#check @Grothendieck.sheaf_iff_equalizer_arrows\n#check @Grothendieck.sheaf_pretopology_iff\n\n-- Integrite (meme protocole que la section 10) : aucun pont ne depend de sorryAx\n#print axioms Grothendieck.sheaf_iff_equalizer_sieve\n#print axioms Grothendieck.sheaf_iff_equalizer_arrows\n#print axioms Grothendieck.sheaf_pretopology_iff\n", "env": 10}
Raw output {"messages": [{"severity": "info", "pos": {"line": 3, "column": 0}, "endPos": {"line": 3, "column": 6}, "data": "@Grothendieck.sheaf_iff_equalizer_sieve : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n (J : CategoryTheory.GrothendieckTopology C) (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))),\n CategoryTheory.Presieve.IsSheaf J P ↔\n ∀ ⦃X : C⦄,\n ∀ S ∈ J X,\n Nonempty\n (CategoryTheory.Limits.IsLimit\n (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P S.arrows) ⋯))"}, {"severity": "info", "pos": {"line": 4, "column": 0}, "endPos": {"line": 4, "column": 6}, "data": "@Grothendieck.sheaf_iff_equalizer_arrows : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))) [inst_1 : CategoryTheory.Limits.HasPullbacks C] {B : C}\n {I : Type (max u_2 u_1)} (X : I → C) (π : (i : I) → X i ⟶ B),\n CategoryTheory.Presieve.IsSheafFor P (CategoryTheory.Presieve.ofArrows X π) ↔\n Nonempty\n (CategoryTheory.Limits.IsLimit\n (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.Presieve.Arrows.forkMap P X π) ⋯))"}, {"severity": "info", "pos": {"line": 5, "column": 0}, "endPos": {"line": 5, "column": 6}, "data": "@Grothendieck.sheaf_pretopology_iff : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))) [inst_1 : CategoryTheory.Limits.HasPullbacks C]\n (K : CategoryTheory.Pretopology C),\n CategoryTheory.Presieve.IsSheaf K.toGrothendieck P ↔\n ∀ ⦃X : C⦄, ∀ R ∈ K.coverings X, CategoryTheory.Presieve.IsSheafFor P R"}, {"severity": "info", "pos": {"line": 8, "column": 0}, "endPos": {"line": 8, "column": 6}, "data": "'Grothendieck.sheaf_iff_equalizer_sieve' depends on axioms: [propext, Classical.choice, Quot.sound]"}, {"severity": "info", "pos": {"line": 9, "column": 0}, "endPos": {"line": 9, "column": 6}, "data": "'Grothendieck.sheaf_iff_equalizer_arrows' depends on axioms: [propext, Classical.choice, Quot.sound]"}, {"severity": "info", "pos": {"line": 10, "column": 0}, "endPos": {"line": 10, "column": 6}, "data": "'Grothendieck.sheaf_pretopology_iff' depends on axioms: [propext, Classical.choice, Quot.sound]"}], "env": 11}

Lecture de la sortie

Les #check affichent les signatures. Les deux premiers ponts sont des équivalences vers Nonempty (IsLimit ...) : être un faisceau, ce n’est pas seulement que le fork de restriction commute, c’est qu’il soit un égaliseur — une limite. Le troisième pont remplace « pour tous les cribles de la topologie » par « pour chaque famille couvrante de la prétopologie » : c’est le levier opérationnel, on vérifie la condition sur une base plutôt que sur tous les cribles.

Les #print axioms répondent [propext, Classical.choice, Quot.sound] — les axiomes standards de Lean, même protocole que la section 10 : aucun des ponts ne dépend de sorryAx. Le module SheafCondition.lean est désormais visible depuis ce compagnon. Après l’enrichissement de ces deux annexes, la mesure fraîche laisse encore des modules invisibles : le lake a gagné des modules depuis, et l’annexe finale en retire plusieurs (dont Spaces.lean).

Annexe — Du crible fermé à la faisceautisation Plus

Des modules voisins rendent explicite une même chaîne de construction. Dans LawvereTierney.lean, un opérateur de Lawvere–Tierney ferme les cribles de façon extensive, idempotente, monotone et compatible au changement de base. TopologyDictionary.lean traduit ensuite une topologie de Grothendieck en un tel opérateur et reconstruit la topologie initiale : la donnée des cribles couvrants et celle de leur clôture sont deux présentations équivalentes. Enfin, PlusConstruction.lean transporte cette logique vers les préfaisceaux : la transformation toPlus est naturelle, son itération mène au point fixe des faisceaux, et plusLift_unique_field exprime la propriété universelle de la factorisation vers un faisceau.

La cellule suivante interroge les modules à travers l’import racine déjà chargé. Les paramètres implicites affichés par #check @... rendent visibles les hypothèses catégoriques ; les #print axioms contrôlent l’intégrité d’un théorème pivot par module.

-- Lawvere–Tierney : fermeture extensive, idempotente et monotone des cribles
#check @Grothendieck.LawvereTierney.lawvereTierneyDiscrete
#check @Grothendieck.LawvereTierney.j_monotone
#check @Grothendieck.LawvereTierney.closure_isClosed

-- Dictionnaire : topologie de Grothendieck et opérateur de Lawvere–Tierney
#check @Grothendieck.TopologyDictionary.grothendieckToLawvereTierney
#check @Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck_comp_grothendieckToLawvereTierney
#check @Grothendieck.TopologyDictionary.grothendieckToLawvereTierney_comp_lawvereTierneyToGrothendieck_closure

-- Construction Plus : naturalité, itération et propriété universelle
#check @Grothendieck.toPlus_naturality_field
#check @Grothendieck.plusMap_toPlus_field
#check @Grothendieck.plusLift_unique_field

#print axioms Grothendieck.LawvereTierney.j_monotone
#print axioms Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck_comp_grothendieckToLawvereTierney
#print axioms Grothendieck.plusLift_unique_field
-- Lawvere–Tierney : fermeture extensive, idempotente et monotone des cribles
@Grothendieck.LawvereTierney.lawvereTierneyDiscrete : {C : Type u_1} → [inst : CategoryTheory.Category.{u_2, u_1} C] → Grothendieck.LawvereTierney.LawvereTierney C
@Grothendieck.LawvereTierney.j_monotone : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (j : Grothendieck.LawvereTierney.LawvereTierney C) {X : C} {S T : CategoryTheory.Sieve X}, S ≤ T → j.closure X S ≤ j.closure X T
@Grothendieck.LawvereTierney.closure_isClosed : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (j : Grothendieck.LawvereTierney.LawvereTierney C) {X : C} (S : CategoryTheory.Sieve X), Grothendieck.LawvereTierney.IsClosed j (j.closure X S)
-- Dictionnaire : topologie de Grothendieck et opérateur de Lawvere–Tierney
@Grothendieck.TopologyDictionary.grothendieckToLawvereTierney : {C : Type u_1} → [inst : CategoryTheory.Category.{u_2, u_1} C] → CategoryTheory.GrothendieckTopology C → Grothendieck.LawvereTierney.LawvereTierney C
@Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck_comp_grothendieckToLawvereTierney : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C), Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck (Grothendieck.TopologyDictionary.grothendieckToLawvereTierney J) = J
@Grothendieck.TopologyDictionary.grothendieckToLawvereTierney_comp_lawvereTierneyToGrothendieck_closure : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (j : Grothendieck.LawvereTierney.LawvereTierney C), (Grothendieck.TopologyDictionary.grothendieckToLawvereTierney (Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck j)).closure = j.closure
-- Construction Plus : naturalité, itération et propriété universelle
@Grothendieck.toPlus_naturality_field : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_3, u_1} C] {D : Type u_2} [inst_1 : CategoryTheory.Category.{u_4, u_2} D] (J : CategoryTheory.GrothendieckTopology C) [inst_2 : ∀ (P : CategoryTheory.Functor Cᵒᵖ D) (X : C) (S : J.Cover X), CategoryTheory.Limits.HasMultiequalizer (S.index P)] [inst_3 : ∀ (X : C), CategoryTheory.Limits.HasColimitsOfShape (J.Cover X)ᵒᵖ D] {P Q : CategoryTheory.Functor Cᵒᵖ D} (η : P ⟶ Q), CategoryTheory.CategoryStruct.comp η (J.toPlus Q) = CategoryTheory.CategoryStruct.comp (J.toPlus P) (J.plusMap η)
@Grothendieck.plusMap_toPlus_field : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_3, u_1} C] {D : Type u_2} [inst_1 : CategoryTheory.Category.{u_4, u_2} D] (J : CategoryTheory.GrothendieckTopology C) [inst_2 : ∀ (P : CategoryTheory.Functor Cᵒᵖ D) (X : C) (S : J.Cover X), CategoryTheory.Limits.HasMultiequalizer (S.index P)] [inst_3 : ∀ (X : C), CategoryTheory.Limits.HasColimitsOfShape (J.Cover X)ᵒᵖ D] (P : CategoryTheory.Functor Cᵒᵖ D), J.plusMap (J.toPlus P) = J.toPlus (J.plusObj P)
@Grothendieck.plusLift_unique_field : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_3, u_1} C] {D : Type u_2} [inst_1 : CategoryTheory.Category.{u_4, u_2} D] (J : CategoryTheory.GrothendieckTopology C) [inst_2 : ∀ (P : CategoryTheory.Functor Cᵒᵖ D) (X : C) (S : J.Cover X), CategoryTheory.Limits.HasMultiequalizer (S.index P)] [inst_3 : ∀ (X : C), CategoryTheory.Limits.HasColimitsOfShape (J.Cover X)ᵒᵖ D] {P Q : CategoryTheory.Functor Cᵒᵖ D} (η : P ⟶ Q) (hQ : CategoryTheory.Presheaf.IsSheaf J Q) (γ : J.plusObj P ⟶ Q), CategoryTheory.CategoryStruct.comp (J.toPlus P) γ = η → γ = J.plusLift η hQ
'Grothendieck.LawvereTierney.j_monotone' depends on axioms: [propext, Classical.choice, Quot.sound]
'Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck_comp_grothendieckToLawvereTierney' depends on axioms: [propext, Classical.choice, Quot.sound]
'Grothendieck.plusLift_unique_field' depends on axioms: [propext, Classical.choice, Quot.sound]
--% env 12
Raw input {"cmd": "-- Lawvere\u2013Tierney : fermeture extensive, idempotente et monotone des cribles\n#check @Grothendieck.LawvereTierney.lawvereTierneyDiscrete\n#check @Grothendieck.LawvereTierney.j_monotone\n#check @Grothendieck.LawvereTierney.closure_isClosed\n\n-- Dictionnaire : topologie de Grothendieck et op\u00e9rateur de Lawvere\u2013Tierney\n#check @Grothendieck.TopologyDictionary.grothendieckToLawvereTierney\n#check @Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck_comp_grothendieckToLawvereTierney\n#check @Grothendieck.TopologyDictionary.grothendieckToLawvereTierney_comp_lawvereTierneyToGrothendieck_closure\n\n-- Construction Plus : naturalit\u00e9, it\u00e9ration et propri\u00e9t\u00e9 universelle\n#check @Grothendieck.toPlus_naturality_field\n#check @Grothendieck.plusMap_toPlus_field\n#check @Grothendieck.plusLift_unique_field\n\n#print axioms Grothendieck.LawvereTierney.j_monotone\n#print axioms Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck_comp_grothendieckToLawvereTierney\n#print axioms Grothendieck.plusLift_unique_field", "env": 11}
Raw output {"messages": [{"severity": "info", "pos": {"line": 2, "column": 0}, "endPos": {"line": 2, "column": 6}, "data": "@Grothendieck.LawvereTierney.lawvereTierneyDiscrete : {C : Type u_1} →\n [inst : CategoryTheory.Category.{u_2, u_1} C] → Grothendieck.LawvereTierney.LawvereTierney C"}, {"severity": "info", "pos": {"line": 3, "column": 0}, "endPos": {"line": 3, "column": 6}, "data": "@Grothendieck.LawvereTierney.j_monotone : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n (j : Grothendieck.LawvereTierney.LawvereTierney C) {X : C} {S T : CategoryTheory.Sieve X},\n S ≤ T → j.closure X S ≤ j.closure X T"}, {"severity": "info", "pos": {"line": 4, "column": 0}, "endPos": {"line": 4, "column": 6}, "data": "@Grothendieck.LawvereTierney.closure_isClosed : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n (j : Grothendieck.LawvereTierney.LawvereTierney C) {X : C} (S : CategoryTheory.Sieve X),\n Grothendieck.LawvereTierney.IsClosed j (j.closure X S)"}, {"severity": "info", "pos": {"line": 7, "column": 0}, "endPos": {"line": 7, "column": 6}, "data": "@Grothendieck.TopologyDictionary.grothendieckToLawvereTierney : {C : Type u_1} →\n [inst : CategoryTheory.Category.{u_2, u_1} C] →\n CategoryTheory.GrothendieckTopology C → Grothendieck.LawvereTierney.LawvereTierney C"}, {"severity": "info", "pos": {"line": 8, "column": 0}, "endPos": {"line": 8, "column": 6}, "data": "@Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck_comp_grothendieckToLawvereTierney : ∀ {C : Type u_1}\n [inst : CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C),\n Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck\n (Grothendieck.TopologyDictionary.grothendieckToLawvereTierney J) =\n J"}, {"severity": "info", "pos": {"line": 9, "column": 0}, "endPos": {"line": 9, "column": 6}, "data": "@Grothendieck.TopologyDictionary.grothendieckToLawvereTierney_comp_lawvereTierneyToGrothendieck_closure : ∀\n {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (j : Grothendieck.LawvereTierney.LawvereTierney C),\n (Grothendieck.TopologyDictionary.grothendieckToLawvereTierney\n (Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck j)).closure =\n j.closure"}, {"severity": "info", "pos": {"line": 12, "column": 0}, "endPos": {"line": 12, "column": 6}, "data": "@Grothendieck.toPlus_naturality_field : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_3, u_1} C] {D : Type u_2}\n [inst_1 : CategoryTheory.Category.{u_4, u_2} D] (J : CategoryTheory.GrothendieckTopology C)\n [inst_2 :\n ∀ (P : CategoryTheory.Functor Cᵒᵖ D) (X : C) (S : J.Cover X), CategoryTheory.Limits.HasMultiequalizer (S.index P)]\n [inst_3 : ∀ (X : C), CategoryTheory.Limits.HasColimitsOfShape (J.Cover X)ᵒᵖ D] {P Q : CategoryTheory.Functor Cᵒᵖ D}\n (η : P ⟶ Q),\n CategoryTheory.CategoryStruct.comp η (J.toPlus Q) = CategoryTheory.CategoryStruct.comp (J.toPlus P) (J.plusMap η)"}, {"severity": "info", "pos": {"line": 13, "column": 0}, "endPos": {"line": 13, "column": 6}, "data": "@Grothendieck.plusMap_toPlus_field : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_3, u_1} C] {D : Type u_2}\n [inst_1 : CategoryTheory.Category.{u_4, u_2} D] (J : CategoryTheory.GrothendieckTopology C)\n [inst_2 :\n ∀ (P : CategoryTheory.Functor Cᵒᵖ D) (X : C) (S : J.Cover X), CategoryTheory.Limits.HasMultiequalizer (S.index P)]\n [inst_3 : ∀ (X : C), CategoryTheory.Limits.HasColimitsOfShape (J.Cover X)ᵒᵖ D] (P : CategoryTheory.Functor Cᵒᵖ D),\n J.plusMap (J.toPlus P) = J.toPlus (J.plusObj P)"}, {"severity": "info", "pos": {"line": 14, "column": 0}, "endPos": {"line": 14, "column": 6}, "data": "@Grothendieck.plusLift_unique_field : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_3, u_1} C] {D : Type u_2}\n [inst_1 : CategoryTheory.Category.{u_4, u_2} D] (J : CategoryTheory.GrothendieckTopology C)\n [inst_2 :\n ∀ (P : CategoryTheory.Functor Cᵒᵖ D) (X : C) (S : J.Cover X), CategoryTheory.Limits.HasMultiequalizer (S.index P)]\n [inst_3 : ∀ (X : C), CategoryTheory.Limits.HasColimitsOfShape (J.Cover X)ᵒᵖ D] {P Q : CategoryTheory.Functor Cᵒᵖ D}\n (η : P ⟶ Q) (hQ : CategoryTheory.Presheaf.IsSheaf J Q) (γ : J.plusObj P ⟶ Q),\n CategoryTheory.CategoryStruct.comp (J.toPlus P) γ = η → γ = J.plusLift η hQ"}, {"severity": "info", "pos": {"line": 16, "column": 0}, "endPos": {"line": 16, "column": 6}, "data": "'Grothendieck.LawvereTierney.j_monotone' depends on axioms: [propext, Classical.choice, Quot.sound]"}, {"severity": "info", "pos": {"line": 17, "column": 0}, "endPos": {"line": 17, "column": 6}, "data": "'Grothendieck.TopologyDictionary.lawvereTierneyToGrothendieck_comp_grothendieckToLawvereTierney' depends on axioms: [propext,\n Classical.choice,\n Quot.sound]"}, {"severity": "info", "pos": {"line": 18, "column": 0}, "endPos": {"line": 18, "column": 6}, "data": "'Grothendieck.plusLift_unique_field' depends on axioms: [propext, Classical.choice, Quot.sound]"}], "env": 12}

Lecture de la sortie

Le premier groupe expose l’opérateur de clôture sur les cribles. La signature de j_monotone dit que l’inclusion S ≤ T est préservée par la clôture, tandis que closure_isClosed matérialise l’idempotence : fermer un crible produit déjà un point fixe.

Le deuxième groupe donne le dictionnaire bidirectionnel. Le premier théorème de composition reconstruit exactement la topologie J; le second reconstruit la fonction de clôture de j. L’asymétrie des conclusions est informative : l’égalité de structures suffit côté topologies, tandis que le retour côté Lawvere–Tierney est formulé sur le champ closure qui porte la donnée utile.

Le troisième groupe affiche les hypothèses de limites et colimites nécessaires à la construction Plus. toPlus_naturality_field contrôle la naturalité, plusMap_toPlus_field relie les deux itérations, et plusLift_unique_field exprime l’unicité de toute factorisation de P ⟶ Q par toPlus P lorsque Q est déjà un faisceau.

Les trois sorties #print axioms ne mentionnent que les axiomes standards propext, Classical.choice et Quot.sound. En particulier, aucune ne contient sorryAx : les trois maillons observés sont bien des déclarations compilées, pas des énoncés admis dans le notebook.

Annexe — Les tiges (stalks) : du germe au recollement (#11703)

Des modules voisins déclarent la théorie ponctuelle du lake — les tiges (stalk) et leurs germes — et n’étaient cités nulle part dans ce compagnon : le scan de visibilité les comptait parmi ses modules noirs. Certains ne sont atteignables depuis aucun autre module du lake, pas même depuis l’agrégateur racine Grothendieck.lean, qui importe StalkGluing mais ni Stalks ni StalkPoints : la cellule d’import de la section 1 les charge donc explicitement, seule façon de les rendre lisibles ici. La cellule suivante interroge leurs déclarations.

  • Stalks.lean (Partie 72) — la tige du préfaisceau représentable, en deux cas disjoints. unique_stalk_yoneda traite le cas intérieur : pour x ∈ U, la tige de yoneda.obj U est un singleton, dont l’unique élément est le germe de l’identité de U. isEmpty_stalk_yoneda traite le cas extérieur : pour x ∉ U, la même tige est vide — tout germe proviendrait d’une flèche W ⟶ U au-dessus d’un voisinage de x, qui forcerait x ∈ U. nonempty_stalk_yoneda_iff joint les deux en une équivalence : la tige est habitée exactement aux points de U.
  • StalkSeparated.lean (Partie 74) — les tiges détectent l’égalité des sections. eq_of_germ_eq_of_isSeparated conclut s = t des seules égalités de germes en tout point de U pour un préfaisceau séparé ; eq_of_germ_eq_of_isSheaf fait de même pour un faisceau de types sans exiger d’hypothèse de limite, là où le section_ext de Mathlib demande [HasLimits C] et compagnie. injective_germ_family_of_isSeparated en donne la forme combinatoire : une section est déterminée par sa famille de germes.
  • StalkGluing.lean (Partie 75) — le recollement des familles de germes. Une famille est localement représentable (GermFamily.IsLocallyRepresentable) si chaque point de U admet un voisinage muni d’une section la réalisant — condition entièrement locale, qui ne suppose aucune section sur U. existsUnique_section_of_isLocallyRepresentable établit que toute famille localement représentable d’un faisceau de types provient d’une unique section de U, et surjective_germ_family_to_locallyRepresentable en donne la lecture en surjectivité sur le sous-type des familles localement représentables.
  • StalkPoints.lean (Partie 73) — la tige vue comme fibre du point du site. opensPoint construit le point du site des ouverts associé à x, fiberToStalk et stalkToFiber les deux cônes de colimite qui le relient à la tige topologique, et stalkFiberIso l’iso canonique entre fibre et tige — précisément l’énoncé que Mathlib.Topology.Sheaves.Points laisse en TODO. stalkFiberIso_naturality en contrôle la naturalité.
-- Tiges (stalks) : les 25 declarations des quatre modules Stalk* du lake,
-- modules invisibles du scan de visibilite (#11703) -- voici leurs enonces.

-- Stalks (Partie 72) : la tige du representable, cas interieur et exterieur
#check @Grothendieck.unique_stalk_yoneda
#check @Grothendieck.isEmpty_stalk_yoneda
#check @Grothendieck.nonempty_stalk_yoneda_iff

-- StalkSeparated (Partie 74) : les tiges detectent l'egalite des sections
#check @Grothendieck.eq_of_germ_eq_of_isSeparated
#check @Grothendieck.eq_of_germ_eq_of_isSheaf
#check @Grothendieck.injective_germ_family_of_isSeparated

-- StalkGluing (Partie 75) : les familles de germes et leur recollement
#check @Grothendieck.GermFamily
#check @Grothendieck.GermFamily.IsLocallyRepresentable
#check @Grothendieck.germFamily_isLocallyRepresentable
#check @Grothendieck.existsUnique_gluing'_of_isSheaf
#check @Grothendieck.existsUnique_section_of_isLocallyRepresentable
#check @Grothendieck.surjective_germ_family_to_locallyRepresentable

-- StalkPoints (Partie 73) : la tige comme fibre du point du site
#check @Grothendieck.opensPoint
#check @Grothendieck.mem_of_fiber
#check @Grothendieck.fiberElem
#check @Grothendieck.fiberToStalkCocone
#check @Grothendieck.fiberToStalk
#check @Grothendieck.stalkToFiberCocone
#check @Grothendieck.stalkToFiber
#check @Grothendieck.toPresheafFiber_fiberToStalk
#check @Grothendieck.germ_stalkToFiber
#check @Grothendieck.stalkToFiber_comp_fiberToStalk
#check @Grothendieck.fiberToStalk_comp_stalkToFiber
#check @Grothendieck.stalkFiberIso
#check @Grothendieck.stalkFiberIso_naturality

-- Integrite (meme protocole que la section 10) : un pivot par module, aucun
-- ne doit dependre de sorryAx
#print axioms Grothendieck.nonempty_stalk_yoneda_iff
#print axioms Grothendieck.eq_of_germ_eq_of_isSheaf
#print axioms Grothendieck.existsUnique_section_of_isLocallyRepresentable
#print axioms Grothendieck.stalkFiberIso_naturality
-- Tiges (stalks) : les 25 declarations des quatre modules Stalk* du lake,
-- modules invisibles du scan de visibilite (#11703) -- voici leurs enonces.
-- Stalks (Partie 72) : la tige du representable, cas interieur et exterieur
Grothendieck.unique_stalk_yoneda : (T : Type u_1) → [inst : TopologicalSpace T] → (U : TopologicalSpace.Opens T) → {x : T} → x ∈ U → Unique (TopCat.Presheaf.stalk (CategoryTheory.yoneda.obj U) x)
Grothendieck.isEmpty_stalk_yoneda : ∀ (T : Type u_1) [inst : TopologicalSpace T] (U : TopologicalSpace.Opens T) {x : T}, x ∉ U → IsEmpty (TopCat.Presheaf.stalk (CategoryTheory.yoneda.obj U) x)
Grothendieck.nonempty_stalk_yoneda_iff : ∀ (T : Type u_1) [inst : TopologicalSpace T] (U : TopologicalSpace.Opens T) (x : T), Nonempty (TopCat.Presheaf.stalk (CategoryTheory.yoneda.obj U) x) ↔ x ∈ U
-- StalkSeparated (Partie 74) : les tiges detectent l'egalite des sections
Grothendieck.eq_of_germ_eq_of_isSeparated : ∀ (T : Type u_1) [inst : TopologicalSpace T] (F : TopCat.Presheaf (Type u_1) (TopCat.of T)), CategoryTheory.Presheaf.IsSeparated (Grothendieck.opensTopology T) F → ∀ {U : TopologicalSpace.Opens T} {s t : F.obj (Opposite.op U)}, (∀ (x : T) (hx : x ∈ U), (CategoryTheory.ConcreteCategory.hom (F.germ U x hx)) s = (CategoryTheory.ConcreteCategory.hom (F.germ U x hx)) t) → s = t
Grothendieck.eq_of_germ_eq_of_isSheaf : ∀ (T : Type u_1) [inst : TopologicalSpace T] (F : TopCat.Presheaf (Type u_1) (TopCat.of T)), F.IsSheaf → ∀ {U : TopologicalSpace.Opens T} {s t : F.obj (Opposite.op U)}, (∀ (x : T) (hx : x ∈ U), (CategoryTheory.ConcreteCategory.hom (F.germ U x hx)) s = (CategoryTheory.ConcreteCategory.hom (F.germ U x hx)) t) → s = t
Grothendieck.injective_germ_family_of_isSeparated : ∀ (T : Type u_1) [inst : TopologicalSpace T] (F : TopCat.Presheaf (Type u_1) (TopCat.of T)), CategoryTheory.Presheaf.IsSeparated (Grothendieck.opensTopology T) F → ∀ (U : TopologicalSpace.Opens T), Function.Injective fun s p => (CategoryTheory.ConcreteCategory.hom (F.germ U ↑p ⋯)) s
-- StalkGluing (Partie 75) : les familles de germes et leur recollement
Grothendieck.GermFamily : (T : Type u_1) → [inst : TopologicalSpace T] → TopCat.Presheaf (Type u_1) (TopCat.of T) → TopologicalSpace.Opens T → Type u_1
Grothendieck.GermFamily.IsLocallyRepresentable : (T : Type u_1) → [inst : TopologicalSpace T] → (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) → (U : TopologicalSpace.Opens T) → Grothendieck.GermFamily T F U → Prop
Grothendieck.germFamily_isLocallyRepresentable : ∀ (T : Type u_1) [inst : TopologicalSpace T] (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) (U : TopologicalSpace.Opens T) (s : F.obj (Opposite.op U)), Grothendieck.GermFamily.IsLocallyRepresentable T F U fun p => (CategoryTheory.ConcreteCategory.hom (F.germ U ↑p ⋯)) s
Grothendieck.existsUnique_gluing'_of_isSheaf : ∀ (T : Type u_1) [inst : TopologicalSpace T] (F : TopCat.Presheaf (Type u_1) (TopCat.of T)), F.IsSheaf → ∀ {ι : Type u_2} (V : ι → TopologicalSpace.Opens T) (U : TopologicalSpace.Opens T) (iVU : (i : ι) → V i ⟶ U), U ≤ iSup V → ∀ (sf : (i : ι) → F.obj (Opposite.op (V i))), F.IsCompatible V sf → ∃! s, ∀ (i : ι), (CategoryTheory.ConcreteCategory.hom (F.map (iVU i).op)) s = sf i
Grothendieck.existsUnique_section_of_isLocallyRepresentable : ∀ (T : Type u_1) [inst : TopologicalSpace T] (F : TopCat.Presheaf (Type u_1) (TopCat.of T)), F.IsSheaf → ∀ (U : TopologicalSpace.Opens T) (a : Grothendieck.GermFamily T F U), Grothendieck.GermFamily.IsLocallyRepresentable T F U a → ∃! s, ∀ (p : ↥U), (CategoryTheory.ConcreteCategory.hom (F.germ U ↑p ⋯)) s = a p
Grothendieck.surjective_germ_family_to_locallyRepresentable : ∀ (T : Type u_1) [inst : TopologicalSpace T] (F : TopCat.Presheaf (Type u_1) (TopCat.of T)), F.IsSheaf → ∀ (U : TopologicalSpace.Opens T), Function.Surjective fun s => ⟨fun p => (CategoryTheory.ConcreteCategory.hom (F.germ U ↑p ⋯)) s, ⋯⟩
-- StalkPoints (Partie 73) : la tige comme fibre du point du site
Grothendieck.opensPoint : (T : Type u_1) → [inst : TopologicalSpace T] → T → (Grothendieck.opensTopology T).Point
Grothendieck.mem_of_fiber : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T) {U : TopologicalSpace.Opens T} (p : (Grothendieck.opensPoint T x).fiber.obj U), x ∈ U
Grothendieck.fiberElem : (T : Type u_1) → [inst : TopologicalSpace T] → (x : T) → {U : TopologicalSpace.Opens T} → x ∈ U → (Grothendieck.opensPoint T x).fiber.obj U
Grothendieck.fiberToStalkCocone : (T : Type u_1) → [inst : TopologicalSpace T] → (x : T) → (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) → CategoryTheory.Limits.Cocone ((CategoryTheory.CategoryOfElements.π (Grothendieck.opensPoint T x).fiber).op.comp F)
Grothendieck.fiberToStalk : (T : Type u_1) → [inst : TopologicalSpace T] → (x : T) → (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) → (Grothendieck.opensPoint T x).presheafFiber.obj F ⟶ F.stalk x
Grothendieck.stalkToFiberCocone : (T : Type u_1) → [inst : TopologicalSpace T] → (x : T) → (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) → CategoryTheory.Limits.Cocone ((TopologicalSpace.OpenNhds.inclusion x).op.comp F)
Grothendieck.stalkToFiber : (T : Type u_1) → [inst : TopologicalSpace T] → (x : T) → (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) → F.stalk x ⟶ (Grothendieck.opensPoint T x).presheafFiber.obj F
Grothendieck.toPresheafFiber_fiberToStalk : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T) (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) (U : TopologicalSpace.Opens T) (p : (Grothendieck.opensPoint T x).fiber.obj U), CategoryTheory.CategoryStruct.comp ((Grothendieck.opensPoint T x).toPresheafFiber U p F) (Grothendieck.fiberToStalk T x F) = F.germ U x ⋯
Grothendieck.germ_stalkToFiber : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T) (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) (U : TopologicalSpace.Opens T) (hx : x ∈ U), CategoryTheory.CategoryStruct.comp (F.germ U x hx) (Grothendieck.stalkToFiber T x F) = (Grothendieck.opensPoint T x).toPresheafFiber U { down := { down := hx } } F
Grothendieck.stalkToFiber_comp_fiberToStalk : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T) (F : TopCat.Presheaf (Type u_1) (TopCat.of T)), CategoryTheory.CategoryStruct.comp (Grothendieck.stalkToFiber T x F) (Grothendieck.fiberToStalk T x F) = CategoryTheory.CategoryStruct.id (F.stalk x)
Grothendieck.fiberToStalk_comp_stalkToFiber : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T) (F : TopCat.Presheaf (Type u_1) (TopCat.of T)), CategoryTheory.CategoryStruct.comp (Grothendieck.fiberToStalk T x F) (Grothendieck.stalkToFiber T x F) = CategoryTheory.CategoryStruct.id ((Grothendieck.opensPoint T x).presheafFiber.obj F)
Grothendieck.stalkFiberIso : (T : Type u_1) → [inst : TopologicalSpace T] → (x : T) → (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) → (Grothendieck.opensPoint T x).presheafFiber.obj F ≅ F.stalk x
Grothendieck.stalkFiberIso_naturality : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T) (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) {G : TopCat.Presheaf (Type u_1) (TopCat.of T)} (f : F ⟶ G), CategoryTheory.CategoryStruct.comp ((Grothendieck.opensPoint T x).presheafFiber.map f) (Grothendieck.fiberToStalk T x G) = CategoryTheory.CategoryStruct.comp (Grothendieck.fiberToStalk T x F) ((TopCat.Presheaf.stalkFunctor (Type u_1) x).map f)
-- Integrite (meme protocole que la section 10) : un pivot par module, aucun
-- ne doit dependre de sorryAx
'Grothendieck.nonempty_stalk_yoneda_iff' depends on axioms: [propext, Classical.choice, Quot.sound]
'Grothendieck.eq_of_germ_eq_of_isSheaf' depends on axioms: [propext, Classical.choice, Quot.sound]
'Grothendieck.existsUnique_section_of_isLocallyRepresentable' depends on axioms: [propext, Classical.choice, Quot.sound]
'Grothendieck.stalkFiberIso_naturality' depends on axioms: [propext, Classical.choice, Quot.sound]
--% env 13
Raw input {"cmd": "-- Tiges (stalks) : les 25 declarations des quatre modules Stalk* du lake,\n-- modules invisibles du scan de visibilite (#11703) -- voici leurs enonces.\n\n-- Stalks (Partie 72) : la tige du representable, cas interieur et exterieur\n#check @Grothendieck.unique_stalk_yoneda\n#check @Grothendieck.isEmpty_stalk_yoneda\n#check @Grothendieck.nonempty_stalk_yoneda_iff\n\n-- StalkSeparated (Partie 74) : les tiges detectent l'egalite des sections\n#check @Grothendieck.eq_of_germ_eq_of_isSeparated\n#check @Grothendieck.eq_of_germ_eq_of_isSheaf\n#check @Grothendieck.injective_germ_family_of_isSeparated\n\n-- StalkGluing (Partie 75) : les familles de germes et leur recollement\n#check @Grothendieck.GermFamily\n#check @Grothendieck.GermFamily.IsLocallyRepresentable\n#check @Grothendieck.germFamily_isLocallyRepresentable\n#check @Grothendieck.existsUnique_gluing'_of_isSheaf\n#check @Grothendieck.existsUnique_section_of_isLocallyRepresentable\n#check @Grothendieck.surjective_germ_family_to_locallyRepresentable\n\n-- StalkPoints (Partie 73) : la tige comme fibre du point du site\n#check @Grothendieck.opensPoint\n#check @Grothendieck.mem_of_fiber\n#check @Grothendieck.fiberElem\n#check @Grothendieck.fiberToStalkCocone\n#check @Grothendieck.fiberToStalk\n#check @Grothendieck.stalkToFiberCocone\n#check @Grothendieck.stalkToFiber\n#check @Grothendieck.toPresheafFiber_fiberToStalk\n#check @Grothendieck.germ_stalkToFiber\n#check @Grothendieck.stalkToFiber_comp_fiberToStalk\n#check @Grothendieck.fiberToStalk_comp_stalkToFiber\n#check @Grothendieck.stalkFiberIso\n#check @Grothendieck.stalkFiberIso_naturality\n\n-- Integrite (meme protocole que la section 10) : un pivot par module, aucun\n-- ne doit dependre de sorryAx\n#print axioms Grothendieck.nonempty_stalk_yoneda_iff\n#print axioms Grothendieck.eq_of_germ_eq_of_isSheaf\n#print axioms Grothendieck.existsUnique_section_of_isLocallyRepresentable\n#print axioms Grothendieck.stalkFiberIso_naturality\n", "env": 12}
Raw output {"messages": [{"severity": "info", "pos": {"line": 5, "column": 0}, "endPos": {"line": 5, "column": 6}, "data": "Grothendieck.unique_stalk_yoneda : (T : Type u_1) →\n [inst : TopologicalSpace T] →\n (U : TopologicalSpace.Opens T) → {x : T} → x ∈ U → Unique (TopCat.Presheaf.stalk (CategoryTheory.yoneda.obj U) x)"}, {"severity": "info", "pos": {"line": 6, "column": 0}, "endPos": {"line": 6, "column": 6}, "data": "Grothendieck.isEmpty_stalk_yoneda : ∀ (T : Type u_1) [inst : TopologicalSpace T] (U : TopologicalSpace.Opens T) {x : T},\n x ∉ U → IsEmpty (TopCat.Presheaf.stalk (CategoryTheory.yoneda.obj U) x)"}, {"severity": "info", "pos": {"line": 7, "column": 0}, "endPos": {"line": 7, "column": 6}, "data": "Grothendieck.nonempty_stalk_yoneda_iff : ∀ (T : Type u_1) [inst : TopologicalSpace T] (U : TopologicalSpace.Opens T)\n (x : T), Nonempty (TopCat.Presheaf.stalk (CategoryTheory.yoneda.obj U) x) ↔ x ∈ U"}, {"severity": "info", "pos": {"line": 10, "column": 0}, "endPos": {"line": 10, "column": 6}, "data": "Grothendieck.eq_of_germ_eq_of_isSeparated : ∀ (T : Type u_1) [inst : TopologicalSpace T]\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)),\n CategoryTheory.Presheaf.IsSeparated (Grothendieck.opensTopology T) F →\n ∀ {U : TopologicalSpace.Opens T} {s t : F.obj (Opposite.op U)},\n (∀ (x : T) (hx : x ∈ U),\n (CategoryTheory.ConcreteCategory.hom (F.germ U x hx)) s =\n (CategoryTheory.ConcreteCategory.hom (F.germ U x hx)) t) →\n s = t"}, {"severity": "info", "pos": {"line": 11, "column": 0}, "endPos": {"line": 11, "column": 6}, "data": "Grothendieck.eq_of_germ_eq_of_isSheaf : ∀ (T : Type u_1) [inst : TopologicalSpace T]\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)),\n F.IsSheaf →\n ∀ {U : TopologicalSpace.Opens T} {s t : F.obj (Opposite.op U)},\n (∀ (x : T) (hx : x ∈ U),\n (CategoryTheory.ConcreteCategory.hom (F.germ U x hx)) s =\n (CategoryTheory.ConcreteCategory.hom (F.germ U x hx)) t) →\n s = t"}, {"severity": "info", "pos": {"line": 12, "column": 0}, "endPos": {"line": 12, "column": 6}, "data": "Grothendieck.injective_germ_family_of_isSeparated : ∀ (T : Type u_1) [inst : TopologicalSpace T]\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)),\n CategoryTheory.Presheaf.IsSeparated (Grothendieck.opensTopology T) F →\n ∀ (U : TopologicalSpace.Opens T),\n Function.Injective fun s p => (CategoryTheory.ConcreteCategory.hom (F.germ U ↑p ⋯)) s"}, {"severity": "info", "pos": {"line": 15, "column": 0}, "endPos": {"line": 15, "column": 6}, "data": "Grothendieck.GermFamily : (T : Type u_1) →\n [inst : TopologicalSpace T] → TopCat.Presheaf (Type u_1) (TopCat.of T) → TopologicalSpace.Opens T → Type u_1"}, {"severity": "info", "pos": {"line": 16, "column": 0}, "endPos": {"line": 16, "column": 6}, "data": "Grothendieck.GermFamily.IsLocallyRepresentable : (T : Type u_1) →\n [inst : TopologicalSpace T] →\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) →\n (U : TopologicalSpace.Opens T) → Grothendieck.GermFamily T F U → Prop"}, {"severity": "info", "pos": {"line": 17, "column": 0}, "endPos": {"line": 17, "column": 6}, "data": "Grothendieck.germFamily_isLocallyRepresentable : ∀ (T : Type u_1) [inst : TopologicalSpace T]\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) (U : TopologicalSpace.Opens T) (s : F.obj (Opposite.op U)),\n Grothendieck.GermFamily.IsLocallyRepresentable T F U fun p => (CategoryTheory.ConcreteCategory.hom (F.germ U ↑p ⋯)) s"}, {"severity": "info", "pos": {"line": 18, "column": 0}, "endPos": {"line": 18, "column": 6}, "data": "Grothendieck.existsUnique_gluing'_of_isSheaf : ∀ (T : Type u_1) [inst : TopologicalSpace T]\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)),\n F.IsSheaf →\n ∀ {ι : Type u_2} (V : ι → TopologicalSpace.Opens T) (U : TopologicalSpace.Opens T) (iVU : (i : ι) → V i ⟶ U),\n U ≤ iSup V →\n ∀ (sf : (i : ι) → F.obj (Opposite.op (V i))),\n F.IsCompatible V sf → ∃! s, ∀ (i : ι), (CategoryTheory.ConcreteCategory.hom (F.map (iVU i).op)) s = sf i"}, {"severity": "info", "pos": {"line": 19, "column": 0}, "endPos": {"line": 19, "column": 6}, "data": "Grothendieck.existsUnique_section_of_isLocallyRepresentable : ∀ (T : Type u_1) [inst : TopologicalSpace T]\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)),\n F.IsSheaf →\n ∀ (U : TopologicalSpace.Opens T) (a : Grothendieck.GermFamily T F U),\n Grothendieck.GermFamily.IsLocallyRepresentable T F U a →\n ∃! s, ∀ (p : ↥U), (CategoryTheory.ConcreteCategory.hom (F.germ U ↑p ⋯)) s = a p"}, {"severity": "info", "pos": {"line": 20, "column": 0}, "endPos": {"line": 20, "column": 6}, "data": "Grothendieck.surjective_germ_family_to_locallyRepresentable : ∀ (T : Type u_1) [inst : TopologicalSpace T]\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)),\n F.IsSheaf →\n ∀ (U : TopologicalSpace.Opens T),\n Function.Surjective fun s => ⟨fun p => (CategoryTheory.ConcreteCategory.hom (F.germ U ↑p ⋯)) s, ⋯⟩"}, {"severity": "info", "pos": {"line": 23, "column": 0}, "endPos": {"line": 23, "column": 6}, "data": "Grothendieck.opensPoint : (T : Type u_1) → [inst : TopologicalSpace T] → T → (Grothendieck.opensTopology T).Point"}, {"severity": "info", "pos": {"line": 24, "column": 0}, "endPos": {"line": 24, "column": 6}, "data": "Grothendieck.mem_of_fiber : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T) {U : TopologicalSpace.Opens T}\n (p : (Grothendieck.opensPoint T x).fiber.obj U), x ∈ U"}, {"severity": "info", "pos": {"line": 25, "column": 0}, "endPos": {"line": 25, "column": 6}, "data": "Grothendieck.fiberElem : (T : Type u_1) →\n [inst : TopologicalSpace T] →\n (x : T) → {U : TopologicalSpace.Opens T} → x ∈ U → (Grothendieck.opensPoint T x).fiber.obj U"}, {"severity": "info", "pos": {"line": 26, "column": 0}, "endPos": {"line": 26, "column": 6}, "data": "Grothendieck.fiberToStalkCocone : (T : Type u_1) →\n [inst : TopologicalSpace T] →\n (x : T) →\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) →\n CategoryTheory.Limits.Cocone\n ((CategoryTheory.CategoryOfElements.π (Grothendieck.opensPoint T x).fiber).op.comp F)"}, {"severity": "info", "pos": {"line": 27, "column": 0}, "endPos": {"line": 27, "column": 6}, "data": "Grothendieck.fiberToStalk : (T : Type u_1) →\n [inst : TopologicalSpace T] →\n (x : T) →\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) → (Grothendieck.opensPoint T x).presheafFiber.obj F ⟶ F.stalk x"}, {"severity": "info", "pos": {"line": 28, "column": 0}, "endPos": {"line": 28, "column": 6}, "data": "Grothendieck.stalkToFiberCocone : (T : Type u_1) →\n [inst : TopologicalSpace T] →\n (x : T) →\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) →\n CategoryTheory.Limits.Cocone ((TopologicalSpace.OpenNhds.inclusion x).op.comp F)"}, {"severity": "info", "pos": {"line": 29, "column": 0}, "endPos": {"line": 29, "column": 6}, "data": "Grothendieck.stalkToFiber : (T : Type u_1) →\n [inst : TopologicalSpace T] →\n (x : T) →\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) → F.stalk x ⟶ (Grothendieck.opensPoint T x).presheafFiber.obj F"}, {"severity": "info", "pos": {"line": 30, "column": 0}, "endPos": {"line": 30, "column": 6}, "data": "Grothendieck.toPresheafFiber_fiberToStalk : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T)\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) (U : TopologicalSpace.Opens T)\n (p : (Grothendieck.opensPoint T x).fiber.obj U),\n CategoryTheory.CategoryStruct.comp ((Grothendieck.opensPoint T x).toPresheafFiber U p F)\n (Grothendieck.fiberToStalk T x F) =\n F.germ U x ⋯"}, {"severity": "info", "pos": {"line": 31, "column": 0}, "endPos": {"line": 31, "column": 6}, "data": "Grothendieck.germ_stalkToFiber : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T)\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) (U : TopologicalSpace.Opens T) (hx : x ∈ U),\n CategoryTheory.CategoryStruct.comp (F.germ U x hx) (Grothendieck.stalkToFiber T x F) =\n (Grothendieck.opensPoint T x).toPresheafFiber U { down := { down := hx } } F"}, {"severity": "info", "pos": {"line": 32, "column": 0}, "endPos": {"line": 32, "column": 6}, "data": "Grothendieck.stalkToFiber_comp_fiberToStalk : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T)\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)),\n CategoryTheory.CategoryStruct.comp (Grothendieck.stalkToFiber T x F) (Grothendieck.fiberToStalk T x F) =\n CategoryTheory.CategoryStruct.id (F.stalk x)"}, {"severity": "info", "pos": {"line": 33, "column": 0}, "endPos": {"line": 33, "column": 6}, "data": "Grothendieck.fiberToStalk_comp_stalkToFiber : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T)\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)),\n CategoryTheory.CategoryStruct.comp (Grothendieck.fiberToStalk T x F) (Grothendieck.stalkToFiber T x F) =\n CategoryTheory.CategoryStruct.id ((Grothendieck.opensPoint T x).presheafFiber.obj F)"}, {"severity": "info", "pos": {"line": 34, "column": 0}, "endPos": {"line": 34, "column": 6}, "data": "Grothendieck.stalkFiberIso : (T : Type u_1) →\n [inst : TopologicalSpace T] →\n (x : T) →\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) → (Grothendieck.opensPoint T x).presheafFiber.obj F ≅ F.stalk x"}, {"severity": "info", "pos": {"line": 35, "column": 0}, "endPos": {"line": 35, "column": 6}, "data": "Grothendieck.stalkFiberIso_naturality : ∀ (T : Type u_1) [inst : TopologicalSpace T] (x : T)\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) {G : TopCat.Presheaf (Type u_1) (TopCat.of T)} (f : F ⟶ G),\n CategoryTheory.CategoryStruct.comp ((Grothendieck.opensPoint T x).presheafFiber.map f)\n (Grothendieck.fiberToStalk T x G) =\n CategoryTheory.CategoryStruct.comp (Grothendieck.fiberToStalk T x F)\n ((TopCat.Presheaf.stalkFunctor (Type u_1) x).map f)"}, {"severity": "info", "pos": {"line": 39, "column": 0}, "endPos": {"line": 39, "column": 6}, "data": "'Grothendieck.nonempty_stalk_yoneda_iff' depends on axioms: [propext, Classical.choice, Quot.sound]"}, {"severity": "info", "pos": {"line": 40, "column": 0}, "endPos": {"line": 40, "column": 6}, "data": "'Grothendieck.eq_of_germ_eq_of_isSheaf' depends on axioms: [propext, Classical.choice, Quot.sound]"}, {"severity": "info", "pos": {"line": 41, "column": 0}, "endPos": {"line": 41, "column": 6}, "data": "'Grothendieck.existsUnique_section_of_isLocallyRepresentable' depends on axioms: [propext, Classical.choice, Quot.sound]"}, {"severity": "info", "pos": {"line": 42, "column": 0}, "endPos": {"line": 42, "column": 6}, "data": "'Grothendieck.stalkFiberIso_naturality' depends on axioms: [propext, Classical.choice, Quot.sound]"}], "env": 13}

Lecture de la sortie

Le premier groupe expose la paire intérieure / extérieure sur la tige du représentable. unique_stalk_yoneda rend un Unique (stalk (yoneda.obj U) x) sous l’hypothèse x ∈ U : la tige n’a qu’un seul élément, le germe de l’identité de U. isEmpty_stalk_yoneda porte l’hypothèse opposée x ∉ U et conclut IsEmpty du même type. nonempty_stalk_yoneda_iff referme les deux en une équivalence Nonempty (stalk …) ↔︎ x ∈ U : la tige du représentable détecte l’appartenance du point.

Le groupe StalkSeparated montre la forme des énoncés de détection. Les deux premiers prennent une famille de germes indexée par les points de U, l’égalité des germes en chaque point, et concluent s = t ; le second le fait sous l’hypothèse de faisceau plutôt que de séparabilité, sans ajouter d’hypothèse de limite. Le troisième affiche le type Function.Injective de l’application qui envoie une section sur sa famille de germes.

Le groupe StalkGluing expose l’aller-retour section ↔︎ famille de germes. germFamily_isLocallyRepresentable donne le sens direct — la famille des germes d’une section est localement représentable — et existsUnique_section_of_isLocallyRepresentable la réciproque, sous forme d’un ∃! qui porte à la fois l’existence et l’unicité. surjective_germ_family_to_locallyRepresentable en est la reformulation en surjectivité, le type de l’application laissant voir que le but est le sous-type des familles localement représentables.

Le groupe StalkPoints affiche la construction du point du site puis les deux cônes de colimite — fiberToStalk des germes vers la fibre, stalkToFiber en sens inverse — et stalkFiberIso qui les compose en un iso. Ses paramètres implicites laissent voir que l’énoncé est posé pour un préfaisceau F sur un espace T arbitraires, sans hypothèse de faisceau : l’iso est une propriété de la construction, pas de la condition de recollement. stalkFiberIso_naturality ajoute la naturalité en F.

Les #print axioms répondent [propext, Classical.choice, Quot.sound] — les axiomes standards de Lean, même protocole que la section 10 : aucun des pivots ne dépend de sorryAx. La mesure fraîche du scan réduit encore le nombre de modules invisibles du lake grothendieck, et le nombre de déclarations distinctes citées continue de croître. Les modules Stalk* sortent du noir, et Spaces.lean avec eux : opensTopology, qu’il déclare, apparaît dans le type rendu de opensPoint et des lemmes de séparation — citer ces énoncés cite aussi le sien.

Annexe — Des ouverts au préfaisceau gratte-ciel (#11703)

Cette annexe relie quatre modules qui forment une même chaîne topologique. SpacesMathlib identifie le site des ouverts construit dans le lake à celui de Mathlib. SpacesSubcanonical montre ensuite que les représentables y sont des faisceaux. StalkCharacterization reformule la condition de faisceau par séparation et recollement des germes. Enfin, Skyscraper applique ce vocabulaire à un préfaisceau concentré autour d’un point.

Les signatures ci-dessous sont vérifiées par Lean dans le lake réel. Elles rendent visibles les propriétés structurantes plutôt que les détails de leurs preuves.

-- SpacesMathlib : le site construit dans le lake coïncide avec celui de Mathlib
#check @Grothendieck.opensTopology_eq
#check @Grothendieck.isSheaf_opensTopology_iff
#check @Grothendieck.coversTop_opensTopology_iff

-- SpacesSubcanonical : tout représentable sur le site des ouverts est un faisceau
#check @Grothendieck.isSheaf_yoneda_opensTopology
#check @Grothendieck.opensTopology_subcanonical

-- StalkCharacterization : séparation et recollement se lisent sur les germes
#check @Grothendieck.GermSeparated
#check @Grothendieck.GermGluing
#check @Grothendieck.germ_eq_of_isCompatible
#check @Grothendieck.isSheaf_iff_germSeparated_and_germGluing

-- Skyscraper : support et dichotomie des tiges autour du point choisi
#check @Grothendieck.Contenu.skyscraper
#check @Grothendieck.Contenu.stalkIsoOfMemClosure
#check @Grothendieck.Contenu.stalkIsoOfNotMemClosure
#check @Grothendieck.Contenu.support_skyscraper
#check @Grothendieck.Contenu.support_skyscraper_of_closed
#check @Grothendieck.Contenu.stalk_dichotomy

-- Les résultats pivots restent auditables par le noyau Lean
#print axioms Grothendieck.opensTopology_subcanonical
#print axioms Grothendieck.isSheaf_iff_germSeparated_and_germGluing
#print axioms Grothendieck.Contenu.support_skyscraper
-- SpacesMathlib : le site construit dans le lake coïncide avec celui de Mathlib
Grothendieck.opensTopology_eq : ∀ (T : Type u_1) [inst : TopologicalSpace T], Grothendieck.opensTopology T = Opens.grothendieckTopology T
@Grothendieck.isSheaf_opensTopology_iff : ∀ {T : Type u_1} [inst : TopologicalSpace T] {C : Type u_2} [inst_1 : CategoryTheory.Category.{u_3, u_2} C] (F : TopCat.Presheaf C (TopCat.of T)), CategoryTheory.Presheaf.IsSheaf (Grothendieck.opensTopology T) F ↔ F.IsSheaf
@Grothendieck.coversTop_opensTopology_iff : ∀ {T : Type u_1} [inst : TopologicalSpace T] {ι : Type u_2} (U : ι → TopologicalSpace.Opens T), (Grothendieck.opensTopology T).CoversTop U ↔ (Opens.grothendieckTopology T).CoversTop U
-- SpacesSubcanonical : tout représentable sur le site des ouverts est un faisceau
Grothendieck.isSheaf_yoneda_opensTopology : ∀ (T : Type u_1) [inst : TopologicalSpace T] (U : TopologicalSpace.Opens T), CategoryTheory.Presieve.IsSheaf (Grothendieck.opensTopology T) (CategoryTheory.yoneda.obj U)
Grothendieck.opensTopology_subcanonical : ∀ (T : Type u_1) [inst : TopologicalSpace T], (Grothendieck.opensTopology T).Subcanonical
-- StalkCharacterization : séparation et recollement se lisent sur les germes
Grothendieck.GermSeparated : (T : Type u_1) → [inst : TopologicalSpace T] → TopCat.Presheaf (Type u_1) (TopCat.of T) → Prop
Grothendieck.GermGluing : (T : Type u_1) → [inst : TopologicalSpace T] → TopCat.Presheaf (Type u_1) (TopCat.of T) → Prop
Grothendieck.germ_eq_of_isCompatible : ∀ (T : Type u_1) [inst : TopologicalSpace T] (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) {ι : Type u_2} (U : ι → TopologicalSpace.Opens T) (sf : (i : ι) → F.obj (Opposite.op (U i))), F.IsCompatible U sf → ∀ {i j : ι} {x : T} (hi : x ∈ U i) (hj : x ∈ U j), (CategoryTheory.ConcreteCategory.hom (F.germ (U i) x hi)) (sf i) = (CategoryTheory.ConcreteCategory.hom (F.germ (U j) x hj)) (sf j)
Grothendieck.isSheaf_iff_germSeparated_and_germGluing : ∀ (T : Type u_1) [inst : TopologicalSpace T] (F : TopCat.Presheaf (Type u_1) (TopCat.of T)), F.IsSheaf ↔ Grothendieck.GermSeparated T F ∧ Grothendieck.GermGluing T F
-- Skyscraper : support et dichotomie des tiges autour du point choisi
@Grothendieck.Contenu.skyscraper : {X : TopCat} → (p₀ : ↑X) → [(U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] → {C : Type u_2} → [inst : CategoryTheory.Category.{u_1, u_2} C] → [CategoryTheory.Limits.HasTerminal C] → C → TopCat.Presheaf C X
@Grothendieck.Contenu.stalkIsoOfMemClosure : {X : TopCat} → (p₀ : ↑X) → [inst : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] → {C : Type u_2} → [inst_1 : CategoryTheory.Category.{u_1, u_2} C] → [inst_2 : CategoryTheory.Limits.HasTerminal C] → [inst_3 : CategoryTheory.Limits.HasColimits C] → (A : C) → {y : ↑X} → y ∈ closure {p₀} → ((Grothendieck.Contenu.skyscraper p₀ A).stalk y ≅ A)
@Grothendieck.Contenu.stalkIsoOfNotMemClosure : {X : TopCat} → (p₀ : ↑X) → [inst : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] → {C : Type u_2} → [inst_1 : CategoryTheory.Category.{u_1, u_2} C] → [inst_2 : CategoryTheory.Limits.HasTerminal C] → [inst_3 : CategoryTheory.Limits.HasColimits C] → (A : C) → {y : ↑X} → y ∉ closure {p₀} → ((Grothendieck.Contenu.skyscraper p₀ A).stalk y ≅ ⊤_ C)
@Grothendieck.Contenu.support_skyscraper : ∀ {X : TopCat} (p₀ : ↑X) [inst : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] {C : Type u_2} [inst_1 : CategoryTheory.Category.{u_1, u_2} C] [inst_2 : CategoryTheory.Limits.HasTerminal C] [inst_3 : CategoryTheory.Limits.HasColimits C] (A : C), IsEmpty (CategoryTheory.Limits.IsTerminal A) → Grothendieck.Contenu.support (Grothendieck.Contenu.skyscraper p₀ A) = closure {p₀}
@Grothendieck.Contenu.support_skyscraper_of_closed : ∀ {X : TopCat} (p₀ : ↑X) [inst : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] {C : Type u_2} [inst_1 : CategoryTheory.Category.{u_1, u_2} C] [inst_2 : CategoryTheory.Limits.HasTerminal C] [inst_3 : CategoryTheory.Limits.HasColimits C] (A : C), IsEmpty (CategoryTheory.Limits.IsTerminal A) → IsClosed {p₀} → Grothendieck.Contenu.support (Grothendieck.Contenu.skyscraper p₀ A) = {p₀}
@Grothendieck.Contenu.stalk_dichotomy : ∀ {X : TopCat} (p₀ : ↑X) [inst : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] {C : Type u_2} [inst_1 : CategoryTheory.Category.{u_1, u_2} C] [inst_2 : CategoryTheory.Limits.HasTerminal C] [inst_3 : CategoryTheory.Limits.HasColimits C] (A : C), IsEmpty (CategoryTheory.Limits.IsTerminal A) → ∀ (y : ↑X), y ∈ Grothendieck.Contenu.support (Grothendieck.Contenu.skyscraper p₀ A) ∧ Nonempty ((Grothendieck.Contenu.skyscraper p₀ A).stalk y ≅ A) ∨ y ∉ Grothendieck.Contenu.support (Grothendieck.Contenu.skyscraper p₀ A) ∧ Nonempty ((Grothendieck.Contenu.skyscraper p₀ A).stalk y ≅ ⊤_ C)
-- Les résultats pivots restent auditables par le noyau Lean
'Grothendieck.opensTopology_subcanonical' depends on axioms: [propext, Classical.choice, Quot.sound]
'Grothendieck.isSheaf_iff_germSeparated_and_germGluing' depends on axioms: [propext, Classical.choice, Quot.sound]
'Grothendieck.Contenu.support_skyscraper' depends on axioms: [propext, Classical.choice, Quot.sound]
--% env 14
Raw input {"cmd": "-- SpacesMathlib : le site construit dans le lake co\u00efncide avec celui de Mathlib\n#check @Grothendieck.opensTopology_eq\n#check @Grothendieck.isSheaf_opensTopology_iff\n#check @Grothendieck.coversTop_opensTopology_iff\n\n-- SpacesSubcanonical : tout repr\u00e9sentable sur le site des ouverts est un faisceau\n#check @Grothendieck.isSheaf_yoneda_opensTopology\n#check @Grothendieck.opensTopology_subcanonical\n\n-- StalkCharacterization : s\u00e9paration et recollement se lisent sur les germes\n#check @Grothendieck.GermSeparated\n#check @Grothendieck.GermGluing\n#check @Grothendieck.germ_eq_of_isCompatible\n#check @Grothendieck.isSheaf_iff_germSeparated_and_germGluing\n\n-- Skyscraper : support et dichotomie des tiges autour du point choisi\n#check @Grothendieck.Contenu.skyscraper\n#check @Grothendieck.Contenu.stalkIsoOfMemClosure\n#check @Grothendieck.Contenu.stalkIsoOfNotMemClosure\n#check @Grothendieck.Contenu.support_skyscraper\n#check @Grothendieck.Contenu.support_skyscraper_of_closed\n#check @Grothendieck.Contenu.stalk_dichotomy\n\n-- Les r\u00e9sultats pivots restent auditables par le noyau Lean\n#print axioms Grothendieck.opensTopology_subcanonical\n#print axioms Grothendieck.isSheaf_iff_germSeparated_and_germGluing\n#print axioms Grothendieck.Contenu.support_skyscraper", "env": 13}
Raw output {"messages": [{"severity": "info", "pos": {"line": 2, "column": 0}, "endPos": {"line": 2, "column": 6}, "data": "Grothendieck.opensTopology_eq : ∀ (T : Type u_1) [inst : TopologicalSpace T],\n Grothendieck.opensTopology T = Opens.grothendieckTopology T"}, {"severity": "info", "pos": {"line": 3, "column": 0}, "endPos": {"line": 3, "column": 6}, "data": "@Grothendieck.isSheaf_opensTopology_iff : ∀ {T : Type u_1} [inst : TopologicalSpace T] {C : Type u_2}\n [inst_1 : CategoryTheory.Category.{u_3, u_2} C] (F : TopCat.Presheaf C (TopCat.of T)),\n CategoryTheory.Presheaf.IsSheaf (Grothendieck.opensTopology T) F ↔ F.IsSheaf"}, {"severity": "info", "pos": {"line": 4, "column": 0}, "endPos": {"line": 4, "column": 6}, "data": "@Grothendieck.coversTop_opensTopology_iff : ∀ {T : Type u_1} [inst : TopologicalSpace T] {ι : Type u_2}\n (U : ι → TopologicalSpace.Opens T),\n (Grothendieck.opensTopology T).CoversTop U ↔ (Opens.grothendieckTopology T).CoversTop U"}, {"severity": "info", "pos": {"line": 7, "column": 0}, "endPos": {"line": 7, "column": 6}, "data": "Grothendieck.isSheaf_yoneda_opensTopology : ∀ (T : Type u_1) [inst : TopologicalSpace T] (U : TopologicalSpace.Opens T),\n CategoryTheory.Presieve.IsSheaf (Grothendieck.opensTopology T) (CategoryTheory.yoneda.obj U)"}, {"severity": "info", "pos": {"line": 8, "column": 0}, "endPos": {"line": 8, "column": 6}, "data": "Grothendieck.opensTopology_subcanonical : ∀ (T : Type u_1) [inst : TopologicalSpace T],\n (Grothendieck.opensTopology T).Subcanonical"}, {"severity": "info", "pos": {"line": 11, "column": 0}, "endPos": {"line": 11, "column": 6}, "data": "Grothendieck.GermSeparated : (T : Type u_1) →\n [inst : TopologicalSpace T] → TopCat.Presheaf (Type u_1) (TopCat.of T) → Prop"}, {"severity": "info", "pos": {"line": 12, "column": 0}, "endPos": {"line": 12, "column": 6}, "data": "Grothendieck.GermGluing : (T : Type u_1) → [inst : TopologicalSpace T] → TopCat.Presheaf (Type u_1) (TopCat.of T) → Prop"}, {"severity": "info", "pos": {"line": 13, "column": 0}, "endPos": {"line": 13, "column": 6}, "data": "Grothendieck.germ_eq_of_isCompatible : ∀ (T : Type u_1) [inst : TopologicalSpace T]\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)) {ι : Type u_2} (U : ι → TopologicalSpace.Opens T)\n (sf : (i : ι) → F.obj (Opposite.op (U i))),\n F.IsCompatible U sf →\n ∀ {i j : ι} {x : T} (hi : x ∈ U i) (hj : x ∈ U j),\n (CategoryTheory.ConcreteCategory.hom (F.germ (U i) x hi)) (sf i) =\n (CategoryTheory.ConcreteCategory.hom (F.germ (U j) x hj)) (sf j)"}, {"severity": "info", "pos": {"line": 14, "column": 0}, "endPos": {"line": 14, "column": 6}, "data": "Grothendieck.isSheaf_iff_germSeparated_and_germGluing : ∀ (T : Type u_1) [inst : TopologicalSpace T]\n (F : TopCat.Presheaf (Type u_1) (TopCat.of T)),\n F.IsSheaf ↔ Grothendieck.GermSeparated T F ∧ Grothendieck.GermGluing T F"}, {"severity": "info", "pos": {"line": 17, "column": 0}, "endPos": {"line": 17, "column": 6}, "data": "@Grothendieck.Contenu.skyscraper : {X : TopCat} →\n (p₀ : ↑X) →\n [(U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] →\n {C : Type u_2} →\n [inst : CategoryTheory.Category.{u_1, u_2} C] → [CategoryTheory.Limits.HasTerminal C] → C → TopCat.Presheaf C X"}, {"severity": "info", "pos": {"line": 18, "column": 0}, "endPos": {"line": 18, "column": 6}, "data": "@Grothendieck.Contenu.stalkIsoOfMemClosure : {X : TopCat} →\n (p₀ : ↑X) →\n [inst : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] →\n {C : Type u_2} →\n [inst_1 : CategoryTheory.Category.{u_1, u_2} C] →\n [inst_2 : CategoryTheory.Limits.HasTerminal C] →\n [inst_3 : CategoryTheory.Limits.HasColimits C] →\n (A : C) → {y : ↑X} → y ∈ closure {p₀} → ((Grothendieck.Contenu.skyscraper p₀ A).stalk y ≅ A)"}, {"severity": "info", "pos": {"line": 19, "column": 0}, "endPos": {"line": 19, "column": 6}, "data": "@Grothendieck.Contenu.stalkIsoOfNotMemClosure : {X : TopCat} →\n (p₀ : ↑X) →\n [inst : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] →\n {C : Type u_2} →\n [inst_1 : CategoryTheory.Category.{u_1, u_2} C] →\n [inst_2 : CategoryTheory.Limits.HasTerminal C] →\n [inst_3 : CategoryTheory.Limits.HasColimits C] →\n (A : C) → {y : ↑X} → y ∉ closure {p₀} → ((Grothendieck.Contenu.skyscraper p₀ A).stalk y ≅ ⊤_ C)"}, {"severity": "info", "pos": {"line": 20, "column": 0}, "endPos": {"line": 20, "column": 6}, "data": "@Grothendieck.Contenu.support_skyscraper : ∀ {X : TopCat} (p₀ : ↑X)\n [inst : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] {C : Type u_2}\n [inst_1 : CategoryTheory.Category.{u_1, u_2} C] [inst_2 : CategoryTheory.Limits.HasTerminal C]\n [inst_3 : CategoryTheory.Limits.HasColimits C] (A : C),\n IsEmpty (CategoryTheory.Limits.IsTerminal A) →\n Grothendieck.Contenu.support (Grothendieck.Contenu.skyscraper p₀ A) = closure {p₀}"}, {"severity": "info", "pos": {"line": 21, "column": 0}, "endPos": {"line": 21, "column": 6}, "data": "@Grothendieck.Contenu.support_skyscraper_of_closed : ∀ {X : TopCat} (p₀ : ↑X)\n [inst : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] {C : Type u_2}\n [inst_1 : CategoryTheory.Category.{u_1, u_2} C] [inst_2 : CategoryTheory.Limits.HasTerminal C]\n [inst_3 : CategoryTheory.Limits.HasColimits C] (A : C),\n IsEmpty (CategoryTheory.Limits.IsTerminal A) →\n IsClosed {p₀} → Grothendieck.Contenu.support (Grothendieck.Contenu.skyscraper p₀ A) = {p₀}"}, {"severity": "info", "pos": {"line": 22, "column": 0}, "endPos": {"line": 22, "column": 6}, "data": "@Grothendieck.Contenu.stalk_dichotomy : ∀ {X : TopCat} (p₀ : ↑X)\n [inst : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] {C : Type u_2}\n [inst_1 : CategoryTheory.Category.{u_1, u_2} C] [inst_2 : CategoryTheory.Limits.HasTerminal C]\n [inst_3 : CategoryTheory.Limits.HasColimits C] (A : C),\n IsEmpty (CategoryTheory.Limits.IsTerminal A) →\n ∀ (y : ↑X),\n y ∈ Grothendieck.Contenu.support (Grothendieck.Contenu.skyscraper p₀ A) ∧\n Nonempty ((Grothendieck.Contenu.skyscraper p₀ A).stalk y ≅ A) ∨\n y ∉ Grothendieck.Contenu.support (Grothendieck.Contenu.skyscraper p₀ A) ∧\n Nonempty ((Grothendieck.Contenu.skyscraper p₀ A).stalk y ≅ ⊤_ C)"}, {"severity": "info", "pos": {"line": 25, "column": 0}, "endPos": {"line": 25, "column": 6}, "data": "'Grothendieck.opensTopology_subcanonical' depends on axioms: [propext, Classical.choice, Quot.sound]"}, {"severity": "info", "pos": {"line": 26, "column": 0}, "endPos": {"line": 26, "column": 6}, "data": "'Grothendieck.isSheaf_iff_germSeparated_and_germGluing' depends on axioms: [propext, Classical.choice, Quot.sound]"}, {"severity": "info", "pos": {"line": 27, "column": 0}, "endPos": {"line": 27, "column": 6}, "data": "'Grothendieck.Contenu.support_skyscraper' depends on axioms: [propext, Classical.choice, Quot.sound]"}], "env": 14}

Lecture du résultat

Le premier groupe de signatures établit un pont sans couche de traduction : la topologie des ouverts du lake est celle de Mathlib, puis sa sous-canonicité autorise Yoneda à produire des faisceaux. La caractérisation par les germes sépare ensuite les deux obligations d’un faisceau : l’unicité locale (GermSeparated) et l’existence d’un recollement (GermGluing).

Le gratte-ciel rend cette abstraction géométrique. Sa tige est isomorphe à la valeur choisie dans l’adhérence du point et terminale hors de cette adhérence. Sous l’hypothèse que la valeur n’est pas terminale, support_skyscraper identifie donc exactement le support à cette adhérence. Les commandes #print axioms permettent enfin de contrôler les dépendances logiques des trois résultats pivots.

Exercice — retrouver la concentration au point fermé

Objectif. Identifier le corollaire qui réduit le support du préfaisceau gratte-ciel au singleton du point lorsque celui-ci est fermé.

  1. Repérez la déclaration dont le nom prolonge support_skyscraper.
  2. Comparez son hypothèse de fermeture avec celle du théorème général.
  3. Décommentez le #check, puis ajoutez sous le message exécutable une micro-preuve qui applique ce corollaire dans un contexte de votre choix.
-- Exercice : retrouver le corollaire pour un point ferme
-- #check Grothendieck.Contenu.support_skyscraper_of_closed

-- TODO etudiant : instanciez le corollaire avec un espace, un point et une valeur adaptes.
-- Indice : partez de `support_skyscraper`, puis utilisez `IsClosed.closure_eq`.

-- Le stub reste executable de bout en bout (C.1) sans pre-remplir une preuve.
#eval "Exercice a completer : instancier le corollaire pour un point ferme"
-- Exercice : retrouver le corollaire pour un point ferme
-- #check Grothendieck.Contenu.support_skyscraper_of_closed
-- TODO etudiant : instanciez le corollaire avec un espace, un point et une valeur adaptes.
-- Indice : partez de `support_skyscraper`, puis utilisez `IsClosed.closure_eq`.
-- Le stub reste executable de bout en bout (C.1) sans pre-remplir une preuve.
"Exercice a completer : instancier le corollaire pour un point ferme"
--% env 15
Raw input {"cmd": "-- Exercice : retrouver le corollaire pour un point ferme\n-- #check Grothendieck.Contenu.support_skyscraper_of_closed\n\n-- TODO etudiant : instanciez le corollaire avec un espace, un point et une valeur adaptes.\n-- Indice : partez de `support_skyscraper`, puis utilisez `IsClosed.closure_eq`.\n\n-- Le stub reste executable de bout en bout (C.1) sans pre-remplir une preuve.\n#eval \"Exercice a completer : instancier le corollaire pour un point ferme\"", "env": 14}
Raw output {"messages": [{"severity": "info", "pos": {"line": 8, "column": 0}, "endPos": {"line": 8, "column": 5}, "data": "\"Exercice a completer : instancier le corollaire pour un point ferme\""}], "env": 15}

Annexe — Faisceaux flasques et résolution de Godement (#11703)

Huit modules du lake déclarent la théorie flasque du corpus — les cinq modules Flasque* (définition, exactitude, quotients, rétracts, stabilité) et les trois Godement* (construction, fonctorialité, monomorphismes) — et étaient les géants noirs du scan de visibilité : plus aucun autre groupe de modules du lake n’en comptait autant d’invisibles d’un seul tenant (16 noirs restants sur 83, dont ces 8). Cette annexe les rend visibles dans le fil du compagnon.

Le récit mathématique. Un préfaisceau est flasque (« flabby ») quand toute section sur un ouvert s’étend à tout l’espace — l’obstruction au recollement y est nulle par construction. La classe est remarquablement stable : invariante par isomorphisme, par rétract, transmise aux quotients d’une suite exacte courte flasque-flasque, et aux produits. C’est la stabilité qui paie : dans une suite exacte courte de faisceaux abélians à terme gauche flasque, le foncteur sections globales la préserve exacte — le flasque est acyclique. Le théorème de Godement (Tôhoku, II) en tire la résolution canonique : tout faisceau se plonge dans un faisceau flasque construit section par section (godementSection : germes à gauche), le plongement est fonctoriel et additif, et le foncteur préserve les monomorphismes — d’où la résolution flasque universelle qui définit la cohomologie des faisceaux.

-- Faisceaux flasques et resolution de Godement : les declarations des
-- huit modules Flasque*/Godement* du lake, noirs du scan de visibilite
-- (#11703) -- voici leurs enonces. Les huit familles sont chargees dans
-- la session par le preambule d'imports de la premiere cellule : cinq
-- par l'umbrela `import Grothendieck`, trois explicitement (le REPL
-- n'accepte les imports qu'en tout debut de session).

-- Flasque : la definition par cribles, et ses premiers ponts
#check @Grothendieck.IsFlasqueSieves
#check @Grothendieck.isFlasqueSieves_iff
#check @Grothendieck.nonempty_obj_of_isFlasqueSieves
#check @Grothendieck.isSheaf_of_isFlasqueSieves_of_isSeparated
#check @Grothendieck.isFlasqueSieves_const_of_subsingleton
#check @Grothendieck.pushforward_isFlasque_bridge
#check @Grothendieck.isFlasque_skyscraper_bridge

-- FlasqueExact : l'acyclicite -- amalgamation sans obstruction
#check @Grothendieck.exists_isAmalgamation_of_sieveTop
#check @Grothendieck.exists_lift_of_isFlasqueSieves_of_mono
#check @Grothendieck.epi_of_shortExact_of_isFlasqueSieves

-- FlasqueQuotient : stabilite par quotient d'une suite exacte flasque-flasque
#check @Grothendieck.isFlasque_of_isFlasqueSieves
#check @Grothendieck.isFlasqueSieves_of_isFlasque_of_isSheaf
#check @Grothendieck.isFlasqueSieves_of_shortExact_of_isFlasque₁₂

-- FlasqueRetract : la classe est stable par retract (et donc par iso)
#check @Grothendieck.isFlasqueSieves_of_retract
#check @Grothendieck.isFlasqueSieves_of_retract'
#check @Grothendieck.isFlasqueSieves_of_iso'
#check @Grothendieck.isFlasqueSieves_of_retract_addCommGrp

-- FlasqueStability : produits, isomorphismes, et l'echelle cohomologique
#check @Grothendieck.isFlasqueSieves_of_iso
#check @Grothendieck.isFlasqueSieves_pi
#check @Grothendieck.subsingleton_H_succ_of_flasque_of_injective

-- Godement : la construction section par section, flasque par construction
#check @Grothendieck.godementSection
#check @Grothendieck.godementObj
#check @Grothendieck.godementMap
#check @Grothendieck.godementPresheaf
#check @Grothendieck.godementExtend
#check @Grothendieck.toGodement
#check @Grothendieck.isFlasque_godementPresheaf
#check @Grothendieck.isSheaf_godementPresheaf
#check @Grothendieck.injective_toGodement_of_isSheaf

-- GodementFunctor : le plongement est fonctoriel et additif
#check @Grothendieck.godementHomApp
#check @Grothendieck.godementMapHom
#check @Grothendieck.godementFunctor
#check @Grothendieck.toGodementNatTrans
#check @Grothendieck.godementMapHom_id
#check @Grothendieck.godementMapHom_comp
#check @Grothendieck.toGodement_naturality

-- GodementMono : le foncteur preserve les monomorphismes
#check @Grothendieck.injective_app_of_mono
#check @Grothendieck.godementHomApp_injective
#check @Grothendieck.godementMapHom_mono
#check @Grothendieck.godementFunctor_preservesMonomorphisms
-- Faisceaux flasques et resolution de Godement : les declarations des
-- huit modules Flasque*/Godement* du lake, noirs du scan de visibilite
-- (#11703) -- voici leurs enonces. Les huit familles sont chargees dans
-- la session par le preambule d'imports de la premiere cellule : cinq
-- par l'umbrela `import Grothendieck`, trois explicitement (le REPL
-- n'accepte les imports qu'en tout debut de session).
-- Flasque : la definition par cribles, et ses premiers ponts
@Grothendieck.IsFlasqueSieves : {C : Type u_1} → [inst : CategoryTheory.Category.{u_2, u_1} C] → CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1)) → Prop
@Grothendieck.isFlasqueSieves_iff : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))), Grothendieck.IsFlasqueSieves P ↔ ∀ {X : C} (S : CategoryTheory.Sieve X) (x : CategoryTheory.Presieve.FamilyOfElements P S.arrows), x.Compatible → ∃ t, x.IsAmalgamation t
@Grothendieck.nonempty_obj_of_isFlasqueSieves : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} [Grothendieck.IsFlasqueSieves P] (X : C), Nonempty (P.obj (Opposite.op X))
@Grothendieck.isSheaf_of_isFlasqueSieves_of_isSeparated : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {J : CategoryTheory.GrothendieckTopology C} {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} [Grothendieck.IsFlasqueSieves P], CategoryTheory.Presieve.IsSeparated J P → CategoryTheory.Presieve.IsSheaf J P
@Grothendieck.isFlasqueSieves_const_of_subsingleton : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (A : Type (max u_2 u_1)) [Subsingleton A] [Nonempty A], Grothendieck.IsFlasqueSieves ((CategoryTheory.Functor.const Cᵒᵖ).obj A)
@Grothendieck.pushforward_isFlasque_bridge : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {X Y : TopCat} {F : TopCat.Presheaf C X} [F.IsFlasque] (f : X ⟶ Y), ((TopCat.Presheaf.pushforward C f).obj F).IsFlasque
@Grothendieck.isFlasque_skyscraper_bridge : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {X : TopCat} (p₀ : ↑X) [inst_1 : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] (A : C) [inst_2 : CategoryTheory.Limits.HasZeroObject C], (skyscraperSheaf p₀ A).IsFlasque
-- FlasqueExact : l'acyclicite -- amalgamation sans obstruction
@Grothendieck.exists_isAmalgamation_of_sieveTop : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} {A : C} (x : CategoryTheory.Presieve.FamilyOfElements P ⊤.arrows), x.Compatible → ∃ t, x.IsAmalgamation t
@Grothendieck.exists_lift_of_isFlasqueSieves_of_mono : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} [Grothendieck.IsFlasqueSieves P] {A B : C} (f : B ⟶ A) [CategoryTheory.Mono f] (s : P.obj (Opposite.op B)), ∃ t, (CategoryTheory.ConcreteCategory.hom (P.map f.op)) t = s
@Grothendieck.epi_of_shortExact_of_isFlasqueSieves : ∀ {X : TopCat} {S : CategoryTheory.ShortComplex (TopCat.Sheaf AddCommGrpCat X)}, S.ShortExact → ∀ [Grothendieck.IsFlasqueSieves (S.X₁.obj.comp (CategoryTheory.forget AddCommGrpCat))] {U : TopologicalSpace.Opens ↑X}, CategoryTheory.Epi (S.g.hom.app (Opposite.op U))
-- FlasqueQuotient : stabilite par quotient d'une suite exacte flasque-flasque
@Grothendieck.isFlasque_of_isFlasqueSieves : ∀ {X : TopCat} {P : TopCat.Presheaf (Type u_1) X} [Grothendieck.IsFlasqueSieves P], P.IsFlasque
@Grothendieck.isFlasqueSieves_of_isFlasque_of_isSheaf : ∀ {X : TopCat} {P : TopCat.Presheaf (Type u_1) X}, CategoryTheory.Presieve.IsSheaf (Opens.grothendieckTopology ↑X) P → P.IsFlasque → Grothendieck.IsFlasqueSieves P
@Grothendieck.isFlasqueSieves_of_shortExact_of_isFlasque₁₂ : ∀ {X : TopCat} {S : CategoryTheory.ShortComplex (TopCat.Sheaf AddCommGrpCat X)}, S.ShortExact → ∀ [Grothendieck.IsFlasqueSieves (S.X₁.obj.comp (CategoryTheory.forget AddCommGrpCat))] [Grothendieck.IsFlasqueSieves (S.X₂.obj.comp (CategoryTheory.forget AddCommGrpCat))], Grothendieck.IsFlasqueSieves (S.X₃.obj.comp (CategoryTheory.forget AddCommGrpCat))
-- FlasqueRetract : la classe est stable par retract (et donc par iso)
@Grothendieck.isFlasqueSieves_of_retract : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {P Q : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} (e : P ⟶ Q) (s : Q ⟶ P), CategoryTheory.CategoryStruct.comp s e = CategoryTheory.CategoryStruct.id Q → ∀ [Grothendieck.IsFlasqueSieves P], Grothendieck.IsFlasqueSieves Q
@Grothendieck.isFlasqueSieves_of_retract' : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {P Q : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} (e : P ⟶ Q) (s : Q ⟶ P), CategoryTheory.CategoryStruct.comp e s = CategoryTheory.CategoryStruct.id P → ∀ [Grothendieck.IsFlasqueSieves Q], Grothendieck.IsFlasqueSieves P
@Grothendieck.isFlasqueSieves_of_iso' : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {P Q : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} (e : P ≅ Q) [Grothendieck.IsFlasqueSieves P], Grothendieck.IsFlasqueSieves Q
@Grothendieck.isFlasqueSieves_of_retract_addCommGrp : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {F G : CategoryTheory.Functor Cᵒᵖ AddCommGrpCat} (e : F ⟶ G) (s : G ⟶ F), CategoryTheory.CategoryStruct.comp s e = CategoryTheory.CategoryStruct.id G → ∀ [Grothendieck.IsFlasqueSieves (F.comp (CategoryTheory.forget AddCommGrpCat))], Grothendieck.IsFlasqueSieves (G.comp (CategoryTheory.forget AddCommGrpCat))
-- FlasqueStability : produits, isomorphismes, et l'echelle cohomologique
@Grothendieck.isFlasqueSieves_of_iso : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {P Q : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} (e : P ≅ Q) [Grothendieck.IsFlasqueSieves P], Grothendieck.IsFlasqueSieves Q
@Grothendieck.isFlasqueSieves_pi : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {ι : Type (max u_2 u_1)} (P : ι → CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))) [∀ (i : ι), Grothendieck.IsFlasqueSieves (P i)], Grothendieck.IsFlasqueSieves (∏ᶜ P)
@Grothendieck.subsingleton_H_succ_of_flasque_of_injective : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C) (F : CategoryTheory.Sheaf J AddCommGrpCat) [CategoryTheory.Injective F] [inst_2 : CategoryTheory.HasSheafify J AddCommGrpCat] [inst_3 : CategoryTheory.HasExt (CategoryTheory.Sheaf J AddCommGrpCat)] [Grothendieck.IsFlasqueSieves (F.obj.comp (CategoryTheory.forget AddCommGrpCat))] {n : ℕ}, Subsingleton (F.H (n + 1))
-- Godement : la construction section par section, flasque par construction
@Grothendieck.godementSection : {X : TopCat} → TopCat.Presheaf AddCommGrpCat X → TopologicalSpace.Opens ↑X → Type u_1
@Grothendieck.godementObj : {X : TopCat} → TopCat.Presheaf AddCommGrpCat X → TopologicalSpace.Opens ↑X → AddCommGrpCat
@Grothendieck.godementMap : {X : TopCat} → (F : TopCat.Presheaf AddCommGrpCat X) → {V U : TopologicalSpace.Opens ↑X} → (V ⟶ U) → (Grothendieck.godementObj F U ⟶ Grothendieck.godementObj F V)
@Grothendieck.godementPresheaf : {X : TopCat} → TopCat.Presheaf AddCommGrpCat X → TopCat.Presheaf AddCommGrpCat X
@Grothendieck.godementExtend : {X : TopCat} → (F : TopCat.Presheaf AddCommGrpCat X) → {U V : TopologicalSpace.Opens ↑X} → Grothendieck.godementSection F U → Grothendieck.godementSection F V
@Grothendieck.toGodement : {X : TopCat} → (F : TopCat.Presheaf AddCommGrpCat X) → F ⟶ Grothendieck.godementPresheaf F
@Grothendieck.isFlasque_godementPresheaf : ∀ {X : TopCat} (F : TopCat.Presheaf AddCommGrpCat X), (Grothendieck.godementPresheaf F).IsFlasque
@Grothendieck.isSheaf_godementPresheaf : ∀ {X : TopCat} (F : TopCat.Presheaf AddCommGrpCat X), (Grothendieck.godementPresheaf F).IsSheaf
@Grothendieck.injective_toGodement_of_isSheaf : ∀ {X : TopCat} (F : TopCat.Presheaf AddCommGrpCat X), F.IsSheaf → ∀ (U : TopologicalSpace.Opens ↑X), Function.Injective ⇑(CategoryTheory.ConcreteCategory.hom ((Grothendieck.toGodement F).app (Opposite.op U)))
-- GodementFunctor : le plongement est fonctoriel et additif
@Grothendieck.godementHomApp : {X : TopCat} → {F G : TopCat.Presheaf AddCommGrpCat X} → (F ⟶ G) → (U : TopologicalSpace.Opens ↑X) → Grothendieck.godementSection F U → Grothendieck.godementSection G U
@Grothendieck.godementMapHom : {X : TopCat} → {F G : TopCat.Presheaf AddCommGrpCat X} → (F ⟶ G) → (Grothendieck.godementPresheaf F ⟶ Grothendieck.godementPresheaf G)
@Grothendieck.godementFunctor : {X : TopCat} → CategoryTheory.Functor (TopCat.Presheaf AddCommGrpCat X) (TopCat.Presheaf AddCommGrpCat X)
@Grothendieck.toGodementNatTrans : {X : TopCat} → CategoryTheory.Functor.id (TopCat.Presheaf AddCommGrpCat X) ⟶ Grothendieck.godementFunctor
@Grothendieck.godementMapHom_id : ∀ {X : TopCat} (F : TopCat.Presheaf AddCommGrpCat X), Grothendieck.godementMapHom (CategoryTheory.CategoryStruct.id F) = CategoryTheory.CategoryStruct.id (Grothendieck.godementPresheaf F)
@Grothendieck.godementMapHom_comp : ∀ {X : TopCat} {F G H : TopCat.Presheaf AddCommGrpCat X} (φ : F ⟶ G) (ψ : G ⟶ H), Grothendieck.godementMapHom (CategoryTheory.CategoryStruct.comp φ ψ) = CategoryTheory.CategoryStruct.comp (Grothendieck.godementMapHom φ) (Grothendieck.godementMapHom ψ)
@Grothendieck.toGodement_naturality : ∀ {X : TopCat} {F G : TopCat.Presheaf AddCommGrpCat X} (φ : F ⟶ G), CategoryTheory.CategoryStruct.comp (Grothendieck.toGodement F) (Grothendieck.godementMapHom φ) = CategoryTheory.CategoryStruct.comp φ (Grothendieck.toGodement G)
-- GodementMono : le foncteur preserve les monomorphismes
@Grothendieck.injective_app_of_mono : ∀ {X : TopCat} {F G : TopCat.Presheaf AddCommGrpCat X} (φ : F ⟶ G) [CategoryTheory.Mono φ] (U : TopologicalSpace.Opens ↑X), Function.Injective ⇑(CategoryTheory.ConcreteCategory.hom (φ.app (Opposite.op U)))
@Grothendieck.godementHomApp_injective : ∀ {X : TopCat} {F G : TopCat.Presheaf AddCommGrpCat X} (φ : F ⟶ G), (∀ (U : TopologicalSpace.Opens ↑X), Function.Injective ⇑(CategoryTheory.ConcreteCategory.hom (φ.app (Opposite.op U)))) → ∀ (U : TopologicalSpace.Opens ↑X), Function.Injective (Grothendieck.godementHomApp φ U)
@Grothendieck.godementMapHom_mono : ∀ {X : TopCat} {F G : TopCat.Presheaf AddCommGrpCat X} (φ : F ⟶ G) [CategoryTheory.Mono φ], CategoryTheory.Mono (Grothendieck.godementMapHom φ)
@Grothendieck.godementFunctor_preservesMonomorphisms : ∀ {X : TopCat}, Grothendieck.godementFunctor.PreservesMonomorphisms
--% env 16
Raw input {"cmd": "-- Faisceaux flasques et resolution de Godement : les declarations des\n-- huit modules Flasque*/Godement* du lake, noirs du scan de visibilite\n-- (#11703) -- voici leurs enonces. Les huit familles sont chargees dans\n-- la session par le preambule d'imports de la premiere cellule : cinq\n-- par l'umbrela `import Grothendieck`, trois explicitement (le REPL\n-- n'accepte les imports qu'en tout debut de session).\n\n-- Flasque : la definition par cribles, et ses premiers ponts\n#check @Grothendieck.IsFlasqueSieves\n#check @Grothendieck.isFlasqueSieves_iff\n#check @Grothendieck.nonempty_obj_of_isFlasqueSieves\n#check @Grothendieck.isSheaf_of_isFlasqueSieves_of_isSeparated\n#check @Grothendieck.isFlasqueSieves_const_of_subsingleton\n#check @Grothendieck.pushforward_isFlasque_bridge\n#check @Grothendieck.isFlasque_skyscraper_bridge\n\n-- FlasqueExact : l'acyclicite -- amalgamation sans obstruction\n#check @Grothendieck.exists_isAmalgamation_of_sieveTop\n#check @Grothendieck.exists_lift_of_isFlasqueSieves_of_mono\n#check @Grothendieck.epi_of_shortExact_of_isFlasqueSieves\n\n-- FlasqueQuotient : stabilite par quotient d'une suite exacte flasque-flasque\n#check @Grothendieck.isFlasque_of_isFlasqueSieves\n#check @Grothendieck.isFlasqueSieves_of_isFlasque_of_isSheaf\n#check @Grothendieck.isFlasqueSieves_of_shortExact_of_isFlasque\u2081\u2082\n\n-- FlasqueRetract : la classe est stable par retract (et donc par iso)\n#check @Grothendieck.isFlasqueSieves_of_retract\n#check @Grothendieck.isFlasqueSieves_of_retract'\n#check @Grothendieck.isFlasqueSieves_of_iso'\n#check @Grothendieck.isFlasqueSieves_of_retract_addCommGrp\n\n-- FlasqueStability : produits, isomorphismes, et l'echelle cohomologique\n#check @Grothendieck.isFlasqueSieves_of_iso\n#check @Grothendieck.isFlasqueSieves_pi\n#check @Grothendieck.subsingleton_H_succ_of_flasque_of_injective\n\n-- Godement : la construction section par section, flasque par construction\n#check @Grothendieck.godementSection\n#check @Grothendieck.godementObj\n#check @Grothendieck.godementMap\n#check @Grothendieck.godementPresheaf\n#check @Grothendieck.godementExtend\n#check @Grothendieck.toGodement\n#check @Grothendieck.isFlasque_godementPresheaf\n#check @Grothendieck.isSheaf_godementPresheaf\n#check @Grothendieck.injective_toGodement_of_isSheaf\n\n-- GodementFunctor : le plongement est fonctoriel et additif\n#check @Grothendieck.godementHomApp\n#check @Grothendieck.godementMapHom\n#check @Grothendieck.godementFunctor\n#check @Grothendieck.toGodementNatTrans\n#check @Grothendieck.godementMapHom_id\n#check @Grothendieck.godementMapHom_comp\n#check @Grothendieck.toGodement_naturality\n\n-- GodementMono : le foncteur preserve les monomorphismes\n#check @Grothendieck.injective_app_of_mono\n#check @Grothendieck.godementHomApp_injective\n#check @Grothendieck.godementMapHom_mono\n#check @Grothendieck.godementFunctor_preservesMonomorphisms", "env": 15}
Raw output {"messages": [{"severity": "info", "pos": {"line": 9, "column": 0}, "endPos": {"line": 9, "column": 6}, "data": "@Grothendieck.IsFlasqueSieves : {C : Type u_1} →\n [inst : CategoryTheory.Category.{u_2, u_1} C] → CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1)) → Prop"}, {"severity": "info", "pos": {"line": 10, "column": 0}, "endPos": {"line": 10, "column": 6}, "data": "@Grothendieck.isFlasqueSieves_iff : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))),\n Grothendieck.IsFlasqueSieves P ↔\n ∀ {X : C} (S : CategoryTheory.Sieve X) (x : CategoryTheory.Presieve.FamilyOfElements P S.arrows),\n x.Compatible → ∃ t, x.IsAmalgamation t"}, {"severity": "info", "pos": {"line": 11, "column": 0}, "endPos": {"line": 11, "column": 6}, "data": "@Grothendieck.nonempty_obj_of_isFlasqueSieves : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} [Grothendieck.IsFlasqueSieves P] (X : C),\n Nonempty (P.obj (Opposite.op X))"}, {"severity": "info", "pos": {"line": 12, "column": 0}, "endPos": {"line": 12, "column": 6}, "data": "@Grothendieck.isSheaf_of_isFlasqueSieves_of_isSeparated : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {J : CategoryTheory.GrothendieckTopology C} {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))}\n [Grothendieck.IsFlasqueSieves P], CategoryTheory.Presieve.IsSeparated J P → CategoryTheory.Presieve.IsSheaf J P"}, {"severity": "info", "pos": {"line": 13, "column": 0}, "endPos": {"line": 13, "column": 6}, "data": "@Grothendieck.isFlasqueSieves_const_of_subsingleton : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n (A : Type (max u_2 u_1)) [Subsingleton A] [Nonempty A],\n Grothendieck.IsFlasqueSieves ((CategoryTheory.Functor.const Cᵒᵖ).obj A)"}, {"severity": "info", "pos": {"line": 14, "column": 0}, "endPos": {"line": 14, "column": 6}, "data": "@Grothendieck.pushforward_isFlasque_bridge : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {X Y : TopCat} {F : TopCat.Presheaf C X} [F.IsFlasque] (f : X ⟶ Y),\n ((TopCat.Presheaf.pushforward C f).obj F).IsFlasque"}, {"severity": "info", "pos": {"line": 15, "column": 0}, "endPos": {"line": 15, "column": 6}, "data": "@Grothendieck.isFlasque_skyscraper_bridge : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {X : TopCat}\n (p₀ : ↑X) [inst_1 : (U : TopologicalSpace.Opens ↑X) → Decidable (p₀ ∈ U)] (A : C)\n [inst_2 : CategoryTheory.Limits.HasZeroObject C], (skyscraperSheaf p₀ A).IsFlasque"}, {"severity": "info", "pos": {"line": 18, "column": 0}, "endPos": {"line": 18, "column": 6}, "data": "@Grothendieck.exists_isAmalgamation_of_sieveTop : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} {A : C}\n (x : CategoryTheory.Presieve.FamilyOfElements P ⊤.arrows), x.Compatible → ∃ t, x.IsAmalgamation t"}, {"severity": "info", "pos": {"line": 19, "column": 0}, "endPos": {"line": 19, "column": 6}, "data": "@Grothendieck.exists_lift_of_isFlasqueSieves_of_mono : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} [Grothendieck.IsFlasqueSieves P] {A B : C} (f : B ⟶ A)\n [CategoryTheory.Mono f] (s : P.obj (Opposite.op B)), ∃ t, (CategoryTheory.ConcreteCategory.hom (P.map f.op)) t = s"}, {"severity": "info", "pos": {"line": 20, "column": 0}, "endPos": {"line": 20, "column": 6}, "data": "@Grothendieck.epi_of_shortExact_of_isFlasqueSieves : ∀ {X : TopCat}\n {S : CategoryTheory.ShortComplex (TopCat.Sheaf AddCommGrpCat X)},\n S.ShortExact →\n ∀ [Grothendieck.IsFlasqueSieves (S.X₁.obj.comp (CategoryTheory.forget AddCommGrpCat))]\n {U : TopologicalSpace.Opens ↑X}, CategoryTheory.Epi (S.g.hom.app (Opposite.op U))"}, {"severity": "info", "pos": {"line": 23, "column": 0}, "endPos": {"line": 23, "column": 6}, "data": "@Grothendieck.isFlasque_of_isFlasqueSieves : ∀ {X : TopCat} {P : TopCat.Presheaf (Type u_1) X}\n [Grothendieck.IsFlasqueSieves P], P.IsFlasque"}, {"severity": "info", "pos": {"line": 24, "column": 0}, "endPos": {"line": 24, "column": 6}, "data": "@Grothendieck.isFlasqueSieves_of_isFlasque_of_isSheaf : ∀ {X : TopCat} {P : TopCat.Presheaf (Type u_1) X},\n CategoryTheory.Presieve.IsSheaf (Opens.grothendieckTopology ↑X) P → P.IsFlasque → Grothendieck.IsFlasqueSieves P"}, {"severity": "info", "pos": {"line": 25, "column": 0}, "endPos": {"line": 25, "column": 6}, "data": "@Grothendieck.isFlasqueSieves_of_shortExact_of_isFlasque₁₂ : ∀ {X : TopCat}\n {S : CategoryTheory.ShortComplex (TopCat.Sheaf AddCommGrpCat X)},\n S.ShortExact →\n ∀ [Grothendieck.IsFlasqueSieves (S.X₁.obj.comp (CategoryTheory.forget AddCommGrpCat))]\n [Grothendieck.IsFlasqueSieves (S.X₂.obj.comp (CategoryTheory.forget AddCommGrpCat))],\n Grothendieck.IsFlasqueSieves (S.X₃.obj.comp (CategoryTheory.forget AddCommGrpCat))"}, {"severity": "info", "pos": {"line": 28, "column": 0}, "endPos": {"line": 28, "column": 6}, "data": "@Grothendieck.isFlasqueSieves_of_retract : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {P Q : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} (e : P ⟶ Q) (s : Q ⟶ P),\n CategoryTheory.CategoryStruct.comp s e = CategoryTheory.CategoryStruct.id Q →\n ∀ [Grothendieck.IsFlasqueSieves P], Grothendieck.IsFlasqueSieves Q"}, {"severity": "info", "pos": {"line": 29, "column": 0}, "endPos": {"line": 29, "column": 6}, "data": "@Grothendieck.isFlasqueSieves_of_retract' : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {P Q : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} (e : P ⟶ Q) (s : Q ⟶ P),\n CategoryTheory.CategoryStruct.comp e s = CategoryTheory.CategoryStruct.id P →\n ∀ [Grothendieck.IsFlasqueSieves Q], Grothendieck.IsFlasqueSieves P"}, {"severity": "info", "pos": {"line": 30, "column": 0}, "endPos": {"line": 30, "column": 6}, "data": "@Grothendieck.isFlasqueSieves_of_iso' : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {P Q : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} (e : P ≅ Q) [Grothendieck.IsFlasqueSieves P],\n Grothendieck.IsFlasqueSieves Q"}, {"severity": "info", "pos": {"line": 31, "column": 0}, "endPos": {"line": 31, "column": 6}, "data": "@Grothendieck.isFlasqueSieves_of_retract_addCommGrp : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {F G : CategoryTheory.Functor Cᵒᵖ AddCommGrpCat} (e : F ⟶ G) (s : G ⟶ F),\n CategoryTheory.CategoryStruct.comp s e = CategoryTheory.CategoryStruct.id G →\n ∀ [Grothendieck.IsFlasqueSieves (F.comp (CategoryTheory.forget AddCommGrpCat))],\n Grothendieck.IsFlasqueSieves (G.comp (CategoryTheory.forget AddCommGrpCat))"}, {"severity": "info", "pos": {"line": 34, "column": 0}, "endPos": {"line": 34, "column": 6}, "data": "@Grothendieck.isFlasqueSieves_of_iso : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {P Q : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} (e : P ≅ Q) [Grothendieck.IsFlasqueSieves P],\n Grothendieck.IsFlasqueSieves Q"}, {"severity": "info", "pos": {"line": 35, "column": 0}, "endPos": {"line": 35, "column": 6}, "data": "@Grothendieck.isFlasqueSieves_pi : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {ι : Type (max u_2 u_1)} (P : ι → CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1)))\n [∀ (i : ι), Grothendieck.IsFlasqueSieves (P i)], Grothendieck.IsFlasqueSieves (∏ᶜ P)"}, {"severity": "info", "pos": {"line": 36, "column": 0}, "endPos": {"line": 36, "column": 6}, "data": "@Grothendieck.subsingleton_H_succ_of_flasque_of_injective : ∀ {C : Type u_1}\n [inst : CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C)\n (F : CategoryTheory.Sheaf J AddCommGrpCat) [CategoryTheory.Injective F]\n [inst_2 : CategoryTheory.HasSheafify J AddCommGrpCat]\n [inst_3 : CategoryTheory.HasExt (CategoryTheory.Sheaf J AddCommGrpCat)]\n [Grothendieck.IsFlasqueSieves (F.obj.comp (CategoryTheory.forget AddCommGrpCat))] {n : ℕ}, Subsingleton (F.H (n + 1))"}, {"severity": "info", "pos": {"line": 39, "column": 0}, "endPos": {"line": 39, "column": 6}, "data": "@Grothendieck.godementSection : {X : TopCat} → TopCat.Presheaf AddCommGrpCat X → TopologicalSpace.Opens ↑X → Type u_1"}, {"severity": "info", "pos": {"line": 40, "column": 0}, "endPos": {"line": 40, "column": 6}, "data": "@Grothendieck.godementObj : {X : TopCat} → TopCat.Presheaf AddCommGrpCat X → TopologicalSpace.Opens ↑X → AddCommGrpCat"}, {"severity": "info", "pos": {"line": 41, "column": 0}, "endPos": {"line": 41, "column": 6}, "data": "@Grothendieck.godementMap : {X : TopCat} →\n (F : TopCat.Presheaf AddCommGrpCat X) →\n {V U : TopologicalSpace.Opens ↑X} → (V ⟶ U) → (Grothendieck.godementObj F U ⟶ Grothendieck.godementObj F V)"}, {"severity": "info", "pos": {"line": 42, "column": 0}, "endPos": {"line": 42, "column": 6}, "data": "@Grothendieck.godementPresheaf : {X : TopCat} → TopCat.Presheaf AddCommGrpCat X → TopCat.Presheaf AddCommGrpCat X"}, {"severity": "info", "pos": {"line": 43, "column": 0}, "endPos": {"line": 43, "column": 6}, "data": "@Grothendieck.godementExtend : {X : TopCat} →\n (F : TopCat.Presheaf AddCommGrpCat X) →\n {U V : TopologicalSpace.Opens ↑X} → Grothendieck.godementSection F U → Grothendieck.godementSection F V"}, {"severity": "info", "pos": {"line": 44, "column": 0}, "endPos": {"line": 44, "column": 6}, "data": "@Grothendieck.toGodement : {X : TopCat} → (F : TopCat.Presheaf AddCommGrpCat X) → F ⟶ Grothendieck.godementPresheaf F"}, {"severity": "info", "pos": {"line": 45, "column": 0}, "endPos": {"line": 45, "column": 6}, "data": "@Grothendieck.isFlasque_godementPresheaf : ∀ {X : TopCat} (F : TopCat.Presheaf AddCommGrpCat X),\n (Grothendieck.godementPresheaf F).IsFlasque"}, {"severity": "info", "pos": {"line": 46, "column": 0}, "endPos": {"line": 46, "column": 6}, "data": "@Grothendieck.isSheaf_godementPresheaf : ∀ {X : TopCat} (F : TopCat.Presheaf AddCommGrpCat X),\n (Grothendieck.godementPresheaf F).IsSheaf"}, {"severity": "info", "pos": {"line": 47, "column": 0}, "endPos": {"line": 47, "column": 6}, "data": "@Grothendieck.injective_toGodement_of_isSheaf : ∀ {X : TopCat} (F : TopCat.Presheaf AddCommGrpCat X),\n F.IsSheaf →\n ∀ (U : TopologicalSpace.Opens ↑X),\n Function.Injective ⇑(CategoryTheory.ConcreteCategory.hom ((Grothendieck.toGodement F).app (Opposite.op U)))"}, {"severity": "info", "pos": {"line": 50, "column": 0}, "endPos": {"line": 50, "column": 6}, "data": "@Grothendieck.godementHomApp : {X : TopCat} →\n {F G : TopCat.Presheaf AddCommGrpCat X} →\n (F ⟶ G) → (U : TopologicalSpace.Opens ↑X) → Grothendieck.godementSection F U → Grothendieck.godementSection G U"}, {"severity": "info", "pos": {"line": 51, "column": 0}, "endPos": {"line": 51, "column": 6}, "data": "@Grothendieck.godementMapHom : {X : TopCat} →\n {F G : TopCat.Presheaf AddCommGrpCat X} →\n (F ⟶ G) → (Grothendieck.godementPresheaf F ⟶ Grothendieck.godementPresheaf G)"}, {"severity": "info", "pos": {"line": 52, "column": 0}, "endPos": {"line": 52, "column": 6}, "data": "@Grothendieck.godementFunctor : {X : TopCat} →\n CategoryTheory.Functor (TopCat.Presheaf AddCommGrpCat X) (TopCat.Presheaf AddCommGrpCat X)"}, {"severity": "info", "pos": {"line": 53, "column": 0}, "endPos": {"line": 53, "column": 6}, "data": "@Grothendieck.toGodementNatTrans : {X : TopCat} →\n CategoryTheory.Functor.id (TopCat.Presheaf AddCommGrpCat X) ⟶ Grothendieck.godementFunctor"}, {"severity": "info", "pos": {"line": 54, "column": 0}, "endPos": {"line": 54, "column": 6}, "data": "@Grothendieck.godementMapHom_id : ∀ {X : TopCat} (F : TopCat.Presheaf AddCommGrpCat X),\n Grothendieck.godementMapHom (CategoryTheory.CategoryStruct.id F) =\n CategoryTheory.CategoryStruct.id (Grothendieck.godementPresheaf F)"}, {"severity": "info", "pos": {"line": 55, "column": 0}, "endPos": {"line": 55, "column": 6}, "data": "@Grothendieck.godementMapHom_comp : ∀ {X : TopCat} {F G H : TopCat.Presheaf AddCommGrpCat X} (φ : F ⟶ G) (ψ : G ⟶ H),\n Grothendieck.godementMapHom (CategoryTheory.CategoryStruct.comp φ ψ) =\n CategoryTheory.CategoryStruct.comp (Grothendieck.godementMapHom φ) (Grothendieck.godementMapHom ψ)"}, {"severity": "info", "pos": {"line": 56, "column": 0}, "endPos": {"line": 56, "column": 6}, "data": "@Grothendieck.toGodement_naturality : ∀ {X : TopCat} {F G : TopCat.Presheaf AddCommGrpCat X} (φ : F ⟶ G),\n CategoryTheory.CategoryStruct.comp (Grothendieck.toGodement F) (Grothendieck.godementMapHom φ) =\n CategoryTheory.CategoryStruct.comp φ (Grothendieck.toGodement G)"}, {"severity": "info", "pos": {"line": 59, "column": 0}, "endPos": {"line": 59, "column": 6}, "data": "@Grothendieck.injective_app_of_mono : ∀ {X : TopCat} {F G : TopCat.Presheaf AddCommGrpCat X} (φ : F ⟶ G)\n [CategoryTheory.Mono φ] (U : TopologicalSpace.Opens ↑X),\n Function.Injective ⇑(CategoryTheory.ConcreteCategory.hom (φ.app (Opposite.op U)))"}, {"severity": "info", "pos": {"line": 60, "column": 0}, "endPos": {"line": 60, "column": 6}, "data": "@Grothendieck.godementHomApp_injective : ∀ {X : TopCat} {F G : TopCat.Presheaf AddCommGrpCat X} (φ : F ⟶ G),\n (∀ (U : TopologicalSpace.Opens ↑X),\n Function.Injective ⇑(CategoryTheory.ConcreteCategory.hom (φ.app (Opposite.op U)))) →\n ∀ (U : TopologicalSpace.Opens ↑X), Function.Injective (Grothendieck.godementHomApp φ U)"}, {"severity": "info", "pos": {"line": 61, "column": 0}, "endPos": {"line": 61, "column": 6}, "data": "@Grothendieck.godementMapHom_mono : ∀ {X : TopCat} {F G : TopCat.Presheaf AddCommGrpCat X} (φ : F ⟶ G)\n [CategoryTheory.Mono φ], CategoryTheory.Mono (Grothendieck.godementMapHom φ)"}, {"severity": "info", "pos": {"line": 62, "column": 0}, "endPos": {"line": 62, "column": 6}, "data": "@Grothendieck.godementFunctor_preservesMonomorphisms : ∀ {X : TopCat},\n Grothendieck.godementFunctor.PreservesMonomorphisms"}], "env": 16}

Lecture de la sortie

Le premier groupe fixe la définition : IsFlasqueSieves est une classe de propositions sur un préfaisceau de cribles — toute section sur un crible s’amalgame sur le crible maximal — et isFlasqueSieves_iff en donne la caractérisation. Les deux « ponts » relient cette définition générale aux notions déjà visibles du compagnon : pushforward_isFlasque_bridge (l’image directe d’un flasque reste flasque) et isFlasque_skyscraper_bridge (le gratte-ciel de l’annexe précédente est flasque — il vit au-dessus d’un point, rien ne peut l’y gêner).

Le groupe exactitude est le théorème qui justifie l’investissement : exists_isAmalgamation_of_sieveTop dit que l’amalgamation sur le crible maximal existe toujours — l’obstruction au recollement est littéralement nulle — et epi_of_shortExact_of_isFlasqueSieves en conclut que dans une suite exacte courte 0 → F' → F → F'' → 0 de faisceaux abélians où F' est flasque, la flèche sur les sections globales est épique : le foncteur Γ préserve l’exactitude. C’est l’acyclicité. subsingleton_H_succ_of_flasque_of_injective en est l’échelle cohomologique : au-delà du degré 0, les groupes d’extension d’un flasque s’effondrent.

Les groupes stabilité sont la plomberie catégorie-théorique : la classe flasque passe aux quotients (FlasqueQuotient), aux rétracts (FlasqueRetract — un rétract d’un flasque est flasque, donc un isomorphe aussi) et aux produits (isFlasqueSieves_pi).

Les trois groupes Godement construisent la résolution : godementSection envoie un ouvert U sur la somme des germes au-dessus de ses points — assez de places pour étendre n’importe quelle section — et isFlasque_godementPresheaf prouve que le préfaisceau obtenu est flasque par construction : c’est le cœur du théorème II de Godement. toGodement plonge le faisceau de départ dans le sien (injective_toGodement_of_isSheaf), le plongement est fonctoriel et additif (GodementFunctor : godementMapHom_add-compatible via godementMapHom_id/comp, naturel via toGodement_naturality), et godementFunctor_preservesMonomorphisms garantit que la résolution s’itère sans perdre l’injectivité. La cohomologie des faisceaux — section 7 du compagnon — a ici sa résolution canonique.

Annexe — Sites, topologies et comparaisons (#11703)

Les huit derniers modules noirs du scan de visibilité forment un bloc cohérent : la hiérarchie des topologies sur les schémas (Zariski, étale, fppf), le classifieur de sous-objets Ω du topos, la condition de faisceau vue par égaliseurs et son invariance, les faisceaux pour une infinité de topologies, et le comparaison des sites par image directe continue. Cette annexe les rend visibles dans le fil du compagnon — après celle des faisceaux flasques, le lake n’a plus de module noir.

Le récit mathématique. Une topologie de Grothendieck se raffine : le Zariski voit les ouverts, l’étale voit les revêtements étales, le fppf (« fidèlement plat de présentation finie ») les voit tous — chacune contenant la précédente, à la fois comme propriétés de morphismes, comme prétopologies et comme topologies engendrées. Sur n’importe quel site, l’égaliseur de la condition de faisceau se caractérise par le couple séparé + compatible, passe aux quotients par équivalence naturelle, et se lit sur les cribles engendrés ; la faisceauté se propage aux bornes supérieures et inférieures de topologies. Le classifieur Ω — le préfaisceau des cribles, dont les valeurs caractéristiques distinguent les sous-objets — referme le chapitre topos. Et entre deux sites, l’image directe continue devient un foncteur qui respecte composition et identités, adjoint au changement de base : c’est la machinerie qui permet de comparer les faisceaux d’un site à l’autre.

-- Sites, topologies et comparaisons : les declarations des huit derniers
-- modules noirs du lake (#11703) -- tous charges par le preambule
-- d'imports de la premiere cellule.

-- Classifier : le classifieur de sous-objets, Omega = le prefaisceau des cribles
#check @Grothendieck.Classifier.truth_picks_top
#check @Grothendieck.Classifier.chi_app_mem_iff
#check @Grothendieck.Classifier.chi_app_downward_closed
#check @Grothendieck.Classifier.chi_app_eq_top_of_app

-- CoversEtaleArrow : la topologie etale sur les schemas, vue par fleches
#check @Grothendieck.CoversEtaleArrow.etale_topology_eq_pretopology
#check @Grothendieck.CoversEtaleArrow.covers_iff_etale
#check @Grothendieck.CoversEtaleArrow.covers_etale_of_cover
#check @Grothendieck.CoversEtaleArrow.zariski_covers_etale
#check @Grothendieck.CoversEtaleArrow.covers_etale_of_mem
#check @Grothendieck.CoversEtaleArrow.covers_etale_precomp
#check @Grothendieck.CoversEtaleArrow.covers_etale_id
#check @Grothendieck.CoversEtaleArrow.covers_etale_top

-- Fppf : la topologie fppf et la chaine Zariski <= etale <= fppf
#check @Grothendieck.Fppf.fppfProperty
#check @Grothendieck.Fppf.fppfPrecoverage_eq_precoverage_fppfProperty
#check @Grothendieck.Fppf.fppfPretopology
#check @Grothendieck.Fppf.fppfTopology_eq_grothendieckTopology
#check @Grothendieck.Fppf.fppfTopology_eq_toGrothendieck_fppfPretopology
#check @Grothendieck.Fppf.etale_le_fppfProperty
#check @Grothendieck.Fppf.etalePrecoverage_le_fppfPrecoverage
#check @Grothendieck.Fppf.etaleTopology_le_fppfTopology
#check @Grothendieck.Fppf.zariskiTopology_le_fppfTopology

-- LocalSurjectivitySpectrum : la surjectivite locale a travers les bornes
#check @Grothendieck.isLocallySurjective_top
#check @Grothendieck.isLocallySurjective_sup
#check @Grothendieck.isLocallySurjective_iSup
#check @Grothendieck.isLocallySurjective_bot_iff

-- SheafConditionCharacterization : la condition de faisceau par egaliseurs
#check @Grothendieck.equalizer_sheaf_condition_mono
#check @Grothendieck.equalizer_sheaf_condition_iff_separated_compatible

-- SheafConditionInvariance : invariance de la condition par equivalence
#check @Grothendieck.equalizer_sheaf_condition_iff_of_nat_equiv
#check @Grothendieck.equalizer_arrows_iff_sieve_generate

-- SheafTopologySpectrum : faisceaux et bornes de topologies
#check @Grothendieck.isSheaf_const_unit
#check @Grothendieck.isSheaf_inf
#check @Grothendieck.isSheaf_iInf

-- SitesComparison : l'image directe continue, foncteur et adjonction
#check @Grothendieck.sheafPushforwardContinuous_comp_sheafToPresheaf
#check @Grothendieck.sheafPushforwardContinuous_id
#check @Grothendieck.sheafPushforwardContinuous_comp
#check @Grothendieck.adjunction_sheafPushforwardContinuous
-- Sites, topologies et comparaisons : les declarations des huit derniers
-- modules noirs du lake (#11703) -- tous charges par le preambule
-- d'imports de la premiere cellule.
-- Classifier : le classifieur de sous-objets, Omega = le prefaisceau des cribles
@Grothendieck.Classifier.truth_picks_top : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (X : Cᵒᵖ) (b : ((CategoryTheory.Functor.const Cᵒᵖ).obj PUnit.{(max u_1 u_2) + 1}).obj X), (CategoryTheory.ConcreteCategory.hom ((CategoryTheory.Presheaf.truth C).app X)) b = ⊤
@Grothendieck.Classifier.chi_app_mem_iff : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {F G : CategoryTheory.Functor Cᵒᵖ (Type (max u_1 u_2))} (m : F ⟶ G) (X : Cᵒᵖ) (x : G.obj X) {Y : C} (f : Y ⟶ Opposite.unop X), ((CategoryTheory.ConcreteCategory.hom ((CategoryTheory.Presheaf.χ m).app X)) x).arrows f ↔ ∃ a, (CategoryTheory.ConcreteCategory.hom (G.map f.op)) x = (CategoryTheory.ConcreteCategory.hom (m.app (Opposite.op Y))) a
@Grothendieck.Classifier.chi_app_downward_closed : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {F G : CategoryTheory.Functor Cᵒᵖ (Type (max u_1 u_2))} (m : F ⟶ G) (X : Cᵒᵖ) (x : G.obj X) {Y Z : C} (f : Y ⟶ Opposite.unop X) (g : Z ⟶ Y), ((CategoryTheory.ConcreteCategory.hom ((CategoryTheory.Presheaf.χ m).app X)) x).arrows f → ((CategoryTheory.ConcreteCategory.hom ((CategoryTheory.Presheaf.χ m).app X)) x).arrows (CategoryTheory.CategoryStruct.comp g f)
@Grothendieck.Classifier.chi_app_eq_top_of_app : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {F G : CategoryTheory.Functor Cᵒᵖ (Type (max u_1 u_2))} (m : F ⟶ G) (X : Cᵒᵖ) (x : G.obj X) (a : F.obj X), (CategoryTheory.ConcreteCategory.hom (m.app X)) a = x → (CategoryTheory.ConcreteCategory.hom ((CategoryTheory.Presheaf.χ m).app X)) x = ⊤
-- CoversEtaleArrow : la topologie etale sur les schemas, vue par fleches
Grothendieck.CoversEtaleArrow.etale_topology_eq_pretopology : AlgebraicGeometry.Scheme.etaleTopology = AlgebraicGeometry.Scheme.etalePretopology.toGrothendieck
@Grothendieck.CoversEtaleArrow.covers_iff_etale : ∀ {X Y : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X) (f : Y ⟶ X), AlgebraicGeometry.Scheme.etaleTopology.Covers S f ↔ ∃ 𝒰, CategoryTheory.Presieve.ofArrows 𝒰.X 𝒰.f ≤ (CategoryTheory.Sieve.pullback f S).arrows
@Grothendieck.CoversEtaleArrow.covers_etale_of_cover : ∀ {X Y : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) (𝒰 : AlgebraicGeometry.Scheme.Cover AlgebraicGeometry.Scheme.etalePrecoverage Y), CategoryTheory.Presieve.ofArrows 𝒰.X 𝒰.f ≤ (CategoryTheory.Sieve.pullback f S).arrows → AlgebraicGeometry.Scheme.etaleTopology.Covers S f
@Grothendieck.CoversEtaleArrow.zariski_covers_etale : ∀ {X Y : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X) (f : Y ⟶ X), AlgebraicGeometry.Scheme.zariskiTopology.Covers S f → AlgebraicGeometry.Scheme.etaleTopology.Covers S f
@Grothendieck.CoversEtaleArrow.covers_etale_of_mem : ∀ {X Y : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X) {f : Y ⟶ X}, S.arrows f → AlgebraicGeometry.Scheme.etaleTopology.Covers S f
@Grothendieck.CoversEtaleArrow.covers_etale_precomp : ∀ {X Y Z : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X) (f : Y ⟶ X) (g : Z ⟶ Y), AlgebraicGeometry.Scheme.etaleTopology.Covers S f → AlgebraicGeometry.Scheme.etaleTopology.Covers S (CategoryTheory.CategoryStruct.comp g f)
@Grothendieck.CoversEtaleArrow.covers_etale_id : ∀ {X : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X), AlgebraicGeometry.Scheme.etaleTopology.Covers S (CategoryTheory.CategoryStruct.id X) ↔ S ∈ AlgebraicGeometry.Scheme.etaleTopology X
@Grothendieck.CoversEtaleArrow.covers_etale_top : ∀ {X Y : AlgebraicGeometry.Scheme} (f : Y ⟶ X), AlgebraicGeometry.Scheme.etaleTopology.Covers ⊤ f
-- Fppf : la topologie fppf et la chaine Zariski <= etale <= fppf
Grothendieck.Fppf.fppfProperty : CategoryTheory.MorphismProperty AlgebraicGeometry.Scheme
Grothendieck.Fppf.fppfPrecoverage_eq_precoverage_fppfProperty : AlgebraicGeometry.Scheme.fppfPrecoverage = AlgebraicGeometry.Scheme.precoverage Grothendieck.Fppf.fppfProperty
Grothendieck.Fppf.fppfPretopology : CategoryTheory.Pretopology AlgebraicGeometry.Scheme
Grothendieck.Fppf.fppfTopology_eq_grothendieckTopology : AlgebraicGeometry.Scheme.fppfTopology = AlgebraicGeometry.Scheme.grothendieckTopology Grothendieck.Fppf.fppfProperty
Grothendieck.Fppf.fppfTopology_eq_toGrothendieck_fppfPretopology : AlgebraicGeometry.Scheme.fppfTopology = Grothendieck.Fppf.fppfPretopology.toGrothendieck
Grothendieck.Fppf.etale_le_fppfProperty : @AlgebraicGeometry.Etale ≤ Grothendieck.Fppf.fppfProperty
Grothendieck.Fppf.etalePrecoverage_le_fppfPrecoverage : AlgebraicGeometry.Scheme.etalePrecoverage ≤ AlgebraicGeometry.Scheme.fppfPrecoverage
Grothendieck.Fppf.etaleTopology_le_fppfTopology : AlgebraicGeometry.Scheme.etaleTopology ≤ AlgebraicGeometry.Scheme.fppfTopology
Grothendieck.Fppf.zariskiTopology_le_fppfTopology : AlgebraicGeometry.Scheme.zariskiTopology ≤ AlgebraicGeometry.Scheme.fppfTopology
-- LocalSurjectivitySpectrum : la surjectivite locale a travers les bornes
@Grothendieck.isLocallySurjective_top : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {F G : CategoryTheory.Functor Cᵒᵖ (Type u_3)} (f : F ⟶ G), CategoryTheory.Presheaf.IsLocallySurjective ⊤ f
@Grothendieck.isLocallySurjective_sup : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {F G : CategoryTheory.Functor Cᵒᵖ (Type u_3)} (f : F ⟶ G) {J₁ J₂ : CategoryTheory.GrothendieckTopology C}, CategoryTheory.Presheaf.IsLocallySurjective J₁ f → CategoryTheory.Presheaf.IsLocallySurjective (J₁ ⊔ J₂) f
@Grothendieck.isLocallySurjective_iSup : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {F G : CategoryTheory.Functor Cᵒᵖ (Type u_3)} (f : F ⟶ G) {ι : Type u_4} {J : ι → CategoryTheory.GrothendieckTopology C}, (∃ i, CategoryTheory.Presheaf.IsLocallySurjective (J i) f) → CategoryTheory.Presheaf.IsLocallySurjective (⨆ i, J i) f
@Grothendieck.isLocallySurjective_bot_iff : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {F G : CategoryTheory.Functor Cᵒᵖ (Type u_3)} (f : F ⟶ G), CategoryTheory.Presheaf.IsLocallySurjective ⊥ f ↔ ∀ (U : Cᵒᵖ), Function.Surjective ⇑(CategoryTheory.ConcreteCategory.hom (f.app U))
-- SheafConditionCharacterization : la condition de faisceau par egaliseurs
@Grothendieck.equalizer_sheaf_condition_mono : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))) {J₁ J₂ : CategoryTheory.GrothendieckTopology C}, J₁ ≤ J₂ → (∀ ⦃X : C⦄, ∀ S ∈ J₂ X, Nonempty (CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P S.arrows) ⋯))) → ∀ ⦃X : C⦄, ∀ S ∈ J₁ X, Nonempty (CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P S.arrows) ⋯))
@Grothendieck.equalizer_sheaf_condition_iff_separated_compatible : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C) (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))), (∀ ⦃X : C⦄, ∀ S ∈ J X, Nonempty (CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P S.arrows) ⋯))) ↔ CategoryTheory.Presieve.IsSeparated J P ∧ ∀ ⦃X : C⦄, ∀ S ∈ J X, ∀ (x : CategoryTheory.Presieve.FamilyOfElements P S.arrows), x.Compatible → ∃ t, x.IsAmalgamation t
-- SheafConditionInvariance : invariance de la condition par equivalence
@Grothendieck.equalizer_sheaf_condition_iff_of_nat_equiv : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C) {P₁ P₂ : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))} (e : ⦃X : C⦄ → P₁.obj (Opposite.op X) ≃ P₂.obj (Opposite.op X)), (∀ ⦃X Y : C⦄ (f : X ⟶ Y) (x : P₁.obj (Opposite.op Y)), e ((CategoryTheory.ConcreteCategory.hom (P₁.map f.op)) x) = (CategoryTheory.ConcreteCategory.hom (P₂.map f.op)) (e x)) → ((∀ ⦃X : C⦄, ∀ S ∈ J X, Nonempty (CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P₁ S.arrows) ⋯))) ↔ ∀ ⦃X : C⦄, ∀ S ∈ J X, Nonempty (CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P₂ S.arrows) ⋯)))
@Grothendieck.equalizer_arrows_iff_sieve_generate : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))) [inst_1 : CategoryTheory.Limits.HasPullbacks C] {B : C} {I : Type (max u_2 u_1)} (X : I → C) (π : (i : I) → X i ⟶ B), Nonempty (CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.Presieve.Arrows.forkMap P X π) ⋯)) ↔ Nonempty (CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P (CategoryTheory.Sieve.generate (CategoryTheory.Presieve.ofArrows X π)).arrows) ⋯))
-- SheafTopologySpectrum : faisceaux et bornes de topologies
@Grothendieck.isSheaf_const_unit : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C), CategoryTheory.Presieve.IsSheaf J ((CategoryTheory.Functor.const Cᵒᵖ).obj PUnit.{(max u_2 u_1) + 1})
@Grothendieck.isSheaf_inf : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {J₁ J₂ : CategoryTheory.GrothendieckTopology C} {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))}, CategoryTheory.Presieve.IsSheaf J₁ P → CategoryTheory.Presieve.IsSheaf J₂ P → CategoryTheory.Presieve.IsSheaf (J₁ ⊓ J₂) P
@Grothendieck.isSheaf_iInf : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {ι : Type u_3} [Nonempty ι] {J : ι → CategoryTheory.GrothendieckTopology C} {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))}, (∀ (i : ι), CategoryTheory.Presieve.IsSheaf (J i) P) → CategoryTheory.Presieve.IsSheaf (⨅ i, J i) P
-- SitesComparison : l'image directe continue, foncteur et adjonction
@Grothendieck.sheafPushforwardContinuous_comp_sheafToPresheaf : {C : Type u_1} → {D : Type u_2} → [inst : CategoryTheory.Category.{u_4, u_1} C] → [inst_1 : CategoryTheory.Category.{u_5, u_2} D] → {A : Type u_3} → [inst_2 : CategoryTheory.Category.{u_6, u_3} A] → (F : CategoryTheory.Functor C D) → (J : CategoryTheory.GrothendieckTopology C) → (K : CategoryTheory.GrothendieckTopology D) → [inst_3 : F.IsContinuous J K] → (F.sheafPushforwardContinuous A J K).comp (CategoryTheory.sheafToPresheaf J A) ≅ (CategoryTheory.sheafToPresheaf K A).comp ((CategoryTheory.Functor.whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj F.op)
@Grothendieck.sheafPushforwardContinuous_id : {C : Type u_1} → [inst : CategoryTheory.Category.{u_3, u_1} C] → {A : Type u_2} → [inst_1 : CategoryTheory.Category.{u_4, u_2} A] → (J : CategoryTheory.GrothendieckTopology C) → (CategoryTheory.Functor.id C).sheafPushforwardContinuous A J J ≅ CategoryTheory.Functor.id (CategoryTheory.Sheaf J A)
@Grothendieck.sheafPushforwardContinuous_comp : {C : Type u_1} → {D : Type u_2} → {E : Type u_3} → [inst : CategoryTheory.Category.{u_5, u_1} C] → [inst_1 : CategoryTheory.Category.{u_6, u_2} D] → [inst_2 : CategoryTheory.Category.{u_7, u_3} E] → {A : Type u_4} → [inst_3 : CategoryTheory.Category.{u_8, u_4} A] → (F : CategoryTheory.Functor C D) → (G : CategoryTheory.Functor D E) → (J : CategoryTheory.GrothendieckTopology C) → (K : CategoryTheory.GrothendieckTopology D) → (L : CategoryTheory.GrothendieckTopology E) → [inst_4 : F.IsContinuous J K] → [inst_5 : G.IsContinuous K L] → (G.sheafPushforwardContinuous A K L).comp (F.sheafPushforwardContinuous A J K) ≅ (F.comp G).sheafPushforwardContinuous A J L
@Grothendieck.adjunction_sheafPushforwardContinuous : {C : Type u_1} → {D : Type u_2} → [inst : CategoryTheory.Category.{u_4, u_1} C] → [inst_1 : CategoryTheory.Category.{u_5, u_2} D] → {A : Type u_3} → [inst_2 : CategoryTheory.Category.{u_6, u_3} A] → {F : CategoryTheory.Functor C D} → {G : CategoryTheory.Functor D C} → (F ⊣ G) → (J : CategoryTheory.GrothendieckTopology C) → (K : CategoryTheory.GrothendieckTopology D) → [inst_3 : F.IsContinuous J K] → [inst_4 : G.IsContinuous K J] → F.sheafPushforwardContinuous A J K ⊣ G.sheafPushforwardContinuous A K J
--% env 17
Raw input {"cmd": "-- Sites, topologies et comparaisons : les declarations des huit derniers\n-- modules noirs du lake (#11703) -- tous charges par le preambule\n-- d'imports de la premiere cellule.\n\n-- Classifier : le classifieur de sous-objets, Omega = le prefaisceau des cribles\n#check @Grothendieck.Classifier.truth_picks_top\n#check @Grothendieck.Classifier.chi_app_mem_iff\n#check @Grothendieck.Classifier.chi_app_downward_closed\n#check @Grothendieck.Classifier.chi_app_eq_top_of_app\n\n-- CoversEtaleArrow : la topologie etale sur les schemas, vue par fleches\n#check @Grothendieck.CoversEtaleArrow.etale_topology_eq_pretopology\n#check @Grothendieck.CoversEtaleArrow.covers_iff_etale\n#check @Grothendieck.CoversEtaleArrow.covers_etale_of_cover\n#check @Grothendieck.CoversEtaleArrow.zariski_covers_etale\n#check @Grothendieck.CoversEtaleArrow.covers_etale_of_mem\n#check @Grothendieck.CoversEtaleArrow.covers_etale_precomp\n#check @Grothendieck.CoversEtaleArrow.covers_etale_id\n#check @Grothendieck.CoversEtaleArrow.covers_etale_top\n\n-- Fppf : la topologie fppf et la chaine Zariski <= etale <= fppf\n#check @Grothendieck.Fppf.fppfProperty\n#check @Grothendieck.Fppf.fppfPrecoverage_eq_precoverage_fppfProperty\n#check @Grothendieck.Fppf.fppfPretopology\n#check @Grothendieck.Fppf.fppfTopology_eq_grothendieckTopology\n#check @Grothendieck.Fppf.fppfTopology_eq_toGrothendieck_fppfPretopology\n#check @Grothendieck.Fppf.etale_le_fppfProperty\n#check @Grothendieck.Fppf.etalePrecoverage_le_fppfPrecoverage\n#check @Grothendieck.Fppf.etaleTopology_le_fppfTopology\n#check @Grothendieck.Fppf.zariskiTopology_le_fppfTopology\n\n-- LocalSurjectivitySpectrum : la surjectivite locale a travers les bornes\n#check @Grothendieck.isLocallySurjective_top\n#check @Grothendieck.isLocallySurjective_sup\n#check @Grothendieck.isLocallySurjective_iSup\n#check @Grothendieck.isLocallySurjective_bot_iff\n\n-- SheafConditionCharacterization : la condition de faisceau par egaliseurs\n#check @Grothendieck.equalizer_sheaf_condition_mono\n#check @Grothendieck.equalizer_sheaf_condition_iff_separated_compatible\n\n-- SheafConditionInvariance : invariance de la condition par equivalence\n#check @Grothendieck.equalizer_sheaf_condition_iff_of_nat_equiv\n#check @Grothendieck.equalizer_arrows_iff_sieve_generate\n\n-- SheafTopologySpectrum : faisceaux et bornes de topologies\n#check @Grothendieck.isSheaf_const_unit\n#check @Grothendieck.isSheaf_inf\n#check @Grothendieck.isSheaf_iInf\n\n-- SitesComparison : l'image directe continue, foncteur et adjonction\n#check @Grothendieck.sheafPushforwardContinuous_comp_sheafToPresheaf\n#check @Grothendieck.sheafPushforwardContinuous_id\n#check @Grothendieck.sheafPushforwardContinuous_comp\n#check @Grothendieck.adjunction_sheafPushforwardContinuous", "env": 16}
Raw output {"messages": [{"severity": "info", "pos": {"line": 6, "column": 0}, "endPos": {"line": 6, "column": 6}, "data": "@Grothendieck.Classifier.truth_picks_top : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] (X : Cᵒᵖ)\n (b : ((CategoryTheory.Functor.const Cᵒᵖ).obj PUnit.{(max u_1 u_2) + 1}).obj X),\n (CategoryTheory.ConcreteCategory.hom ((CategoryTheory.Presheaf.truth C).app X)) b = ⊤"}, {"severity": "info", "pos": {"line": 7, "column": 0}, "endPos": {"line": 7, "column": 6}, "data": "@Grothendieck.Classifier.chi_app_mem_iff : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {F G : CategoryTheory.Functor Cᵒᵖ (Type (max u_1 u_2))} (m : F ⟶ G) (X : Cᵒᵖ) (x : G.obj X) {Y : C}\n (f : Y ⟶ Opposite.unop X),\n ((CategoryTheory.ConcreteCategory.hom ((CategoryTheory.Presheaf.χ m).app X)) x).arrows f ↔\n ∃ a,\n (CategoryTheory.ConcreteCategory.hom (G.map f.op)) x =\n (CategoryTheory.ConcreteCategory.hom (m.app (Opposite.op Y))) a"}, {"severity": "info", "pos": {"line": 8, "column": 0}, "endPos": {"line": 8, "column": 6}, "data": "@Grothendieck.Classifier.chi_app_downward_closed : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {F G : CategoryTheory.Functor Cᵒᵖ (Type (max u_1 u_2))} (m : F ⟶ G) (X : Cᵒᵖ) (x : G.obj X) {Y Z : C}\n (f : Y ⟶ Opposite.unop X) (g : Z ⟶ Y),\n ((CategoryTheory.ConcreteCategory.hom ((CategoryTheory.Presheaf.χ m).app X)) x).arrows f →\n ((CategoryTheory.ConcreteCategory.hom ((CategoryTheory.Presheaf.χ m).app X)) x).arrows\n (CategoryTheory.CategoryStruct.comp g f)"}, {"severity": "info", "pos": {"line": 9, "column": 0}, "endPos": {"line": 9, "column": 6}, "data": "@Grothendieck.Classifier.chi_app_eq_top_of_app : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {F G : CategoryTheory.Functor Cᵒᵖ (Type (max u_1 u_2))} (m : F ⟶ G) (X : Cᵒᵖ) (x : G.obj X) (a : F.obj X),\n (CategoryTheory.ConcreteCategory.hom (m.app X)) a = x →\n (CategoryTheory.ConcreteCategory.hom ((CategoryTheory.Presheaf.χ m).app X)) x = ⊤"}, {"severity": "info", "pos": {"line": 12, "column": 0}, "endPos": {"line": 12, "column": 6}, "data": "Grothendieck.CoversEtaleArrow.etale_topology_eq_pretopology : AlgebraicGeometry.Scheme.etaleTopology =\n AlgebraicGeometry.Scheme.etalePretopology.toGrothendieck"}, {"severity": "info", "pos": {"line": 13, "column": 0}, "endPos": {"line": 13, "column": 6}, "data": "@Grothendieck.CoversEtaleArrow.covers_iff_etale : ∀ {X Y : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X)\n (f : Y ⟶ X),\n AlgebraicGeometry.Scheme.etaleTopology.Covers S f ↔\n ∃ 𝒰, CategoryTheory.Presieve.ofArrows 𝒰.X 𝒰.f ≤ (CategoryTheory.Sieve.pullback f S).arrows"}, {"severity": "info", "pos": {"line": 14, "column": 0}, "endPos": {"line": 14, "column": 6}, "data": "@Grothendieck.CoversEtaleArrow.covers_etale_of_cover : ∀ {X Y : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X)\n (f : Y ⟶ X) (𝒰 : AlgebraicGeometry.Scheme.Cover AlgebraicGeometry.Scheme.etalePrecoverage Y),\n CategoryTheory.Presieve.ofArrows 𝒰.X 𝒰.f ≤ (CategoryTheory.Sieve.pullback f S).arrows →\n AlgebraicGeometry.Scheme.etaleTopology.Covers S f"}, {"severity": "info", "pos": {"line": 15, "column": 0}, "endPos": {"line": 15, "column": 6}, "data": "@Grothendieck.CoversEtaleArrow.zariski_covers_etale : ∀ {X Y : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X)\n (f : Y ⟶ X), AlgebraicGeometry.Scheme.zariskiTopology.Covers S f → AlgebraicGeometry.Scheme.etaleTopology.Covers S f"}, {"severity": "info", "pos": {"line": 16, "column": 0}, "endPos": {"line": 16, "column": 6}, "data": "@Grothendieck.CoversEtaleArrow.covers_etale_of_mem : ∀ {X Y : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X)\n {f : Y ⟶ X}, S.arrows f → AlgebraicGeometry.Scheme.etaleTopology.Covers S f"}, {"severity": "info", "pos": {"line": 17, "column": 0}, "endPos": {"line": 17, "column": 6}, "data": "@Grothendieck.CoversEtaleArrow.covers_etale_precomp : ∀ {X Y Z : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X)\n (f : Y ⟶ X) (g : Z ⟶ Y),\n AlgebraicGeometry.Scheme.etaleTopology.Covers S f →\n AlgebraicGeometry.Scheme.etaleTopology.Covers S (CategoryTheory.CategoryStruct.comp g f)"}, {"severity": "info", "pos": {"line": 18, "column": 0}, "endPos": {"line": 18, "column": 6}, "data": "@Grothendieck.CoversEtaleArrow.covers_etale_id : ∀ {X : AlgebraicGeometry.Scheme} (S : CategoryTheory.Sieve X),\n AlgebraicGeometry.Scheme.etaleTopology.Covers S (CategoryTheory.CategoryStruct.id X) ↔\n S ∈ AlgebraicGeometry.Scheme.etaleTopology X"}, {"severity": "info", "pos": {"line": 19, "column": 0}, "endPos": {"line": 19, "column": 6}, "data": "@Grothendieck.CoversEtaleArrow.covers_etale_top : ∀ {X Y : AlgebraicGeometry.Scheme} (f : Y ⟶ X),\n AlgebraicGeometry.Scheme.etaleTopology.Covers ⊤ f"}, {"severity": "info", "pos": {"line": 22, "column": 0}, "endPos": {"line": 22, "column": 6}, "data": "Grothendieck.Fppf.fppfProperty : CategoryTheory.MorphismProperty AlgebraicGeometry.Scheme"}, {"severity": "info", "pos": {"line": 23, "column": 0}, "endPos": {"line": 23, "column": 6}, "data": "Grothendieck.Fppf.fppfPrecoverage_eq_precoverage_fppfProperty : AlgebraicGeometry.Scheme.fppfPrecoverage =\n AlgebraicGeometry.Scheme.precoverage Grothendieck.Fppf.fppfProperty"}, {"severity": "info", "pos": {"line": 24, "column": 0}, "endPos": {"line": 24, "column": 6}, "data": "Grothendieck.Fppf.fppfPretopology : CategoryTheory.Pretopology AlgebraicGeometry.Scheme"}, {"severity": "info", "pos": {"line": 25, "column": 0}, "endPos": {"line": 25, "column": 6}, "data": "Grothendieck.Fppf.fppfTopology_eq_grothendieckTopology : AlgebraicGeometry.Scheme.fppfTopology =\n AlgebraicGeometry.Scheme.grothendieckTopology Grothendieck.Fppf.fppfProperty"}, {"severity": "info", "pos": {"line": 26, "column": 0}, "endPos": {"line": 26, "column": 6}, "data": "Grothendieck.Fppf.fppfTopology_eq_toGrothendieck_fppfPretopology : AlgebraicGeometry.Scheme.fppfTopology =\n Grothendieck.Fppf.fppfPretopology.toGrothendieck"}, {"severity": "info", "pos": {"line": 27, "column": 0}, "endPos": {"line": 27, "column": 6}, "data": "Grothendieck.Fppf.etale_le_fppfProperty : @AlgebraicGeometry.Etale ≤ Grothendieck.Fppf.fppfProperty"}, {"severity": "info", "pos": {"line": 28, "column": 0}, "endPos": {"line": 28, "column": 6}, "data": "Grothendieck.Fppf.etalePrecoverage_le_fppfPrecoverage : AlgebraicGeometry.Scheme.etalePrecoverage ≤\n AlgebraicGeometry.Scheme.fppfPrecoverage"}, {"severity": "info", "pos": {"line": 29, "column": 0}, "endPos": {"line": 29, "column": 6}, "data": "Grothendieck.Fppf.etaleTopology_le_fppfTopology : AlgebraicGeometry.Scheme.etaleTopology ≤\n AlgebraicGeometry.Scheme.fppfTopology"}, {"severity": "info", "pos": {"line": 30, "column": 0}, "endPos": {"line": 30, "column": 6}, "data": "Grothendieck.Fppf.zariskiTopology_le_fppfTopology : AlgebraicGeometry.Scheme.zariskiTopology ≤\n AlgebraicGeometry.Scheme.fppfTopology"}, {"severity": "info", "pos": {"line": 33, "column": 0}, "endPos": {"line": 33, "column": 6}, "data": "@Grothendieck.isLocallySurjective_top : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {F G : CategoryTheory.Functor Cᵒᵖ (Type u_3)} (f : F ⟶ G), CategoryTheory.Presheaf.IsLocallySurjective ⊤ f"}, {"severity": "info", "pos": {"line": 34, "column": 0}, "endPos": {"line": 34, "column": 6}, "data": "@Grothendieck.isLocallySurjective_sup : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {F G : CategoryTheory.Functor Cᵒᵖ (Type u_3)} (f : F ⟶ G) {J₁ J₂ : CategoryTheory.GrothendieckTopology C},\n CategoryTheory.Presheaf.IsLocallySurjective J₁ f → CategoryTheory.Presheaf.IsLocallySurjective (J₁ ⊔ J₂) f"}, {"severity": "info", "pos": {"line": 35, "column": 0}, "endPos": {"line": 35, "column": 6}, "data": "@Grothendieck.isLocallySurjective_iSup : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {F G : CategoryTheory.Functor Cᵒᵖ (Type u_3)} (f : F ⟶ G) {ι : Type u_4}\n {J : ι → CategoryTheory.GrothendieckTopology C},\n (∃ i, CategoryTheory.Presheaf.IsLocallySurjective (J i) f) → CategoryTheory.Presheaf.IsLocallySurjective (⨆ i, J i) f"}, {"severity": "info", "pos": {"line": 36, "column": 0}, "endPos": {"line": 36, "column": 6}, "data": "@Grothendieck.isLocallySurjective_bot_iff : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {F G : CategoryTheory.Functor Cᵒᵖ (Type u_3)} (f : F ⟶ G),\n CategoryTheory.Presheaf.IsLocallySurjective ⊥ f ↔\n ∀ (U : Cᵒᵖ), Function.Surjective ⇑(CategoryTheory.ConcreteCategory.hom (f.app U))"}, {"severity": "info", "pos": {"line": 39, "column": 0}, "endPos": {"line": 39, "column": 6}, "data": "@Grothendieck.equalizer_sheaf_condition_mono : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))) {J₁ J₂ : CategoryTheory.GrothendieckTopology C},\n J₁ ≤ J₂ →\n (∀ ⦃X : C⦄,\n ∀ S ∈ J₂ X,\n Nonempty\n (CategoryTheory.Limits.IsLimit\n (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P S.arrows) ⋯))) →\n ∀ ⦃X : C⦄,\n ∀ S ∈ J₁ X,\n Nonempty\n (CategoryTheory.Limits.IsLimit\n (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P S.arrows) ⋯))"}, {"severity": "info", "pos": {"line": 40, "column": 0}, "endPos": {"line": 40, "column": 6}, "data": "@Grothendieck.equalizer_sheaf_condition_iff_separated_compatible : ∀ {C : Type u_1}\n [inst : CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C)\n (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))),\n (∀ ⦃X : C⦄,\n ∀ S ∈ J X,\n Nonempty\n (CategoryTheory.Limits.IsLimit\n (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P S.arrows) ⋯))) ↔\n CategoryTheory.Presieve.IsSeparated J P ∧\n ∀ ⦃X : C⦄,\n ∀ S ∈ J X, ∀ (x : CategoryTheory.Presieve.FamilyOfElements P S.arrows), x.Compatible → ∃ t, x.IsAmalgamation t"}, {"severity": "info", "pos": {"line": 43, "column": 0}, "endPos": {"line": 43, "column": 6}, "data": "@Grothendieck.equalizer_sheaf_condition_iff_of_nat_equiv : ∀ {C : Type u_1}\n [inst : CategoryTheory.Category.{u_2, u_1} C] (J : CategoryTheory.GrothendieckTopology C)\n {P₁ P₂ : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))}\n (e : ⦃X : C⦄ → P₁.obj (Opposite.op X) ≃ P₂.obj (Opposite.op X)),\n (∀ ⦃X Y : C⦄ (f : X ⟶ Y) (x : P₁.obj (Opposite.op Y)),\n e ((CategoryTheory.ConcreteCategory.hom (P₁.map f.op)) x) =\n (CategoryTheory.ConcreteCategory.hom (P₂.map f.op)) (e x)) →\n ((∀ ⦃X : C⦄,\n ∀ S ∈ J X,\n Nonempty\n (CategoryTheory.Limits.IsLimit\n (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P₁ S.arrows) ⋯))) ↔\n ∀ ⦃X : C⦄,\n ∀ S ∈ J X,\n Nonempty\n (CategoryTheory.Limits.IsLimit\n (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.forkMap P₂ S.arrows) ⋯)))"}, {"severity": "info", "pos": {"line": 44, "column": 0}, "endPos": {"line": 44, "column": 6}, "data": "@Grothendieck.equalizer_arrows_iff_sieve_generate : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n (P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))) [inst_1 : CategoryTheory.Limits.HasPullbacks C] {B : C}\n {I : Type (max u_2 u_1)} (X : I → C) (π : (i : I) → X i ⟶ B),\n Nonempty\n (CategoryTheory.Limits.IsLimit\n (CategoryTheory.Limits.Fork.ofι (CategoryTheory.Equalizer.Presieve.Arrows.forkMap P X π) ⋯)) ↔\n Nonempty\n (CategoryTheory.Limits.IsLimit\n (CategoryTheory.Limits.Fork.ofι\n (CategoryTheory.Equalizer.forkMap P\n (CategoryTheory.Sieve.generate (CategoryTheory.Presieve.ofArrows X π)).arrows)\n ⋯))"}, {"severity": "info", "pos": {"line": 47, "column": 0}, "endPos": {"line": 47, "column": 6}, "data": "@Grothendieck.isSheaf_const_unit : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n (J : CategoryTheory.GrothendieckTopology C),\n CategoryTheory.Presieve.IsSheaf J ((CategoryTheory.Functor.const Cᵒᵖ).obj PUnit.{(max u_2 u_1) + 1})"}, {"severity": "info", "pos": {"line": 48, "column": 0}, "endPos": {"line": 48, "column": 6}, "data": "@Grothendieck.isSheaf_inf : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C]\n {J₁ J₂ : CategoryTheory.GrothendieckTopology C} {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))},\n CategoryTheory.Presieve.IsSheaf J₁ P →\n CategoryTheory.Presieve.IsSheaf J₂ P → CategoryTheory.Presieve.IsSheaf (J₁ ⊓ J₂) P"}, {"severity": "info", "pos": {"line": 49, "column": 0}, "endPos": {"line": 49, "column": 6}, "data": "@Grothendieck.isSheaf_iInf : ∀ {C : Type u_1} [inst : CategoryTheory.Category.{u_2, u_1} C] {ι : Type u_3} [Nonempty ι]\n {J : ι → CategoryTheory.GrothendieckTopology C} {P : CategoryTheory.Functor Cᵒᵖ (Type (max u_2 u_1))},\n (∀ (i : ι), CategoryTheory.Presieve.IsSheaf (J i) P) → CategoryTheory.Presieve.IsSheaf (⨅ i, J i) P"}, {"severity": "info", "pos": {"line": 52, "column": 0}, "endPos": {"line": 52, "column": 6}, "data": "@Grothendieck.sheafPushforwardContinuous_comp_sheafToPresheaf : {C : Type u_1} →\n {D : Type u_2} →\n [inst : CategoryTheory.Category.{u_4, u_1} C] →\n [inst_1 : CategoryTheory.Category.{u_5, u_2} D] →\n {A : Type u_3} →\n [inst_2 : CategoryTheory.Category.{u_6, u_3} A] →\n (F : CategoryTheory.Functor C D) →\n (J : CategoryTheory.GrothendieckTopology C) →\n (K : CategoryTheory.GrothendieckTopology D) →\n [inst_3 : F.IsContinuous J K] →\n (F.sheafPushforwardContinuous A J K).comp (CategoryTheory.sheafToPresheaf J A) ≅\n (CategoryTheory.sheafToPresheaf K A).comp\n ((CategoryTheory.Functor.whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj F.op)"}, {"severity": "info", "pos": {"line": 53, "column": 0}, "endPos": {"line": 53, "column": 6}, "data": "@Grothendieck.sheafPushforwardContinuous_id : {C : Type u_1} →\n [inst : CategoryTheory.Category.{u_3, u_1} C] →\n {A : Type u_2} →\n [inst_1 : CategoryTheory.Category.{u_4, u_2} A] →\n (J : CategoryTheory.GrothendieckTopology C) →\n (CategoryTheory.Functor.id C).sheafPushforwardContinuous A J J ≅\n CategoryTheory.Functor.id (CategoryTheory.Sheaf J A)"}, {"severity": "info", "pos": {"line": 54, "column": 0}, "endPos": {"line": 54, "column": 6}, "data": "@Grothendieck.sheafPushforwardContinuous_comp : {C : Type u_1} →\n {D : Type u_2} →\n {E : Type u_3} →\n [inst : CategoryTheory.Category.{u_5, u_1} C] →\n [inst_1 : CategoryTheory.Category.{u_6, u_2} D] →\n [inst_2 : CategoryTheory.Category.{u_7, u_3} E] →\n {A : Type u_4} →\n [inst_3 : CategoryTheory.Category.{u_8, u_4} A] →\n (F : CategoryTheory.Functor C D) →\n (G : CategoryTheory.Functor D E) →\n (J : CategoryTheory.GrothendieckTopology C) →\n (K : CategoryTheory.GrothendieckTopology D) →\n (L : CategoryTheory.GrothendieckTopology E) →\n [inst_4 : F.IsContinuous J K] →\n [inst_5 : G.IsContinuous K L] →\n (G.sheafPushforwardContinuous A K L).comp (F.sheafPushforwardContinuous A J K) ≅\n (F.comp G).sheafPushforwardContinuous A J L"}, {"severity": "info", "pos": {"line": 55, "column": 0}, "endPos": {"line": 55, "column": 6}, "data": "@Grothendieck.adjunction_sheafPushforwardContinuous : {C : Type u_1} →\n {D : Type u_2} →\n [inst : CategoryTheory.Category.{u_4, u_1} C] →\n [inst_1 : CategoryTheory.Category.{u_5, u_2} D] →\n {A : Type u_3} →\n [inst_2 : CategoryTheory.Category.{u_6, u_3} A] →\n {F : CategoryTheory.Functor C D} →\n {G : CategoryTheory.Functor D C} →\n (F ⊣ G) →\n (J : CategoryTheory.GrothendieckTopology C) →\n (K : CategoryTheory.GrothendieckTopology D) →\n [inst_3 : F.IsContinuous J K] →\n [inst_4 : G.IsContinuous K J] →\n F.sheafPushforwardContinuous A J K ⊣ G.sheafPushforwardContinuous A K J"}], "env": 17}

Lecture de la sortie

Le groupe Classifier décrit Ω vu comme classifieur : truth_picks_top dit que la flèche « vrai » choisit le crible maximal, et les trois chi_app_* gouvernent la fonction caractéristique d’un monomorphisme — appartenance, descendance, et le cas où la valeur est le maximum : c’est la mécanique qui classe les sous-préfaisceaux par des cribles.

Les groupes CoversEtaleArrow et Fppf établissent la hiérarchie des topologies : etale_topology_eq_pretopology identifie la topologie étale à celle engendrée par sa prétopologie, covers_iff_etale traduit « couvrir » en un prédicat sur les flèches, et les lemmes covers_etale_* en vérifient les axiomes (stabilité par composition precomp, identité, top). Côté fppf : fppfProperty est la propriété de morphismes, fppfPretopology la prétopologie, fppfTopology_eq_* disent que tout se recolle, et les trois _le_ mesurent la chaîne Zariski ≤ étale ≤ fppf — à chaque niveau (propriétés, prétopologies, topologies).

LocalSurjectivitySpectrum lit la surjectivité locale dans le spectre des topologies : stable par sup et iSup, caractérisée au minimum par isLocallySurjective_bot_iff. SheafConditionCharacterization donne la condition de faisceau en forme d’égaliseur — le cas mono, puis l’équivalence avec « séparé + compatible » ; SheafConditionInvariance la transporte le long d’une équivalence naturelle et la relie aux cribles engendrés (equalizer_arrows_iff_sieve_generate).

SheafTopologySpectrum montre que le faisceau constant unité est faisceau pour toute topologie et que la faisceauté passe aux inf et iInf de topologies — le spectre des topologies pour lesquelles un préfaisceau est faisceau est stable par bornes. Enfin SitesComparison compare les sites : sheafPushforwardContinuous est un foncteur (identité id, composition comp), compatible avec l’oubli vers les préfaisceaux (comp_sheafToPresheaf), et adjunction_sheafPushforwardContinuous en est l’adjonction — l’outil qui identifie les faisceaux d’un site à ceux d’un site raffiné, la pierre angulaire de toute comparaison de sites.

12. Conclusion

Le lake grothendieck_lean couvre tout le spectre — de Yoneda à la cohomologie de Čech, en passant par la forme flèche des recouvrements et le site de Zariski. Ce notebook rend visibles par leurs énoncés une large part de ces modules : chaque #check est un lemme qui compile dans Mathlib 4.

Ce que l’on a appris en chemin. Que le formalisme catégorique n’est pas du verbalisme : chaque théorème du §2 transporte des données calculables (univers, adjonctions, extensions de Kan), et la machinerie des sites (§4-5) est ce qui rend « recouvrir » une opération plutôt qu’une métaphore. Que les faisceaux (§6) sont la réponse à une question précise — quand les sections locales se recollent-elles ? — et que la cohomologie (§7) mesure quand elles ne se recollent pas : H⁰ est l’espace des sections globales, le H¹ est l’obstruction. Que la géométrie (§8) est atteinte par une chaîne d’identifications, chacune prouvée : Zariski est une topologie de Grothendieck, les fibres sont des colimites. Et que la calibration (§9) n’est pas l’annexe du lake : c’est ce qui garantit que ses définitions ne sont pas vides.

Ce que le #print axioms garantit. Les théorèmes sondés ne dépendent que des trois axiomes standards (propext, Classical.choice, Quot.sound) — ceux de la logique sous-jacente de Lean, aucun autre. Aucun sorry : rien n’est promis sans preuve. C’est la différence entre un lake qui raconte Grothendieck et un lake qui le prouve.

La mesure fraîche de visibilité liée à #11703 laisse encore des modules invisibles. Ce notebook démontre ainsi que la suite est un travail d’enrichissement, plus de déblocage.

Retour au sommet