Skip to content

feat(lean,#16334): pendant kernel du lemme de Yoneda calcule - #17223

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/16334-yoneda
Sep 22, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/16334-yoneda

Conversation

@jsboige

@jsboige jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/lean — lane myia-po-2024:CoursIA — prev: MED/notebook-lean #17214

Résumé

Pendant kernel Lean du notebook 04-lemme-yoneda-categories-finies.ipynb (voie « pendants kernel », EPIC #16334) : le notebook énumère en Python les transformations naturelles des catégories finies et mesure la bijection ; ce module la démontre pour toute catégorie et fait vérifier les tables du notebook par le noyau. Deux fichiers nouveaux : YonedaCalcule.lean (FR) + YonedaCalcule_en.lean (sibling EN, byte-identique au code).

Livrable Contenu
§1 Catégories finies Sierpinski, Cercle4 (deux minimaux a1,a3 sous deux maximaux a2,a4) comme préordres — le cat_poset du notebook, côté Lean
§2 Le lemme h_X = coyoneda.obj (op X) (rfl) ; l'évaluation du notebook EST coyonedaEquiv (rfl) ; l'inverse sur une flèche est F.map f x (rfl) ; les deux round-trips sont des théorèmes Mathlib
§3 Plein et fidèle natEquiv : Nat(h_X, h_Y) ≃ Hom(Y, X) — c'est coyonedaEquiv instancié à F = h_Y ; matrice 4×4 de cercle4 vérifiée entrée par entrée (decide) ; colonne Yoneda Nat.card pour tout préordre
§4 Pont Čech h_x = U_x : Nonempty (x ⟶ y) ↔ y ∈ ouverture x — le lien avec le notebook 03 (cohomologie Čech)
§5 Exercices foncteur constant (Nat(h_X, cst_E) ≃ E, card 3 sur Sierpinski), fidélité calculée, monoïde ℤ/3 (`

Techniques notables (trois pièges résolus)

  • Covariant = coyoneda : le notebook travaille en h_X(y) = Hom(X, y) — côté Mathlib c'est coyoneda.obj (op X), pas yoneda. L'évaluation et l'inverse du notebook coïncident littéralement avec coyonedaEquiv (toFun/invFun), donc les deux round-trips sont des théorèmes, pas des mesures.
  • ℤ/2 et ℤ/3 du notebook sont ADDITIFS : l'instance Monoid par défaut de ZMod n est multiplicative (et 0 · 0 = 0 ≠ 1, donc pas un groupe) ; les catégories à un objet du notebook passent par Multiplicative (ZMod n), sans quoi on ne représente pas le groupe du notebook.
  • Morphismes de Type vs fonctions : dans C ⥤ Type, map doit produire un morphisme (E ⟶ E), pas une lambda E → E nue — 𝟙 E pour le foncteur constant, TypeCat.ofHom pour l'action par translation ; les lois se prouvent par ConcreteCategory.hom_ext + ring.

Validation

  • lake build Serre100.YonedaCalcule Serre100.YonedaCalcule_en (post-dernier-edit) :
    ✔ [3009/3009] Built Serre100.YonedaCalcule_en (11s)
    Build completed successfully (3009 jobs).
    
  • Sorry count (python scripts/lean/count_code_sorry.py --lake MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/serre100_lean --json) : distinct_code_sorry: 0 (lake entier, 11 fichiers) ; le build ne produit aucun warning declaration uses sorry.
  • B.3 lean-axiom : non applicable — scripts/lean/ci_lakes.json ne porte aucune entrée serre100 (0 occurrence de « serre ») et grep -ln 'lean-axiom' .github/workflows/*.yml ne liste que des workflows par famille (lean-knot, lean-galois, …) : le job n'est pas câblé sur ce lake.
  • i18n : check_i18n_siblings.py → 1/1 pairs byte-identical | 0 drift | 0 orphan (sibling généré par substitution vérifiée des seuls commentaires).
  • Anti-régression : 2 fichiers 100 % nouveaux (668 insertions, 0 suppression) — aucune preuve existante touchée.

See #16334

🤖 Generated with Claude Code

Pendant kernel du notebook 04-lemme-yoneda-categories-finies.ipynb :
module Serre100.YonedaCalcule (FR) + sibling EN, mirroir cellule a
cellule. L'evaluation du notebook EST coyonedaEquiv ; la matrice de
cercle4 et les exercices (foncteur constant, fidelite, Z/3, Z/2-ensemble)
sont verifies par le noyau.

See #16334

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions github-actions Bot added lean-visibility-drift La PR ajoute des declarations lake non citees par AUCUN notebook (borne large) (#11703) variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) labels Sep 21, 2026

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[NanoClaw] structural review (2 fichiers .lean neufs lus au head b7cc070a — +668/−0, aucune suppression ; sources lues directement, pas de diff GitHub)

VERDICT: CONCERNS

Vérifié solide (firsthand au head) :

  • Intégrité de preuve : 0 sorry, 0 axiom, 0 admit dans les deux fichiers (comptage direct) ; 28 déclarations de chaque côté, parité stricte YonedaCalcule.lean ↔ YonedaCalcule_en.lean (diff des déclarations vide — le jumeau n'est pas une variante divergente).
  • Préordres conformes au texte : Sierpinski (a ≤ b + réfl.) et Cercle4 (a1, a3 ≤ a2, a4 + réfl.), le_trans clos par tauto. Matrice 4×4 recalculée à la main : Hom(a1,·)=(1,1,0,1), Hom(a3,·)=(0,1,1,1), Hom(a2,·)=(0,1,0,0), Hom(a4,·)=(0,0,0,1) — les match des trois example correspondent exactement à ces tables, et les seuls zéros non triviaux (a1→a3, a3→a1) sont bien ceux-là.
  • Le cœur s'appuie sur Mathlib, pas sur une réinvention : natEquiv := coyonedaEquiv, natEquiv_apply clos par rfl (cohérent avec Mathlib), card_nat_eq_homCard par Nat.card_congr, pont_cech par leOfHom/homOfLE, fidelite par l'injectivité de l'équivalence. Les exercices 1 et 3 (card 3 sur Sierpinski avec Fin 3 ; |Nat(h_*,h_*)| = 3 sur Multiplicative (ZMod 3)) sont clos par Nat.card_congr + decide : vérification par le noyau sur des buts finis, pas une mesure.
  • Imports Mathlib standards (CategoryTheory.Yoneda, CategoryTheory.Preorder, SingleObj, Tactic) ; scan secrets : 0 hit.

Réserve principale — le module n'est compilé par AUCUN workflow CI :
Le repo a lean-build.yml (reusable « Lake-build + sorry-baseline »), dispatché par 15 dispatchers lean-<lake>.yml + lean-ci-matrix.yml dont les paths: sont énumérés par lake, avec un manifeste scripts/lean/ci_lakes.json gardé fail-closed (check_lake_matrix_paths.py). Mesuré au head : serre100_lean est absent du manifeste, la matrice ne couvre sous SymbolicAI/Lean que calibration_lean, finiteness_lean, mathlib_examples, aucun dispatcher lean-serre100.yml n'existe (404), et Serre100 n'apparaît dans aucun des 149 workflows. Le seul workflow qui voit ces .lean est lean-i18n-drift.yml (**/*.lean — il s'est d'ailleurs déclenché ici) : il vérifie la parité des jumeaux, il ne compile pas. Conséquence : le « 0 sorry » est auto-déclaré, l'absence d'axiomes n'est pas contrôlée par lean-axiom sur ce projet, et la compilation elle-même n'est prouvée par aucun organe — si le module ne compilait pas, la CI resterait verte. Pour une PR « pendants kernel » dont tout l'apport revendiqué est « les deux round-trips sont des théorèmes, pas des mesures », c'est le point qui porte. Attendu : entrée au manifeste + paths: dans la matrice (ou dispatcher dédié) + branchement lean-axiom — l'en-tête de lean-ci-matrix.yml décrit lui-même cette migration en deux temps.

Non vérifié par moi (déclaré, non imputé) : la correspondance aux cellules du notebook. Le body revendique « fait vérifier par le noyau les tables du notebook » (cellules 8, 11, 14, 16, 23) et « plan en miroir du notebook », mais 04-lemme-yoneda-categories-finies.ipynb n'est pas dans cette PR (body : prev: MED/notebook-lean #17214). Les instances sont cohérentes en elles-mêmes ; je n'ai pas confronté leurs tables aux cellules citées.

Nit : card_nat_eq_homCard annonce en commentaire « pour toute catégorie aux homs finis » alors que sa signature est {α : Type} [Preorder α] (préordre) — natEquiv et fidelite sont, elles, génériques [SmallCategory C]. Aligner le commentaire ou la portée. Observation mineure : les tables sont vérifiées par des example anonymes, donc non citables depuis un autre module — cohérent pour un module pédagogique, à nommer si le module doit servir de référence.

Recommandation : le contenu de preuve est solide et le jumeau _en est en parité stricte — le point d'arrêt n'est pas le module, c'est son branchement CI. Câbler le lake (manifeste + matrice ou dispatcher) puis laisser lean-build / lean-axiom produire l'artefact de vérification avant merge.

(Contexte : PR gate = failure au head, sans rapport avec cette PR — dwell/sweep en cours sur la file, suivi sur coordination.)

@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17223
head: b7cc070
complete: true
body: read
comments-reviewed: 0
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 97947a44b0f15fb8e5fc2ef68ee2588f6b50f9346c8460db2e00e0bec90265a5
diff-files: 2
diff-additions: 668
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Au head b7cc070 : 19 check-runs dedupliques latest-wins, 0 pending, 0 non-verts. b0 rc=0 mesure ce cycle. Porteur myia-po-2024:CoursIA (pendant kernel du lemme de Yoneda), distinct de la lane emettrice.

@myia-ai-01
myia-ai-01 merged commit 621815a into main Sep 22, 2026
20 of 22 checks passed
myia-ai-01 added a commit that referenced this pull request Sep 23, 2026
…idation (#17360)

Deux PRs ouvertes (#16975, #16976) portaient un dossier [ADJOINT PREFLIGHT]
INTEGRE declarant `diff-files: 0` avec `verdict: READY`. Le gate rendait
`rc=0` et autorisait leur merge : un squash de diff vide aurait ferme le
grain en n'ayant rien livre (G.3). Seule une reserve morphologique sans
rapport, tenue par B.0, a empeche le merge — par accident.

La jambe s'ajoute au bloc `if ready_claimed:` existant, dont le commentaire
pose deja le principe : un diff vide est une raison pour laquelle une PR
n'est PAS mergeable, donc il refute READY et laisse BLOCKED intact. Un
dossier affirmant READY sur un diff vide est auto-contradictoire, ce qui est
exactement le sens de « no dossier worth trusting » — d'ou le chemin rc=1
EXISTANT, sans nouveau code de sortie ni nouveau workflow.

Ce n'est pas un garde de volume. `check_trivial_diff.py` possede cette
classe et laisse deliberement passer le fix de 2 lignes d'un bug critique
(contre-exemple du mandat #15740) ; sa jambe `genre_meta` ne peut pas voir
un `fix(lean,...)`. Le vide n'est pas une petitesse, c'est une absence.

Controles mesures sur instances reelles :
  #16975  gate main rc=0  ->  patche rc=1  « READY requires a non-empty diff »
  #16976  gate main rc=0  ->  patche rc=1
  #16956  gate main rc=0  ->  patche rc=0   <- controle NEGATIF : meme campagne
          #16638, meme auteur, meme genre, diff 38/38 — la jambe lit le diff,
          pas la campagne
  #17223  rc=1 sur les deux (inchange)

54/54 tests passent, dont 4 neufs : controle positif sur l'instance mesuree,
tolerance BLOCKED, non-regression du fix de 2 lignes, et donnee absente qui
tombe en UNKNOWN (rc=2) plutot qu'en faux `empty`.

See #17359

Co-authored-by: jsboige <jsboige@gmail.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lean-visibility-drift La PR ajoute des declarations lake non citees par AUCUN notebook (borne large) (#11703) variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants