{-# OPTIONS --without-K --rewriting --overlapping-instances #-} module Pi.Coxeter.Norm where open import HoTT open import Pi.Coxeter.Sn open import Pi.Coxeter.Coxeter open import Pi.Coxeter.LehmerCoxeterEquiv open import Pi.Common.Extra open import Pi.Common.Misc norm : {n : ℕ} → (l : List (Fin n)) → List (Fin n) norm {O} nil = nil norm {S n} l = immersion code where code = ListFin-to-Lehmer l .fst norm-≈* : {n : ℕ} → (l : List (Fin n)) → l ≈* norm l norm-≈* {O} nil = idp norm-≈* {S n} l = code≈* where code = ListFin-to-Lehmer l .fst code≈* = ListFin-to-Lehmer l .snd norm-norm : {n : ℕ} → (l : List (Fin n)) → norm l == norm (norm l) norm-norm {O} nil = idp norm-norm {S n} l = let z = immersion-is-injection (immersion⁻¹ l) ((immersion⁻¹ (norm l))) (norm-≈* (norm l)) in ap immersion z ≈*-norm : {n : ℕ} {l1 l2 : List (Fin n)} → l1 ≈* l2 → norm l1 == norm l2 ≈*-norm {O} {nil} {nil} r = idp ≈*-norm {S n} {l1} {l2} r = ap immersion (immersion⁻¹-respects≈ r) instance List-level : ∀ {n} {i} {A : Type i} → {{_ : has-level n A}} → has-level n (List A) List-level = TODO- norm-inc : {n : ℕ} → Sn n → List (Fin n) norm-inc w = SetQuot-rec ⦃ List-level {{Fin-is-set}} ⦄ norm ≈*-norm w norm-inc-right-inv : {n : ℕ} (w : Sn n) → q[ norm-inc w ] == w norm-inc-right-inv = SetQuot-elim (λ l → quot-rel (comm (norm-≈* l))) λ r → prop-has-all-paths-↓ module _ {i j} {A : Type i} {B : Type j} where has-section : (f : A → B) → Type (lmax i j) has-section f = Σ (B → A) (λ g → f ∘ g ∼ idf B) has-hfiber-has-section : {f : A → B} → ((b : B) → hfiber f b) → has-section f has-hfiber-has-section h = fst ∘ h , snd ∘ h module _ {i j} {A : Type i} {B : Type j} where im : (n : ℕ₋₂) (f : A → B) → Type (lmax i j) im n f = Σ B (λ b → Trunc n (hfiber f b)) restrict : {n : ℕ₋₂} (f : A → B) → A → im n f restrict f a = f a , [ a , idp ] restrict-has-section : {n : ℕ₋₂} {{_ : has-level n A}} {{_ : has-level (S n) B}} {f : A → B} → has-section (restrict {n = n} f) restrict-has-section {n} {f} = s , s-is-section where s : im n f → A s (b , ϕ) = Trunc-rec fst ϕ s-is-section : restrict f ∘ s ∼ idf (im n f) s-is-section (b , ϕ) = Trunc-elim {P = λ ψ → (restrict f ∘ s) (b , ψ) == idf (im n f) (b , ψ)} {{λ {x} → has-level-apply-instance {{Σ-level ⟨⟩ λ _ → raise-level _ ⟨⟩}}}} (λ { (a , idp) → idp }) ϕ module _ {i j} {A : Type i} {B : Type j} where has-retraction : (f : A → B) → Type (lmax i j) has-retraction f = Σ (B → A) (λ g → g ∘ f ∼ idf A) module _ {i j} {B : Type j} where is-retract : Type i → Type (lmax i j) is-retract A = Σ (A → B) (λ i → Σ (B → A) λ r → r ∘ i ∼ idf A ) module _ {i} {A : Type i} where is-idempotent : (f : A → A) → Type i is-idempotent f = (f ∘ f) ∼ f is-split-idempotent : (f : A → A) → Type (lsucc i) is-split-idempotent f = is-idempotent f × Σ (Type i) (λ B → Σ (A → B) (λ r → Σ (B → A) (λ s → (s ∘ r ∼ f) × (r ∘ s ∼ idf B)))) q-norm-has-section : {n : ℕ} → has-section (q[_] ∘ norm {n}) q-norm-has-section = norm-inc , SetQuot-elim (λ w → quot-rel (comm (norm-≈* w ■ norm-≈* (norm w)))) (λ r → prop-has-all-paths-↓) norm-is-idempotent : {n : ℕ} → is-idempotent (norm {n}) norm-is-idempotent l = ! (norm-norm l) norm-is-split-idempotent : {n : ℕ} → is-split-idempotent norm norm-is-split-idempotent {n} = norm-is-idempotent , Sn n , q[_] , norm-inc , (λ l → idp) , norm-inc-right-inv Sn-is-retract : {n : ℕ} → is-retract (Sn n) Sn-is-retract = norm-inc , q[_] , SetQuot-elim (λ l → quot-rel (comm (norm-≈* l))) λ r → prop-has-all-paths-↓ Sn-is-retract2 : {n : ℕ} → is-retract (Sn n) Sn-is-retract2 = norm-inc , q[_] ∘ norm , SetQuot-elim (λ l → ! (quot-rel (norm-≈* l) ∙ quot-rel (norm-≈* (norm l)))) λ r → prop-has-all-paths-↓ is-norm : {n : ℕ} → List (Fin n) → Type₀ is-norm l = norm l == l module _ {i} {A : Type i} {j} {R : Rel A j} where q-is-surj : is-surj (q[_] {R = R}) q-is-surj = SetQuot-elim ⦃ raise-level _ Trunc-level ⦄ (λ a → [ a , idp ]) λ r → prop-has-all-paths-↓ SetQuot≃im-q : SetQuot R ≃ im -1 (q[_] {R = R}) SetQuot≃im-q = equiv f g f-g g-f where f : SetQuot R → im -1 q[_] f = SetQuot-rec ⦃ Σ-level-instance {{⟨⟩}} {{raise-level _ ⟨⟩}} ⦄ (λ a → q[ a ] , [ a , idp ]) (λ r → pair= (quot-rel r) prop-has-all-paths-↓) g : im -1 q[_] → SetQuot R g = fst f-g : (x : im (S ⟨-2⟩) q[_]) → f (g x) == x f-g (x , ϕ) = Trunc-elim {P = λ ψ → f (g (x , ψ)) == x , ψ} ⦃ has-level-apply (Σ-level-instance {{⟨⟩}} {{raise-level _ ⟨⟩}}) _ _ ⦄ (λ { (a , idp) → idp }) ϕ g-f : (x : SetQuot R) → g (f x) == x g-f = SetQuot-elim (λ a → idp) (λ r → prop-has-all-paths-↓) norm-q-is-surj : {n : ℕ} → is-surj (q[_] {R = _≈*_}) norm-q-is-surj {n} w = [ norm-inc {n} w , norm-inc-right-inv w ] Sn≃im-q-norm : {n : ℕ} → Sn n ≃ im -1 ((q[_] {R = _≈*_}) ∘ norm {n}) Sn≃im-q-norm = transport-equiv (im -1) (λ= (quot-rel ∘ norm-≈*)) ∘e SetQuot≃im-q Sn≃im-norm : {n : ℕ} → Sn n ≃ im -1 (norm {n}) Sn≃im-norm {n} = equiv f g f-g g-f where instance _ = Fin-is-set f : Sn n → im -1 (norm {n}) f = SetQuot-rec ⦃ Σ-level-instance {{⟨⟩}} {{raise-level _ ⟨⟩}} ⦄ (λ w → norm w , [ w , idp ]) (λ r → pair= (≈*-norm r) prop-has-all-paths-↓) g : im -1 (norm {n}) → Sn n g (l , ϕ) = q[ l ] f-g : (x : im -1 norm) → f (g x) == x f-g (l , ϕ) = Trunc-elim {P = λ ψ → f (g (l , ψ)) == l , ψ} ⦃ has-level-apply (Σ-level-instance {{⟨⟩}} {{raise-level _ ⟨⟩}}) _ _ ⦄ (λ { (w , ψ) → pair= (! (norm-norm w ∙ ap norm ψ) ∙ ψ) prop-has-all-paths-↓ }) ϕ g-f : (x : Sn n) → g (f x) == x g-f = SetQuot-elim (λ l → quot-rel (comm (norm-≈* l))) (λ r → prop-has-all-paths-↓) im-q-im-norm : {n : ℕ} → im -1 (q[_] {R = _≈*_}) ≃ im -1 (norm {n}) im-q-im-norm {n} = Sn≃im-norm ∘e SetQuot≃im-q ⁻¹