{-# OPTIONS --cubical --safe #-}
module Cardinality.Finite.SplitEnumerable.Isomorphism where
open import Prelude
open import Container
open import Container.List
open import Data.Fin
open import Container.Membership (ℕ , Fin)
open import Path.Reasoning
open import Data.Sigma.Properties
open import Function.Surjective.Properties
open import Data.Fin.Properties
import Data.List.Membership as 𝕃
open import Container.List.Isomorphism
open import Data.Nat.Properties
open import Data.List using (_∷_; []; List)
import Cardinality.Finite.SplitEnumerable.Container as ℒ
import Cardinality.Finite.SplitEnumerable.Inductive as 𝕃
∈ℒ⇒∈𝕃 : ∀ (x : A) (xs : ⟦ ℕ , Fin ⟧ A) → x ∈ xs → x 𝕃.∈ ℒ→𝕃 xs
∈ℒ⇒∈𝕃 x (suc l , xs) (f0 , p) = f0 , p
∈ℒ⇒∈𝕃 x (suc l , xs) (fs n , p) = 𝕃.push (∈ℒ⇒∈𝕃 x (l , xs ∘ fs) (n , p))
𝕃⇔ℒ⟨ℰ!⟩ : 𝕃.ℰ! A ⇔ ℒ.ℰ! A
𝕃⇔ℒ⟨ℰ!⟩ .fun (sup , cov) = 𝕃→ℒ sup , cov
𝕃⇔ℒ⟨ℰ!⟩ .inv (sup , cov) = ℒ→𝕃 sup , λ x → ∈ℒ⇒∈𝕃 x sup (cov x)
𝕃⇔ℒ⟨ℰ!⟩ .rightInv (sup , cov) i .fst = 𝕃⇔ℒ .rightInv sup i
𝕃⇔ℒ⟨ℰ!⟩ .rightInv (sup , cov) i .snd x = ∈ℒ⇒∈𝕃-rightInv sup (cov x) i
where
∈ℒ⇒∈𝕃-rightInv : ∀ xs x∈xs →
PathP (λ i → x ∈ 𝕃⇔ℒ .rightInv xs i)
(∈ℒ⇒∈𝕃 x xs x∈xs) x∈xs
∈ℒ⇒∈𝕃-rightInv (suc l , xs) (f0 , x∈xs) i = f0 , x∈xs
∈ℒ⇒∈𝕃-rightInv (suc l , xs) (fs n , x∈xs) i =
let m , q = ∈ℒ⇒∈𝕃-rightInv (l , xs ∘ fs) (n , x∈xs) i
in fs m , q
𝕃⇔ℒ⟨ℰ!⟩ .leftInv (sup , cov) i .fst = 𝕃⇔ℒ .leftInv sup i
𝕃⇔ℒ⟨ℰ!⟩ .leftInv (sup , cov) i .snd x = ∈ℒ⇒∈𝕃-leftInv sup (cov x) i
where
∈ℒ⇒∈𝕃-leftInv : ∀ xs x∈xs →
PathP (λ i → x 𝕃.∈ 𝕃→ℒ→𝕃 xs i)
(∈ℒ⇒∈𝕃 x (𝕃→ℒ xs) x∈xs) x∈xs
∈ℒ⇒∈𝕃-leftInv (_ ∷ xs) (f0 , x∈xs) i = f0 , x∈xs
∈ℒ⇒∈𝕃-leftInv (_ ∷ xs) (fs n , x∈xs) i =
let m , p = ∈ℒ⇒∈𝕃-leftInv xs (n , x∈xs) i
in fs m , p