open import Cat.Instances.Shape.Terminal
open import Cat.Diagram.Everything
open import Cat.Functor.Everything
open import Cat.Instances.Discrete
open import Cat.Instances.Elements
open import Cat.Instances.Functor
open import Cat.Instances.Comma
open import Cat.Instances.Lift
open import Cat.Prelude
open import Data.Fin
open import Topoi.Base
import Cat.Functor.Reasoning as Functor-kit
import Cat.Reasoning
module wip.obj where
open Precategory
open Functor
open _=>_
FinSet : ∀ {ℓ} → Precategory ℓ ℓ
FinSet .Ob = Lift _ Nat
FinSet .Hom (lift n) (lift k) = Lift _ (Fin n → Fin k)
FinSet .Hom-set _ _ = hlevel 2
FinSet .id = lift λ x → x
FinSet ._∘_ = λ (lift f) (lift g) → lift λ x → f (g x)
FinSet .idr = λ f → refl
FinSet .idl = λ f → refl
FinSet .assoc = λ f g h → refl
Fin→Sets : ∀ {ℓ κ} → Functor (FinSet {ℓ}) (Sets κ)
Fin→Sets .F₀ n = Lift _ (Fin (Lift.lower n)) , hlevel 2
Fin→Sets .F₁ (lift f) (lift x) = lift (f x)
Fin→Sets .F-id = refl
Fin→Sets .F-∘ f g = refl
Obj : Topos lzero _
Obj = Presheaf (FinSet ^op)
-- module Sets-tensoring {o ℓ κ} {C : Precategory o ℓ} (colim : is-cocomplete κ κ C) where
-- private
-- module C = Cat.Reasoning C
-- open Initial
-- open Cocone
-- open Cocone-hom
-- Sets_⊗_ : Set κ → Ob C → Ob C
-- Sets n ⊗ T = colim (Const {C = Disc′ n} T) .bot .coapex
-- Copower-map : ∀ {A B : Set κ} {o}
-- → (∣ A ∣ → ∣ B ∣) → Hom C (Sets A ⊗ o) (Sets B ⊗ o)
-- Copower-map f = colim _ .has⊥ cocone′ .centre .hom
-- where
-- cocone′ : Cocone _
-- cocone′ .coapex = Sets _ ⊗ _
-- cocone′ .ψ x = colim _ .bot .ψ (f x)
-- cocone′ .commutes p =
-- idr C _ ∙ ap (colim (Const _) .bot .ψ ⊙ f) (sym p)
-- Copower-id : ∀ {A : Set κ} {o} → Copower-map {A = A} {o = o} (λ x → x) ≡ id C
-- Copower-id = ap hom $ colim _ .has⊥ _ .paths $
-- cocone-hom (id C) λ o → idl C _
-- Copower-∘ : ∀ {A B C : Set κ} {o} {f : ∣ B ∣ → ∣ C ∣} {g : ∣ A ∣ → ∣ B ∣}
-- → Copower-map {A} {C} {o = o} (λ x → f (g x))
-- ≡ Copower-map {B} f C.∘ Copower-map g
-- Copower-∘ = ap hom $ colim _ .has⊥ _ .paths $
-- cocone-hom _ λ o → C.pullr (colim _ .has⊥ _ .centre .commutes _)
-- ∙ colim _ .has⊥ _ .centre .commutes _
-- Copower : Ob C → Functor (Sets κ) C
-- Copower x .F₀ = Sets_⊗ x
-- Copower x .F₁ = Copower-map
-- Copower x .F-id = Copower-id
-- Copower x .F-∘ _ _ = Copower-∘
{-
module Sets-powering {o ℓ κ} {C : Precategory o ℓ} (lim : is-complete κ κ C) where
private
module C = Cat.Reasoning C
open Terminal
open Cone
open Cone-hom
Sets_⋔_ : Set κ → Ob C → Ob C
Sets n ⋔ T = lim (Const {C = Disc′ n} T) .top .apex
Power-map : ∀ {A B : Set κ} {o}
→ (∣ A ∣ → ∣ B ∣) → Hom C (Sets B ⋔ o) (Sets A ⋔ o)
Power-map f = lim _ .has⊤ cone′ .centre .hom
where
cone′ : Cone _
cone′ .apex = Sets _ ⋔ _
cone′ .ψ x = lim _ .top .ψ (f x)
cone′ .commutes p =
idl C _ ∙ ap (lim (Const _) .top .ψ ⊙ f) p
abstract
Power-id : ∀ {A : Set κ} {o} → Power-map {A = A} {o = o} (λ x → x) ≡ id C
Power-id = ap hom $ lim _ .has⊤ _ .paths $
record { hom = _ ; commutes = λ o → C.idr _ }
Power-∘ : ∀ {A B C : Set κ} {o} {f : ∣ B ∣ → ∣ C ∣} {g : ∣ A ∣ → ∣ B ∣}
→ Power-map {A} {C} {o = o} (λ x → f (g x))
≡ Power-map {A} g C.∘ Power-map {B} f
Power-∘ = ap hom $ lim _ .has⊤ _ .paths $
record { hom = _ ; commutes = λ o → C.pulll (lim _ .has⊤ _ .centre .commutes _)
∙ lim _ .has⊤ _ .centre .commutes _
}
Power : Ob C → Functor (Sets κ ^op) C
Power x .F₀ = Sets_⋔ x
Power x .F₁ = Power-map
Power x .F-id = Power-id
Power x .F-∘ _ _ = Power-∘
-}
-- Power-continuous : ∀ o → is-continuous {oshape = κ} {κ} (Power o)
-- Power-continuous o K x y = {! !}
-- const : ∀ {ℓ} (c : C.Ob) → Functor (Sets ℓ) (PSh (h ⊔ ℓ) C)
-- const c .F₀ A .F₀ d = (∣ A ∣ × C.Hom d c) , ×-is-hlevel 2 (A .is-tr) (hlevel 2)
-- const c .F₀ A .F₁ f (fst , snd) = fst , snd C.∘ f
-- const c .F₀ A .F-id = funext λ _ → Σ-pathp refl (C.idr _)
-- const c .F₀ A .F-∘ f g = funext λ _ → Σ-pathp refl (C.assoc _ _ _)
-- const c .F₁ f = NT (λ { _ (a , b) → (f a , b) }) λ x y f₁ → refl
-- const c .F-id = Nat-path λ _ → refl
-- const c .F-∘ f g = Nat-path λ _ → refl
-- const⊣ev : ∀ {ℓ} (c : C.Ob) → const c ⊣ ev {h ⊔ ℓ} c
-- const⊣ev c = adj where
-- open _⊣_
-- adj : _ ⊣ _
-- adj .unit .η _ s = s , C.id
-- adj .unit .is-natural x y f = refl
-- adj .counit .η x = NT (λ i (f , a) → x .F₁ a f) λ _ _ _ →
-- funext λ _ → happly (x .F-∘ _ _) _
-- adj .counit .is-natural x y f = Nat-path λ _ → funext λ _ →
-- happly (sym (f .is-natural _ _ _)) _
-- adj .zig = Nat-path (λ _ → funext λ _ → Σ-pathp refl (C.idl _))
-- adj .zag {B} = B .F-id
{-
module _ {D : Precategory κ κ} (F : Functor D C) (flat : Flat cocompl F) where
private
module DC = Cat.Reasoning Cat[ D , C ]
module D = Cat.Reasoning D
module F = Functor F
diinv : Diaconescu⁻¹ (Diaconescu F flat) DC.≅ F
diinv = DC.invertible→iso to (componentwise-invertible→invertible to inv)
where
cocone′ : ∀ x → Cocone _
cocone′ x = cocone (F.₀ x) (λ x → F.₁ (x .section))
λ f → sym (F.F-∘ _ _) ∙ ap F.₁ (f .commute)
to : Diaconescu⁻¹ (Diaconescu F flat) => F
to .η x = cocompl _ .has⊥ (cocone′ x) .centre .hom
to .is-natural x y f = ap hom $
is-contr→is-prop
(cocompl (F F∘ πₚ _ _) .has⊥ (cocone (F.F₀ y) (λ x → F.₁ (f D.∘ x .section)) λ p → sym (F.F-∘ _ _) ∙ ap F.₁ (D.pullr (p .commute))))
(cocone-hom _ (λ _ → C.pullr (cocompl _ .has⊥ _ .centre .commutes _) ∙ cocompl _ .has⊥ _ .centre .commutes _))
(cocone-hom _ λ _ → C.pullr (cocompl _ .has⊥ _ .centre .commutes _) ∙ sym (F.F-∘ _ _))
inv : ∀ x → C.is-invertible (to .η x)
inv ob = C.make-invertible (cocompl _ .bot .ψ (elem ob D.id))
(cocompl _ .has⊥ _ .centre .commutes _ ∙ F.F-id)
(ap hom $ is-contr→is-prop (cocompl _ .has⊥ (cocompl _ .bot))
(cocone-hom _ (λ o → C.pullr (cocompl _ .has⊥ _ .centre .commutes _) ∙ cocompl _ .bot .commutes (elem-hom (o .section) (D.idl _))))
(cocone-hom _ (λ _ → C.idl _)))
-- open Finitely-complete
-- test : {D : Precategory κ κ} → Finitely-complete D → (F : Functor D C) → is-lex F → Flat cocompl F
-- test f-c F F-lex .is-lex.pres-⊤ {T} x ob = contr map unique
-- where
-- map : C.Hom ob (₀ (Realisation cocompl F) T)
-- map = cocompl _ .bot .ψ (elem (f-c .terminal .top)
-- (x (Const (Lift _ ⊤ , λ _ _ _ _ _ _ → lift tt)) .centre .η (f-c .terminal .top) (lift tt)))
-- C.∘ F-lex .is-lex.pres-⊤ (f-c .terminal .has⊤) ob .centre
-- unique : ∀ h → map ≡ h
-- unique h = {! ap (_ C.∘_) ? ∙ cocompl _ .bot .commutes _ ∙ ?!}
-- test f-c F F-lex .is-lex.pres-pullback = {! !}
-- test : C.Ob → Functor (FinSet {κ} ^op) C
-- test o = Power o F∘ Functor.op Fin→Sets
-- test′ : C.Ob → Functor (PSh κ (FinSet ^op)) C
-- test′ ob = Realisation {κ = κ} cocompl (test ob)
-- object→map : C.Ob → Geom[ C , PSh κ (FinSet {κ} ^op) ]
-- object→map ob = g where
-- g : Geom[ _ , _ ]
-- Inv[ g ] = test′ ob
-- Dir[ g ] = RHom cocompl (test ob)
-- g .Inv-lex = {! !}
-- g .Inv⊣Dir = よext⊣RH cocompl (test ob)
-- {-
-- Global-sections : Geom[ C , Sets κ ]
-- Inv[ Global-sections ] = Copower (fc.terminal .top)
-- Dir[ Global-sections ] = hom' where
-- hom' : Functor C (Sets κ)
-- hom' .F₀ ob′ = C.Hom (fc.terminal .top) ob′ , C.Hom-set _ _
-- hom' .F₁ f = f C.∘_
-- hom' .F-id = funext C.idl
-- hom' .F-∘ f g = funext λ _ → sym (C.assoc _ _ _)
-- Global-sections .Inv-lex .is-lex.pres-⊤ term obj =
-- is-terminal-iso C isom (fc.terminal .has⊤) obj
-- where
-- isom : _ C.≅ _
-- isom = C.make-iso
-- (cocompl _ .bot .ψ (term (Lift κ ⊤ , λ _ _ _ _ _ _ → lift tt) .centre _))
-- (cocompl _ .has⊥ (cocone (fc.terminal .top) (λ _ → C.id) λ _ → C.idl _) .centre .hom)
-- (ap hom (is-contr→is-prop (cocompl _ .has⊥ (cocone _ (λ _ → cocompl _ .bot .ψ _) λ _ → C.idr _))
-- (cocone-hom _ λ o → C.pullr (cocompl _ .has⊥ _ .centre .commutes _) ∙ C.idr _)
-- (cocone-hom _ λ o → C.idl _ ∙ ap (cocompl _ .bot .ψ) (sym (happly (term _ .paths _) _)))))
-- (!-unique₂ fc.terminal _ _)
-- Global-sections .Inv-lex .is-lex.pres-pullback {P = P} {X} {p1 = p1} {p2} {f} {g} x = {! !}
-- -- open is-pullback
-- -- pb′ : is-pullback C _ _ _ _
-- -- pb′ .square = sym Copower-∘ ∙ ap Copower-map (x .square) ∙ Copower-∘
-- -- pb′ .limiting {P'} {p1'} {p2'} p = Copower-map {! !} C.∘ {! !}
-- -- pb′ .p₁∘limiting = C.pulll (sym Copower-∘ ∙ ap Copower-map (x .p₁∘limiting))
-- -- ∙ {! !}
-- -- pb′ .p₂∘limiting = {! !}
-- -- pb′ .unique = {! !}
-- Global-sections .Inv⊣Dir = adj₂
-- where
-- open _⊣_
-- adj₂ : Copower (fc.terminal .top) ⊣ _
-- adj₂ .unit .η x i = cocompl _ .bot .ψ i
-- adj₂ .unit .is-natural x y f = funext λ _ → sym (cocompl _ .has⊥ _ .centre .commutes _)
-- adj₂ .counit .η x = cocompl _ .has⊥ cocone′ .centre .hom
-- where
-- cocone′ : Cocone (Const (fc.terminal .top))
-- cocone′ .coapex = x
-- cocone′ .ψ f = f
-- cocone′ .commutes f = C.idr _ ∙ sym f
-- adj₂ .counit .is-natural x y f = ap hom $ is-contr→is-prop
-- (cocompl _ .has⊥ (cocone y (λ g → f C.∘ g) (λ p → C.pullr (C.elimr refl ∙ sym p))))
-- (cocone-hom _ (λ o → C.pullr (cocompl _ .has⊥ _ .centre .commutes _) ∙ cocompl _ .has⊥ _ .centre .commutes _))
-- (cocone-hom _ (λ o → C.pullr (cocompl _ .has⊥ _ .centre .commutes _)))
-- adj₂ .zig = ap hom $ is-contr→is-prop
-- (cocompl _ .has⊥ (cocone (cocompl (Const (fc.terminal .top)) .bot .coapex) _ λ f → C.idr _ ∙ ap (cocompl _ .bot .ψ) (sym f)))
-- (cocone-hom _ λ o → C.pullr (cocompl _ .has⊥ _ .centre .commutes _) ∙ cocompl _ .has⊥ _ .centre .commutes _)
-- (cocone-hom C.id (λ o → C.idl _))
-- adj₂ .zag = funext λ x → cocompl _ .has⊥ _ .centre .commutes _
-- -}
-- {-
-- map→object : Geom[ C , PSh κ (FinSet ^op) ] → C.Ob
-- map→object gm = Inv[ gm ] .F₀ Fin→Sets
-- object→map : C.Ob → Geom[ C , PSh κ (FinSet ^op) ]
-- Inv[ object→map ob ] = Copower ob F∘ ev (FinSet ^op) 1
-- Dir[ object→map ob ] = const′ F∘ hom' where
-- hom' : Functor C (Sets κ)
-- hom' .F₀ ob′ = C.Hom ob ob′ , C.Hom-set _ _
-- hom' .F₁ f = f C.∘_
-- hom' .F-id = funext C.idl
-- hom' .F-∘ f g = funext λ _ → sym (C.assoc _ _ _)
-- const′ : Functor (Sets κ) (PSh κ (FinSet ^op))
-- const′ .F₀ c = Const c
-- const′ .F₁ f = NT (λ _ → f) (λ _ _ _ → refl)
-- const′ .F-id = Nat-path λ _ → refl
-- const′ .F-∘ f g = Nat-path λ _ → refl
-- object→map ob .Inv-lex = F∘-is-lex (record { pres-⊤ = {! !} ; pres-pullback = {! !} }) (right-adjoint→lex (const⊣ev _ _))
-- object→map ob .Inv⊣Dir = LF⊣GR adj₁ adj₂
-- where
-- open _⊣_
-- adj₁ : ev _ _ ⊣ _
-- adj₁ .unit .η x .η n o = x .F₁ (λ _ → fzero) o
-- adj₁ .unit .η x .is-natural y z f = funext λ _ →
-- sym (happly (x .F-∘ _ _) _) ∙ refl
-- adj₁ .unit .is-natural x y f = Nat-path λ _ → funext λ _ →
-- happly (sym (f .is-natural _ _ _)) _
-- adj₁ .counit .η _ o = o
-- adj₁ .counit .is-natural = λ _ _ _ → refl
-- adj₁ .zig {A} = funext λ x → ap (λ e → A .F₁ e x) (funext λ { fzero → refl })
-- ∙ happly (A .F-id) _
-- adj₁ .zag = Nat-path (λ _ → refl)
-- adj₂ : Copower ob ⊣ _
-- adj₂ .unit .η x i = cocompl _ .bot .ψ i
-- adj₂ .unit .is-natural x y f = funext λ _ → sym (cocompl _ .has⊥ _ .centre .commutes _)
-- adj₂ .counit .η x = cocompl _ .has⊥ cocone′ .centre .hom
-- where
-- cocone′ : Cocone (Const ob)
-- cocone′ .coapex = x
-- cocone′ .ψ f = f
-- cocone′ .commutes f = C.idr _ ∙ sym f
-- adj₂ .counit .is-natural x y f = ap hom $ is-contr→is-prop
-- (cocompl _ .has⊥ (cocone y (λ g → f C.∘ g) (λ p → C.pullr (C.elimr refl ∙ sym p))))
-- (cocone-hom _ (λ o → C.pullr (cocompl _ .has⊥ _ .centre .commutes _) ∙ cocompl _ .has⊥ _ .centre .commutes _))
-- (cocone-hom _ (λ o → C.pullr (cocompl _ .has⊥ _ .centre .commutes _)))
-- adj₂ .zig = ap hom $ is-contr→is-prop
-- (cocompl _ .has⊥ (cocone (cocompl (Const ob) .bot .coapex) _ λ f → C.idr _ ∙ ap (cocompl _ .bot .ψ) (sym f)))
-- (cocone-hom _ λ o → C.pullr (cocompl _ .has⊥ _ .centre .commutes _) ∙ cocompl _ .has⊥ _ .centre .commutes _)
-- (cocone-hom C.id (λ o → C.idl _))
-- adj₂ .zag = funext λ x → cocompl _ .has⊥ _ .centre .commutes _
-- test : ∀ x → map→object (object→map x) C.≅ x
-- test x = C.make-iso
-- (cocompl _ .has⊥ (cocone x (λ _ → C.id) (λ _ → C.idl _)) .centre .hom)
-- (cocompl _ .bot .ψ (lift fzero)) (cocompl _ .has⊥ _ .centre .commutes _)
-- $ ap hom $ is-contr→is-prop
-- (cocompl _ .has⊥ (cocompl _ .bot))
-- (cocone-hom _ (λ o → C.pullr (cocompl _ .has⊥ _ .centre .commutes _) ∙ C.idr _ ∙ ap (cocompl (Const x) .bot .ψ) (ap lift (p (Lift.lower o)))))
-- (cocone-hom _ (λ o → C.idl _))
-- where
-- p : (o : Fin 1) → fzero ≡ o
-- p fzero = refl
-- -}
-}