Skip to content

[Lean][GOL] Recadrage Gosper : prouver evolveHashlifeFastAtN inconditionnel (étape 2, #6724) — la capture devient corollaire #11161

Description

@jsboige

[Lean][GOL] Recadrage Gosper : prouver evolveHashlifeFastAtN inconditionnel (étape 2, #6724) — la capture devient corollaire

Contexte

no_padding_depth_suffices (#6724, JumpCapture.lean) prouve que le rembourrage ne peut pas refermer la capture dans le cadrage standard (saut 2^lvl depuis une cellule de niveau lvl) : le rembourrage augmente la cellule ET le saut à parts égales, le rapport marge/portée reste 1 − 2^(1-p) < 1, le déficit = demi-largeur du contenu, constant en p. La seule voie restante est la décorrélation portée/niveau (paramètre j de Gosper) : sauter 2^j indépendamment du niveau M ≥ j+2. Avec j = lvl-2, la marge (2^(lvl-1)+pad) excède la portée (2^(lvl-2)) — la capture cesse d'être une hypothèse.

C'est l'étape 2 annoncée dans JumpCapture.lean (note « Marges nommées » : « Cette étape 2 fera l'objet d'une PR distincte »). Cette issue est la traduction concrète de la discussion session user du 2026-08-16 (« le théorème général est faux (clip), pas dur — un moteur re-cadré le rend atteignable »).

État sur main (VERIFIE, main 2c391cc0e)

La machinerie est déjà committée dans Conway/Life/Hashlife.lean :

  • hashlifeResultAt j : avance exactement 2^j générations, indépendant du niveau de la cellule (fenêtre centrale 2^(M-1) à t = 2^j, demi-largeur 2^(M-2) excédant la portée d'un facteur 2^(M-2-j)).
  • hashlifeJumpAt, jumpSizeAt lvl = 2^(lvl-2), evolveHashlifeFastAtAuxN, evolveHashlifeFastAtN.
  • jumpAt_capture_centered PROUVÉ (théorème, sorry-free) : sous B + 2·pad ≤ 2^lvl et lvl ≥ 2, la marge gauche 2^(lvl-1)+pad et la marge droite 3·2^(lvl-1)−pad−B couvrent chacune la portée 2^(lvl-2) — la capture du saut est un corollaire de l'invariant du cadre.
  • guardAt_viable_glider PROUVÉ : le garde décorrélé TIRE (glider n=8, lvl=5, jumpSizeAt 5 = 2^3 = 8 ≤ 8), contra du garde plein (b2) mort pour toute grille.

Manquant : la correction globale evolveHashlifeFastAtN n g = evolve n g (aucun théorème ne l'énonce encore dans Hashlife.lean).

Grains

  1. Invariant de re-cadrage : prouver que gridToMacroCellWithOffsetN n g satisfait B + 2·pad ≤ 2^lvl à chaque itération (ou documenter où c'est déjà acquis par la construction du cadre).
  2. Squelette d'induction fuel : adapter evolveHashlifeFastAux_correct (feat(lean,#6724): DISCHARGE p5_large_n_jumpN — fuel induction + trajectory-capture re-signing (b3') #11007) — induction sur le fuel, invariant n ≤ fuel, bras saut = brique un-saut (jumpAt_capture_centered à la place de l'hypothèse ∀ t ≤ n) + IH ré-instantiée en t + js + recomposition evolve_add.
  3. Re-signature inconditionnelle : hashlife_correctN sans hypothèse de capture — le théorème initial le plus général revient.

Bénéfice / coût

  • Bénéfice : l'hypothèse de capture disparaît du théorème de correction. Le contenu de recherche « caractériser les motifs dont la capture persiste » reste utile pour la caractérisation (axe efficacité), mais n'est plus une condition de la correction.
  • Coût : sauts 2^(lvl-2) au lieu de 2^lvl — plus de niveaux pour la même distance temporelle. C'est la convention standard de hashlife (Gosper) : le moteur actuel sautait trop loin par rapport à sa fenêtre. L'accélération reste exponentielle ; le compromis est à documenter dans le body de la PR.

Acceptance

  • lake build Conway SUCCESS (WSL ou natif, règle B pr-review-discipline)
  • grep -cE '^\s*sorry\s*$' : HashlifeCorrectness 0 → 0 (aucun nouveau sorry)
  • Témoins : evolveHashlifeFastAtN 8 glider = evolve 8 glider, blinker, lineCell3 (le témoin qui falsifiait le moteur plein doit passer sur le moteur décorrélé)
  • Body PR : arithmétique marge/portée citée (jumpAt_capture_centered : 2^(lvl-2) ≤ 2^(lvl-1)+pad ∧ 2^(lvl-2) ≤ 3·2^(lvl-1)−pad−B) + verdict b3'

See #6724 (Epic) · #11007 (squelette induction + re-signature trajectoire, à adapter) · #9568 (cribleur : cribler les énoncés du recadrage AVANT leur figement)

Activity

  1. added
    leanLean 4 formalization (proofs, ports, theorem mining)
    on Aug 16, 2026
  2. myia-ai-01 commented on Aug 16, 2026

    @myia-ai-01
    Collaborator

    [CLAIMED] lane myia-po-2025:CoursIA -- recadrage Gosper : evolveHashlifeFastAtN inconditionnel (dispatch ai-01 c.108) -- paths: MyIA.AI.Notebooks/SymbolicAI/Lean/conway_lean/**

    (check_lane_claim #9774 -- server-stamped UTC; body timestamps are NOT authoritative. Release with [RELEASED] when your PR lands.)

  3. jsboige commented on Aug 16, 2026

    @jsboige
    OwnerAuthor

    [RELEASED] lane myia-po-2025:CoursIA -- grain 1 livre : PR #11257 (gridFrameN_frame_invariant + gridFrameN_level_ge_two + frame_jumpAt_capture_centered, FR+EN #4980, lake build SUCCESS, 0 sorry, check_i18n 17/17). Le claim reste detenu pour grain 2 (induction de fuel evolveHashlifeFastAtAuxN) et grain 3 (signature inconditionnelle evolveHashlifeFastAtN n g = evolve n g).

  4. jsboige commented on Aug 16, 2026

    @jsboige
    OwnerAuthor

    [RELEASED] lane myia-po-2025:CoursIA — grain 2 livre : PR #11281 (squelette induction fuel evolveHashlifeFastAtAuxN_correct + evolveHashlifeFastAtN_correct sous OneJumpAtCorrect, 0 nouveau sorry, 4 temoins #eval true dont line7 n=8 et glider n=12 deux sauts).

    Claim RETENU pour le grain 3 (decharge de OneJumpAtCorrect : P4-At hashlifeResultAt + pont localite + invariant du cadre grain 1) — paths: MyIA.AI.Notebooks/SymbolicAI/Lean/conway_lean/Conway/Life/*.lean

  5. added a commit that references this issue on Aug 16, 2026
  6. added a commit that references this issue on Aug 16, 2026
  7. added 6 commits that reference this issue on Aug 16, 2026
  8. added a commit that references this issue on Aug 16, 2026
  9. jsboige commented on Aug 16, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA -- grain 3b : decharge de OneJumpAtCorrect (P4-At hashlifeResultAt + pont localite + invariant cadre grain 1) -- paths: MyIA.AI.Notebooks/SymbolicAI/Lean/conway_lean/** Grain: DEEP/lean — lane myia-po-2024:CoursIA — prev: MED/notebook-python #11345 (dispatch coord DM 2026-08-16T22:33Z, check_lane_claim CLEAR firsthand 2026-08-17T01:15Z)

  10. added a commit that references this issue on Aug 16, 2026
  11. 20 remaining items

  12. jsboige commented on Aug 17, 2026

    @jsboige
    OwnerAuthor

    Tranche 4 livree dans #11407 (commit pousse DANS feature/11161-grain3b-env16, conformement au DM file Actions) : hashlifeResultAt_step_converse_mem — direction CONVERSE (RHS->LHS) du pas inductif, miroir exact du forward de la tranche 3.

    Enonce : sous l'hypothese d'induction forte hIH (les 9 briques n_i de niveau M satisfont la fenetre centrale), tout point p de l'evolue 2^j du parent restreint a la fenetre [2^(M-1), 2^M) appartient a la sortie mono-ronde At lue a l'ancre centrale (2^(M-1), 2^(M-1)) — l'inclusion inverse qui complete l'equivalence point par point du pas inductif.

    Chaine : mem_restrictGridTo.mp hp -> hpalive (bridge isAlive sur l'evolue du parent) -> reduction du but (unfold + hashlifeResultAtAux_succ_node_at + if_neg + hrw1..9) -> refine (out16_toGrid_mem ...).mpr (construction constructive de la disjonction 16-voies) -> split positionnel 16 cas (rcases lt_or_ge imbriques, fenetre [2S, 6S)^2) -> par tuile : call-site au bras factorise.

    Refactor Path B (lecon tranche 4) : la version tuiles inline echouait par TIMEOUT d'elaboration (>= 2M heartbeats sur les by_cases portant evolve (2^j) ((node ...).toGrid (0,0)) concret — corps de tuile re-elabore 16 fois sans type attendu). Fix : 4 bras step_converse_arm_{se,sw,ne,nw} (signature (hj) (n r) (o1 o2 x y) (cg) (p) hrw hrl href hih hagree hXY hbox hpalive : p in (subX r).toGrid (x, y)), corps commun factorise (hS, hS0, hAc, rw Nat.cast_pow 2 (M-2) at hih, hQalive, hQmem by_cases+exfalso, hQrest mem_restrictGridTo.mpr <;> omega, hQsub mem_toGrid_shift.mp + Prod.ext <;> omega, conclusion subX_toGrid_mem.mpr) ; les 16 tuiles deviennent des call-sites a 3 bullets (hagree = nX_evolve_agree (j := j) ... (by omega) ; hXY et hbox = combinator first|omega|constructor<;>first|omega|trivial|skip SANS prefixe simp — sur goals pure npow le simp ne fait pas de progres et first retombe sur skip avec "No goals to be solved"). Meme pattern que step_forward_arm_* (5d).

    Lecons d'elaboration consolidees (detail body PR) : ancres coercees ((2^k : Nat)) vs npow ((2^k : Int)) — pont propositionnel Nat.cast_pow, normalise par hSc/hAc + rw ; asymetrie forward/converse : le forward consomme hih via rw [← hih] suivi d'un exact qui absorbe la difference coercee/npow par defeq (rw brut indifferent), la converse via rw [hih] directionnel contre un but npow propre est SYNTAXIQUE et exige un hSc ASCRIBE (le rw brut produit l'ancre base-cast ↑2^(M-2), desunifiable) ; shapes de bullets des 16 call-sites normalisees au format valide par le forward (continuation a exact+2, pipes a first+2 — la generation initiale les mettait a la meme colonne, erreur de parse unexpected token 'by' en cascade) ; j implicite de nX_evolve_agree passe explicitement (j := j) sinon omega voit 2^?m non assigne ; t1 (subSE, ancre (A,A)) : simp only [Int.sub_zero, Prod.mk.eta] at hQ AVANT simp [isAlive, hQ] (eta-collapse du point local).

    Validation : lake env lean EXIT 0 reel (wrapper REAL_EXIT, log complet sans | tail), lake build -Kjobs=2 EXIT 0 (fallback -Kjobs=1 sur std::bad_alloc/exit 3221226505), distinct_code_sorry conway = 1 inchange (invariant ai-01 tenu). B.3 : cablage lean-axiom conway inchange (aucun sorry ajoute/retire).

    Residuel grain 3b : induction forte -> hashlifeResultAt_central_correct -> chainage OneJumpAtCorrect. See #11161

  13. jsboige commented on Aug 17, 2026

    @jsboige
    OwnerAuthor

    Tranche 5 livree sur la branche feature/11161-grain3b-t5 (commit c06f785, stackee sur #11407, PAS de PR - DM ai-01 file Actions, la livraison attend le merge de #11407 ou un feu vert) : hashlifeResultAt_central_correct - l'induction P4-At elle-meme, pur assemblage. +83 lignes.

    Enonce (k-forme sans soustraction) : forall k c, c.wf = true -> c.level = j + 2 + k -> (hashlifeResultAt j c).toGrid (2^(j+k), 2^(j+k)) = restrictGridTo (evolve (2^j) (c.toGrid (0,0))) (2^(j+k)) (2^(j+k+1)) - induction ORDINAIRE sur k suffit (l'IH est universellement quantifiee sur la cellule, donc re-instantiable sur les neuf briques).

    Assemblage : base k=0 = hashlifeResultAt_base_central (deja sur main, moteur plein a fuel sature) ; pas k+1 = exposition des 16 petits-enfants par hnode + rfl en cascade, les deux directions du pas inductif hashlifeResultAt_step_forward_mem (5f) + hashlifeResultAt_step_converse_mem (5g) a M := j+k+2 avec hIH' := l'IH re-ecrite dans la forme exacte M-2/M-1, reliees en egalite de grille par le pont p4at_ext_bridge a M := j+k+3 (la biconditionnelle point par point est exactement forward-then-converse, appliquee partiellement hfw p / hcv p au constructeur anonyme de l'iff).

    Lecon d'elaboration 1 (capture de sous-terme par rw total) : les normalisations d'exposants M-2 <-> forme propre ne sont PAS defeq, donc chaque passage se fait par rw directionnel SYNTAXIQUE - un rw [a = b] at h reecrit TOUTES les occurrences de a dans h, y compris imbriquees dans le resultat d'un rw precedent. Rewriter j+k+1 -> j+k+2-1 (taille) puis j+k -> j+k+2-2 (ancre) corrompt la taille. Remede : les rw sur le BUT dans le sens M-forme -> forme propre (motifs disjoints), les plus GRANDS motifs en premier quand une inclusion existe (j+(k+1)+1 avant j+(k+1)).

    Lecon d'elaboration 2 (rcases sur cellWf OPAQUE apres subst) : decomposer cellWf_of_wf _ hwf par obtain ⟨..., noms⟩ apres le dance hnode+rfl introduit les 7 champs inaccessibles (✝) - les noms du pattern ne se lient PAS, quel que soit le pattern (nomme, wildcard, have explicite sans trou - isole par probes minimaux avec trace_state). Pivot : extraire les trois egalites de niveau DIRECTEMENT du wf Bool transparent, technique de la preuve de cellWf_of_wf elle-meme (Foundation) : have hAB : A.level = B.level := by simp_all [MacroCell.wf, beq_iff_eq]. Les temoins cellWf des enfants ne sont pas nommes au passage - inutiles ici : forward/converse consomment le wf du PARENT, les wf des briques vivent dans l'IH universellement quantifiee.

    Validation : lake env lean EXIT 0 reel, 0 erreur, 0 sorry (log complet ~/t5_c8.log, sans | tail) ; lake build -Kjobs=2 complet EXIT 0 (8723 jobs, 0 erreur) ; count_code_sorry.py --json distinct_code_sorry conway = 1 inchange (residuel MarginFragment, INTRINSIC #9568). B.3 : cablage lean-axiom conway inchange (aucun sorry ajoute/retire).

    Note infra (le jour meme) : le pont 9p WSL->/mnt/d a gele 3x en serie (thread p9_client_rpc fige, read_bytes delta 0) - les compiles ont ete basculees sur ext4 natif WSL : copie du lake + robocopy des 8,5 Go de packages reels via \\wsl.localhost (direction 9p inverse, saine), LEAN_PATH 100% ext4 verifie par /proc//environ. Les logs c6-c8 sont les preuves d'execution (ext4, toolchain v4.32.0 identique).

    Residuel grain 3b : derivation de OneJumpAtCorrect inconditionnel depuis hashlifeResultAt_central_correct (re-signature, grain 3 de l'issue) -> evolveHashlifeFastAtN_correct inconditionnel. See #11161

  14. added a commit that references this issue on Aug 17, 2026
  15. jsboige commented on Aug 17, 2026

    @jsboige
    OwnerAuthor

    Tranche 6 livree sur la branche feature/11161-grain3b-t5 (commit 61b6924, stackee sur c06f785 / #11407) : grain 3 complet — derivation inconditionnelle de OneJumpAtCorrect + capstone evolveHashlifeFastAtN_correct_uncond (l'hypothese hbr du squelette grain 2 est dechargee : pour TOUT n et TOUTE grille, evolveHashlifeFastAtN n g = evolve n g). +265 lignes, 0 sorry ajoute.

    Les 4 theoremes :

    1. mem_toGrid_gridToMacroCellWithOffsetN' (private) : miroir N de BR1 (MacroCell L861) — cases hF : gridFrameN n g, simp [gridToMacroCellWithOffsetN, hF, MacroCell.toGrid, mem_sortDedup], mem_toCellsAux_buildFromGrid + gridFrameN_contains_g. Byte-miroir de la preuve non-N.

    2. hashlifeJumpAt_correct_uncond (private) : miroir de hashlifeJump_correct_of_captured (L6494) OU la capture est remplacee par un argument de cone de lumiere. Instantiation hashlifeResultAt_central_correct (lvl-2) 2 (padCenter2 c) (tranche 5) : fenetre centrale ancre (2^lvl, 2^lvl), restrict [2^lvl, 2^lvl + 2^(lvl+1)). Depot du restrict par restrictGridTo_eq_self SANS capture : tout point vivant du evolve 2^(lvl-2) a un ancetre vivant (evolve_reach_chebyshev, portee Chebyshev <= 2^(lvl-2)) dans le contenu — boite [32^(lvl-1), 52^(lvl-1)) via padCenter2_toGrid_shift + mem_toGrid_extent — d'ou point dans [5X, 11X) ⊂ [4X, 12X) avec X = 2^(lvl-2). La marge geometrique 2^(lvl-1) couvre DEUX FOIS la portee 2^(lvl-2). Arithmetique : coord_bound_of_chebDist_le (ConeGeometry) + normalisations npow/cast vers l'atome X, omega ferme.

    3. one_jumpAt_toGrid_correct (private) : miroir de one_jump_toGrid_correct (L6517) SANS hcap — l'algebre de decalages (hnew/jumpResultOff, hmc0/toGrid_shift_grid, chaine rw, hz1/hz2) est byte-identique : la geometrie de jumpResultOff ne depend pas de la taille du saut.

    4. one_jumpAt_correct + evolveHashlifeFastAtN_correct_uncond : derivation (intro n g, cases hF : gridFrameN n g, hun + pont BR1-N, buildFromGrid_wf, application de 3) puis capstone evolveHashlifeFastAtN_correct one_jumpAt_correct n g.

    C'est la fermeture du re-cadrage Gosper : la capture (jumpCaptured) etait un artefact du moteur mono-ronde ORIGINAL, pas une propriete du monde — le moteur decorrele n-aware la rend theoreme gratuit.

    Validation : compile lake env lean EXIT 0 reel, 0 erreur ; lake build -Kjobs=2 complet EXIT 0 ; count_code_sorry.py --json distinct_code_sorry conway = 1 inchange (residuel MarginFragment, INTRINSIC #9568). B.3 : cablage lean-axiom conway inchange.

    Logs : ~/t6_c1.log (fichier), ~/lake_t6_full.log (build). See #11161

  16. jsboige commented on Aug 18, 2026

    @jsboige
    OwnerAuthor

    [RELEASED] lane myia-po-2024:CoursIA-2 -- released

  17. added a commit that references this issue on Aug 18, 2026
  18. added a commit that references this issue on Aug 19, 2026
  19. jsboigeEpita commented on Aug 19, 2026

    @jsboigeEpita
    Contributor

    [CLAIMED] lane myia-po-2025:CoursIA-2 -- paths: MyIA.AI.Notebooks/SymbolicAI/Lean/conway_lean/Conway/Life/HashlifeCorrectness.lean
    Grain: DEEP/lean — lane myia-po-2025:CoursIA-2 — prev: MED/notebook-python #11774

    Livraison des tranches 5+6 (ecrites le 2026-08-17 sur cette machine, tenues jusqu'au merge de #11407 -- condition du DM ai-01 satisfaite : merge 653d1d5 le 2026-08-19T04:55Z). Branche rebasee frais sur origin/main (cherry-picks c06f785 + 61b6924, les tranches 1-4 tombent en vide = deja sur main via squash 653d1d5). Claim herite de la lane CoursIA de cette meme machine (grain 3b 2026-08-17T06:06Z + [OVERRIDE] ai-01 2026-08-17T04:20Z).

  20. added 2 commits that reference this issue on Aug 19, 2026
  21. jsboige commented on Aug 19, 2026

    @jsboige
    OwnerAuthor

    [RELEASED] lane myia-po-2025:CoursIA-2 -- PR #11781 (tranches 5+6 : hashlifeResultAt_central_correct + one_jumpAt_correct + capstone evolveHashlifeFastAtN_correct_uncond).

    Libere AUSSI le claim grain 3b de la lane soeur myia-po-2025:CoursIA (2026-08-17T06:06Z, meme machine) : le grain 3b est complet — l'acceptance de #11161 est entierement couverte (build EXIT 0 frais, sorries 0->0, 4 temoins true, arithmetique jumpAt_capture_centered sur main via #11407). La PR porte Closes #11161.

  22. added a commit that references this issue on Aug 19, 2026
  23. jsboige commented on Oct 5, 2026

    @jsboige
    OwnerAuthor

    [INFO] candidate-delivered + release de claim (Tell c.1356 strict) — lane myia-po-2026:CoursIA-2

    Le picker sert #11161 comme grain neuf. Confrontation body ↔ main (verification first-hand L1356) :

    Grain "manquant" du corps d'origine : la re-signature inconditionnelle evolveHashlifeFastN n g = evolve n g (l'acceptance explicite du body, point 3).

    Mesure sur origin/main : MyIA.AI.Notebooks/SymbolicAI/Lean/conway_lean/Conway/Life/Hashlife.lean ligne 513 :

    theorem evolveHashlifeFastN_eq_evolve (n : Nat) (g : Grid) :
        evolveHashlifeFastN n g = evolve n g := by
      cases n with
      | zero => rfl
      | succ m =>
        exact evolveHashlifeFastAuxN_eq_evolve (m + 1) (m + 1) g (by omega)

    Signature inconditionnelle (aucune hypothese de capture), preuve par induction sur n. La PR #10973 (lane myia-po-2026:CoursIA, merge 2026-08-14T17:40:36Z) a livre ce theoreme comme grain 3a (b2') de l'EPIC : elle demontre par ailleurs que le garde de saut N3 est structurellement mort (gridToMacroCellWithOffsetN_level_gt_n), ce qui rend la preservation VACUE et livre gratuitement le pont — plus fort que le pont n <= 2 initialement reporte (cf. body de la PR, lignes detaillees).

    Recadrage Gosper (5 PRs mergées au total) : #11257 (grain 1, capture du saut decorele inconditionnelle), #11281 (grain 2, squelette induction fuel), #11303 (grain 3a, socle hashlifeResultAt_base_central), #11781 (grain 3 complet, OneJumpAtCorrect theoreme + capstone), #18645 (doc). Body d'origine 2026-08-16 obsolet sur le point 3 — livre depuis 2026-08-14, deux jours plus tot.

    Conclusion : la re-signature inconditionnelle est livree sur main, l'EPIC #11161 est complet. Aucune modification a apporter ; le corps d'origine date et consigne mal. La fermeture reste signee coordinateur/adjoint (R6/lane delivered).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    leanLean 4 formalization (proofs, ports, theorem mining)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions