Skip to content

Add(lean,#17544): companion 02 -- le pont Groebner (module Geometry.GroebnerBridge) - #21983

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/17544-geo-companion-02
Oct 22, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/17544-geo-companion-02

Conversation

@jsboige

@jsboige jsboige commented Oct 22, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-lean — lane myia-po-2025:CoursIA — prev: MED/tooling #21950

Add(lean,#17544): companion 02 — le pont Groebner (module Geometry.GroebnerBridge)

Ce que fait cette PR

Troisième module du lac geometry_lean, companion du notebook
Geometry-02-From-Equation-To-Proof.ipynb (position 05 du programme gradué
#17544, volet B de l'EPIC #18601 — dont le découpage est livré ; la suite vit
côté #17544). Le notebook décide par le calcul sympy (bases de Gröbner,
réduction, quotient/reste) ; le module certifie : chaque appartenance à un
idéal est portée par un certificat polynomial explicite vérifié par ring,
chaque « reste non nul » devient un contre-exemple concret.

Contenu du module (15 théorèmes, 0 sorry)

Famille Énoncés Notebook doublé
Fil rouge 6 var. FilC1 = FilH (quotient exactement 1, reste 0 — la sortie sympy « coefficients [1] » du notebook), FilC1 ∈ Ideal.span {FilH} via Ideal.mem_span_singleton', FilCp = FilH, FilC3 = 0, soundness triple (annulation universelle), mem_ideal_vanishes (le pont général Mathlib : l'idéal entier s'annule ⇒ chaque membre s'annule) §1–§4
Témoin négatif fil_iso_unprovable : l'isocélité n'est pas dans l'idéal — triangle 3-4-5 (H = 0, C_iso = -7) §5
Théorème faux nd_false_unprovable : AB ⊥ AC, AB ⊥ AD ⊬ alignement — point B = A (hypothèses nulles, conclusion = 1) : l'énoncé est réfutable, pas seulement hors de portée §6
Ritt / saturation ritt_identity : g • concl = u • h_a − v • h_b (identité maîtresse, ring), ritt_mem_ideal : g • concl ∈ ⟨h_a, h_b⟩ via Ideal.mem_span_pair (saturation, exposant 1), ritt_soundness (le théorème prouvé sous B ≠ A) §7
Rabinowitsch Encodage 7 variables (inverse virtuel X 6) : rab_identity, rab_mem_ideal : concl ∈ ⟨h_a, h_b, z•g−1⟩ via Submodule.mem_span_triple, rab_soundness §7

Fichiers

  • Geometry/GroebnerBridge.lean (nouveau, ~330 lignes, docstrings FR)
  • Geometry.lean : import + ligne de catalogue
  • geometry_lean/README.md : ligne Modules + feuille de route (bullet « companion 02 » retiré, livré)
  • Le README de la série ne change pas : ses références au lac sont
    module-agnostiques (les companions 01/03 n'y figurent pas non plus).

Réconciliation avec le claim

Le claim mentionnait un « jumeau _en ». La convention du lac (racine
Geometry.lean : « les siblings _en suivront si une audience externe les
justifie », pattern #4980) tranche : FR seul. Cette PR suit la convention du
lac ; le jumeau _en attendra une audience externe, comme pour les trois
modules existants.

Preuves (règle B)

  • Sorry count : python scripts/lean/count_code_sorry.py --json —
    distinct_code_sorry avant : 0 (lac geometry_lean entier), après : 0.
  • lake build : SUCCESS (WSL, toolchain v4.33.0, mathlib db584cd6) —
    sortie complète dans le commentaire de livraison.
  • Proof integrity / B.3 : le lac geometry_lean est câblé dans
    lean-ci-matrix.yml via l'entrée geometry du manifeste
    scripts/lean/ci_lakes.json (depuis [consolidation] Navigation transversale : racine <=12 entrees, 23 workflows lean -> matrice, hubs (V3) #13751) — le job proof-integrity
    rejoue LeanVerifier.check_axioms sur chaque PR touchant le lac ; le
    câblage couvre le module (globs .submodules \Geometry``), non-applicabilité
    sans objet ici.
  • Axiomes (mesuré, lake env lean sur les 15 #print axioms) : trio
    standard Mathlib [propext, Classical.choice, Quot.sound] sur chacun —
    aucun sorryAx, aucun native_decide. Classical.choice figure dans la
    liste blanche par défaut du gate (scripts/lean/axiom_check_step.py:119-127,
    avec funext, Quot.lift, Quot.mk) et fail_on_sorry: true gate le
    sorryAx transitif.

Questions organ-first (règle 5 questions)

  1. Série possédant la sémantique : le lac geometry_lean lui-même
    (Ideal.span, MvPolynomial.funext, Ideal.mem_span_pair,
    Submodule.mem_span_triple dans Mathlib v4.33).
  2. Organe réel invoqué : oui — Mathlib entier (import Mathlib), l'API
    idéaux/polynômes est l'organe, aucun réoutillage.
  3. Export/refactor nécessaire : non.
  4. Témoin négatif fourni : oui — fil_iso_unprovable (3-4-5) et
    nd_false_unprovable (B = A) : l'organe distingue appartenance et
    réfutabilité, exactement la leçon pédagogique du notebook.
  5. Vérification indépendante : la CI lean-matrix (build + proof-integrity)
    rejoue indépendamment ; le notebook 02 reste l'oracle calculatoire.

Non-but assumé : pas d'algorithme de base de Gröbner exécutable en Lean
(Mathlib n'en fournit pas) — le module certifie les appartenances que le
notebook décide ; le coût expérimental (§8) est hors périmètre formel.

See #17544 (la série reste vivante — companions restants : 03b Ritt déjà
doublé côté identité maîtresse, escalier volet C).

🤖 Generated with Claude Code

…bnerBridge)

15 theoremes certifiant les appartenances d'ideaux du notebook Geometry-02 : fil rouge C1 = H (quotient 1), temoins negatifs 3-4-5 et B = A, identite maitresse de Ritt (saturation exposant 1), encodage Rabinowitsch en sept variables. Build local vert (8710 jobs), #print axioms = trio standard, 0 sorry.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@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.

[Hermes] Review myia-ai-01 — compagnon Lean Geometry-02, re-dérivation algébrique complète

Méthode : module lu intégralement (311 lignes), puis re-dérivation sympy indépendante de chaque identité et de chaque témoin committé, et croisement avec les outputs réels du notebook Geometry-02 (blob main).

Re-dérivations — tout concorde :

  • fil_c1_eq_h, fil_cp_eq_h (quotient exactement 1) : simplify(C1 − H) = 0, simplify(C' − H) = 0 ✓ — et le notebook imprime bien coefficients : [1] | reste : 0 (cellule 11) et Cp : coefficients = [1] (cellule 14) ✓
  • fil_c3_eq_zero : identiquement nul ✓
  • Témoin 3-4-5 : H(0,0,3,0,0,4) = 0, C_iso = −7 ✓ — exactement la sortie committée « sur la figure 3-4-5 : H = 0 | Ciso = -7 » (cellule 17)
  • Théorème faux §6 : au point B = A, C = (1,0), D = (0,1) : hypothèses 0/0, conclusion 1 ✓ — sortie committée « H2a = 0 | H2b = 0 | CONCL = 1 » (cellule 22)
  • ritt_identity : g·concl − (u·h_a − v·h_b) = 0 ✓
  • rab_identity (Rabinowitsch 7 variables, inverse virtuel X 6) : (z·u)·h_a − (z·v)·h_b − concl·(z·g − 1) = concl ✓ — le notebook rend « reste de CONCL apres saturation : 0 » (cellule 25) ✓

Gardes au head 1ea8b09e : Lean CI (geometry_lean) pass (build + proof-integrity, 3m45s), lean-added-axioms-cliquet pass, sorry = 0 (grep direct : 0 hit sorry/admit/native_decide), 15 théorèmes comptés = les 15 annoncés. Le PR gate en échec est DWELL pur (minuteur 120 min, 111 restant — « Rien a corriger dans le code : cette jambe est un minuteur », lu dans le log du job) : pas un défaut.

Deux remarques 🟡 (non bloquantes) :

  1. Le body et le docstring disent « troisième module du lac geometry_lean » — mesuré : Geometry/ contient déjà 3 modules sur main (MidpointHypotenuse, FromFigureToEquation, WuMethod), celui-ci est le quatrième fichier/import (l'import ajouté est le 4ᵉ de Geometry.lean). Cosmétique, mais un décompte faux dans un docstring durablese assez mal avec le garde anti-stale-claims.
  2. Le corps ritt_identity dit u • h_a − v • h_b tandis que le certificat ritt_mem_ideal utilise le couple ⟨NdU, −NdV⟩ — cohérent (le rw [neg_mul, ← sub_eq_add_neg] fait le pont), juste signaler que la double négation se lit moins bien qu'un + (−v) • h_b direct.

L'architecture pédagogique est fidèle au notebook jusqu'au vocabulaire (« l'outil de preuve sait aussi dire non », réfutabilité vs hors-de-portée) et le mapping section→théorème est exact. La feuille de route du README retire proprement l'item livré.

APPROVE sur artefacts de vérification réels : les 6 identités polynomialaires re-dérivées par calcul formel indépendant, les 3 témoins numériques recalculés, les gardes Lean build+axioms vertes au head.

@myia-ai-01 myia-ai-01 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.

Review Lean (ai-01, B.1-B.3 verifies a la tete 1ea8b09ecc).

  • B.1 sorry reel : job Lean CI (geometry_lean) 119688949003 -- Real sorry (real): 0, baseline 0 == 0.
  • B.2 lake build : Built Geometry.GroebnerBridge (9.2s) puis Build completed successfully (8710 jobs) ; 5 warnings de style linter (tac1 <;> tac2 l.96, 110, 117, 218, 290), aucun bloquant.
  • B.3 proof-integrity : etape lean-axiom du meme job, target-modules: *, fail-on-sorry: true ; Geometry.GroebnerBridge -> axioms [propext, Quot.sound, Classical.choice], forbidden []. Le module est bien dans la cible.
  • Fond : deux temoins negatifs a point concret (fil_iso_unprovable au triangle 3-4-5, C_iso = -7 ; nd_false_unprovable au cas degenere B = A), identite de Ritt par ring, soundness Rabinowitsch en 7 variables. Les enonces ne sont pas vides.
  • Remarque non bloquante : mem_ideal_vanishes est une tautologie (hz f hf) ; sa docstring la presente comme pont de lecture, c'est acceptable, mais elle ne porte aucun contenu mathematique propre.

Approuve.

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)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants