feat: base-point change for higher homotopy groups - #4309
Conversation
Construct the transport of a generalized loop along a path, prove that a homotopy whose boundary traces the path is canonically the transport, and deduce that a path from `x` to `y` induces a group isomorphism `HomotopyGroup N X x ≃* HomotopyGroup N X y`. Co-Authored-By: Claude Code <noreply@github.com>
There was a problem hiding this comment.
⛔ reuse — block codex/gpt-5.6-sol
Two new endpoint lemmas directly duplicate existing Set.projIcc API and should be removed.
TauCeti/Topology/Homotopy/Cube/Radius.lean:62—projIcc_zeroandprojIcc_oneare specialization-only wrappers directly replaced bySet.projIcc_leftandSet.projIcc_right. Fix: Delete both declarations and useSet.projIcc_left/Set.projIcc_rightdirectly at all call sites, withrflornorm_numwhere subtype endpoint normalization is needed.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
codex/gpt-5.6-sol · 29s · 155.4k in / 797 out tokens · reviewing this diff · rubric
AI review — blockedEach rubric is judged independently by multiple review agents; the PR merges only once every rubric is green — any rubric that is not green (changes requested, blocked, errored, stale, or not yet run) blocks the merge. See the rubrics.
♻️ = approved on an earlier commit, re-run before merge. Halted at the Reviewing this diff at head |
Co-Authored-By: Codex <noreply@github.com>
Co-Authored-By: Antigravity <noreply@github.com>
There was a problem hiding this comment.
🟡 api-design — request_changes codex/gpt-5.6-sol
The general higher-homotopy equivalence unnecessarily exposes a decidable-equality requirement, and two canonical reduction lemmas are missing simp annotations.
TauCeti/Topology/Homotopy/HomotopyGroup/BasepointChange.lean:354—homotopyGroupMulEquivOfPathand every general theorem built from it require[DecidableEq N], although the advertised construction only needs finite nonemptyN; this leaks a proof implementation choice into the canonical API. Fix: Remove[DecidableEq N]fromhomotopyGroupMulEquivOfPath, its_mk,_apply,_symm_apply,_refl,_trans,_congr,_symmlemmas, andnonempty_homotopyGroupMulEquiv; installClassical.decEq Nlocally for thetransAtproof.TauCeti/Topology/Homotopy/HomotopyGroup/BasepointChange.lean:321— Canonical normalization lemmas are inconsistently annotated:homotopyGroupTransport_transandhomotopyGroupMulEquivOfPath_symm_applylack@[simp], despite reducing concatenation and inverse application to the established transport normal form. Fix: Add@[simp]to both lemmas; their orientations reduce compound operations and do not introduce a rewrite loop.
Reply in this thread to contest a finding; that re-runs only this rubric and posts an answer here. (To fix it, just push a commit — that re-reviews on its own. To contest again after an answer, post a NEW reply rather than editing an old one.)
codex/gpt-5.6-sol · 34s · 71.7k in / 1.6k out tokens · reviewing this diff · rubric
There was a problem hiding this comment.
I implemented the valid part of this finding on 4543b98: homotopyGroupTransport_trans is now @[simp], and the full linter-enabled lake build passes. The other two requests are not valid against this Mathlib pin. First, Mathlib defines HomotopyGroup.group (N) [DecidableEq N] [Nonempty N] : Group (HomotopyGroup N X x) and HomotopyGroup.mul_spec under the same [DecidableEq N] section; removing the assumption makes the exported MulEquiv result itself fail to synthesize Mul (HomotopyGroup N X x). Installing Classical.decEq locally changes the typeclass identity and does not definitionally agree with canonical instances (for example Fin.instDecidableEq). This exact evidence already cleared the corresponding generality finding in reply 3839828331 / re-review 3840016705. Second, homotopyGroupMulEquivOfPath_symm_apply must not be tagged @[simp]: commit 3b44af8 removed that attribute because the simpNF linter reports the lemma is already normalized by the existing simp lemmas homotopyGroupMulEquivOfPath_symm and homotopyGroupMulEquivOfPath_apply. Re-adding it would violate the repository requirement not to silence linters. Current verification after retaining both constraints: lake build completed successfully (9072 jobs), and lake exe axioms audited 71008 declarations with all axioms in the allowlist.
There was a problem hiding this comment.
Re: your reply on api-design — re-reviewed on 4543b98; the finding stands — The main basepoint-change API is present, but it exposes proof-only collar machinery and omits a normal-form simp annotation for inverse application.
codex/gpt-5.6-sol · addresses your replies through comment 3840087519.
AI review — changes requestedEach rubric is judged independently by multiple review agents; the PR merges only once every rubric is green — any rubric that is not green (changes requested, blocked, errored, stale, or not yet run) blocks the merge. See the rubrics.
♻️ = approved on an earlier commit, re-run before merge. Reviewing this diff at head |
There was a problem hiding this comment.
✅ reuse — now passing on 85fc4af.
AI review — approvedEach rubric is judged independently by multiple review agents; the PR merges only once every rubric is green — any rubric that is not green (changes requested, blocked, errored, stale, or not yet run) blocks the merge. See the rubrics.
♻️ = approved on an earlier commit, re-run before merge. Reviewing this diff at head |
Add bundled functoriality and inverse application laws, hide implementation bodies, document the transport laws, and make definitional-equality uses explicit. Co-Authored-By: Codex <noreply@github.com>
There was a problem hiding this comment.
✅ api-design — now passing on 85fc4af.
There was a problem hiding this comment.
Fixed on e17fd44, with one adjustment on the third item.
transportFamily,transportFamily_apply,transportFamily_apply_eq_transportandtransportFamily_apply_of_mem_boundaryare nowprivate.cubeTopFaceRetract(renamed fromcubeRetractfor thenamingfinding),cubeTopFaceRetract_apply,cubeTopFaceRetract_of_mem_boundaryandHomotopyAlong.map_cubeTopFaceRetractare nowprivate, leavingHomotopyAlong.homotopic_transportas the public result. It is also dropped from the## Main declarationslist.homotopyGroupMulEquivOfPath_symm_applynow carries@[simp]. Adding the attribute whilehomotopyGroupMulEquivOfPath_symmalso had it is not possible:simpNFrejects it, because the composite of the two existing simp lemmas already normalises the left-hand side. Verbatim output of#lint only ... simpNF ... in TauCeti.Topology.Homotopyon that intermediate state:
-- TauCeti.Topology.Homotopy.HomotopyGroup.BasepointChange
#check @TauCeti.homotopyGroupMulEquivOfPath_symm_apply /- simp can prove this:
by simp only [*, @TauCeti.homotopyGroupMulEquivOfPath_symm, @TauCeti.homotopyGroupMulEquivOfPath_apply]
One of the lemmas above could be a duplicate.
If that.s not the case try reordering lemmas or adding @[priority]. -/
Since silencing a linter is not allowed in this repository, I made homotopyGroupMulEquivOfPath_symm_apply the simp-normal form as requested and dropped @[simp] from homotopyGroupMulEquivOfPath_symm instead. The simp normal form of (homotopyGroupMulEquivOfPath γ).symm a is unchanged — it was, and still is, homotopyGroupTransport γ.symm a, now reached in one rewrite rather than two — and homotopyGroupMulEquivOfPath_symm is retained as a plain lemma. With that arrangement the same #lint run reports 0 errors in 70 declarations ... All linting checks passed!.
Verification of the whole commit: lake build completed successfully (9072 jobs); lake exe axioms audited 71011 declarations, all within [propext, Classical.choice, Quot.sound].
There was a problem hiding this comment.
Re: your reply on api-design — re-reviewed on e17fd44; this clears the finding ✅ — approved on e17fd44.
codex/gpt-5.6-sol · addresses your replies through comment 3840317234.
There was a problem hiding this comment.
✅ naming — now passing on 85fc4af.
There was a problem hiding this comment.
✅ documentation — now passing on 85fc4af.
There was a problem hiding this comment.
✅ proof-quality — now passing on 85fc4af.
There was a problem hiding this comment.
Fixed on e17fd44 by adding the explicit evaluation lemmas, as the first branch of the suggested fix. All four flagged change steps are gone.
HomotopyAlong.map_boundaryis now stated through the coercion of the underlying homotopy (toHomotopy (t, z) = γ t) instead of the inherited rawtoFunfield. That is what forced thechangeat line 174: with the new spelling the goal inHomotopyAlong.transis already⇑(h₁.toHomotopy.trans h₂.toHomotopy) (t, z) = (γ.trans δ) t, soContinuousMap.Homotopy.trans_applyrewrites directly. TheunusedTacticlinter confirms the step had become a no-op ("change ... does nothing") before I deleted it.- The homotopy underlying
HomotopyAlong.transAtis split off as a privatetransAtHomotopy, with a private evaluation lemmatransAtHomotopy_apply. Itsmap_boundaryfield is then proved byrw [transAtHomotopy_apply], nochange. - The remaining two goals were
map_zero_left/map_one_left, whose right-hand sides are values of Mathlib’sGenLoop.transAt, which has no evaluation lemma upstream. A privatetransAt_applysupplies one (it isrfl, sinceGenLoop.transAtis aGenLoop.copyof exactly that half-and-half split), and the two proofs are nowdsimp only; rw [GenLoop.coe_copy-style lemma GenLoop.coe_coe, transAt_apply]; split_ifs. Both new declarations areprivate, matching theapi-designfinding on this PR that proof-only machinery should not be exposed.
The one change still in the file is the pre-existing one in homotopyGroupMulEquivOfPath.map_mul, which carries the three-line comment explaining that Mathlib’s HomotopyGroup.mul_spec has an open TODO for a HomotopyGroup.mk API and that the wrapper must be exposed for mul_spec to rewrite; this rubric approved that step explicitly on 3b44af8 ("the only change exposing definitional equality is locally documented and justified by Mathlib’s quotient-wrapper API").
Verification: lake build completed successfully (9072 jobs); lake exe axioms audited 71011 declarations, all within [propext, Classical.choice, Quot.sound]; the #lint environment-linter set over TauCeti.Topology.Homotopy reports "All linting checks passed!".
There was a problem hiding this comment.
Re: your reply on proof-quality — re-reviewed on e17fd44; this clears the finding ✅ — approved on e17fd44.
codex/gpt-5.6-sol · addresses your replies through comment 3840318263.
Rename `cubeRad` to `cubeRadius` throughout, and rename `cubeRetract` to `cubeTopFaceRetract`, whose docstring and the module docstring now describe it as the restriction to the top face of the cylinder's radial projection rather than as a retraction. Make the proof-only collar machinery private: `transportFamily` and its three lemmas, and `cubeTopFaceRetract` with its evaluation lemmas. Replace the four definitional `change` steps with explicit evaluation lemmas. Stating `HomotopyAlong.map_boundary` through the coercion of the underlying homotopy lets `ContinuousMap.Homotopy.trans_apply` rewrite directly, and the homotopy underlying `HomotopyAlong.transAt` is split off as `transAtHomotopy` so that `transAtHomotopy_apply` and an evaluation lemma for Mathlib's `GenLoop.transAt` expose the three remaining goals. Make `homotopyGroupMulEquivOfPath_symm_apply` the simp-normal form for inverse application by moving the `@[simp]` attribute from `homotopyGroupMulEquivOfPath_symm`; the two cannot both carry it, as `simpNF` then reports the former as already normalized by the latter. Co-Authored-By: Claude Code <noreply@github.com>
There was a problem hiding this comment.
✅ placement — now passing on 85fc4af.
`Mathlib.AlgebraicTopology.FundamentalGroupoid.Basic` and `Mathlib.Topology.Connected.PathConnected` are already supplied transitively through `TauCeti.Topology.Homotopy.HomotopyGroup.Collar`. Co-Authored-By: Claude Code <noreply@github.com>
This PR proves that a path from
xtoyinduces a group isomorphism between the higher homotopy groups based at the two points,TauCeti.homotopyGroupMulEquivOfPath : HomotopyGroup N X x ≃* HomotopyGroup N X yfor a finite nonempty index typeN, together with its functoriality in the path. This is the last unmet item of Stage 3, milestone 9 ofTauCetiRoadmap/UniversalCovers/README.md, whoseπ_nAPI asks for "functoriality, pointed maps, the boundary-relative homotopy API onΩ^N, (pre)connectedness of cubes and cube boundaries forn ≥ 2, and basepoint-change isomorphisms"; every other part of that list is already in the repository, and after this PR Stage 3 is complete, leaving the roadmap's open work in the Galois-category lens of Stage 2 item 8 and in the remaining Stage 4 examples.The construction is the classical collar argument, organised so that one canonicity lemma does all the later work.
TauCeti.cubeRad, defined as twice the distance to the centre of the cube, is continuous because the product metric onI^Nis thesupmetric for finiteN, and it equals1exactly onCube.boundary N;TauCeti.cubeScalerescales radially and multiplies the radius.TauCeti.collarglues an inner family of cube maps, rescaled onto the full cube, to an outer family of paths reparametrised along the collar, the two branches agreeing where the rescaling lands on the cube boundary. With the shrinking radius(2 - t)/2this isTauCeti.GenLoop.collarHomotopy, andTauCeti.GenLoop.transport γ fis defined as its value at time1.TauCeti.GenLoop.HomotopyAlong γ f grecords a homotopy fromftogrestricting toγon the cube boundary, andTauCeti.GenLoop.HomotopyAlong.homotopic_transportsays every such homotopy ends at a loop homotopic, relative to the boundary, totransport γ f. This is the homotopy extension property of the pair(I^N, Cube.boundary N)in the only form needed, and it is proved concretely: an explicit radial retractionTauCeti.cubeRetractsends the top face of the cylinderI × I^Nonto its bottom face together with its sides, composing a homotopy alongγwith it reproducestransport γ fon the nose, and the straight-line homotopy in the convex cylinder from the identity to that retraction is stationary on the boundary. Consequently the concatenation law, the constant-path law and multiplicativity each reduce to exhibiting one homotopy along the relevant path — two collar homotopies concatenated in the time direction, the constant homotopy, and two collar homotopies concatenated in a cube direction. That transport respects homotopy of generalized loops, and depends only on the homotopy class of the path, is instead read off from the collar of a continuous family,TauCeti.transportFamily. The group structure enters only through Mathlib'sHomotopyGroup.mul_spec.The mathematics is standard (Hatcher, Algebraic Topology, Section 4.1), and no Mathlib source was vendored: Mathlib's
Ω^ N X x,HomotopyGroup,Cube.boundary,ContinuousMap.HomotopyRel,Path.Homotopic.trans_symm/symm_transandSet.projIccare consumed as they stand, and the result is the higher-dimensional analogue of Mathlib's existingFundamentalGroup.fundamentalGroupMulEquivOfPath. The new cube geometry needed a home beside the existing cube file, so that file becomes a directory in the same PR; the module table isTauCeti.Topology.Homotopy.CubeTauCeti.Topology.Homotopy.Cube.Basicwith no declaration renamed, and the single importer,
TauCeti.Topology.Homotopy.HomotopyGroup.Covering, updated.Roadmap: UniversalCovers
🤖 Prepared with Claude Code