One of the central facts in elementary topos theory is that geometric morphisms between slice toposes \(\mathbf{Set}/J\) and \(\mathbf{Set}/K\) correspond exactly to functions \(f:J\to K\). Let’s unpack that carefully, and then describe explicitly the inverse image and direct image functors that such a morphism induces.
A geometric morphism \[ f:\mathcal{E}\longrightarrow\mathcal{F} \] between toposes is a pair of functors \[ f^*:\mathcal{F}\to\mathcal{E},\qquad f_*:\mathcal{E}\to\mathcal{F}, \] such that:
If we have \(\mathcal{E}=\mathbf{Set}/J\) and \(\mathcal{F}=\mathbf{Set}/K\), we are looking for such pairs \((f^*, f_*)\).
Every function \(f:J\to K\) gives rise to a geometric morphism \[ f:\mathbf{Set}/J\longrightarrow\mathbf{Set}/K, \] and every geometric morphism between slice toposes arises uniquely in this way (up to isomorphism).
The key idea: the slice \(\mathbf{Set}/J\) can be thought of as “the category of sets varying over \(J\),” i.e. a family of sets indexed by \(J\). A function \(f:J\to K\) allows you to:
These are the inverse and direct image functors respectively.
Given \(f:J\to K\), define \[ f^*:\mathbf{Set}/K \to \mathbf{Set}/J \] as pullback (reindexing) along \(f\). Concretely:
This functor \(f^*\) is left exact, since pullback in \(\mathbf{Set}\) preserves all finite limits (indeed, is exact).
Fiberwise description.
Under the equivalence \(\mathbf{Set}/J\simeq\prod_{j\in J}\mathbf{Set}\),
the object \(f^*(Y\to K)\) corresponds to the family
\[
(f^*Y)_j = Y_{f(j)}.
\]
That is, \(f^*\) reindexes the family \((Y_k)_{k\in K}\) along \(f:J\to K\).
So \(f^*\) acts as: “Given a family of sets over \(K\), take the family over \(J\) obtained by looking at the fiber over \(f(j)\).”
The right adjoint of \(f^*\) is the “dependent product” (or right Kan extension) along \(f\), \[ f_*:\mathbf{Set}/J \to \mathbf{Set}/K. \]
Concretely:
So under the product-of-sets description, this amounts to \[ (f_*X)_k = \prod_{j\in f^{-1}(k)} X_j. \]
So \(f_*\) takes a family over \(J\) and bundles together all the fibers with the same image in \(K\), turning a \(J\)-family into a \(K\)-family by taking products over each fiber of \(f\).
To verify \(f^*\dashv f_*\), it suffices to check fiberwise: \[ \operatorname{Hom}_{\mathbf{Set}/J}(f^*(Y\to K), X\to J) \cong \operatorname{Hom}_{\mathbf{Set}/K}(Y\to K, f_*(X\to J)). \]
Under the product-of-sets equivalence, this becomes \[ \prod_{j\in J}\operatorname{Hom}(Y_{f(j)},X_j) \;\cong\; \prod_{k\in K}\operatorname{Hom}\Big(Y_k, \prod_{j\in f^{-1}(k)}X_j\Big), \] and this bijection is simply the adjunction between “precomposition” and “product of homs,” namely: \[ (g_j)_{j\in J} \longleftrightarrow (g'_k)_{k\in K}, \quad \text{where } g'_k(y) = (g_j(y))_{j\in f^{-1}(k)}. \] This works naturally in all variables, so \(f^*\dashv f_*\).
While not part of the definition of a geometric morphism, in the case of \(\mathbf{Set}/J\) there also exists a left adjoint \(f_!\) to \(f^*\) (making \(f^*\) part of an essential geometric morphism).
Concretely:
| Functor | Direction | Formula on fibers | Description |
|---|---|---|---|
| \(f_!\) | \(\mathbf{Set}/J \to \mathbf{Set}/K\) | \((f_!X)_k = \bigsqcup_{j\in f^{-1}(k)} X_j\) | pushforward by sum (compose maps) |
| \(f^*\) | \(\mathbf{Set}/K \to \mathbf{Set}/J\) | \((f^*Y)_j = Y_{f(j)}\) | pullback (reindex) along \(f\) |
| \(f_*\) | \(\mathbf{Set}/J \to \mathbf{Set}/K\) | \((f_*X)_k = \prod_{j\in f^{-1}(k)} X_j\) | pushforward by product (dependent product) |
And the adjunctions hold: \[ f_! \;\dashv\; f^* \;\dashv\; f_*. \]
Therefore:
Thus the geometric morphisms between slice toposes over sets are exactly reindexing morphisms induced by maps of the base sets.
Let’s now translate the concrete slice-picture into the internal languages (type-theoretic / predicate-logical view) of the toposes \(\mathbf{Set}/J\) and \(\mathbf{Set}/K\), and show how \((f^*,f_!,f_*)\) become substitution, existential and universal quantification respectively. We’ll do this in a mix of dependent-type notation and ordinary predicate notation.
Fix \(f:J\to K\). For a family \(Y\to K\) write \(Y_k\) for the fiber over \(k\in K\). For a family \(X\to J\) write \(X_j\) for the fiber over \(j\in J\). The three functors are:
We’ll show how these are interpreted inside the internal languages.
Think of \(\mathbf{Set}/K\) as the theory of sets varying over \(K\) (or the dependent type theory with a distinguished index type \(k:K\)). Concretely:
Similarly \(\mathbf{Set}/J\) is the dependent theory with index variable \(j:J\), types \(B(j)\), terms \(b(j)\), and predicates \(Q(j)\).
The important operation is substitution/reindexing: given a map \(f:J\to K\), any syntactic object depending on \(k\) (a type \(A(k)\), a term \(a(k)\), a predicate \(P(k)\)) can be pulled back to something depending on \(j\) by replacing \(k\) with \(f(j)\): written \(A(f(j))\), \(a(f(j))\), \(P(f(j))\).
This replacement is exactly the inverse-image functor \(f^*\).
Syntactic statement. If in the language of \(\mathbf{Set}/K\) we have a type family \(A(k)\) (i.e. \(A\to K\)), then in the language of \(\mathbf{Set}/J\) we get the pulled-back type \(A[f](j) := A(f(j))\). If \(a(k):A(k)\) is a term, then \(a[f](j):=a(f(j))\) is a term of type \(A[f](j)\).
Categorical reading. This is exactly \(f^*A\) with \(\big(f^*A\big)_j = A_{f(j)}\).
Logical consequence. Because pullback preserves finite limits, \(f^*\) preserves truth, conjunction, equality, and finite products. In internal language: substitution commutes with ∧, ⊤, and with formation of identity-types (i.e. equality is stable under substitution).
Think of an object \(X\to J\) as a predicate/type \(X(j)\) depending on \(j:J\). Then \(f_!X\) is a family over \(K\) defined at each \(k\in K\) by \[ (f_!X)(k) \;=\; \Sigma_{j\in f^{-1}(k)} X(j). \] Syntactically, for \(k:K\) we form the dependent sum \[ \exists j, (f(j)=k) \;.\; X(j). \] (Equivalently \(\Sigma_{j:J} (f(j)=k) \times X(j)\).)
Introduction/elimination rules (informal):
Adjunction: \(f_!\dashv f^*\) becomes the logical equivalence \[ \operatorname{Hom}_{\mathbf{Set}/K}(f_!X,Y)\cong\operatorname{Hom}_{\mathbf{Set}/J}(X,f^*Y), \] which in internal logic reads as the usual existential/capture rule: \[ \text{Given } \varphi(j,y)\text{ with }y:X(j), \text{ we get } \psi(k,-) \text{ on }(f_!X)(k) \text{ iff we have } \varphi \text{ for each } j\text{ with }f(j)=k. \] More elementarily, this says: a \(K\)-indexed family of maps \(f_!X(k)\to Y(k)\) corresponds to a \(J\)-indexed family \(X(j)\to Y(f(j))\) — i.e. giving, for each \(j\), a way to send \(x\in X(j)\) to an element of \(Y(f(j))\). That is the familiar rule for defining functions out of a dependent sum.
Similarly, \(f_*\) is the dependent product: \[ (f_*X)(k) \;=\; \Pi_{j\in f^{-1}(k)} X(j). \] Syntactically, for \(k:K\) we may view \((f_*X)(k)\) as the type of families \((x_j)_{j\in f^{-1}(k)}\) with \(x_j\in X(j)\), equivalently the type \[ \forall j, (f(j)=k) \;.\; X(j), \] or \(\Pi_{j:J} (f(j)=k) \to X(j)\) depending on encoding of bounded quantification.
Introduction/elimination rules (informal):
Adjunction: The adjunction \(f^*\dashv f_*\) is \[ \operatorname{Hom}_{\mathbf{Set}/J}(f^*Y,X)\cong\operatorname{Hom}_{\mathbf{Set}/K}(Y,f_*X). \] In internal terms this reads as the usual universal quantifier rule: providing, for each \(j\) in the fiber of \(k\), a map \(Y(f(j))\to X(j)\) is the same as providing a single map \(Y(k)\to \prod_{j\in f^{-1}(k)} X(j)\). It encodes the idea that universal quantification over the fiber corresponds to dependent product.
If \(P(k)\) is a predicate on \(K\) then in the \(J\)-language \(f^*P\) is \(P(f(j))\). Thus the judgment \[ k:K \;\vdash\; P(k)\ \text{ true} \] pulls back to \[ j:J \;\vdash\; P(f(j))\ \text{ true.} \] This is just ordinary substitution.
Suppose \(\exists j,(f(j)=k \wedge \phi(j))\) holds in context \(k:K\). Writing this as an element of \((f_!\mathbf{1}_X)(k)\) with \(\mathbf{1}_X\) the terminal family on \(X\), the elimination rule leads to some \(j\) with \(f(j)=k\) and \(\phi(j)\) to prove a goal that depends only on \(k\).
If \(t\in (f_*X)(k)\) (a family \(t(j)\in X(j)\) for each \(j\in f^{-1}(k)\)), then for each such \(j\) we have \(t(j)\in X(j)\) — the projection/elimination of \(\Pi\).
We can convert the bounded quantifiers range \(j\in f^{-1}(k)\) into a more uniform syntax over a single ambient index type \(J\) and an equality predicate \(f(j)=k\):
Both are standard and equivalent inside the topos because \(\Sigma\) and \(\Pi\) can be used with predicates \((f(j)=k)\).
Thus the three adjunctions \(f_!\dashv f^*\dashv f_*\) give the usual interplay of substitution, ∃ and ∀ in the dependent logic of the slices.
The adjunction isomorphisms yield the following inference rules:
These are exactly the same calculations as the Hom-set bijections we gave earlier, only read as logical rules instead of maps of sets.
Here’s the standard generalization to an arbitrary topos \(\mathcal{E}\), using the internal language of \(\mathcal{E}\). We’ll:
Let \(\mathcal{E}\) be any topos and let \(f:A\to B\) be an arrow in \(\mathcal{E}\). Then there is an (essential) geometric morphism of toposes \[ f:\mathcal{E}/A \longrightarrow \mathcal{E}/B \] whose inverse image is the pullback (reindexing) functor \(f^*:\mathcal{E}/B\to\mathcal{E}/A\). Moreover \(f^*\) has both a left adjoint \(\Sigma_f\) and a right adjoint \(\Pi_f\): \[ \Sigma_f \;\dashv\; f^* \;\dashv\; \Pi_f. \] Thus geometric morphisms between slices \(\mathcal{E}/A\to\mathcal{E}/B\) are (up to canonical iso) exactly arrows \(f:A\to B\) in \(\mathcal{E}\).
(As in \(\mathbf{Set}\), \(\Sigma_f\) is dependent sum along \(f\) and \(\Pi_f\) is dependent product along \(f\).)
These universal properties determine \(\Sigma_f\) and \(\Pi_f\) uniquely (up to iso) and give the adjunctions \(\Sigma_f\dashv f^*\) and \(f^*\dashv\Pi_f\).
Working in the internal language of the topos \(\mathcal{E}\) we can think of \(A\) and \(B\) as types (objects) and \(f:A\to B\) as a term \(f(a):B\) depending on \(a:A\). An object \(X\to B\) is a family \(X(b)\) depending on \(b:B\); an object \(Y\to A\) is a family \(Y(a)\) depending on \(a:A\).
(i) Substitution (inverse image) \(f^*\) — syntactic rule.
Given a family \(X(b)\) over \(b:B\), define the pulled-back family over \(A\) by substitution: \[ (f^*X)(a) \;:=\; X\big(f(a)\big). \] If \(x(b):X(b)\) is a term in context \(b:B\), then \(x[f](a) := x(f(a))\) is a term of type \((f^*X)(a)\).
This says \(f^*\) is syntactic substitution \(b\mapsto f(a)\). It preserves finite limits (equality, conjunctions, terminal object).
(ii) Dependent sum (left adjoint) \(\Sigma_f\) — bounded \(\exists\).
For \(Y(a)\) over \(a:A\) define a family over \(b:B\) by the bounded dependent sum (in context \(b:B\)) \[ (\Sigma_f Y)(b) \;:=\; \Sigma_{a:A}\big( f(a)=b \ \wedge\ Y(a)\big). \] Equivalently, think of \((\Sigma_f Y)(b)\) as “there exists \(a\) with \(f(a)=b\) and an element of \(Y(a)\).” If your topos has a good representation of the fiber \(\{a\mid f(a)=b\}\) as the pullback \(A_b := A\times_B \{b\}\), you can write \[ (\Sigma_f Y)(b) \cong \Sigma_{a\in A_b} Y(a). \] Intro/elim rules: given \(a:A\) with \(f(a)=b\) and \(y\in Y(a)\) you form \((a,y)\in(\Sigma_f Y)(b)\); to define a map out of \(\Sigma_f Y\) it suffices to give maps on each \(Y(a)\) uniformly.
(iii) Dependent product (right adjoint) \(\Pi_f\) — bounded \(\forall\).
For \(Y(a)\) over \(A\) define a family over \(B\) by the bounded dependent product: \[ (\Pi_f Y)(b) \;:=\; \Pi_{a:A}\big( f(a)=b \;\Rightarrow\; Y(a)\big), \] or equivalently \[ (\Pi_f Y)(b) \cong \Pi_{a\in A_b} Y(a). \] An element of \((\Pi_f Y)(b)\) is a family choosing for every \(a\) in the fiber \(A_b\) an element of \(Y(a)\). Intro/elim: give a choice of \(y(a)\in Y(a)\) for each \(a\) to get an element of \(\Pi_f Y(b)\); project to get the component at a particular \(a\).
Remarks on the encoding.
The formula \(\Sigma_{a:A} (f(a)=b)\times Y(a)\) and \(\Pi_{a:A} (f(a)=b)\to Y(a)\) are a way to express bounded quantifiers in one ambient index type \(A\) using equality-objects; this is the same pattern we used in \(\mathbf{Set}\) but written with the identity/type-equality object of \(\mathcal{E}\).
We'll give the internal, type-theoretic view of the bijections:
(A) \(\Sigma_f\dashv f^*\). We need for each \(Z(b)\) over \(B\) a bijection \[ \operatorname{Hom}_{\mathcal{E}/B}\big(\Sigma_f Y, Z\big) \cong \operatorname{Hom}_{\mathcal{E}/A}\big(Y, f^*Z\big). \] Internally in context \(b:B\), giving a function \((\Sigma_f Y)(b)\to Z(b)\) is the same as giving, for each \(a\) with \(f(a)=b\), a function \(Y(a)\to Z(b)\) which is the same data as, in context \(a:A\), a function \(Y(a)\to Z(f(a))=(f^*Z)(a)\). These match up bijectively and naturally; the usual \(\Sigma\)-elimination/introduction rules witness the isomorphism.
(B) \(f^*\dashv\Pi_f\). We need \[ \operatorname{Hom}_{\mathcal{E}/A}\big(f^*Z, Y\big) \cong \operatorname{Hom}_{\mathcal{E}/B}\big(Z, \Pi_f Y\big). \] Internally a map \(f^*Z(a)=Z(f(a))\to Y(a)\) for each \(a\) is equivalent to, for each \(b\), a map \(Z(b)\to \prod_{a\in A_b} Y(a)\), i.e. a map \(Z(b)\to(\Pi_f Y)(b)\). Again the usual \(\Pi\)-introduction/elimination rules give the bijection and its naturality.
These internal bijections are exactly the categorical adjunctions expressed as Hom-set isomorphisms.
Because the constructions are Kan extensions / (co)limits computed fiberwise and because pullback preserves those (in a topos), one has the Beck–Chevalley property: for any pullback square \[ \begin{CD} A' @>g'>> A \\ @V f' VV @VV f V\\ B' @>g>> B \end{CD} \] the canonical natural transformations \[ g^* \Sigma_f \longrightarrow \Sigma_{f'} g'^* \qquad\text{and}\qquad \Pi_{f'} g'^* \longrightarrow g^* \Pi_f \] are isomorphisms under suitable exactness hypotheses (in a topos they are isomorphisms). Intuitively: reindexing commutes with dependent sum / product along pullbacks. This is the geometric-morphism-level statement that substitution commutes with bounded quantifiers when you change base.
In context \(b:B\) we form:
Analogous rules for \(\Pi_f\) hold.