Sheaves came up in my last post, so , since I’m quite new to sheaves, I figured it would be a good idea to learn some more about them. Naturally, I decided to share my notes with you.
The books I’m using to learn about sheaves are: (1) Sheaf Theory though Examples [Rosiak] and (2) Sheaves in Geometry and Logic [MacLane, Moerdijk]. I’m really enjoying both, so I recommend you give them a read, if you’re interested (maybe start with the first one).
Sheaves, I say, waving my hands profusely, have to do with passing from local information to global information. Daniel Rosiak has a bunch of great examples (which is unsurprising, since the word “examples” is even in the in the title of his book). The example I’ll use here is one we’ve already seen in my previous post: graph homomorphisms. Let’s unpack that.
Suppose \(f: G \to H\) is a graph homomorphism where \(G\) and \(H\) are finite simple graphs (“to keep things simple“). Now suppose we have a covering \((G_i)_{i \in I}\) of \(G\) (i.e. some \(I\)-indexed family of subgraphs of \(G\) whose union is \(G\)). Clearly we can restrict \(f\) to each subgraph \(G_i\) in the family; this yields a family of graph homorphisms \( (f_i := f|_{G_i})_{i \in I} \) which match-up on boundaries: $$\forall i,j \in I, \quad f_i|_{G_i \cap G_j} = f_j|_{G_i \cap G_j}.$$
Yeah, so what?Well, what if, conversely, I were to give you such a matching family of functions \( \mathcal{M} := (f_i: G_i \to H)_{i \in I} \) (i.e. one where \(f_i|_{G_i \cap G_j} = f_j|_{G_i \cap G_j}\)); what would you be able to deduce? You’d be able to deduce that this family \(\mathcal{M}\) uniquely determines a graph homomorphism $$f_{\mathcal{M}}: G \to H \text{ where } f_{\mathcal{M}}: (x \in G_i) \mapsto f_i(x).$$
This is saying that graph homomorphisms are global constructions which are uniquely reconstructable from matching families of their sections (i.e. restrictions).
In a sense, lovingly mocking topolgy, this is the primordial example of a sheaf. This post is my attempt to organize sheaves in my mind so that I have a clear picture of how: (1) one generalizes the notion of a sheaf, (2) what are the knobs we can tune in the definition and (3) how one generates examples — at least heruistically — of sheaves.
From my ever-less naïve perspective (thanks go to Daniel Rosiak for helping me clear up some confusion) , the birds-eyed, handwavy view is the following. In the general case, to define a sheaf one needs four kinds of data:
a presheaf \(\mathcal{F}: C^{op} \to D\) (i.e. a functor whose attitude seems to display a particular proclivity towards sheaf-y-ness)
a notion of covering,
what it means for “stuff in \(\mathcal{F}\)” (sections) to match-up given this notion of covering and
what the sheaf condition looks like given a matching family.
For the graph homomorphism example, the presheaf in question is that of continuous functions (a classic): $$\mathcal{F} : (\mathbf{Sub}G)^{op} \to \mathbf{Set} \text{ where } \mathcal{F} : (G’ {\hookrightarrow} G) \mapsto \{h \colon G’ \to H \mid h \text{ graph homo.}\}.$$
The interesting parts are points 2,3 and 4; namely: “coverings” and “matching families” and the “sheaf condition”.
Let’s start by abstracting the sheaf condition.
To that end let’s think of set-valued presheaves \(\mathcal{F}: (\mathcal{O}X)^{op} \to \mathbf{Set} \) on the poset of opens in a topological space \(X\) (notice that the graph example above is a special case). Let’s also take this as an opportunity to formally state the terminology:
we call \( \mathcal{F}U \) the set of sections of \(\mathcal{F}\),
naturally we call any \(s \in \mathcal{F}U\) a section of \(\mathcal{F}U\),
we say that a family \((s_i \in \mathcal{F}U_i)_{i \in I}\) is a matching family if it consists of pairwise matching/agreeing sections; i.e. such that \(s_i|_{U_i \cap U_j} = s_j|_{U_i \cap U_j}\).
If you’ve read my previous post, you’ll have noticed that one can indeed define presheaves or sheaves that are not \(\mathbf{Set}\)-valued. To try to keep things simpler, I’ll stick with \(mathbf{Set}\)-valued sheaves in this post.
By the way, John Baez gave me some sound typograhical advice this week: one should use bold for definitions and italic for emphasis. I’m going to try to shift to this convention from now on, but, since old habits die hard, please help me out by pointing out typographical inconsistnecies, if you find any. 🙂
Alright, so hopefully you agree that the definition of a sheaf that I gave before reeks with bad vibes. So what’s “off” in that definition.? Well, for starters we’re taking intersections of opens \(U_i \cap U_j\), yuck! The polite thing to do is to talk about spans like: \(U_i \leftarrow U_i \cap U_j \rightarrow U_j\).
Def: Fix a topological space \(X\) and and open \(U\) in \(X\). Consider any (I)-indexed family \(\mathcal{U} := (U_i)_{i \in I}\) of opens in \(X\) (for any such \(I\)) together with the inclusions \(U_i \hookleftarrow U_i \cap U_j \hookrightarrow U_j\). We say that \(\mathcal{U}\) is a covering of \(U\) if \(U\) is the colimit of \(\mathcal{U}\).
Def: a presheaf \(\mathcal{F}: (\mathcal{O}X)^{op} \to \mathbf{Set}\) is a sheaf of Sets if, for all coverings \(\mathcal{U}\) of \(X\), the following is an equalizer diagram.
The fact that \(e\) is an equalizer amounts to saying that you can reconstruct sections on \(U\) from sections on each one of the opens \(U_i\) in the covering \(\mathcal{U}\) of \(U\).
This is a general definition of the “collation” property which should work in any category. Unfortunetely we’re not done, since the notion of a covering doesn’t generalize immeditely (what should the analogue of \(\mathcal{O}X\) be?).
The following are some notes on Chapter 10 of Daniel’s book; if it’s your first time being “sheafy” and you’re confused, don’t be discouraged everything is explained very well in the book: I’m deliberately trying to condense these ideas all in one place for my own benefit.
So what makes a covering a covering? Well, you somehow recovered a bunch of data of some topological space \(X\) by pasting together opens of X. The opens of \(X\) are the elements of the poset \(\mathcal{O}X\) (these are subobjects of \(X\)). This is similar to the grah case where we let the opens of a graph \(G\) be objects of \(\mathbf{Sub}G\). In this setting, a covering of a graph \(G\) is just a diagram in the subcategory \(\mathbf{dom}: \mathbf{Sub}G \to \mathbf{Gr} \) whose colimit is \(G\) (… equivalently you could just take the diagram to be in \(\mathbf{Sub}G\)).
Observation: structured decompositions of a topological space and coverings of that space are the same thing. This makes me guess that the way to generalize the notion of a topology is to take structured decompositions is to first define an “opens” functor \(\mathbb{O}: C \to \mathbf{Cat}\) which is left adjoint and then define a covering of any \(c \in C\) to be \(\mathbb{O}(c)\)-valued structured decompositions which behave “nicely” when passed through the adjunction. Anyway, I’m writing this post as I read, so, brimming with eager anticipation, let’s find out together if this is how the story goes..
Gorthendieck’s idea was to let an “open” of an object \(c \in C\) to be any old mapping \(f: c’ \to c\). Then these would be collected into sets of the form $$S := \{f_i: c_i \to c \mid i \in I\}$$ called covering families and then these would in turn be collected into familes \(K\) of “permissible coverings” (I’m making this name up, I think); these are functions of the form $$K: (c \in C) \mapsto \{S, S’, S”, \dots\}.$$
Obviously, if you want this to be a useful notion, you can’t just call any such function \(K\) a covering; you want coverings to be nicely behaved. one way to make this precise is through the idea ofbasis of a Grothendieck topology (also known as a pretopology). Let’s define it.
Def: in a category \(C\) with pullbacks, we call such a “permissible coverings” function \(K\) a basis of Grothendieck topology if the following three conditions hold for all \(c \in C\):
for every isomorphism on \(c\) is a singleton covering; i.e. if \(f : c’ \to c\) is an iso, then \(\{f\} \in K(c)\)
if \(S \in K(c)\) is a covering family for \(c\) and \(g: b \to c\) a morphism in \(C\), then the pullback of \(S\) and \(g\) is a covering family for \(b\); i.e. $$\{g \times_{c} f \mid f \in S\} \in K(b);$$
if \(\{f_i : c_i \to c \mid i \in I\} \in K(c)\), then, whenever we are given \(\{g_{i,j}: b_{i,j} \to c_i | j \in J_i\} \in K(c_i)\) for all \(i \in I\), the composite covering family $$\{f_ig_{i,j}: b_{i,j} \to c_i \to c \mid i \in I, j \in J_i\} \in K(c).$$
The first axiom is very natural, it says, up to iso, that everything ought to cover itself. The third axiom is also very natural; it feels very monadic since it says that: “a cover of a cover is again a cover“. The second axiom is more interesting. I’m reading it as a generalization of the fact that \(\mathbf{Sub}(-): C \to \mathbf{Pos}\) is “functorial by pullback”.
By the way, this second condition looks like the definition of a pullback-absorbing functor which Zoltan, Jade and I give in our paper on structured decompositions.. this is not important, but I guess that it gives me a moment to remark on the discomfort I feel about the fact that \(K\) is a mere function instead of being a functor. If there are any sheaf-theorists out there who can tell me why it’s a bad idea to promote \(K\) to a functor, then leave a comment, I’d be very happy to hear about it!
Anyway, according to Grothendieck’s taste, requiring \(C\) to have pullbacks (needed for condition 2 above) was apparently still too restrictive. Since pullbacks only appear in the second condition and since the second condition is the odd one among the three, it makes sense to single it out. This yields the notion of a coverage (following Johnstone’s notation).
Def: a coverage on a category \(C\) is a function \(T\) taking objects of \(c\) to covering families (collections of morphisms with codomain \(c\)) such that, for every \(S \in T(c)\) and every arrow \(g: b \to c\) there is a covering family \(S’ \in T(b)\) such that \(g \circ S’\) factors through \(S\); spelling this out, we want the following to hold.
Apparently, you can throw the first and third conditions of a Grothendieck pretopology out of the window and stick with coverages to define site(i.e. a “place where you can define sheaves”) as a category equipped with a coverage .
Def: a site is a pair \((C, T)\) where \(C\) is a category and \(T\) a coverage.
Again I am confused: why not just define \(T\) to be a subfunctor of the Yoneda embedding \(y: (c \in C) \mapsto (C(-, c) : C^{op} \to \mathbf{Set})\)?
Anyway, sidestepping my unease around \(T\) being a function, the point of all this is that we can now define \(T\)-sheaves on a site \((C, T)\).
Def: let \(\mathcal{F}: C^{op} \to \mathbf{Set}\) be presheaf on a site \((C, T)\). We say that \(\mathcal{F}\) is a \(T\)-sheaf if the following holds for all objects \(c \in C\):
for all covers \(S := \{f_i: c_i \to c \mid i \in I\} \in T(c) \) in the coverage \(T\) and
for any family of sections \(s_i \in \mathcal{F}c_i )_{i \in I} \) (one for each element of the given cover) which is compatible w.r.t. \(S\) — i.e. such that given any commutative square we have that \(\mathcal{F}_g s_i = \mathcal{F}_h s_j\) (recall that \(\mathcal{F}\) is contravariant)
there is a unique section \(\sigma \in \mathcal{F}\) which restricts to each given section; i.e. \(\mathcal{F}_{f_i}\sigma = s_i\) for all \(i \in I\).
There is obviously more to be said here, but I’ll stop because I’m tired. Ciao!
P.S. looking ahead in Daniel’s book I think my issues with \(K\) being a function rather than a functor are fixed by sieves… more on that next time..
[…] Tree-shaped structured decompositions are among the simplest to compute upon. The tree-shape clearly displays the recursive structure of any graph that is obtained as a colimit of such a decomposition and this structure can be exploited algorithmically. Let’s see how to compute sheaves on such decompositions. (By the way, if you’re new to sheaves, I’ve collected some notes on sheaves in a previous post; you can find it here.) […]
[…] Last time I started explaining ((mathbf{Set})-valued) sheaves, coverages, sites and Grothendieck (pre-) topologies. Today I’ll talk about sieves and I’ll go deeper on sheaves, presheaves and Grothendieck topologies. […]
[…] I already explained sheaves in some previous posts (see §1, §2 and §3 if you want to learn a bunch about them) but, for what I’ll be speaking about in […]
3 responses to “Understanding sheaves §1”
[…] Tree-shaped structured decompositions are among the simplest to compute upon. The tree-shape clearly displays the recursive structure of any graph that is obtained as a colimit of such a decomposition and this structure can be exploited algorithmically. Let’s see how to compute sheaves on such decompositions. (By the way, if you’re new to sheaves, I’ve collected some notes on sheaves in a previous post; you can find it here.) […]
[…] Last time I started explaining ((mathbf{Set})-valued) sheaves, coverages, sites and Grothendieck (pre-) topologies. Today I’ll talk about sieves and I’ll go deeper on sheaves, presheaves and Grothendieck topologies. […]
[…] I already explained sheaves in some previous posts (see §1, §2 and §3 if you want to learn a bunch about them) but, for what I’ll be speaking about in […]