\import Category \import Category.Functor \import Category.Limit \import Category.Slice \import Category.Subcat \import Equiv (QEquiv) \import Function.Meta \import Logic \import Logic.Meta \import Meta \import Paths \import Paths.Meta \record Presieve {C : Precat} (x : C) (\coerce S : \Pi {y : C} -> Hom y x -> \Prop) { \func diagram : Functor => Comp (SlicePrecat.forget x) (subPrecat.embedding {SlicePrecat x} (\lam (p : \Sigma (y : SlicePrecat x) (S y.2)) => p.1)) \func cone : Cone diagram.op x \cowith | coneMap => __.1.2 | coneCoh => __.2 \func pullback {y : C} (h : Hom y x) : Presieve y \cowith | S g => S (h ∘ g) \lemma pullback_id : pullback (id x) = {Presieve x} \this => exts \lam h => pmap S id-left } \where { \lemma idLimit {C D : Precat} {F : Functor C.op D} {x : C} (S : Presieve x) (xS : S (id x)) : Limit { | Cone => Cone.map F S.cone } \cowith | isLimit z => \new QEquiv { | ret (c : Cone) => c.coneMap ((x, id x), xS) | ret_f h => pmap (`∘ _) Func-id *> id-left | f_sec (c : Cone) => exts \lam ((y,Hyx),yS) => c.coneCoh (Hyx, id-left) } \open Limit \lemma transLimit {C : SmallPrecat} {D : Precat} {F : Functor C.op D} {a : C} (S1 S2 : Presieve a) (L1 : \Pi {b : C} (h : Hom b a) -> Limit { | Cone => Cone.map F (cone {S1.pullback h}) }) (L2 : \Pi {b : C} {h : Hom b a} -> S1 h -> Limit { | Cone => Cone.map F (cone {S2.pullback h}) }) : Limit { | Cone => Cone.map F S2.cone } \cowith | isLimit z => \have | L : Limit { | Cone => Cone.map F S1.cone } => rewriteI S1.pullback_id (L1 (id a)) | cm (c : Cone (Comp F S2.diagram.op) z) : Cone L.G z => \new Cone { | coneMap ((x,Hxa),xS1) => limMap {L2 xS1} (\new Cone { | coneMap ((y,Hyx),yS2) => c.coneMap ((y, Hxa ∘ Hyx), yS2) | coneCoh {((y,Hyx),yS2)} {((y',Hy'x),y'S2)} h => c.coneCoh {((y, Hxa ∘ Hyx), yS2)} {((y', Hxa ∘ Hy'x), y'S2)} (h.1, o-assoc *> pmap (Hxa ∘) h.2) }) | coneCoh {k} {k'} h => limUnique {L2 k'.2} \lam j => inv o-assoc *> pmap (`∘ _) (inv Func-o) *> limBeta {L2 k.2} _ ((j.1.1, h.1 ∘ j.1.2), transport (S2 __) (pmap (`∘ j.1.2) (inv h.2) *> o-assoc) j.2) *> path (\lam i => c.coneMap ((j.1.1, (inv o-assoc *> pmap (`∘ j.1.2) h.2) @ i), prop-dpi _ _ _ @ i)) *> inv (limBeta {L2 k'.2} _ j) } \in \new QEquiv { | ret c => L.limMap (cm c) | ret_f h => L.limUniqueBeta \lam j => limUniqueBeta {L2 j.2} (\lam k => pmap (`∘ h) Func-o *> o-assoc) | f_sec c => exts \lam j => limUnique {L1 j.1.2} \lam k => inv o-assoc *> pmap (`∘ _) (inv Func-o) *> L.limBeta (cm c) ((k.1.1, j.1.2 ∘ k.1.2), k.2) *> limUnique {L2 k.2} (\lam m => unfold $ limBeta {L2 k.2} _ m *> inv (coneCoh {c} {j} {(m.1.1, j.1.2 ∘ k.1.2 ∘ m.1.2), m.2} (k.1.2 ∘ m.1.2, inv o-assoc)) *> pmap (`∘ _) F.Func-o *> o-assoc) } } \record Sieve \extends Presieve { | isSieve : \Pi {z y : C} (g : Hom z y) {f : Hom y x} -> S f -> S (f ∘ g) \func pullback {y : C} (h : Hom y x) : Sieve y \cowith | S g => S (h ∘ g) | isSieve g hfS => transport S o-assoc (isSieve g hfS) } \where { \func map {C D : Precat} (F : Functor C D) (s : Sieve {C}) : Sieve {D} \cowith | x => F s.x | S {y} h => ∃ (z : C) (f : Hom y (F z)) (g : Hom z s.x) (h = F.Func g ∘ f) (s g) | isSieve h (inP (w,k,g,p,sg)) => inP (w, k ∘ h, g, rewrite p o-assoc, sg) } \class Site \extends Precat \lp | isCover (x : Ob) : Sieve x -> \Prop | cover-stable {x y : Ob} (h : Hom x y) {s : Sieve y} (c : isCover y s) : isCover x (s.pullback h) \record SitePrehom \extends Functor \lp { \override C : Site \override D : Site | F-cover {x : C} {s : Sieve x} : isCover x s -> isCover (F x) (Sieve.map \this s) } \func inducedSite {C : SmallPrecat} {D : Site} (F : Functor C D) : Site \cowith | Precat => C | isCover x s => ∃ (s' : Sieve (F x)) (isCover (F x) s') ∀ {y} (h : Hom y x) (s h = s' (F.Func h)) | cover-stable h {s} (inP (s' : Sieve, c, p)) => inP (s'.pullback (F.Func h), cover-stable (F.Func h) c, \lam g => p (h ∘ g) *> pmap (s' __) Func-o) \class SiteWithBasis \extends Site, PrecatWithPullbacks (\lp,\lp) { | isBasicCover (x : Ob) {J : \Set} (g : J -> SlicePrecat x) : \Prop | basicCover-stable {x y : Ob} (f : Hom x y) {J : \Set} {g : J -> SlicePrecat y} : isBasicCover y g -> isBasicCover x (\lam j => pullbackFunctor f (g j)) | isCover x s => ∃ (J : \Set) (g : J -> SlicePrecat x) (isBasicCover x g) (\Pi (j : J) -> s (g j).2) | cover-stable h {s} (inP (J,g,c,d)) => inP (J, \lam j => pullbackFunctor h (g j), basicCover-stable h c, \lam j => transportInv (s {_}) (Pullback.pbCoh {pullback h (g j).2}) (isSieve _ (d j))) \lemma genSieve (a : Ob) {J : \Set} (g : J -> SlicePrecat a) : Sieve a (\lam {b} f => ∃ (j : J) (h : Hom b (g j).1) ((g j).2 ∘ h = f)) \cowith | isSieve {z} {y} f (inP (j,h,s)) => inP (j, h ∘ f, inv o-assoc *> pmap (`∘ f) s) } \record SiteWithBasisPrehom \extends Functor \lp { \override C : SiteWithBasis \override D : SiteWithBasis | F-basicCover {x : C} {J : \Set} {g : J -> SlicePrecat x} : isBasicCover x g -> isBasicCover (F x) (\lam j => (F (g j).1, Func (g j).2)) | F-pullback {x y z : C} {f : Hom x z} {g : Hom y z} : Iso {D} {F (pullback f g)} {pullback (Func f) (Func g)} $ pbMap (Func pbProj1) (Func pbProj2) $ inv Func-o *> pmap Func pbCoh *> Func-o }