{-# OPTIONS --safe #-}
module Multiset.Tote.Base where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Univalence
using
( ua
; ua→
)
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Function
using
( _∘_
)
open import Cubical.Foundations.Structure
open import Cubical.Data.Unit as Unit
using
( Unit
)
open import Cubical.Data.Sigma as Σ
using
( ΣPathP
; Σ≡Prop
)
open import Cubical.Data.Sum as Sum
using
( _⊎_
)
open import Cubical.Data.Nat as ℕ
using
( ℕ
; suc
; _+_
)
open import Cubical.Data.FinSet as FinSet
using
( FinSet
; isFinSet
; isPropIsFinSet
)
import Cubical.HITs.PropositionalTruncation as PT
private
variable
ℓ : Level
X : Type ℓ
FinSet₀ : Type₁
FinSet₀ = FinSet ℓ-zero
Tote : Type ℓ → Type (ℓ-max ℓ (ℓ-suc ℓ-zero))
Tote X = Σ[ Y ∈ FinSet₀ ] (⟨ Y ⟩ → X)
map : ∀ {ℓ ℓ'} → {X : Type ℓ} {Y : Type ℓ'}
→ (f : X → Y) → Tote X → Tote Y
map f (B , v)= B , f ∘ v
TotePath : ∀ {V W : Type}
→ {finV : isFinSet V}
→ {finW : isFinSet W}
→ {v : V → X}
→ {w : W → X}
→ (p : V ≡ W)
→ (P : PathP (λ i → p i → X) v w)
→ Path (Tote X) ((V , finV) , v) (((W , finW) , w))
TotePath p P = ΣPathP ((Σ≡Prop (λ _ → isPropIsFinSet) p) , P)
TotePathP≃ : ∀ {V W : Type}
→ {finV : isFinSet V}
→ {finW : isFinSet W}
→ {v : V → X}
→ {w : W → X}
→ (α : V ≃ W)
→ (eq : ∀ k → v k ≡ w (equivFun α k))
→ Path (Tote X) ((V , finV) , v) (((W , finW) , w))
TotePathP≃ α eq = TotePath (ua α) (ua→ eq)
_∷_ : X → Tote X → Tote X
x ∷ ((Y , n , finY) , v) =
( ( Unit ⊎ Y
, (suc n)
, PT.map (Sum.⊎-equiv (idEquiv Unit)) finY
)
, Sum.elim (λ _ → x) v
)