Martin Escardo, 23rd May 2025.
Homotopy pullbacks and some basic properties to begin with.
This is loosely based on
[1] Jeremy Avigad, Chris Kapulkin, Peter LeFanu Lumsdaine.
Homotopy limits in type theory, 2015 (first version 2013).
https://arxiv.org/abs/1304.0680
\begin{code}
{-# OPTIONS --safe --without-K #-}
module UF.Pullback where
open import MLTT.Spartan
open import UF.Embeddings
open import UF.Equiv
open import UF.Subsingletons
\end{code}
We assume a cospan
Y
│
│ g
│
↓
X ───────→ C
f
\begin{code}
module pullback
{𝓤 𝓥 𝓦 : Universe}
{X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ }
(f : X → Z) (g : Y → Z)
where
\end{code}
And we consider commutative squares of the form
q
A ───────→ X
│ │
p │ │ g
│ │
↓ ↓
Y ───────→ Z
f
completing the cospan.
\begin{code}
commutative-square : {A : 𝓣 ̇ } → (A → X) × (A → Y) → 𝓦 ⊔ 𝓣 ̇
commutative-square (p , q) = f ∘ p ∼ g ∘ q
\end{code}
A cone over the cospan is the totality of these data.
\begin{code}
cone : 𝓣 ̇ → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⊔ 𝓣 ̇
cone A = Σ pq ꞉ ((A → X) × (A → Y)) , commutative-square pq
\end{code}
It is convenient to collect all cones in a universe into a single
type.
\begin{code}
Cone : (𝓣 : Universe) → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⊔ (𝓣 ⁺) ̇
Cone 𝓣 = Σ A ꞉ 𝓣 ̇ , cone A
source : Cone 𝓣 → 𝓣 ̇
source (P , c) = P
cone-of : (𝓒 : Cone 𝓣) → cone (source 𝓒)
cone-of (P , c) = c
\end{code}
If we have a cone
q
P ───────→ Y
│ │
p │ │ g
│ │
↓ ↓
X ───────→ Z
f
and a map u : A → P, we get a cone
q ∘ u
A ───────→ Y
│ │
p ∘ u │ │ g
│ │
↓ ↓
X ───────→ Z
f
\begin{code}
cone-map : {P : 𝓣' ̇ } (A : 𝓣 ̇ ) → cone P → (A → P) → cone A
cone-map X ((p , q) , e) u = (p ∘ u , q ∘ u) , e ∘ u
\end{code}
We say that a cone
q
P ───────→ Y
│ │
p │ │ g
│ │
↓ ↓
X ───────→ Z
f
is a (homotopy) pullback if the cone map is an equivalence for every A.
\begin{code}
is-pullback : Cone 𝓣 → 𝓤ω
is-pullback (P , c) = {𝓣' : Universe} (A : 𝓣' ̇ ) → is-equiv (cone-map A c)
\end{code}
We record the equivalence explicitly.
\begin{code}
module _ (𝓒@(P , c@((p₁ , p₂) , s)) : Cone 𝓣)
(i : is-pullback 𝓒)
where
pullback-equivalence : (A : 𝓣' ̇ ) → (A → P) ≃ cone A
pullback-equivalence A = cone-map A c , i A
\end{code}
And we can formulate the universal property of pullbacks in terms of
(homotopy) unique existence.
\begin{code}
module _ (𝓓@(A , d@((h₁ , h₂) , t)) : Cone 𝓣') where
universal-property
: ∃! u ꞉ (A → P) , ((p₁ ∘ u , p₂ ∘ u) , s ∘ u) = ((h₁ , h₂) , t)
universal-property
= equivs-are-vv-equivs (cone-map A c) (i A) d
\end{code}
It is convenient to name the uniquely existing u as the "mediating
map", and record the equations it satisfies.
\begin{code}
mediating-map : (A → P)
mediating-map = pr₁ (center universal-property)
_ : mediating-map = ⌜ pullback-equivalence A ⌝⁻¹ d
_ = refl
mediating-map-eq₁ : p₁ ∘ mediating-map = h₁
mediating-map-eq₁ = ap (pr₁ ∘ pr₁) (pr₂ (center universal-property))
mediating-map-eq₂ : p₂ ∘ mediating-map = h₂
mediating-map-eq₂ = ap (pr₂ ∘ pr₁) (pr₂ (center universal-property))
\end{code}
We now show that pullbacks exist, and call them simply pullbacks,
although perhaps we should call them standard pullbacks, or chosen
pullbacks.
The construction is illustrated in the following diagram.
pb₂
Σ (x , y) ꞉ X × Y , f x = g y ───────→ Y
│ │
pb₁ │ │ g
│ │
↓ ↓
X --------------------───────→ Z
f
\begin{code}
pullback : 𝓤 ⊔ 𝓥 ⊔ 𝓦 ̇
pullback = Σ (x , y) ꞉ X × Y , f x = g y
private
P = pullback
pb₁ : P → X
pb₁ ((x , y) , s) = x
pb₂ : P → Y
pb₂ ((x , y) , s) = y
pullback-square : commutative-square (pb₁ , pb₂)
pullback-square ((x , y) , s) = s
pullback-cone : cone P
pullback-cone = ((pb₁ , pb₂) , pullback-square)
Pullback-Cone : Cone (𝓤 ⊔ 𝓥 ⊔ 𝓦)
Pullback-Cone = P , pullback-cone
pullback-cone-map : (A : 𝓣' ̇ ) → (A → P) → cone A
pullback-cone-map A = cone-map A pullback-cone
pullback-mediating-map : {A : 𝓣 ̇ } → cone A → (A → P)
pullback-mediating-map ((p , q) , s) a = (p a , q a) , s a
pullback-Cone-is-pullback : is-pullback Pullback-Cone
pullback-Cone-is-pullback A =
qinvs-are-equivs
(pullback-cone-map A)
(pullback-mediating-map , (λ u → refl) , (λ c → refl))
_ : (A : 𝓣' ̇ ) (c : cone A)
→ pullback-mediating-map c
= mediating-map Pullback-Cone pullback-Cone-is-pullback (A , c)
_ = λ A c → refl
\end{code}
Pullbacks of embeddings are embeddings.
\begin{code}
pb₂-is-embedding : is-embedding f → is-embedding pb₂
pb₂-is-embedding f-is-embedding y = I
where
I : is-prop (fiber pb₂ y)
I (((x₁ , y) , e₁) , refl) (((x₂ , y) , e₂) , refl) = III II
where
II : (x₁ , e₁) = (x₂ , e₂)
II = f-is-embedding (g y) (x₁ , e₁) (x₂ , e₂)
III : {(x₁ , e₁) (x₂ , e₂) : fiber f (g y)}
→ (x₁ , e₁) = (x₂ , e₂)
→ (((x₁ , y) , e₁) , refl) =[ fiber pb₂ y ] (((x₂ , y) , e₂) , refl)
III refl = refl
𝕡𝕓₂ : is-embedding f → P ↪ Y
𝕡𝕓₂ e = pb₂ , (pb₂-is-embedding e)
\end{code}
We have a pullback
fiber f c ────→ 𝟙
│ │
fiber-point │ │ c
│ │
↓ ↓
X --───────→ Z
f
\begin{code}
module _ {𝓤 𝓥 𝓦 : Universe}
{X : 𝓤 ̇ }
{Z : 𝓦 ̇ }
(f : X → Z)
(z : Z)
where
open pullback f (λ (_ : 𝟙 {𝓥}) → z)
fiber-is-pullback
: is-pullback (fiber f z , (fiber-point , unique-to-𝟙) , fiber-identification)
fiber-is-pullback A
= qinvs-are-equivs ϕ (γ , (λ u → refl) , (λ c → refl))
where
ϕ : (A → fiber f z) → cone A
ϕ = cone-map A ((fiber-point , unique-to-𝟙) , fiber-identification)
γ : cone A → (A → fiber f z)
γ ((p , q) , s) a = p a , s a
\end{code}
TODO. Implement other results from [1].