{-# OPTIONS --rewriting --without-K --overlapping-instances #-} module Pi.Lehmer.LehmerFinEquiv where open import HoTT hiding (_≤_; _<_; ≤-has-all-paths ; ltS ; ltSR) import lib.types.Nat as N open import Pi.Common.Extra open import Pi.Lehmer.FinExcept open import Pi.Lehmer.Lehmer open import Pi.Common.InequalityEquiv open import Pi.Common.Arithmetic open import Pi.Coxeter.InvTransform open import Pi.UFin.BAut open import Pi.Common.Misc open import Pi.Common.Extra ≤→< : {k n : ℕ} -> (k ≤ n) -> (k < S n) ≤→< z≤n = s≤s z≤n ≤→< (s≤s p) = s≤s (≤→< p) LehmerInd : {n : ℕ} -> (Fin (S (S n))) × Lehmer n ≃ Lehmer (S n) LehmerInd {n} = equiv f g f-g g-f where f : _ f ((x , p) , l) = CanS l (≤-down2 ((–> <N≃< p))) g : _ g (CanS l {r} p) = (r , <– <N≃< (≤→< p)) , l f-g : _ f-g (CanS l {r} p) = ap (CanS l) (≤-has-all-paths _ _) g-f : _ g-f ((x , p) , l) = pair= (pair= idp (<-has-all-paths _ _)) (↓-cst-in idp) Coprod-≃-r : {A B C : Type₀} -> (A ≃ B) -> (A ⊔ C) ≃ (B ⊔ C) Coprod-≃-r e = equiv f g f-g g-f where f : _ f (inr x) = inr x f (inl x) = inl (–> e x) g : _ g (inr x) = inr x g (inl x) = inl (<– e x) f-g : _ f-g (inr x) = idp f-g (inl x) = ap inl (<–-inv-r e x) g-f : _ g-f (inr x) = idp g-f (inl x) = ap inl (<–-inv-l e x) instance Lehmer-O-level : is-contr (Lehmer O) Lehmer-O-level = has-level-in (CanZ , λ { CanZ → idp }) Lehmer-level : {n : ℕ} → is-set (Lehmer n) Lehmer-level {O} = contr-is-set Lehmer-O-level Lehmer-level {S n} = let ind = LehmerInd {n} rec = Lehmer-level {n} in equiv-preserves-level {B = Lehmer (S n)} ind {{×-level Fin-is-set rec}} Fin≃Lehmer-aux : {n : ℕ} -> Aut (Fin (S n)) ≃ Lehmer n Fin≃Lehmer-aux {O} = Aut (Fin (S O)) ≃⟨ contr-equiv-Unit Aut-level ⟩ Unit ≃⟨ contr-equiv-Unit Lehmer-O-level ⁻¹ ⟩ Lehmer O ≃∎ Fin≃Lehmer-aux {S n} = Fin (S (S n)) ≃ Fin (S (S n)) ≃⟨ i ⟩ Σ (Fin (S (S n))) (λ k → (FinExcept fzero ≃ FinExcept k)) ≃⟨ Σ-cong-equiv-snd ii ⟩ Fin (S (S n)) × (Fin (S n) ≃ Fin (S n)) ≃⟨ _ , (×-isemap-r (Fin (S (S n))) (snd (Fin≃Lehmer-aux {n}))) ⟩ Fin (S (S n)) × Lehmer n ≃⟨ LehmerInd ⟩ Lehmer (S n) ≃∎ Fin≃Lehmer : {n : ℕ} -> Aut (Fin (S n)) ≃ Lehmer n Fin≃Lehmer = Fin≃Lehmer-aux ∘e inv-transform-equiv