Sheafification without using stalks? Most definitions of sheafification either use stalks or (co)limits. Can we avoid that, at least in some nice cases? Say $\mathcal{F}$ is a sheaf of abelian groups on a topological space $X$, thought of as functions with certain properties. For $U\subseteq X$ open, call $(f_i,U_i)_{i\in I}$ a generalized function if $(U_i)_{i\in I}$ is an open cover of $U$, $f_i\in \mathcal{F}(U_i)$ and they are compatible, i.e., $f_i$ and $f_j$ agree on $U_i\cap U_j$. Identify two generalized functions $(f_i,U_i)_{i\in I}$ and $(g_j,V_j)_{j\in J}$ if they cover the same open set $U$, and there is another open cover $(W_k)_k$ of $U$ such that $f_i$ agree with $g_j$ on $U_i\cap V_k\cap W_k$ for all $i,j,k$; I think this is equivalent to the existence of $(W_k)_k$ a common refinement of $(U_i)_i$ and $(V_j)_j$, and $f_i,g_j$ agreeing on $W_k$.
Can we define the sheafification $\mathcal{F}^\sharp$ by letting $\mathcal{F}^\sharp(U)$ be all the equivalence classes of generalized functions on $U$? Or if this disagree with the standard definition is there a simple counterexample? Is it even a sheaf?
Edit: It seems it is standard that this works for separated presheaf, namely if two function agree on an open cover then they agree, but it doesn't work in general (although it does make the presheaf separate, and thus applying twice would work). Here is the argument. Use $[(f_i,U_i)_{i\in I}]$ to denoted the equivalence class of $(f_i,U_i)_{i\in I}$. If $W\subseteq U$ is open, the restriction of $[(f_i,U_i)_{i\in I}]$ to $W$ is $[(f_i|_{U_i\cap W},U_i\cap W)_{i\in I}]$. For simplicity say we have two classes [$(f_i,U_i)_{i\in I}]$ and $[(g_j,V_j)_{j\in J}]$ that are compatible, that is the restrictions of $(f_i,U_i)_{i\in I}$ and $(g_j,V_j)_{j\in J}$ to $U\cap V$ are equivalent. I claim that $(f_i,U_i)_{i\in I}\cup(g_j,V_j)_{j\in J}$ is a generalized function, which means $f_i$ and $g_j$ agree on $U_i\cap V_j$. What we know is that $f_i$ and $g_j$ agree on $U_i\cap V_j\cap W_k$ for some open cover $(W_k)_k$ of $U\cap V$. To deduce that $f_i$ and $g_j$ agree on $U_i\cap V_j$ we do want the presheaf we started with to be separated.
 A: Your construction is the Grothendieck $+$ construction. In fact, although it may not be obvious to you, your approach uses limits and colimits.
Recall that a sieve is a set $K$ of open sets such that for all open $V \subseteq W \in K$, $V \in K$. If $\bigcup\limits_{V \in K} V = U$, $K$ is said to be a cover of $U$. In other words, a cover of $U$ is an open cover which is also a sieve. Denote the set of covers of $U$ by $sieve(U)$. Note that $sieve : Sets^{\mathcal{O}_X^{op}}$ is actually a presheaf of sets. $\DeclareMathOperator{colim}{colim}$
Every open cover $\{U_i \mid i \in I\}$ of $U$ gives rise to the sieve $toSieve((U_i)_{i \in I}) := \bigcup\limits_{i \in I} \{V$ open $\mid V \subseteq U_i\}$.
It turns out that your set of “generalised functions” on $U$ is just $\colim_{K \in sieve(U)} \lim_{V \in K} \mathcal{F}(V)$. Indeed, given a generalised function $(f_i, U_i)_{i \in I}$, let $K = toSieve((U_i)_{i \in I})$. Then we can extend $f$ uniquely to an element $g \in \lim_{V \in K} \mathcal{F}(V)$ by defining, for $V \subseteq U_i$, $g_V = f_{U_i}|_V$.
Your condition for when one should consider two “generalised functions” to be equal corresponds precisely to taking the colimit over all sieves. Define the resulting preshead to be $\mathcal{F}^+$.
The good news is that you are on the right track, and this $+$ construction can be used to construct the sheafification. The bad news is that you actually have to apply it twice - the construction is thus known as the $++$ construction.
To show you can’t get away with just one application (except for $X$ trivial), take $\mathcal{F}$ to be the constant presheaf on $S$, where $S$ is any set with at least two distinct elements. That is, $\mathcal{F}(U) = S$ for all $U$, with restrictions being the identity map. Then $\mathcal{F}^+(U)$ will be $S$ for nonempty $U$ and $1$ for $U = \emptyset$. This is not a sheaf unless every open subset of $X$ is connected.
You were correct to note that $+$ results in a sheaf when applied to a separated presheaf. It is a no-op when applied to a sheaf. And it gives a separated presheaf when applied to any presheaf.
For more details on why $++$ gives the sheafification, you should consult a text. I first learned it from Sheaves in Geometry and Logic. It takes about 5 pages, so I won’t recount the proof here.
