Encyclopedia Foundation Foundation Circle Winding Path Homotopic Rel Const Of Loop Winding Zero
ARTICLE 4 claims 4 theorems
Foundation Circle Winding Path Homotopic Rel Const Of Loop Winding Zero
On a circle, a loop that winds around zero times can be shrunk to a point, and the framework's machine-checked library proves it.
The zero-winding theorem
A loop on a circle is a path that starts and ends at the same point, like a rubber band laid on a ring. The winding number counts how many times the band goes around: one full trip is winding 1, two is 2, and a path that never completes a full circle has winding 0. The classical fact, known to topologists for over a century, is that a loop with winding zero can be continuously deformed, or shrunk, to the single point where it started, without ever leaving the circle or breaking the band. This is the statement that the circle's fundamental group is the integers, and it is a basic result of algebraic topology.
The framework's machine-checked library of formal theorems proves this fact for its own exact model of the circle. The declaration pathHomotopicRel_const_of_loop_winding_zero states: if a path on the circle is a loop (its endpoints agree) and its winding number is zero, then the loop is homotopic relative to its endpoints to the constant path at that point. In plain words, zero winding means the loop can be tightened to a dot. The proof works by lifting the loop to the real line through the circle's covering map, showing the lift's endpoints coincide when winding is zero, and then constructing the deformation in the line before projecting back down.
The theorem is not a new discovery; it is a formal verification of a standard result. What it adds is certainty: the proof is checked by a computer, with no gaps and no unstated assumptions. The library also proves the companion facts that make the theorem usable: the winding number of a loop is always an integer, the fundamental loop has winding exactly 1, and the displacement of a path is unchanged by homotopies that fix the endpoints. Together these form a small, verified toolkit for reasoning about loops on a circle.
What the theorem does not claim is just as important. It does not say that a loop with nonzero winding cannot be shrunk; that is a separate statement, also true, but not part of this declaration. It does not apply to paths on other surfaces, such as a sphere or a torus, where the topology is different. And it does not connect the winding number to any physical quantity; the circle here is a purely mathematical object, not a model of anything in the framework's physics.
THEOREM pathHomotopicRel_const_of_loop_winding_zero · IndisputableMonolith/Foundation/CircleWinding.lean
/-- A closed path in `S¹` with zero winding is homotopic rel endpoints to the
constant path at its basepoint. The homotopy lifts the path to `ℝ`, uses zero
winding to identify the lift endpoints, and contracts the lifted path linearly
to its initial value before projecting back through the covering map. -/
theorem pathHomotopicRel_const_of_loop_winding_zero (γ : C(I, SphereOne))
(hloop : γ 1 = γ 0) (hw : pathWinding γ = 0) :
γ.HomotopicRel (ContinuousMap.const I (γ 0)) {0, 1} := by
have hlift_end : pathLift γ 1 = pathLift γ 0 := by
exact pathLift_endpoint_eq_of_winding_zero γ hw
let Hmap : C(I × I, SphereOne) := {
toFun p :=
trigCirclePoint
((1 - ((p.1 : I) : ℝ)) * pathLift γ p.2 +
((p.1 : I) : ℝ) * pathLift γ 0)
continuous_toFun := by
exact continuous_trigCirclePoint.comp (by continuity)
}
let H : γ.Homotopy (ContinuousMap.const I (γ 0)) :=
ContinuousMap.Homotopy.mk Hmap
(by
intro x
change trigCirclePoint
((1 - (((0 : I) : I) : ℝ)) * pathLift γ x +
(((0 : I) : I) : ℝ) * pathLift γ 0) = γ x
simp
exact congrFun (pathLift_lifts γ) x)
(by
intro x
change trigCirclePoint
((1 - (((1 : I) : I) : ℝ)) * pathLift γ x +
(((1 : I) : I) : ℝ) * pathLift γ 0) =
(ContinuousMap.const I (γ 0)) x
simp
exact congrFun (pathLift_lifts γ) 0)
refine ⟨ContinuousMap.HomotopyWith.mk H ?_⟩
intro t x hx
rcases hx with hx | hx
· subst x
change trigCirclePoint
((1 - ((t : I) : ℝ)) * pathLift γ 0 +
((t : I) : ℝ) * pathLift γ 0) = γ 0
rw [← congrFun (pathLift_lifts γ) 0]
congr 1
ring
· subst x
change trigCirclePoint
((1 - ((t : I) : ℝ)) * pathLift γ 1 +
((t : I) : ℝ) * pathLift γ 0) = γ 1
rw [hlift_end]
rw [hloop]
rw [← congrFun (pathLift_lifts γ) 0]
congr 1
ring
THEOREM pathWinding_loop_integral · IndisputableMonolith/Foundation/CircleWinding.lean
/-- A closed path has integer winding. -/
theorem pathWinding_loop_integral (γ : C(I, SphereOne)) (hloop : γ 1 = γ 0) :
∃ k : ℤ, pathWinding γ = (k : ℝ) := by
obtain ⟨k, hk⟩ := pathDisplacement_loop_intMul γ hloop
refine ⟨k, ?_⟩
rw [pathWinding, hk]
have hpi : (2 : ℝ) * Real.pi ≠ 0 := by positivity
field_simp [hpi]
THEOREM pathWinding_fundamentalLoop · IndisputableMonolith/Foundation/CircleWinding.lean
/-- **The winding number of the fundamental loop is `1`.** The winding invariant
is therefore a left inverse to the fundamental loop class on the nose: it sends
the canonical generator to `1`. -/
theorem pathWinding_fundamentalLoop : pathWinding fundamentalLoop = 1 := by
rw [pathWinding, pathDisplacement_fundamentalLoop]
have hpi : (2 : ℝ) * Real.pi ≠ 0 := by positivity
field_simp
THEOREM pathDisplacement_homotopic · IndisputableMonolith/Foundation/CircleWinding.lean
/-- **Homotopy invariance of the displacement.** If two paths are homotopic
relative to their endpoints, they have the same displacement. This is the core
mechanism by which the winding invariant kills boundaries: the boundary loop of a
singular `2`-simplex is null-homotopic in the contractible standard simplex, so
its displacement vanishes. -/
theorem pathDisplacement_homotopic {γ δ : C(I, SphereOne)}
(h : γ.HomotopicRel δ {0, 1}) : pathDisplacement γ = pathDisplacement δ := by
have hend : γ 0 = δ 0 := homotopicRel_apply_zero h
have he_γ : γ 0 = trigCirclePoint (pathLiftStart γ) := (pathLiftStart_spec γ).symm
have he_δ : δ 0 = trigCirclePoint (pathLiftStart γ) := by rw [← hend]; exact he_γ
have key : isCoveringMap_trig.liftPath γ (pathLiftStart γ) he_γ 1
= isCoveringMap_trig.liftPath δ (pathLiftStart γ) he_δ 1 :=
isCoveringMap_trig.liftPath_apply_one_eq_of_homotopicRel h (pathLiftStart γ) he_γ he_δ
have dγ : pathDisplacement γ
= isCoveringMap_trig.liftPath γ (pathLiftStart γ) he_γ 1 - pathLiftStart γ := by
rw [pathDisplacement_eq γ (isCoveringMap_trig.liftPath γ (pathLiftStart γ) he_γ)
(isCoveringMap_trig.liftPath_lifts γ (pathLiftStart γ) he_γ),
isCoveringMap_trig.liftPath_zero γ (pathLiftStart γ) he_γ]
have dδ : pathDisplacement δ
= isCoveringMap_trig.liftPath δ (pathLiftStart γ) he_δ 1 - pathLiftStart γ := by
rw [pathDisplacement_eq δ (isCoveringMap_trig.liftPath δ (pathLiftStart γ) he_δ)
(isCoveringMap_trig.liftPath_lifts δ (pathLiftStart γ) he_δ),
isCoveringMap_trig.liftPath_zero δ (pathLiftStart γ) he_δ]
rw [dγ, dδ, key]
What this page does not claim
The theorem does not show that loops with nonzero winding cannot be shrunk. The theorem does not apply to paths on surfaces other than the circle. The winding number is not connected to any physical quantity in this declaration.
Verify this page
Every tagged claim above names its theorem. To check one yourself rather than trust this page, elaborate the source module with Lean 4 and audit its axiom basis:
$ lake env lean IndisputableMonolith/Foundation/CircleWinding.lean
expected axiom basis: [propext, Classical.choice, Quot.sound] (the Lean kernel's standard three; no RS-specific axioms)
A page whose claims cannot be reproduced this way does not ship. In production, every anchor links to the exact declaration in the public source release, and this block carries the build receipt for the page itself.
Derived articles
This page is generated by a question-recursion engine: the questions its answers raise become the next pages. The current agenda, with open targets marked red:
- What is the proof that a loop with nonzero winding cannot be shrunk to a point?
- How does the framework's covering map construction generalize to other spaces with nontrivial fundamental groups?
- What role does the winding invariant play in the framework's broader forcing chain?
MACHINE LAYER · GROUNDED CLAIM TABLE · CLICK TO EXPAND
THEOREM pathHomotopicRel_const_of_loop_winding_zero · IndisputableMonolith/Foundation/CircleWinding.lean
/-- A closed path in `S¹` with zero winding is homotopic rel endpoints to the constant path at its basepoint. The homotopy lifts the path to `ℝ`, uses zero winding to identify the lift endpoints, and contracts the lifted path linearly to its initial value before projecting back through the covering map. -/ theorem pathHomotopicRel_const_of_loop_winding_zero (γ : C(I, SphereOne)) (hloop : γ 1 = γ 0) (hw : pathWinding γ = 0) : γ.HomotopicRel (ContinuousMap.const I (γ 0)) {0, 1} := by have hlift_end : pathLift γ 1 = pathLift γ 0 := by exact pathLift_endpoint_eq_of_winding_zero γ hw let Hmap : C(I × I, SphereOne) := { toFun p := trigCirclePoint ((1 - ((p.1 : I) : ℝ)) * pathLift γ p.2 + ((p.1 : I) : ℝ) * pathLift γ 0) continuous_toFun := by exact continuous_trigCirclePoint.comp (by continuity) } let H : γ.Homotopy (ContinuousMap.const I (γ 0)) := ContinuousMap.Homotopy.mk Hmap (by intro x change trigCirclePoint ((1 - (((0 : I) : I) : ℝ)) * pathLift γ x + (((0 : I) : I) : ℝ) * pathLift γ 0) = γ x simp exact congrFun (pathLift_lifts γ) x) (by intro x change trigCirclePoint ((1 - (((1 : I) : I) : ℝ)) * pathLift γ x + (((1 : I) : I) : ℝ) * pathLift γ 0) = (ContinuousMap.const I (γ 0)) x simp exact congrFun (pathLift_lifts γ) 0) refine ⟨ContinuousMap.HomotopyWith.mk H ?_⟩ intro t x hx rcases hx with hx | hx · subst x change trigCirclePoint ((1 - ((t : I) : ℝ)) * pathLift γ 0 + ((t : I) : ℝ) * pathLift γ 0) = γ 0 rw [← congrFun (pathLift_lifts γ) 0] congr 1 ring · subst x change trigCirclePoint ((1 - ((t : I) : ℝ)) * pathLift γ 1 + ((t : I) : ℝ) * pathLift γ 0) = γ 1 rw [hlift_end] rw [hloop] rw [← congrFun (pathLift_lifts γ) 0] congr 1 ringif a path on the circle is a loop (its endpoints agree) and its winding number is zero, then the loop is homotopic relative to its endpoints to the constant path at that point pathHomotopicRel_const_of_loop_winding_zero · IndisputableMonolith/Foundation/CircleWinding.leanTHEOREM pathWinding_loop_integral · IndisputableMonolith/Foundation/CircleWinding.lean
/-- A closed path has integer winding. -/ theorem pathWinding_loop_integral (γ : C(I, SphereOne)) (hloop : γ 1 = γ 0) : ∃ k : ℤ, pathWinding γ = (k : ℝ) := by obtain ⟨k, hk⟩ := pathDisplacement_loop_intMul γ hloop refine ⟨k, ?_⟩ rw [pathWinding, hk] have hpi : (2 : ℝ) * Real.pi ≠ 0 := by positivity field_simp [hpi]the winding number of a loop is always an integer pathWinding_loop_integral · IndisputableMonolith/Foundation/CircleWinding.leanTHEOREM pathWinding_fundamentalLoop · IndisputableMonolith/Foundation/CircleWinding.lean
/-- **The winding number of the fundamental loop is `1`.** The winding invariant is therefore a left inverse to the fundamental loop class on the nose: it sends the canonical generator to `1`. -/ theorem pathWinding_fundamentalLoop : pathWinding fundamentalLoop = 1 := by rw [pathWinding, pathDisplacement_fundamentalLoop] have hpi : (2 : ℝ) * Real.pi ≠ 0 := by positivity field_simpthe fundamental loop has winding exactly 1 pathWinding_fundamentalLoop · IndisputableMonolith/Foundation/CircleWinding.leanTHEOREM pathDisplacement_homotopic · IndisputableMonolith/Foundation/CircleWinding.lean
/-- **Homotopy invariance of the displacement.** If two paths are homotopic relative to their endpoints, they have the same displacement. This is the core mechanism by which the winding invariant kills boundaries: the boundary loop of a singular `2`-simplex is null-homotopic in the contractible standard simplex, so its displacement vanishes. -/ theorem pathDisplacement_homotopic {γ δ : C(I, SphereOne)} (h : γ.HomotopicRel δ {0, 1}) : pathDisplacement γ = pathDisplacement δ := by have hend : γ 0 = δ 0 := homotopicRel_apply_zero h have he_γ : γ 0 = trigCirclePoint (pathLiftStart γ) := (pathLiftStart_spec γ).symm have he_δ : δ 0 = trigCirclePoint (pathLiftStart γ) := by rw [← hend]; exact he_γ have key : isCoveringMap_trig.liftPath γ (pathLiftStart γ) he_γ 1 = isCoveringMap_trig.liftPath δ (pathLiftStart γ) he_δ 1 := isCoveringMap_trig.liftPath_apply_one_eq_of_homotopicRel h (pathLiftStart γ) he_γ he_δ have dγ : pathDisplacement γ = isCoveringMap_trig.liftPath γ (pathLiftStart γ) he_γ 1 - pathLiftStart γ := by rw [pathDisplacement_eq γ (isCoveringMap_trig.liftPath γ (pathLiftStart γ) he_γ) (isCoveringMap_trig.liftPath_lifts γ (pathLiftStart γ) he_γ), isCoveringMap_trig.liftPath_zero γ (pathLiftStart γ) he_γ] have dδ : pathDisplacement δ = isCoveringMap_trig.liftPath δ (pathLiftStart γ) he_δ 1 - pathLiftStart γ := by rw [pathDisplacement_eq δ (isCoveringMap_trig.liftPath δ (pathLiftStart γ) he_δ) (isCoveringMap_trig.liftPath_lifts δ (pathLiftStart γ) he_δ), isCoveringMap_trig.liftPath_zero δ (pathLiftStart γ) he_δ] rw [dγ, dδ, key]the displacement of a path is unchanged by homotopies that fix the endpoints pathDisplacement_homotopic · IndisputableMonolith/Foundation/CircleWinding.lean