module StringLab.Equiv where
Results about equivalences🔗
This module collects some basic facts about equivalences that I proved in the course of development of the StringLab.
If is equivalent to then is equivalent to
×-apr : (A → B ≃ C) → (A × B) ≃ (A × C) ×-apr e = Σ-ap id≃ e ×-apl : (C → A ≃ B) → (A × C) ≃ (B × C) ×-apl e = ×-swap ∙e ×-apr e ∙e ×-swap
If is empty, then the disjoint union is equivalent to
⊎-emptyl : ¬ A → (A ⊎ B) ≃ B ⊎-emptyl ¬a = ⊎-apl (is-empty→≃ ¬a id) ∙e ⊎-zerol ⊎-emptyr : ¬ B → (A ⊎ B) ≃ A ⊎-emptyr ¬b = ⊎-apr (is-empty→≃ ¬b id) ∙e ⊎-zeror
If is contractible, then is equivalent to
lens-introl : is-contr A → B ≃ (A × B) lens-introl (contr a p) = Iso→Equiv $ (a ,_) , iso snd (λ ab → p (ab .fst) ,ₚ refl) (λ b → refl)
Singleton types are contractible.
singleton-is-contr : ∀ {A : Type ℓ} (x : A) → is-contr (Σ[ a ∈ A ] a ≡ x) singleton-is-contr {A = A} x .centre = x , refl singleton-is-contr {A = A} x .paths (y , p) = transp (λ i → Path (Σ[ a ∈ A ] a ≡ x) (x , refl) (p (~ i) , λ j → p (~ i ∨ j))) i0 refl
One of the 4 De Morgan laws are not constructively valid unless and are decidable. Moreover, if and are general types, then we have a more refined form of De Morgan that distinguishes between one type being non-empty, and both types being nonempty!
Dec→demorgan≃ : ⦃ _ : H-Level A 1 ⦄ ⦃ _ : H-Level B 1 ⦄ → ⦃ _ : Dec A ⦄ ⦃ _ : Dec B ⦄ → (¬ (A × B)) ≃ ((¬ A × B) ⊎ (A × ¬ B) ⊎ (¬ A × ¬ B)) Dec→demorgan≃ {A = A} {B = B} with holds? A | holds? B ... | yes a | yes b = is-empty→≃ (λ ¬ab → ¬ab (a , b)) λ where (inl (¬a , b)) → ¬a a (inr (inl (a , ¬b))) → ¬b b (inr (inr (¬a , ¬b))) → ¬b b ... | no ¬a | yes b = ¬ (A × B) ≃⟨ prop-ext! (λ _ → ¬a , b) (λ _ → ¬a ∘ fst) ⟩≃ (¬ A × B) ≃˘⟨ ⊎-emptyr (¬a ∘ fst) ⟩≃˘ (¬ A × B) ⊎ (A × ¬ B) ≃˘⟨ ⊎-apr (⊎-emptyr λ (_ , ¬b) → ¬b b) ⟩≃˘ ((¬ A × B) ⊎ (A × ¬ B) ⊎ (¬ A × ¬ B)) ≃∎ ... | yes a | no ¬b = ¬ (A × B) ≃⟨ prop-ext! (λ _ → a , ¬b) (λ _ → ¬b ∘ snd) ⟩≃ (A × ¬ B) ≃˘⟨ ⊎-emptyr (λ (¬a , _) → ¬a a) ⟩≃˘ (A × ¬ B) ⊎ (¬ A × ¬ B) ≃˘⟨ ⊎-emptyl (¬b ∘ snd) ⟩≃˘ ((¬ A × B) ⊎ (A × ¬ B) ⊎ (¬ A × ¬ B)) ≃∎ ... | no ¬a | no ¬b = ¬ (A × B) ≃⟨ prop-ext! (λ _ → ¬a , ¬b) (λ _ → ¬a ∘ fst) ⟩≃ (¬ A × ¬ B) ≃˘⟨ ⊎-emptyl (¬a ∘ fst) ⟩≃˘ (A × ¬ B) ⊎ (¬ A × ¬ B) ≃˘⟨ ⊎-emptyl (¬b ∘ snd) ⟩≃˘ ((¬ A × B) ⊎ (A × ¬ B) ⊎ (¬ A × ¬ B)) ≃∎