{-# OPTIONS --safe #-}
module Multiset.FMSet.Fixpoint where
open import Multiset.Prelude
open import Multiset.Functor
open import Multiset.Limit.TerminalChain using (_^_)
open import Multiset.Util.SetTruncation as STExt using (setTruncEquiv)
open import Multiset.Tote as Tote using (Tote ; FMSet≃∥Tote∥₂ ; ∥Tote∥₂→FMSet)
open import Multiset.FMSet as FMSet
open import Multiset.Bag.Base as Bag using (Bag ; Bag≃Tote ; isNaturalBagToteEquiv)
open import Multiset.Bag.Properties as Bag
using (bagLimitEquiv ; BagLim)
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Function using (_∘_)
open import Cubical.Foundations.Transport using (substEquiv)
open import Cubical.Foundations.Univalence using (ua)
open import Cubical.Data.Nat.Base using (zero ; suc)
open import Cubical.Data.Unit.Properties using (isSetUnit*)
open import Cubical.HITs.SetTruncation as ST using (∥_∥₂)
TruncBagFMSetEquiv : ∀ {ℓ} {X : Type ℓ} → ∥ Bag X ∥₂ ≃ FMSet X
TruncBagFMSetEquiv = setTruncEquiv Bag≃Tote ∙ₑ invEquiv (FMSet≃∥Tote∥₂)
IterTruncBagFMSetEquiv : ∀ n → ∥ Bag ^ n ∥₂ ≃ FMSet ^ n
IterTruncBagFMSetEquiv zero = ST.setTruncIdempotent≃ isSetUnit*
IterTruncBagFMSetEquiv (suc n) =
∥ Bag (Bag ^ n) ∥₂ ≃⟨ TruncBagFMSetEquiv {X = Bag ^ n} ⟩
FMSet (Bag ^ n) ≃⟨ invEquiv STInvarianceEquiv ⟩
FMSet ∥ Bag ^ n ∥₂ ≃⟨ substEquiv FMSet (ua (IterTruncBagFMSetEquiv n)) ⟩
FMSet (FMSet ^ n) ■
abstract
isNaturalTruncBagFMSetEquiv : ∀ {X Y : Type}
→ (f : X → Y) → equivFun TruncBagFMSetEquiv ∘ ST.map (Bag.map f) ≡ FMSet.map f ∘ equivFun TruncBagFMSetEquiv
isNaturalTruncBagFMSetEquiv {X = X} {Y = Y} f =
let
Bag→Tote : ∀ {Z} → Bag Z → Tote Z
Bag→Tote = equivFun Bag≃Tote
in
equivFun TruncBagFMSetEquiv ∘ ST.map (Bag.map f) ≡⟨⟩
∥Tote∥₂→FMSet ∘ (ST.map Bag→Tote ∘ ST.map (Bag.map f)) ≡⟨ cong (invEq FMSet≃∥Tote∥₂ ∘_) (funExt (STExt.map∘map (Bag.map f) Bag→Tote)) ⟩
∥Tote∥₂→FMSet ∘ (ST.map (Bag→Tote ∘ Bag.map f)) ≡⟨ cong (λ γ → ∥Tote∥₂→FMSet ∘ (ST.map γ)) (isNaturalBagToteEquiv f) ⟩
∥Tote∥₂→FMSet ∘ (ST.map (Tote.map f ∘ Bag→Tote)) ≡⟨ cong (∥Tote∥₂→FMSet ∘_) (sym (funExt (STExt.map∘map Bag→Tote (Tote.map f)))) ⟩
∥Tote∥₂→FMSet ∘ ST.map (Tote.map f) ∘ ST.map Bag→Tote ≡⟨ cong (_∘ ST.map Bag→Tote) (Tote.isNatural-∥Tote∥₂≃FMSet f) ⟩
FMSet.map f ∘ (invEq FMSet≃∥Tote∥₂) ∘ ST.map Bag→Tote ≡⟨⟩
FMSet.map f ∘ equivFun TruncBagFMSetEquiv ∎
FMSetFixSetTruncTree : FMSet ∥ BagLim ∥₂ ≃ ∥ BagLim ∥₂
FMSetFixSetTruncTree =
FMSet ∥ BagLim ∥₂ ≃⟨ FMSet.STInvarianceEquiv ⟩
FMSet BagLim ≃⟨ invEquiv TruncBagFMSetEquiv ⟩
∥ Bag BagLim ∥₂ ≃⟨ setTruncEquiv (bagLimitEquiv) ⟩
∥ BagLim ∥₂ ■