Encyclopedia Foundation Foundation Circle Winding Path Winding Fundamental Loop

ARTICLE 4 claims 4 theorems

Foundation Circle Winding Path Winding Fundamental Loop

The winding number counts how many times a path wraps around a circle; one full loop has winding number 1.

The winding number of one full turn

A path on a circle can wrap around it any whole number of times, and the winding number is the count of those wraps. A path that starts and ends at the same point but goes once around the circle has winding number 1. A path that goes twice around has winding number 2, and a path that goes around in the opposite direction has winding number -1. The winding number is a topological invariant: it stays the same when the path is deformed continuously without moving its endpoints.

The winding number is computed by lifting the path to the real line, where a point on the circle is represented by an angle plus any multiple of 2π. A continuous lift of a path on the circle is a path on the real line that projects down to the original path. The displacement of the lift, the difference between its final and initial values, is independent of which lift is chosen. Dividing this displacement by 2π gives the winding number. For a loop, the displacement is always an integer multiple of 2π, so the winding number is always an integer.

The fundamental loop is the path that goes once around the circle, tracing the angle from 0 to 2π. Its lift on the real line is the straight line from 0 to 2π. The displacement of that lift is 2π, so the winding number of the fundamental loop is 1. This is the theorem pathWinding_fundamentalLoop in the framework's machine-checked library of formal theorems. It is a proof that the definition of winding number gives the expected value for the simplest nontrivial loop.

The theorem also has a converse. If a loop has winding number 0, then it can be continuously shrunk to a point without breaking the loop. This is the theorem pathHomotopicRel_const_of_loop_winding_zero. Together these two theorems characterize the loops on a circle: a loop can be shrunk to a point if and only if its winding number is 0, and any other integer winding number describes a loop that cannot be shrunk without leaving the circle.

In Recognition Science, this winding number is a tool for measuring how a path in the fundamental space winds around its own structure. The framework models the circle as the exact TopCat.sphere 1 object and defines the winding number as a real number, not just an integer. The theorem that the fundamental loop has winding number 1 is a basic calibration: it fixes the unit of winding. The framework's library proves this without any axioms beyond the standard three, and without any project-local replacements for the circle.

The winding number is a classical and well-understood invariant. The framework's contribution is to formalize it in a machine-checked library, with all the definitions and proofs written out in full. The theorem pathWinding_fundamentalLoop is a small but necessary step in that formalization. It does not claim to derive the winding number from the framework's cost function or from any other Recognition Science principle. It is a theorem about a standard mathematical object, proved in a standard way.

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_eq · IndisputableMonolith/Foundation/CircleWinding.lean
/-- **Lift independence.**  The displacement computed from the canonical lift
equals the endpoint difference of *any* continuous lift `Γ` of the path.  Two
lifts that agree on the same fiber differ by a constant in the deck group `2πℤ`,
so their endpoint differences coincide. -/
theorem pathDisplacement_eq (γ : C(I, SphereOne)) (Γ : C(I, ℝ))
    (hΓ : trigCirclePoint ∘ (Γ : I → ℝ) = γ) :
    pathDisplacement γ = Γ 1 - Γ 0 := by
  set Γ' := pathLift γ with hΓ'def
  -- The two lift starts lie in the same fiber, hence differ by `k • (2π)`.
  have hfib : trigCirclePoint (Γ 0) = trigCirclePoint (Γ' 0) := by
    have h1 : trigCirclePoint (Γ 0) = γ 0 := congrFun hΓ 0
    have h2 : trigCirclePoint (Γ' 0) = γ 0 := congrFun (pathLift_lifts γ) 0
    rw [h1, h2]
  obtain ⟨k, hk⟩ := (trigCirclePoint_eq_iff (Γ 0) (Γ' 0)).1 hfib
  set c : ℝ := (k : ℝ) * (2 * Real.pi) with hcdef
  -- `Γ' + c` is also a lift, and agrees with `Γ` at `0`.
  have hshift_lifts : trigCirclePoint ∘ (fun t : I => Γ' t + c) = γ := by
    funext t
    have : trigCirclePoint (Γ' t + c) = trigCirclePoint (Γ' t) :=
      trigCirclePoint_add_intMul_period (Γ' t) k
    rw [Function.comp_apply, this]
    exact congrFun (pathLift_lifts γ) t
  have hagree0 : Γ 0 = (fun t : I => Γ' t + c) 0 := by
    simp only [hcdef]; rw [hk]
  -- Lift uniqueness on the connected interval forces equality.
  have huniq : (fun t : I => Γ t) = (fun t : I => Γ' t + c) :=
    isCoveringMap_trig.eq_of_comp_eq Γ.continuous
      (Γ'.continuous.add continuous_const)
      (by rw [hΓ, hshift_lifts]) 0 hagree0
  have hone : Γ 1 = Γ' 1 + c := congrFun huniq 1
  have hzero : Γ 0 = Γ' 0 + c := congrFun huniq 0
  simp only [pathDisplacement, ← hΓ'def]
  rw [hone, hzero]; ring
THEOREM pathDisplacement_loop_intMul · IndisputableMonolith/Foundation/CircleWinding.lean
pathDisplacement_loop_intMul · IndisputableMonolith/Foundation/CircleWinding.lean:223
/-- A closed path has displacement equal to an integer number of full turns. -/
theorem pathDisplacement_loop_intMul (γ : C(I, SphereOne)) (hloop : γ 1 = γ 0) :
    ∃ k : ℤ, pathDisplacement γ = (k : ℝ) * (2 * Real.pi) := by
  have hfib : trigCirclePoint (pathLift γ 1) = trigCirclePoint (pathLift γ 0) := by
    have h1 : trigCirclePoint (pathLift γ 1) = γ 1 := congrFun (pathLift_lifts γ) 1
    have h0 : trigCirclePoint (pathLift γ 0) = γ 0 := congrFun (pathLift_lifts γ) 0
    rw [h1, h0, hloop]
  obtain ⟨k, hk⟩ := (trigCirclePoint_eq_iff (pathLift γ 1) (pathLift γ 0)).1 hfib
  refine ⟨k, ?_⟩
  rw [pathDisplacement_self, hk]
  ring
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

What this page does not claim

The winding number is not derived from the Recognition Science cost function or any other framework principle. The theorem does not claim that the fundamental loop is the only loop with winding number 1. The theorem does not claim that every loop with winding number 1 is homotopic to the fundamental loop.

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