module Cat.Site.Instances.Frame {o â„“} (X : Poset o â„“) (isf : is-frame X) where
open Frame isf
Frames as sites🔗
Since sites, as categories we can define sheaves on, are meant to axiomatise what it means for a category to have a notion of covering, we should expect that frames, as geometric objects, should admit the structure of a site.
This module shows that: for a frame thought of as the opens in a space, we say that the coverings for are the families with To interpret such a family as a sieve, we say that an object belongs if there exists an with this is the specialisation to partial orders of the sieve generated by a family of arrows.
private
: ⌞ X ⌟ → Type _
Covering = Σ[ I ∈ Type o ] Σ[ f ∈ (I → ⌞ X ⌟) ] (⋃ f ≡ U)
Covering U
: ∀ {U} → Covering U → Sieve (poset→category X) U
generate (I , f , _) .arrows {V} _ = elΩ $ Σ[ i ∈ I ] V ≤ f i
generate (I , f , _) .closed = rec! λ i α β → inc (i , ≤-trans β α) generate
For the stability property, we have to check that given a covering and a contained we can restrict to a covering of The answer is yes, and the process is leaving the index the same, and intersecting each part of the coverage with This works only because is a frame: essentially, if then the infinite distributive law gives us and this last meet, if is just so is a covering family for
: ∀ {U V} → V ≤ U → Covering U → Covering V
∩-covering {U} {V} V≤U (I , f , p) = I , _ , cap-covers where abstract
∩-covering : ⋃ (λ i → f i ∩ V) ≡ V
cap-covers =
cap-covers (λ i → f i ∩ V) ≡˘⟨ ⋃-distribr f V ⟩
⋃ _∩_ p refl ⟩
⋃ f ∩ V ≡⟨ ap₂
U ∩ V ≡⟨ ∩-comm ∙ order→∩ V≤U ⟩ V ∎
To show that these definitions fit together to give a Coverage
, we must now show that, if
is a covering family for
then the intersection
we computed above is contained in the pullback sieve
We’ll actually do one better: the intersection we computed is
the pullback sieve.
generate-∩: ∀ {U V} (h : V ≤ U) (S : Covering U)
→ generate (∩-covering h S) ≡ pullback h (generate S)
(I , f , p) = ext λ {W} W≤V → Ω-ua
generate-∩ V≤U (rec! λ i W≤fi∩V → inc (i , ≤-trans W≤fi∩V ∩≤l))
(rec! λ i W≤fi → inc (i , ∩-universal _ W≤fi W≤V))
: Coverage (poset→category X) (lsuc o)
Open-coverage .covers = Covering
Open-coverage .cover = generate
Open-coverage .stable {U} {V} S V≤U = inc (∩-covering V≤U S , incl) where
Open-coverage : generate (∩-covering V≤U S) ⊆ pullback V≤U (generate S)
incl = subst (g ∈_) (generate-∩ V≤U S) incl g
The open coverage on a frame enjoys the important property of being subcanonical, i.e. all of its covering sieves are pullback-stable colimits. This is essentially by definition: in the open coverage, a family over is covering if its union is i.e. if its colimit is Regardless, Agda will still ask that we do a bit of shuffling, and this is where our lemma for simplifying pullbacks comes in.
: is-subcanonical _ Open-coverage
Open-coverage-is-subcanonical {U} cov@(I , f , _) {V} V≤U = done where
Open-coverage-is-subcanonical open make-is-colimit
: make-is-colim (poset→category X) (generate (∩-covering V≤U cov))
mk .ψ (elem W (W≤V , _)) = W≤V mk
In practical terms, all we have to show is that
is the colimit of
This computation is implicit in the definition of ∩-covering
, so we may reuse that. In more
details, we’re given an object
and a witness
that, for every
for which there exists an
with
we have
and we must show
Since
has a type with pretty complex quantification, we’ll write it out
first:
.universal {W} ε _ =
mk let
: ∀ {X} → X ≤ V → ∃[ i ∈ I ] X ≤ f i ∩ V → X ≤ W
ε' {X} α β = ε (elem X (α , (tr-□ β))) ε'
Since is equal to the join it has the universal property of a join: to show for any it suffices to show that for every By we can reduce this to the two trivial conditions and After this, we can finish the proof by transitivity.
: ∀ i → f i ∩ V ≤ W
pt = ε' ∩≤r (inc (i , ≤-refl))
pt i in
.snd .snd ⟩
V =˘⟨ ∩-covering V≤U cov (λ i → f i ∩ V) ≤⟨ ⋃-universal _ pt ⟩
⋃ W ≤∎
Commutativity, universality and uniqueness are all trivial in a poset, so is a colim sieve, which is almost what we wanted. The theorem is complete by transporting along our proof that
.commutes _ = prop!
mk .factors _ _ = prop!
mk .unique _ _ _ _ = prop!
mk
: is-colim (poset→category X) (pullback V≤U (generate cov))
done = subst (is-colim (poset→category X)) (generate-∩ V≤U _) (to-is-colimitp mk refl) done