{-# OPTIONS --without-K --safe #-}
open import Categories.Category
module Categories.Category.Duality {o ℓ e} (C : Category o ℓ e) where
open import Relation.Binary.PropositionalEquality using (_≡_; refl)
open import Categories.Category.BinaryProducts using (BinaryProducts)
open import Categories.Category.Cartesian using (Cartesian)
open import Categories.Category.Cocartesian using (Cocartesian)
open import Categories.Category.Complete using (Complete)
open import Categories.Category.Complete.Finitely
open import Categories.Category.Cocomplete using (Cocomplete)
open import Categories.Category.Cocomplete.Finitely
open import Categories.Object.Duality
open import Categories.Diagram.Duality
open import Categories.Functor
private
module C = Category C
open C
coCartesian⇒Cocartesian : Cartesian C.op → Cocartesian C
coCartesian⇒Cocartesian Car = record
{ initial = op⊤⇒⊥ C terminal
; coproducts = record
{ coproduct = coProduct⇒Coproduct C product
}
}
where
open Cartesian Car using (products; terminal)
open BinaryProducts (products) using (product)
Cocartesian⇒coCartesian : Cocartesian C → Cartesian C.op
Cocartesian⇒coCartesian Co = record
{ terminal = ⊥⇒op⊤ C initial
; products = record
{ product = Coproduct⇒coProduct C coproduct
}
}
where open Cocartesian Co
coComplete⇒Cocomplete : ∀ {o′ ℓ′ e′} → Complete o′ ℓ′ e′ C.op → Cocomplete o′ ℓ′ e′ C
coComplete⇒Cocomplete Com F = coLimit⇒Colimit C (Com F.op)
where module F = Functor F
Cocomplete⇒coComplete : ∀ {o′ ℓ′ e′} → Cocomplete o′ ℓ′ e′ C → Complete o′ ℓ′ e′ C.op
Cocomplete⇒coComplete Coc F = Colimit⇒coLimit C (Coc F.op)
where module F = Functor F
coFinitelyComplete⇒FinitelyCocomplete : FinitelyComplete C.op → FinitelyCocomplete C
coFinitelyComplete⇒FinitelyCocomplete FC = record
{ cocartesian = coCartesian⇒Cocartesian cartesian
; coequalizer = λ f g → coEqualizer⇒Coequalizer C (equalizer f g)
}
where open FinitelyComplete FC
FinitelyCocomplete⇒coFinitelyComplete : FinitelyCocomplete C → FinitelyComplete C.op
FinitelyCocomplete⇒coFinitelyComplete FC = record
{ cartesian = Cocartesian⇒coCartesian cocartesian
; equalizer = λ f g → Coequalizer⇒coEqualizer C (coequalizer f g)
}
where open FinitelyCocomplete FC
module DualityConversionProperties where
private
op-involutive : Category.op C.op ≡ C
op-involutive = refl
coCartesian⇔Cocartesian : ∀(coCartesian : Cartesian C.op)
→ Cocartesian⇒coCartesian (coCartesian⇒Cocartesian coCartesian)
≡ coCartesian
coCartesian⇔Cocartesian _ = refl
coFinitelyComplete⇔FinitelyCocomplete : ∀(coFinComplete : FinitelyComplete C.op) →
FinitelyCocomplete⇒coFinitelyComplete
(coFinitelyComplete⇒FinitelyCocomplete coFinComplete) ≡ coFinComplete
coFinitelyComplete⇔FinitelyCocomplete _ = refl