{-# OPTIONS --without-K --safe #-}
module Categories.Adjoint.Alternatives where
open import Level
open import Categories.Adjoint
open import Categories.Category
open import Categories.Functor renaming (id to idF)
open import Categories.NaturalTransformation
import Categories.Morphism.Reasoning as MR
private
variable
o ℓ e : Level
C D : Category o ℓ e
module _ (L : Functor C D) (R : Functor D C) where
private
module C = Category C
module D = Category D
module L = Functor L
module R = Functor R
record FromUnit : Set (levelOfTerm L ⊔ levelOfTerm R) where
field
unit : NaturalTransformation idF (R ∘F L)
module unit = NaturalTransformation unit
field
θ : ∀ {X Y} → C [ X , R.₀ Y ] → D [ L.₀ X , Y ]
commute : ∀ {X Y} (g : C [ X , R.₀ Y ]) → g C.≈ R.₁ (θ g) C.∘ unit.η X
unique : ∀ {X Y} {f : D [ L.₀ X , Y ]} {g : C [ X , R.₀ Y ]} →
g C.≈ R.₁ f C.∘ unit.η X → θ g D.≈ f
module _ where
open C.HomReasoning
open MR C
θ-natural : ∀ {X Y Z} (f : D [ Y , Z ]) (g : C [ X , R.₀ Y ]) → θ (R.₁ f C.∘ g) D.≈ θ (R.₁ f) D.∘ L.₁ g
θ-natural {X} {Y} f g = unique eq
where eq : R.₁ f C.∘ g C.≈ R.₁ (θ (R.₁ f) D.∘ L.₁ g) C.∘ unit.η X
eq = begin
R.₁ f C.∘ g ≈⟨ commute (R.₁ f) ⟩∘⟨refl ⟩
(R.₁ (θ (R.₁ f)) C.∘ unit.η (R.F₀ Y)) C.∘ g ≈⟨ C.assoc ⟩
R.₁ (θ (R.₁ f)) C.∘ unit.η (R.₀ Y) C.∘ g ≈⟨ pushʳ (unit.commute g) ⟩
(R.₁ (θ (R.₁ f)) C.∘ R.₁ (L.₁ g)) C.∘ unit.η X ≈˘⟨ R.homomorphism ⟩∘⟨refl ⟩
R.₁ (θ (R.₁ f) D.∘ L.₁ g) C.∘ unit.η X ∎
θ-cong : ∀ {X Y} {f g : C [ X , R.₀ Y ]} → f C.≈ g → θ f D.≈ θ g
θ-cong eq = unique (eq ○ commute _)
θ-natural′ : ∀ {X Y} (g : C [ X , R.₀ Y ]) → θ g D.≈ θ C.id D.∘ L.₁ g
θ-natural′ g = θ-cong (introˡ R.identity) ○ θ-natural D.id g ○ D.∘-resp-≈ˡ (θ-cong R.identity)
where open D.HomReasoning
open MR C
counit : NaturalTransformation (L ∘F R) idF
counit = ntHelper record
{ η = λ d → θ C.id
; commute = λ f → begin
θ C.id D.∘ L.₁ (R.₁ f) ≈˘⟨ θ-natural′ (R.₁ f) ⟩
θ (R.₁ f) ≈⟨ unique (CH.⟺ (MR.cancelʳ C (CH.⟺ (commute C.id))) CH.○ CH.⟺ (C.∘-resp-≈ˡ R.homomorphism)) ⟩
f D.∘ θ C.id ∎
}
where open D.HomReasoning
module CH = C.HomReasoning
unique′ : ∀ {X Y} {f g : D [ L.₀ X , Y ]} (h : C [ X , R.₀ Y ]) →
h C.≈ R.₁ f C.∘ unit.η X →
h C.≈ R.₁ g C.∘ unit.η X → f D.≈ g
unique′ _ eq₁ eq₂ = ⟺ (unique eq₁) ○ unique eq₂
where open D.HomReasoning
zig : ∀ {A} → θ C.id D.∘ L.F₁ (unit.η A) D.≈ D.id
zig {A} = unique′ (unit.η A)
(commute (unit.η A) ○ (C.∘-resp-≈ˡ (R.F-resp-≈ (θ-natural′ (unit.η A)))))
(introˡ R.identity)
where open C.HomReasoning
open MR C
L⊣R : L ⊣ R
L⊣R = record
{ unit = unit
; counit = counit
; zig = zig
; zag = C.Equiv.sym (commute C.id)
}
record FromCounit : Set (levelOfTerm L ⊔ levelOfTerm R) where
field
counit : NaturalTransformation (L ∘F R) idF
module counit = NaturalTransformation counit
field
θ : ∀ {X Y} → D [ L.₀ X , Y ] → C [ X , R.₀ Y ]
commute : ∀ {X Y} (g : D [ L.₀ X , Y ]) → g D.≈ counit.η Y D.∘ L.₁ (θ g)
unique : ∀ {X Y} {f : C [ X , R.₀ Y ]} {g : D [ L.₀ X , Y ]} →
g D.≈ counit.η Y D.∘ L.₁ f → θ g C.≈ f
module _ where
open D.HomReasoning
open MR D
θ-natural : ∀ {X Y Z} (f : C [ X , Y ]) (g : D [ L.₀ Y , Z ]) → θ (g D.∘ L.₁ f) C.≈ R.₁ g C.∘ θ (L.₁ f)
θ-natural {X} {Y} {Z} f g = unique eq
where eq : g D.∘ L.₁ f D.≈ counit.η Z D.∘ L.₁ (R.₁ g C.∘ θ (L.₁ f))
eq = begin
g D.∘ L.₁ f ≈⟨ pushʳ (commute (L.₁ f)) ⟩
(g D.∘ counit.η (L.F₀ Y)) D.∘ L.F₁ (θ (L.F₁ f)) ≈⟨ pushˡ (counit.sym-commute g) ⟩
counit.η Z D.∘ L.₁ (R.₁ g) D.∘ L.₁ (θ (L.₁ f)) ≈˘⟨ refl⟩∘⟨ L.homomorphism ⟩
counit.η Z D.∘ L.₁ (R.₁ g C.∘ θ (L.₁ f)) ∎
θ-cong : ∀ {X Y} {f g : D [ L.₀ X , Y ]} → f D.≈ g → θ f C.≈ θ g
θ-cong eq = unique (eq ○ commute _)
θ-natural′ : ∀ {X Y} (g : D [ L.₀ X , Y ]) → θ g C.≈ R.₁ g C.∘ θ D.id
θ-natural′ g = θ-cong (introʳ L.identity) ○ θ-natural C.id g ○ C.∘-resp-≈ʳ (θ-cong L.identity)
where open C.HomReasoning
open MR D
unit : NaturalTransformation idF (R ∘F L)
unit = ntHelper record
{ η = λ _ → θ D.id
; commute = λ f → begin
θ D.id C.∘ f ≈˘⟨ unique (DH.⟺ (cancelˡ (DH.⟺ (commute D.id))) DH.○ D.∘-resp-≈ʳ (DH.⟺ L.homomorphism)) ⟩
θ (L.₁ f) ≈⟨ θ-natural′ (L.₁ f) ⟩
R.₁ (L.₁ f) C.∘ θ D.id ∎
}
where open C.HomReasoning
module DH = D.HomReasoning
open MR D
unique′ : ∀ {X Y} {f g : C [ X , R.₀ Y ]} (h : D [ L.₀ X , Y ]) →
h D.≈ counit.η Y D.∘ L.₁ f →
h D.≈ counit.η Y D.∘ L.₁ g →
f C.≈ g
unique′ _ eq₁ eq₂ = ⟺ (unique eq₁) ○ unique eq₂
where open C.HomReasoning
zag : ∀ {B} → R.F₁ (counit.η B) C.∘ θ D.id C.≈ C.id
zag {B} = unique′ (counit.η B)
(⟺ (cancelʳ (⟺ (commute D.id))) ○ pushˡ (counit.sym-commute (counit.η B)) ○ D.∘-resp-≈ʳ (⟺ L.homomorphism))
(introʳ L.identity)
where open D.HomReasoning
open MR D
L⊣R : L ⊣ R
L⊣R = record
{ unit = unit
; counit = counit
; zig = D.Equiv.sym (commute D.id)
; zag = zag
}
module _ {L : Functor C D} {R : Functor D C} where
fromUnit : FromUnit L R → L ⊣ R
fromUnit = FromUnit.L⊣R
fromCounit : FromCounit L R → L ⊣ R
fromCounit = FromCounit.L⊣R