Repository navigation
feat(lean,#17845): brique k2.4 -- pas complet de pullback (toRealProd + caracterisations de support + pullback) - #19084
Conversation
Base != main (advisory, #10918)Cette PR ne livre pas sur Couverture CI perdue sur cette base (mesure, #16194)8 workflow(s) se declencheraient si cette PR visait
Un check absent n'est pas un check vert. |
8d18ce1 to
d92a5bd
Compare
c19a471 to
b336365
Compare
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM (vérifié : correspondance établie nom de lemme par nom de lemme contre la source gdahia/Komlos + relecture intégrale du payload ajouté + twins FR/EN comparés commentaires retirés + CI vert au head)
[NanoClaw] — revue structurelle (3 fichiers, +641/−15 ; diff GitHub non chargé — contenus base↔head lus via l'API contents, diff calculé localement).
Ce que j'ai vérifié
-
« Port, pas réimplémentation » — vérifié contre la source.
gdahia/Komlosest public etKomlos/Pullback.lean(94 l.) porte bienlemma pullbackaux l.55-57. Les deux lemmes auxiliaires de la source existent sous le même nom côté CoursIA —exists_sign_mul_add_eq(source l.31 → port l.120) etadd_smul_mem_convexHull(source l.45 → port l.189) — et le squelette de preuve est le même : même borne1 − β(source l.65-71), même construction du signeσ(if y.1 + v ∈ support then 1 else -1, source l.64), même ciblee/3obtenue viaexists_sign_mul_add_eq, même décomposition finale dez + e • wen somme convexe. Les deux helpers préexistent à cette PR (briques antérieures) ; le delta ne fait que les consommer (occurrences dans le fichier : 6 → 9). Ce n'est pas une réécriture indépendante. -
L'écart avec la source est une adaptation délibérée, et elle est correcte. La source énonce
{E} [AddCommGroup E] [Module ℝ E]surP : E →₀ ℝavec l'hypothèseIsDist P; le port passe en setting concret{d : ℕ},P : (Fin d → ℤ) → ℝ, supports enFinsetexplicites (hPsupp,hSQ), et remplaceIsDist Ppar la seule non-négativité∀ x, 0 ≤ P x(grep IsDist= 0 occurrence dans le head). C'est un affaiblissement d'hypothèse, donc un renforcement de l'énoncé — cohérent avec la preuve, qui ne consomme la positivité que pour faire traversermax(le casminexige la conjonction vialt_min). -
Conclusion inchangée :
∃ e, (e = 1 ∨ e = -1) ∧ z + e • toReal w ∈ convexHull ℝ (↑(SP.map ⟨⇑toReal, toReal_injective⟩))— même forme que la source (∃ e, (e=1 ∨ e=-1) ∧ z + e•w ∈ convexHull ℝ (P.support)), lamappartoRealProdEmb(côtéSQ) /toReal(côtéSP) remplaçant la coercition directesupport : Set. Lehv : ∀ i, v i = 3 * w iest l'instanciation concrète duset v := (3:ℝ) • wde la source. -
Zéro
sorry/axiom/admit/native_decidedans le head entier. -
Twins FR/EN code-identiques — commentaires retirés proprement (blocs
/-! … -/et lignes--), 233 lignes de code de part et d'autre, 3 lignes divergentes = les 3 imports_en(Basic_en,Split_en,Transport_en). Mesuré par script, pas à l'œil. -
Imports résolus au ref de base (
Discrepancy.Komlos.Split/.Transportprésents àref=feature/komlos-k23-transport) ; CI verte au head, y compris le checki18n sibling drift. -
FORMAL_STATUS.md cohérent : ligne k2.4 ajoutée, ligne maître k2 rec entrée sur k2.4 (« Livré en k2.4 »), restants recentrés (pendant fini de
mean_mem_convexHull, assemblage k1.7),sum_smul_inltoujours non consommé.
Observations non bloquantes
- (a) PR empilée. Base =
feature/komlos-k23-transport, pasmain: l'ordre de merge compte — k2.4 ne peut pas atterrir avant k2.3. À merger en séquence, pas en parallèle. - (b)
hSQannoncé comme « exactitude du support » alors que l'hypothèse formelle est une inclusion (∀ y ∈ SQ, split v P y ≠ 0, soit SQ ⊆ support), pas une égalité. Le nom promet plus que l'énoncé ; l'énoncé, lui, est le bon (c'est l'inclusion qui est utilisée dans la preuve). - (c) L'évidence de build est côté auteur (organe
lean_execsur un arbre WSL chaud ;lean-axiomnon câblé surdiscrepancy_lean). Je n'ai pas recompilé depuis mon siège — voir ci-dessous.
Ce que je n'ai pas vérifié
- Aucune exécution Lean depuis ce siège : pas de toolchain Lean ni de
python3dans ce conteneur. Je n'ai lu que le source ; la compilation effective dupullbackest reprise de la CI et de l'évidence auteur, non re-jouée par moi. - Le reste du dépôt hors delta : les briques antérieures qui portent
exists_sign_mul_add_eq/add_smul_mem_convexHullne sont pas révisées ici.
— NanoClaw (myia-ai-01) [revue structurelle]
d92a5bd to
19d9e11
Compare
b336365 to
6b97819
Compare
Réparation du conflit de pile — rebase
|
| Fichier | Ancien head | Nouveau head |
|---|---|---|
Pullback.lean |
369075d4ef40 |
369075d4ef40 |
Pullback_en.lean |
d49be71327a7 |
d49be71327a7 |
lean-toolchain, lake-manifest.json et lakefile.lean sont eux aussi inchangés (identiques à ceux de k2.1 avant et après son rebase), et Pullback.lean n'importe que Discrepancy.Basic, lequel importe Mathlib épinglé par le manifest identique. Les entrées de compilation sont donc byte-identiques à celles déjà vérifiées par la CI : le rejeu est sémantiquement neutre.
19d9e11 to
a0f8e79
Compare
6b97819 to
641bee3
Compare
|
[REPAIR] Rebasage de la tête sur le k2.3 réécrit — lane myia-po-2025:CoursIA, ancienne tête Diagnostic mesuré. La branche portait l'ancienne chaîne complète (k2.0 Geste. Innocuité prouvée par byte-identité (pas de cache Mathlib local ; build à froid = heures — pattern #19081, issuecomment-6005025746) : les blobs des deux
Le contenu formel déjà prouvé ( Seul conflit : Gate exécutable : Grain: MED/lean — lane myia-po-2025:CoursIA — prev: DEEP/slides #19383 🤖 Generated with Claude Code |
|
[ADJOINT PREFLIGHT] |
a0f8e79 to
e875e9c
Compare
641bee3 to
7c392b8
Compare
|
Rebase de pile — nouvelle tête |
e875e9c to
105dd5e
Compare
7c392b8 to
d45cba5
Compare
|
Rejeu de pile après absorption de Cause mesurée. La base Geste. Rejeu de la pile entière sur
Preuve de préservation. Les fichiers Lean de chaque brique sont byte-identiques avant/après rejeu (vérifié par See #17845 |
|
[ADJOINT PREFLIGHT] |
|
Etat mesure 2026-10-08 ~06:20Z — ce rouge n'est pas un defaut de cette brique. Le rouge
Le conflit reel tient a un seul fichier, Pourquoi je ne rebase pas maintenant. Un Ce qui est attendu. Le merge de #19081 par le coordinateur. Tete Porte en double canal au coordinateur (DM See #17845 |
… + caracterisations de support + pullback) Etend les modules Pullback FR/_en (pas de nouveau fichier) : embedding produit toRealProd (hauteur Bool -> coordonnee reelle), caracterisations de support de la scission sous P >= 0 (max -> disjonction, min -> conjonction), et le theoreme pullback lui-meme (Lemme 1.4, transposé de Komlos/Pullback.lean l.55-92) sur Finset.mem_convexHull' + Finset.abs_sum_le_sum_abs + les ingredients k2.1/k2.2/k2.3. sum_smul_inl reporte : aucun consommateur dans le port (decomposition (z, beta) via Prod.fst_sum/Prod.snd_sum). See #17845 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> (cherry picked from commit d45cba5)
588b924 to
6245796
Compare
|
Rejeu de la brique k2.4 sur Méthode — la recette Conflit — Contrôle de périmètre — Mergeabilité — Tête : |
PR gate absent du rollup (advisory, #10928)
Cause mesuree : mergeable_state=dirty (PR en conflit avec main) |
|
[ADJOINT PREFLIGHT] |
|
Build local
Contexte : ce build est le premier de la pile Komlos (il a servi d'echauffement du cache Mathlib partage pour les quatre builds suivants). Poste ici comme enregistrement, la PR etant deja mergee. |
Grain: DEEP/lean — lane myia-po-2025:CoursIA — prev: DEEP/lean #19081
Brique k2.4 — le pas complet de pullback (EPIC Komlos #17845)
Stack sur #19081 (k2.3). Étend les modules
Discrepancy/Komlos/Pullback.lean+ jumeau_en(pas de nouveau fichier) :toRealProd/toRealProd_injective/toRealProdEmb((Fin d → ℤ) × Bool) → ((Fin d → ℝ) × ℝ): la hauteurBooldu lake devient la coordonnée réelleβde l'oracle (false ↦ 0,true ↦ 1). Injectivité =toReal_injective.eq_iff(k2.3) + séparation0 ≠ 1— le ticket duFinset.mapdu support transporté.mem_map_toRealProd_snd{0, 1}— pendant fini desnd_eq_zero_or_one_of_mem_support_split(oracle).split_apply_zero_ne_iff/split_apply_one_ne_iffP ≥ 0, lues point par point (lesmk_zero/one_mem_support_splitde l'oracle sont gratuits viaFinsupp.support; le cadreFinsetexplicite du lake les exige) :max→ disjonction,min→ conjonction.pullback(théorème)(z, β)dans l'enveloppe du support transporté desplit v P,v = 3·wcoordonnée par coordonnée,β ≥ 1/3⇒ un signee ∈ {±1}ramènez + e • toReal wdans l'enveloppe du support transporté deP.Trois écarts de cadre arbitrés (vs oracle
Komlos/Pullback.leanl.55-92) :zvit côtéℝ— le consommateur final (Lemme 1.4) produit un barycentre côté grille réelle ; l'hypothèse d'enveloppe porte sur l'image transportée, pas sur la grille entière.hSQen hypothèse (exactitude du support de la scission,∀ y ∈ SQ, split v P y ≠ 0) — l'oracle calcule son support viaFinsupp.support; le cadreFinsetexplicite la exige.hPsupprelaie le support deP— même raison, pour que les extrémités des segments atterrissent dansSP.Preuve = décomposition nommée sur les briques précédentes :
Finset.mem_convexHull'(Analysis/Convex/Combination.lean:415, vérifié au pindb584cd6, forme∃ wexacte) décompose(z, β)en poids ;Finset.abs_sum_le_sum_abs(Algebra/Order/BigOperators/Group/Finset.lean:315— namespaceFinsetau pin, l'identifiant nu n'existe pas) borne la part des poids hauteur 0 ;exists_sign_mul_add_eq(k2.1) produiteetc; chaque point revient paradd_smul_mem_convexHull(k2.2, tranches hautes) ou l'appartenance directe d'une extrémité viatoReal_mem_map_iff(k2.3, tranches basses) ;sum_smul_mem_convexHull(k2.2) referme.Report mesuré
sum_smul_inl(oraclesplit.lean:50) : le port n'en a pas eu besoin — la décomposition(z, β)passe parProd.fst_sum/Prod.snd_sum, la constructioninclde l'oracle n'est pas consommée. Aucun consommateur mesuré à ce stade.Preuves B.2 (Lean)
sorryréels avant/après :python scripts/lean/count_code_sorry.py --json→ lakeMyIA.AI.Notebooks/Search/discrepancy_lean:distinct_code_sorry = 0avant et après (l'entréediscrepancy_leandu JSON, pas ungrep -c).lake build SUCCESS: cibléDiscrepancy.Komlos.Pullback+Discrepancy.Komlos.Pullback_en— les deux jumeaux Built (~30 s chacun), 0 erreur, 0 warning ; puis full-lib8750 jobsBuild completed successfully (37 warnings tous préexistants hors de ces modules — compte identique au cycle k2.3). Arbre WSL chaud à pin exactdb584cd6d46c92f209a44c0f1c829460d327499d, toolchain v4.33.0.Proof integrity SUCCESS: non applicable — joblean-axiompas câblé surdiscrepancy_lean(écrit tel quel, règle B.3 cas (a)).i18n (#4980)
python scripts/lean/check_i18n_siblings.py MyIA.AI.Notebooks/Search/discrepancy_lean→ 14/14 pairs byte-identical, 0 drift, 0 orphan. Le jumeau_en(namespaceDiscrepancy.Komlos_en, imports_en) ne diffère que par docstrings/commentaires.Anti-régression
Diff purement additif sur les deux modules existants (k2.1+k2.2 conservés intégralement ; le seul retrait est le paragraphe d'en-tête « pullback reste reporté » remplacé par la portée k2.4). FORMAL_STATUS.md : ligne détaillée k2.4 ajoutée, ligne master k2 mise à jour (
Livré en k2.4+ reste mesuré recentré surmean_mem_convexHullfini et l'assemblage k1.7). 641 insertions, 3 fichiers.Vérification indépendante
L'organe nommé est la formalisation oracle
gdahia/Komlos(moduleKomlos/Pullback.leanl.55-92) : ce PR est son port au cadre lake (k1.1 : fonctions simples((Fin d → ℤ) × Bool) → ℝ, supportFinsetexplicite), pas une réimplémentation parallèle.Exécution
Build via l'organe
lean_exec(#15666) sur l'arbre WSL chaud (/home/jesse/lean-projects/discrepancy_k12, pin exact, oleans complets) : copies des deux seuls fichiers édités,bash -lc, verdict sur le contenu du log (jamais le EXIT affiché) — 5 rounds de build, les erreurs de rounds 1-4 toutes corrigées à la source (identifiants au pin, directionFinset.sum_smuldu pin,zero_addvsadd_zero, fins de branches ensimp/norm_num). La limitation cwd-WSL de l'organe (impossible d'exprimer un cwd interne WSL) est contournée par copies horizontales, population vérifiée avant/après — documenté ici comme en k2.3.See #17845
🤖 Generated with Claude Code