{-# OPTIONS --safe #-} module Cubical.Functions.Involution where open import Cubical.Foundations.Equiv open import Cubical.Foundations.Isomorphism open import Cubical.Foundations.Prelude open import Cubical.Foundations.Univalence isInvolution : ∀{ℓ} {A : Type ℓ} → (A → A) → Type _ isInvolution f = ∀ x → f (f x) ≡ x module _ {ℓ} {A : Type ℓ} {f : A → A} (invol : isInvolution f) where open Iso involIso : Iso A A involIso .fun = f involIso .inv = f involIso .rightInv = invol involIso .leftInv = invol involIsEquiv : isEquiv f involIsEquiv = isoToIsEquiv involIso involEquiv : A ≃ A involEquiv = f , involIsEquiv involPath : A ≡ A involPath = ua involEquiv involEquivComp : compEquiv involEquiv involEquiv ≡ idEquiv A involEquivComp = equivEq (λ i x → invol x i) involPathComp : involPath ∙ involPath ≡ refl involPathComp = sym (uaCompEquiv involEquiv involEquiv) ∙∙ cong ua involEquivComp ∙∙ uaIdEquiv involPath² : Square involPath refl refl involPath involPath² = subst (λ s → Square involPath s refl involPath) involPathComp (compPath-filler involPath involPath)