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
pathHomotopicRel_const_of_loop_winding_zero · IndisputableMonolith/Foundation/CircleWinding.lean:313
/-- 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
pathWinding_loop_integral · IndisputableMonolith/Foundation/CircleWinding.lean:235
/-- 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
pathWinding_fundamentalLoop · IndisputableMonolith/Foundation/CircleWinding.lean:267
/-- **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
pathDisplacement_homotopic · IndisputableMonolith/Foundation/CircleWinding.lean:149
/-- **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:

MACHINE LAYER · GROUNDED CLAIM TABLE · CLICK TO EXPAND