{-# OPTIONS --without-K --safe #-}
module Cats.Category.Constructions.Iso where
open import Relation.Binary using (IsEquivalence ; Setoid)
open import Level
open import Cats.Category.Base
open import Cats.Util.Conv
import Relation.Binary.EqReasoning as EqReasoning
import Cats.Category.Constructions.Epi as Epi
import Cats.Category.Constructions.Mono as Mono
module Build {lo la l≈} (Cat : Category lo la l≈) where
infix 4 _≅_
private open module Cat = Category Cat
open Cat.≈-Reasoning
open Epi.Build Cat
open Mono.Build Cat
record _≅_ (A B : Obj) : Set (lo ⊔ la ⊔ l≈) where
field
forth : A ⇒ B
back : B ⇒ A
back-forth : back ∘ forth ≈ id
forth-back : forth ∘ back ≈ id
open _≅_
instance
HasArrow-≅ : ∀ {A B} → HasArrow (A ≅ B) lo la l≈
HasArrow-≅ = record { Cat = Cat ; _⃗ = forth }
≅-equiv : IsEquivalence _≅_
≅-equiv = record { refl = refl ; sym = sym ; trans = trans }
where
refl : ∀ {A} → A ≅ A
refl {A} = record
{ forth = id
; back = id
; back-forth = id-l
; forth-back = id-l
}
sym : ∀ {A B} → A ≅ B → B ≅ A
sym iso = record
{ forth = back iso
; back = forth iso
; back-forth = forth-back iso
; forth-back = back-forth iso
}
trans : ∀ {A B C : Obj} → A ≅ B → B ≅ C → A ≅ C
trans {A} {B} {C} A≅B B≅C = record
{ forth = forth B≅C ∘ forth A≅B
; back = back A≅B ∘ back B≅C
; back-forth
= begin
(back A≅B ∘ back B≅C) ∘ forth B≅C ∘ forth A≅B
≈⟨ assoc ⟩
back A≅B ∘ back B≅C ∘ forth B≅C ∘ forth A≅B
≈⟨ ∘-resp-r (≈.trans unassoc (∘-resp-l (back-forth B≅C))) ⟩
back A≅B ∘ id ∘ forth A≅B
≈⟨ ∘-resp-r id-l ⟩
back A≅B ∘ forth A≅B
≈⟨ back-forth A≅B ⟩
id
∎
; forth-back
= begin
(forth B≅C ∘ forth A≅B) ∘ back A≅B ∘ back B≅C
≈⟨ assoc ⟩
forth B≅C ∘ forth A≅B ∘ back A≅B ∘ back B≅C
≈⟨ ∘-resp-r (≈.trans unassoc (∘-resp-l (forth-back A≅B))) ⟩
forth B≅C ∘ id ∘ back B≅C
≈⟨ ∘-resp-r id-l ⟩
forth B≅C ∘ back B≅C
≈⟨ forth-back B≅C ⟩
id
∎
}
≅-Setoid : Setoid lo (lo ⊔ la ⊔ l≈)
≅-Setoid = record
{ Carrier = Obj
; _≈_ = _≅_
; isEquivalence = ≅-equiv
}
module ≅ = IsEquivalence ≅-equiv
module ≅-Reasoning = EqReasoning ≅-Setoid
iso-mono : ∀ {A B} (iso : A ≅ B) → IsMono (forth iso)
iso-mono iso {g = g} {h} iso∘g≈iso∘h
= begin
g
≈⟨ ≈.sym id-l ⟩
id ∘ g
≈⟨ ∘-resp-l (≈.sym (back-forth iso)) ⟩
(back iso ∘ forth iso) ∘ g
≈⟨ assoc ⟩
back iso ∘ forth iso ∘ g
≈⟨ ∘-resp-r iso∘g≈iso∘h ⟩
back iso ∘ forth iso ∘ h
≈⟨ unassoc ⟩
(back iso ∘ forth iso) ∘ h
≈⟨ ∘-resp-l (back-forth iso) ⟩
id ∘ h
≈⟨ id-l ⟩
h
∎
iso-epi : ∀ {A B} (iso : A ≅ B) → IsEpi (forth iso)
iso-epi iso {g = g} {h} g∘iso≈h∘iso
= begin
g
≈⟨ ≈.sym id-r ⟩
g ∘ id
≈⟨ ∘-resp-r (≈.sym (forth-back iso)) ⟩
g ∘ forth iso ∘ back iso
≈⟨ unassoc ⟩
(g ∘ forth iso) ∘ back iso
≈⟨ ∘-resp-l g∘iso≈h∘iso ⟩
(h ∘ forth iso) ∘ back iso
≈⟨ assoc ⟩
h ∘ forth iso ∘ back iso
≈⟨ ∘-resp-r (forth-back iso) ⟩
h ∘ id
≈⟨ id-r ⟩
h
∎
open Build public renaming (_≅_ to Iso)