{-# OPTIONS --without-K --safe #-} module Cats.Category.Constructions.Equalizer where open import Level open import Cats.Category.Base open import Cats.Util.Conv import Cats.Category.Constructions.Mono as Mono import Cats.Category.Constructions.Unique as Unique module Build {lo la l≈} (Cat : Category lo la l≈) where private open module Cat = Category Cat open Cat.≈-Reasoning open Mono.Build Cat open Unique.Build Cat record IsEqualizer {A B} (f g : A ⇒ B) {E} (e : E ⇒ A) : Set (lo ⊔ la ⊔ l≈) where field equalizes : f ∘ e ≈ g ∘ e universal : ∀ {Z} (z : Z ⇒ A) → f ∘ z ≈ g ∘ z → ∃![ u ] (e ∘ u ≈ z) record Equalizer {A B} (f g : A ⇒ B) : Set (lo ⊔ la ⊔ l≈) where field {E} : Obj e : E ⇒ A isEqualizer : IsEqualizer f g e open IsEqualizer isEqualizer public instance HasObj-Equalizer : ∀ {A B} {f g : A ⇒ B} → HasObj (Equalizer f g) lo la l≈ HasObj-Equalizer = record { Cat = Cat ; _ᴼ = Equalizer.E } HasArrow-Equalizer : ∀ {A B} {f g : A ⇒ B} → HasArrow (Equalizer f g) lo la l≈ HasArrow-Equalizer = record { Cat = Cat ; _⃗ = Equalizer.e } equalizer→mono : ∀ {A B} {f g : A ⇒ B} {E} {e : E ⇒ A} → IsEqualizer f g e → IsMono e equalizer→mono {f = f} {g} {E} {e} eql {Z} {i} {j} e∘i≈e∘j = ∃!→≈ (universal (e ∘ j) lemma) e∘i≈e∘j ≈.refl where open IsEqualizer eql lemma : f ∘ e ∘ j ≈ g ∘ e ∘ j lemma = begin f ∘ e ∘ j ≈⟨ unassoc ⟩ (f ∘ e) ∘ j ≈⟨ ∘-resp-l equalizes ⟩ (g ∘ e) ∘ j ≈⟨ assoc ⟩ g ∘ e ∘ j ∎ open Build public