WithRewriting

Tom de Jong, 19 June 2026.

Updated on 26 June 2026 to remove the definitional computation rules for path
constructors, in line with the HoTT Book.
Updated 5 July 2026 to derive the recursion principle with a definitional point
computation rule from the induction principle.

We postulate the existence of the circle S¹ with a definitional computation rule
at the point using Agda's rewriting mechanism and derive its (dependent)
universal property.


{-# OPTIONS --rewriting --without-K #-}

module SyntheticHomotopyTheory.Circle.WithRewriting where

open import MLTT.Spartan
open import UF.Base
open import UF.Equiv
open import UF.FunExt

{-# BUILTIN REWRITE _=_ #-}

postulate
 S¹ : 𝓤₀ ̇
 pt : S¹
 loop : pt = pt

 S¹-induction : (A : S¹ → 𝓤 ̇ ) (a : A pt) (l : transport A loop a = a)
              → (s : S¹) → A s

 S¹-induction-comp-pt : (A : S¹ → 𝓤 ̇ ) (a : A pt) (l : transport A loop a = a)
                      → S¹-induction A a l pt = a

 {-# REWRITE S¹-induction-comp-pt #-}

 S¹-induction-comp-loop
  : (A : S¹ → 𝓤 ̇ ) (a : A pt) (l : transport A loop a = a)
  → apd (S¹-induction A a l) loop = l

S¹-recursion : (A : 𝓤 ̇ ) (a : A) → a = a → S¹ → A
S¹-recursion A a l = S¹-induction (λ _ → A) a (transport-const loop ∙ l)

private
 S¹-recursion-comp-pt : (A : 𝓤 ̇ ) (a : A) (l : a = a)
                      → S¹-recursion A a l pt = a
 S¹-recursion-comp-pt A a l = refl

S¹-recursion-comp-loop : (A : 𝓤 ̇ ) (a : A) (l : a = a)
                       → ap (S¹-recursion A a l) loop = l
S¹-recursion-comp-loop A a l =
 ap f loop         =⟨refl⟩
 ap g loop         =⟨ apd-from-ap g loop ⟩
 p ⁻¹ ∙ apd g loop =⟨ e ⟩
 p ⁻¹ ∙ (p ∙ l)    =⟨ (∙assoc (p ⁻¹) p l) ⁻¹ ⟩
 (p ⁻¹ ∙ p) ∙ l    =⟨ ap (_∙ l) (left-inverse p) ⟩
 refl ∙ l          =⟨ refl-left-neutral ⟩
 l                 ∎
  where
   p : transport (λ _ → A) loop a = a
   p = transport-const loop
   f = S¹-recursion A a l
   g = S¹-induction (λ _ → A) a (p ∙ l)
   e = ap (p ⁻¹ ∙_) (S¹-induction-comp-loop (λ _ → A) a (p ∙ l))


The above rewrite rule amounts to the first components being refl in the below
proofs.


S¹-recursion-comp : (A : 𝓤 ̇ )
                    (a : A)
                    (l : a = a)
                  → let f = S¹-recursion A a l in
                    (f pt , ap f loop) =
                    ((a , l) ∶ (Σ a' ꞉ A , a' = a'))
S¹-recursion-comp A a l = to-Σ-= (refl , S¹-recursion-comp-loop A a l)

S¹-induction-comp : (A : S¹ → 𝓤 ̇ )
                    (a : A pt)
                    (l : transport A loop a = a)
                  → let f = S¹-induction A a l in
                    (f pt , apd f loop) =
                    ((a , l) ∶ (Σ a' ꞉ A pt , transport A loop a' = a'))
S¹-induction-comp A a l = to-Σ-= (refl , S¹-induction-comp-loop A a l)


Assuming function extensionality, we can derive the (dependent) universal
property.


S¹-universal-property : funext 𝓤₀ 𝓤 → (A : 𝓤 ̇ )
                      → is-equiv ((λ f → f pt , ap f loop)
                                   ∶ ((S¹ → A) → Σ a ꞉ A , a = a))
S¹-universal-property fe A =
 qinvs-are-equivs _ ((λ (a , l) → S¹-recursion A a l) , II , I)
  where
   I : ((a , l) : Σ a ꞉ A , a = a)
     → (S¹-recursion A a l pt , ap (S¹-recursion A a l) loop) = (a , l)
   I (a , l) = S¹-recursion-comp A a l

   II : (λ f → S¹-recursion A (f pt) (ap f loop)) ∼ id
   II f = dfunext fe III
    where
     g : S¹ → A
     g = S¹-recursion A (f pt) (ap f loop)

     III : (s : S¹) → S¹-recursion A (f pt) (ap f loop) s = f s
     III = S¹-induction _ refl IV
      where
       IV : transport (λ - → g - = f -) loop refl = refl
       IV = transport (λ - → g - = f -) loop refl =⟨ IV₁ ⟩
            ap g loop ⁻¹ ∙ refl ∙ ap f loop        =⟨refl⟩
            ap g loop ⁻¹ ∙ ap f loop               =⟨ IV₃ ⟩
            ap f loop ⁻¹ ∙ ap f loop               =⟨ IV₂ ⟩
            refl                                   ∎
        where
         IV₁ = transport-after-ap' loop g f refl
         IV₂ = left-inverse (ap f loop)
         IV₃ = ap (λ - → - ⁻¹ ∙ ap f loop)
                  (S¹-recursion-comp-loop A (f pt) (ap f loop))

S¹-universal-property-≃
 : funext 𝓤₀ 𝓤 → (A : 𝓤 ̇ )
 → (S¹ → A) ≃ (Σ a ꞉ A , a = a)
S¹-universal-property-≃ fe A =
 (λ f → f pt , ap f loop) , S¹-universal-property fe A

S¹-dependent-universal-property
 : funext 𝓤₀ 𝓤 → (A : S¹ → 𝓤 ̇ )
 → is-equiv ((λ f → f pt , apd f loop)
              ∶ ((Π s ꞉ S¹ , A s) → Σ a ꞉ A pt , transport A loop a = a))
S¹-dependent-universal-property fe A =
 qinvs-are-equivs (λ f → f pt , apd f loop)
                  ((λ (a , l) → S¹-induction A a l) ,
                   I ,
                   (λ _ → S¹-induction-comp A _ _))
  where
   I : (λ f → S¹-induction A (f pt) (apd f loop)) ∼ id
   I f = dfunext fe II
    where
     II : (s : S¹) → S¹-induction A (f pt) (apd f loop) s = f s
     II = S¹-induction _ refl III
      where
       g : (s : S¹) → A s
       g = S¹-induction A (f pt) (apd f loop)
       III =
        transport (λ - → g - = f -) loop refl                  =⟨ III₁ ⟩
        apd g loop ⁻¹ ∙ ap (transport A loop) refl ∙ apd f loop =⟨ III₂ ⟩
        apd f loop ⁻¹ ∙ ap (transport A loop) refl ∙ apd f loop =⟨ III₃ ⟩
        apd f loop ⁻¹ ∙ refl ∙ apd f loop                       =⟨refl⟩
        apd f loop ⁻¹ ∙ apd f loop                              =⟨ III₄ ⟩
        refl                                                    ∎
         where
          III₁ = transport-after-ap'-dependent g f loop refl
          III₂ = ap (λ - → - ⁻¹ ∙ ap (transport A loop) refl ∙ apd f loop)
                    (S¹-induction-comp-loop A (f pt) (apd f loop))
          III₃ = ap (λ - → apd f loop ⁻¹ ∙ - ∙ apd f loop)
                    (ap-refl (transport A loop))
          III₄ = left-inverse (apd f loop)

S¹-dependent-universal-property-≃
 : funext 𝓤₀ 𝓤 → (A : S¹ → 𝓤 ̇ )
 → (Π s ꞉ S¹ , A s) ≃ (Σ a ꞉ A pt , transport A loop a = a)
S¹-dependent-universal-property-≃ fe A =
 (λ f → f pt , apd f loop) , S¹-dependent-universal-property fe A