--------------------------------------------------------------------------------
Ettore Aldrovandi, ealdrovandi@fsu.edu
Started: September 2023
--------------------------------------------------------------------------------
Port of [HoTT-Agda](https://github.com/HoTT/HoTT-Agda) `PathSeq`
library to TypeTopology.
Inversion of path sequences.
\begin{code}
{-# OPTIONS --without-K --safe #-}
open import MLTT.Spartan
open import UF.Base
open import PathSequences.Type
open import PathSequences.Concat
open import PathSequences.Reasoning
module PathSequences.Inversion {X : 𝓤 ̇ } where
seq⁻¹ : {x x' : X} → x ≡ x' → x' ≡ x
seq⁻¹ [] = []
seq⁻¹ (p ◃∙ s) = seq⁻¹ s ∙▹ (p ⁻¹)
seq⁻¹-∙▹ : {x x' x'' : X} (s : x ≡ x') (p : x' = x'')
→ seq⁻¹ (s ∙▹ p) = (p ⁻¹) ◃∙ seq⁻¹ s
seq⁻¹-∙▹ [] p = refl
seq⁻¹-∙▹ (p₁ ◃∙ s) p = ap (_∙▹ (p₁ ⁻¹)) (seq⁻¹-∙▹ s p)
seq⁻¹-involutive : {x x' : X} (s : x ≡ x')
→ seq⁻¹ (seq⁻¹ s) = s
seq⁻¹-involutive [] = refl
seq⁻¹-involutive (p ◃∙ s) =
seq⁻¹ (seq⁻¹ s ∙▹ (p ⁻¹)) =⟨ seq⁻¹-∙▹ (seq⁻¹ s) (p ⁻¹) ⟩
((p ⁻¹) ⁻¹) ◃∙ seq⁻¹ (seq⁻¹ s) =⟨ I ⟩
p ◃∙ s ∎
where
I = ap₂ _◃∙_ (⁻¹-involutive p) (seq⁻¹-involutive s)
sym-[↓]-seq⁻¹ : {x x' : X} (s : x ≡ x')
→ ([ s ↓] ⁻¹) ◃∎ =ₛ seq⁻¹ s
sym-[↓]-seq⁻¹ [] = =ₛ-in refl
sym-[↓]-seq⁻¹ (p ◃∙ s) =
([(p ◃∙ s) ↓] ⁻¹) ◃∎ =ₛ⟨ =ₛ-in refl ⟩
((p ∙ [ s ↓]) ⁻¹) ◃∎ =ₛ⟨ =ₛ-in ( ⁻¹-contravariant p ([ s ↓]) ⁻¹) ⟩
([ s ↓] ⁻¹) ◃∙ (p ⁻¹) ◃∎ =ₛ⟨ 0 & 1 & sym-[↓]-seq⁻¹ s ⟩
seq⁻¹ s ∙▹ (p ⁻¹) ∎ₛ
seq⁻¹-sym-[↓] : {x x' : X} (s : x ≡ x')
→ seq⁻¹ s =ₛ ([ s ↓] ⁻¹) ◃∎
seq⁻¹-sym-[↓] s = sym-[↓]-seq⁻¹ s ⁻¹ₛ
seq⁻¹-=ₛ : {x x' : X} {s t : x ≡ x'}
→ s =ₛ t
→ seq⁻¹ s =ₛ seq⁻¹ t
seq⁻¹-=ₛ {s = s} {t} e =
seq⁻¹ s =ₛ⟨ seq⁻¹-sym-[↓] s ⟩
([ s ↓] ⁻¹) ◃∎ =↓⟨ ap (λ v → v ⁻¹) (=ₛ-out e) ⟩
([ t ↓] ⁻¹) ◃∎ =ₛ⟨ sym-[↓]-seq⁻¹ t ⟩
seq⁻¹ t ∎ₛ
seq⁻¹-left-inverse : {x x' : X} (s : x ≡ x')
→ seq⁻¹ s ∙≡ s =ₛ []
seq⁻¹-left-inverse s = =ₛ-in (
[ (seq⁻¹ s ∙≡ s) ↓] =⟨ ( [↓]-hom (seq⁻¹ s) s ) ⁻¹ ⟩
[ seq⁻¹ s ↓] ∙ [ s ↓] =⟨ ap (_∙ [ s ↓]) (=ₛ-out (seq⁻¹-sym-[↓] s)) ⟩
[ s ↓] ⁻¹ ∙ [ s ↓] =⟨ left-inverse ([ s ↓]) ⟩
refl ∎ )
seq⁻¹-right-inverse : {x x' : X} (s : x ≡ x')
→ s ∙≡ seq⁻¹ s =ₛ []
seq⁻¹-right-inverse s = =ₛ-in (
[ s ∙≡ seq⁻¹ s ↓] =⟨ [↓]-hom s (seq⁻¹ s) ⁻¹ ⟩
[ s ↓] ∙ [ seq⁻¹ s ↓] =⟨ ap ([ s ↓] ∙_) (=ₛ-out (seq⁻¹-sym-[↓] s)) ⟩
[ s ↓] ∙ [ s ↓] ⁻¹ =⟨ ( right-inverse [ s ↓] ) ⁻¹ ⟩
refl ∎ )
\end{code}
Alternative names
\begin{code}
seq-reverse = seq⁻¹
reverse = seq⁻¹
seq-reverse-∙▹ = seq⁻¹-∙▹
seq-reverse-flip = seq⁻¹-∙▹
seq-reverse-involutive = seq⁻¹-involutive
sym-seq-reverse = sym-[↓]-seq⁻¹
seq-reverse-sym = seq⁻¹-sym-[↓]
seq-reverse-=ₛ = seq⁻¹-=ₛ
seq-reverse-left-inverse = seq⁻¹-left-inverse
seq-reverse-right-inverse = seq⁻¹-right-inverse
\end{code}