{-# OPTIONS --without-K --exact-split --rewriting #-}
module Pi.UFin.Monoidal where
open import HoTT
open import homotopy.FinSet public
open import Pi.UFin.Base
open import Pi.Common.Misc as N
open import Pi.Common.Extra
⊔-comm : (A B : Type₀) -> (A ⊔ B) ≃ (B ⊔ A)
⊔-comm A B = equiv f g f-g g-f
where f : (A ⊔ B) -> (B ⊔ A)
f (inl x) = inr x
f (inr x) = inl x
g : (B ⊔ A) -> (A ⊔ B)
g (inl x) = inr x
g (inr x) = inl x
f-g : ∀ x -> f (g x) == x
f-g (inl x) = idp
f-g (inr x) = idp
g-f : ∀ x -> g (f x) == x
g-f (inl x) = idp
g-f (inr x) = idp
⊔-assoc : (A B C : Type₀) -> (A ⊔ B) ⊔ C ≃ A ⊔ (B ⊔ C)
⊔-assoc A B C = equiv f g f-g g-f
where f : (A ⊔ B) ⊔ C -> A ⊔ (B ⊔ C)
f (inl (inl x)) = inl x
f (inl (inr x)) = inr (inl x)
f (inr x) = inr (inr x)
g : A ⊔ (B ⊔ C) -> (A ⊔ B) ⊔ C
g (inl x) = inl (inl x)
g (inr (inl x)) = inl (inr x)
g (inr (inr x)) = inr x
f-g : ∀ x -> f (g x) == x
f-g (inl x) = idp
f-g (inr (inl x)) = idp
f-g (inr (inr x)) = idp
g-f : ∀ x -> g (f x) == x
g-f (inl (inl x)) = idp
g-f (inl (inr x)) = idp
g-f (inr x) = idp
⊔-≃ : {A B C D : Type₀} → (A ≃ B) → (C ≃ D) → (A ⊔ C) ≃ (B ⊔ D)
⊔-≃ {A} {B} {C} {D} e₁ e₂ = equiv f g f-g g-f
where f : A ⊔ C → B ⊔ D
f (inl a) = inl (–> e₁ a)
f (inr c) = inr (–> e₂ c)
g : B ⊔ D → A ⊔ C
g (inl b) = inl (<– e₁ b)
g (inr d) = inr (<– e₂ d)
f-g : (x : B ⊔ D) → f (g x) == x
f-g (inl b) = ap inl (<–-inv-r e₁ b)
f-g (inr d) = ap inr (<–-inv-r e₂ d)
g-f : (x : A ⊔ C) → g (f x) == x
g-f (inl a) = ap inl (<–-inv-l e₁ a)
g-f (inr c) = ap inr (<–-inv-l e₂ c)
Fin-⊔ : {n m : ℕ} → (Fin n ⊔ Fin m) ≃ Fin (n + m)
Fin-⊔ {O} {m} =
⊔₁-Empty (Fin m) ∘e
⊔-≃ Fin-equiv-Empty (ide (Fin m))
Fin-⊔ {S n} {m} =
Fin-equiv-Coprod {n + m} ⁻¹ ∘e
⊔-≃ (Fin-⊔ {n} {m}) (ide ⊤) ∘e
⊔-assoc (Fin n) (Fin m) ⊤ ⁻¹ ∘e
⊔-≃ (ide (Fin n)) (⊔-comm ⊤ (Fin m)) ∘e
⊔-assoc (Fin n) ⊤ (Fin m) ∘e
⊔-≃ (Fin-equiv-Coprod {n}) (ide (Fin m))
_∪_ : FinSet -> FinSet → FinSet
(X , ϕ) ∪ (Y , ψ) = X ⊔ Y , Trunc-fmap2 tx ϕ ψ
where
tx : Σ ℕ (λ n → Fin n == X) → Σ ℕ (λ n → Fin n == Y) → Σ ℕ (λ n → Fin n == X ⊔ Y)
tx (n , α) (m , β)= (n + m) , ua ((Fin-⊔ ∘e transport2-equiv (λ x y -> x ⊔ y) (! α) (! β)) ⁻¹)
×₁-Empty : ∀ {i} (A : Type i) → Empty × A ≃ Empty
×₁-Empty A = equiv (λ { ((), a) }) (λ ()) (λ ()) (λ { ((), a) })
×₁-Unit : ∀ {i} (A : Type i) → Unit × A ≃ A
×₁-Unit A = equiv snd (λ a → tt , a) (λ a → idp) (λ { (tt , a) → idp })
×-≃ : {A B C D : Type₀} → (A ≃ B) → (C ≃ D) → (A × C) ≃ (B × D)
×-≃ {A} {B} {C} {D} e₁ e₂ = equiv f g f-g g-f
where f : (A × C) → (B × D)
f (a , c) = –> e₁ a , –> e₂ c
g : (B × D) → (A × C)
g (b , d) = <– e₁ b , <– e₂ d
f-g : (x : B × D) → f (g x) == x
f-g (b , d) = pair= (<–-inv-r e₁ b) (↓-cst-in (<–-inv-r e₂ d))
g-f : (x : A × C) → g (f x) == x
g-f (a , c) = pair= (<–-inv-l e₁ a) (↓-cst-in (<–-inv-l e₂ c))
×-⊔-distrib : (A B C : Type₀) → (A ⊔ B) × C ≃ (A × C) ⊔ (B × C)
×-⊔-distrib A B C = equiv f g f-g g-f
where f : (A ⊔ B) × C → (A × C) ⊔ (B × C)
f (inl a , c) = inl (a , c)
f (inr b , c) = inr (b , c)
g : (A × C) ⊔ (B × C) → (A ⊔ B) × C
g (inl (a , c)) = inl a , c
g (inr (b , c)) = inr b , c
f-g : (x : (A × C) ⊔ B × C) → f (g x) == x
f-g (inl (a , c)) = idp
f-g (inr (b , c)) = idp
g-f : (x : (A ⊔ B) × C) → g (f x) == x
g-f (inl a , c) = idp
g-f (inr b , c) = idp
Fin-× : {n m : ℕ} → (Fin n × Fin m) ≃ Fin (n N.* m)
Fin-× {O} {m} =
Fin-equiv-Empty ⁻¹ ∘e
×₁-Empty (Fin m) ∘e
×-≃ Fin-equiv-Empty (ide (Fin m))
Fin-× {S n} {m} =
Fin-⊔ {m} {n N.* m} ∘e
⊔-≃ (ide (Fin m)) (Fin-× {n} {m}) ∘e
⊔-comm (Fin n × Fin m) (Fin m) ∘e
⊔-≃ (ide _) (×₁-Unit (Fin m)) ∘e
×-⊔-distrib (Fin n) ⊤ (Fin m) ∘e
×-≃ Fin-equiv-Coprod (ide (Fin m))
_⊓_ : FinSet -> FinSet → FinSet
(X , ϕ) ⊓ (Y , ψ) = X × Y , Trunc-fmap2 tx ϕ ψ
where
tx : Σ ℕ (λ n → Fin n == X) → Σ ℕ (λ n → Fin n == Y) → Σ ℕ (λ n → Fin n == X × Y)
tx (n , α) (m , β)= (n N.* m) , ua ((Fin-× ∘e transport2-equiv (λ x y -> x × y) (! α) (! β)) ⁻¹)