-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathXII_5.v
517 lines (470 loc) · 19.1 KB
/
XII_5.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
From HoTT Require Import Basics Types Spaces.Nat WildCat Pointed
Truncations HProp HSet HFiber Limits.Pullback ExactSequence
AbGroups AbSES.
Require Import Lemmas EquivalenceRelation ES HigherExt.
Local Open Scope pointed_scope.
Local Open Scope type_scope.
(** We prove Lemma XII.5.3, Lemma XII.5.4, and Lemma XII.5.5 in Mac Lane's "Homology". Using these, we deduce the long exact sequence in LES.v. The statements are named [XII_5_3], [XII_5_4], and [XII_5_5], respectively. We do the proof on the level of [ES n] as opposed to the quotient [Ext n], since it's simpler to express things before truncating. Afterwards we show that analogous statements hold for [Ext n] in HigherExt.v. *)
(** Since we'll be proving several goals of the form "the following 3 statements are equivalent" we make a helper structure: *)
Definition TFAE3 (P Q R : Type) := (P -> Q) * (Q -> R) * (R -> P).
Definition TFAE3_merely (P Q R : Type)
: TFAE3 P Q R -> TFAE3 (merely P) (merely Q) (merely R).
Proof.
intros [[PQ QR] RP]; repeat split;
apply Trunc_functor; assumption.
Defined.
Definition iff_TFAE3 {P P' Q Q' R R' : Type}
(p : P <-> P') (q : Q <-> Q') (r : R <-> R')
: TFAE3 P Q R -> TFAE3 P' Q' R'.
Proof.
intros [[PQ QR] RP]; repeat split.
- exact (fst q o PQ o snd p).
- exact (fst r o QR o snd q).
- exact (fst p o RP o snd r).
Defined.
(** * Lemma XII.5.3 *)
(** Given two short exact sequences [F] and [E] which can be spliced, the following are logically equivalent:
a) F is in the image of of pullback along [inclusion E]
b) E is in the image of pushout along [projection F]
c) [es_splice F E] is trivial
**)
(** We start by showing that (a) <-> (b), which we need in order to show that (c) is equivalent to either. *)
Definition abses_spliceable_hfiber_inclusion_to_hfiber_projection
`{Univalence} {C B A : AbGroup} (F : AbSES B A) (E : AbSES C B)
: hfiber (abses_pullback (inclusion E)) F
-> hfiber (abses_pushout (projection F)) E.
Proof.
(* By inducting on the path, we assume definitionally that
[F = abses_pullback (inclusion F) G]
for some [G]. *)
intros [G []].
(* We construct the sequence [K] then show it lies in the fiber. *)
srefine (let K:=_ in (K; _)).
{ srapply (Build_AbSES G).
1: apply grp_pullback_pr1.
1: exact (projection E $o projection G).
1: rapply istruncmap_mapinO_tr.
1: exact _.
snrapply Build_IsExact.
{ apply phomotopy_homotopy_hset; intros [g [b q]]; cbn.
refine (ap _ q @ _).
apply isexact_inclusion_projection. }
intros [g q]; rapply contr_inhabited_hprop; cbn.
assert (b : Tr (-1) (hfiber (inclusion E) (projection G g))).
1: exact (isexact_preimage _ _ (projection E) _ q).
strip_truncations; apply tr.
srefine ((g; b.1; _); _); cbn.
1: exact b.2^.
by apply equiv_path_sigma_hprop. }
(* We construct a morphism which exhibits [K] as the pullback of [F]: *)
snrefine (abses_pushout_component3_id
(Build_AbSESMorphism _ _ grp_homo_id _ _)
(fun _ => idpath)).
1: exact (projection G).
- intros [g [b q]]; cbn.
exact q^.
- reflexivity.
Defined.
Definition abses_spliceable_hfiber_projection_to_hfiber_inclusion
`{U : Univalence} {C B A : AbGroup} (F : AbSES B A) (E : AbSES C B)
: hfiber (abses_pushout (projection F)) E
-> hfiber (abses_pullback (inclusion E)) F.
Proof.
(* We assume that [H] is definitionally a pushout by inducting on the path. *)
intros [H []].
(* We first construct a sequence [K], afterwards we show that it's in the fibre. *)
srefine (let K:=_ in (K; _)).
{ srapply (Build_AbSES H).
1: exact (inclusion H $o inclusion F).
1: apply ab_pushout_inr.
1: exact _.
1: rapply ab_pushout_surjection_inr.
srapply Build_IsExact.
{ apply phomotopy_homotopy_hset; intro a.
refine ((ab_pushout_commsq _)^ @ _).
refine (ap ab_pushout_inl _ @ _).
1: apply isexact_inclusion_projection.
apply grp_homo_unit. }
intros [h p]; rapply contr_inhabited_hprop.
(* since [h] is in the kernel of [projection H], we can lift it to [e : E] *)
assert (e : merely (hfiber (inclusion H) h)).
{ rapply (isexact_preimage (Tr (-1)) (inclusion H)).
refine ((right_square (abses_pushout_morphism H (projection F)) h)^ @ _);
unfold abses_pushout_morphism, component2.
refine (ap _ p @ _).
apply grp_homo_unit. }
strip_truncations.
(* since [inclusion F] is a mono, [e] is in the kernel of [projection E] *)
assert (q : projection F e.1 = pt).
{ rapply (isinj_embedding (inclusion (abses_pushout (projection F) H))).
refine (ab_pushout_commsq e.1 @ _ @ (grp_homo_unit _)^).
exact (ap ab_pushout_inr e.2 @ p). }
(* by exactness of [E] we get a preimage [a : A] of [e : E] *)
pose (a := isexact_preimage (Tr (-1)) (inclusion F) _ _ q).
generalize a; clear a. apply Trunc_functor; intro a.
exists a.1.
apply path_sigma_hprop; cbn.
exact (ap (inclusion H) a.2 @ e.2). }
snrefine (abses_pullback_component1_id
(Build_AbSESMorphism grp_homo_id _ _ _ _)
(fun _ => idpath))^.
- exact (inclusion H).
- reflexivity.
- exact (fun x => (ab_pushout_commsq x)^).
Defined.
(** Lemma XII.5.3 (a) iff (b) *)
Definition iff_abses_spliceable_hfiber_projection_inclusion `{Univalence}
{C B A : AbGroup} (F : AbSES B A) (E : AbSES C B)
: hfiber (abses_pullback (inclusion E)) F
<-> hfiber (abses_pushout (projection F)) E
:= (abses_spliceable_hfiber_inclusion_to_hfiber_projection F E,
abses_spliceable_hfiber_projection_to_hfiber_inclusion F E).
(** We construct maps between fibres which are needed for the proof. *)
Definition es2_zig_fiber_projection `{Univalence} {C B B' A : AbGroup}
{F : ES 1 B A} {E : ES 1 C B} {Y : ES 1 B' A} {X : ES 1 C B'}
(zig : es_zig (es_splice F E) (es_splice Y X))
: hfiber (abses_pushout (projection F)) E
-> hfiber (abses_pushout (projection Y)) X.
Proof.
intros [G p]; induction p.
destruct zig as [phi [p q]]; cbn in phi, p, q.
pose (phi' := abses_path_pullback_projection_commsq phi _ _ p^).
destruct phi' as [phi' r].
exists (abses_pushout phi' G).
refine ((abses_pushout_compose _ _ _)^ @ _).
refine (abses_pushout_homotopic _ (grp_homo_compose phi (projection F)) _ _ @ _).
1: exact r.
exact (abses_pushout_compose _ _ _ @ q).
Defined.
Definition es2_zag_fiber_inclusion `{Univalence} {C B B' A : AbGroup}
{F : ES 1 B A} {E : ES 1 C B} {Y : ES 1 B' A} {X : ES 1 C B'}
(zag : es_zig (es_splice Y X) (es_splice F E))
: hfiber (abses_pullback (inclusion E)) F
-> hfiber (abses_pullback (inclusion X)) Y.
Proof.
intros [G p]; induction p.
destruct zag as [phi [p q]]; cbn in phi, p, q.
pose (phi' := abses_path_pushout_inclusion_commsq phi _ _ q).
destruct phi' as [phi' r].
exists (abses_pullback phi' G).
refine (abses_pullback_compose _ _ _ @ _).
refine (abses_pullback_homotopic _ (inclusion E $o phi) _ _ @ _).
1: symmetry; exact r.
exact ((abses_pullback_compose _ _ _)^ @ p^).
Defined.
Lemma XII_5_3 `{Univalence} {C B A : AbGroup} (F : ES 1 B A) (E : ES 1 C B)
: TFAE3 (hfiber (abses_pullback (inclusion E)) F)
(hfiber (abses_pushout (projection F)) E)
(pt ~ (es_splice F E)).
Proof.
repeat split.
- apply abses_spliceable_hfiber_inclusion_to_hfiber_projection.
- (* (b) -> (c) can be shown directly *)
intros [G p]; induction p.
exists 2%nat. (* pt <- (E (projection E) <> F) -> E <> (projection E) F *)
refine (_; (_, inl (es_morphism_abses_zig _ _ _))).
refine (pt; (idpath, inr _)).
exists grp_homo_const; split; cbn.
+ refine (_ @ (abses_pullback_point _)^).
exact (abses_pullback_projection F)^.
+ exact (abses_pushout_const G).
- (* for (c) -> (a) we need to use that we know (a) <-> (b) *)
intros [n zzs].
revert dependent B.
induction n as [|n IH]; intros.
+ (* the base case can be shown directly *)
cbn in zzs.
apply (transport (fun X : ES 2 C A =>
hfiber (abses_pullback (inclusion (snd X.2)))
(fst X.2)) zzs); cbn.
exists pt.
apply abses_pullback_point.
+ destruct zzs as [[D [X0 X1]] [zzs [zig|zag]]].
(* note: X is definitionally in the image of es_splice *)
* apply abses_spliceable_hfiber_projection_to_hfiber_inclusion.
apply (es2_zig_fiber_projection zig).
apply abses_spliceable_hfiber_inclusion_to_hfiber_projection.
exact (IH _ X0 X1 zzs).
* apply (es2_zag_fiber_inclusion zag).
by apply IH.
Defined.
(** * Lemma XII.5.4 *)
(** Lemma XII.5.4 gives an equivalent condition to (b) in Lemma XII.5.3 which generalises to [ES n]. The condition is that the following type is inhabited: *)
Definition es_ii_family `{Univalence} {n : nat} {C B A : AbGroup}
: ES n.+1 B A -> ES 1 C B -> Type
:= fun F E => { alpha : { B' : AbGroup & B' $-> B }
& (pt ~ es_pullback alpha.2 F)
* (hfiber (abses_pushout alpha.2) E) }.
(** The logical equivalence with condition (b) above. *)
Lemma XII_5_4 `{Univalence} {C B A : AbGroup} (F : ES 1 B A) (E : ES 1 C B)
: hfiber (abses_pushout (projection F)) E <-> es_ii_family F E.
Proof.
split.
- intros [G p]; induction p.
exists (middle F; projection F); split.
+ apply abses_pullback_projection.
+ cbn. exact (G; idpath).
- intros [[B' alpha] [p [G q]]]; cbn in *.
pose (phi := abses_pullback_trivial_factors_projection p).
destruct phi as [phi gamma].
exists (abses_pushout phi G).
refine ((abses_pushout_compose _ _ _)^ @ _).
refine (abses_pushout_homotopic _ _ _ _ @ _).
1: exact (equiv_path_grouphomomorphism^-1 gamma^).
assumption.
Defined.
(** We rephrase Lemma XII.5.3 in general terms for later use. *)
Theorem XII_5_3' `{Univalence} {C B A : AbGroup} (F : ES 1 B A) (E : ES 1 C B)
: TFAE3 (rfiber es_zig (es_pullback (inclusion E)) F)
(es_ii_family F E)
(pt ~ (es_splice F E)).
Proof.
repeat split.
- refine (_ o _).
+ apply XII_5_4.
+ apply XII_5_3.
- refine (_ o _).
+ apply XII_5_3.
+ apply XII_5_4.
- apply XII_5_3.
Defined.
(** * Lemma XII.5.5 *)
(** For [F : ES n.+1 B A] and [E : ES 1 C B], the following are equivalent:
a) F is in the image of pullback along [inclusion E]
b) [es_ii_family F E] holds
c) [es_splice F E] is trivial
**)
(** The proof is structurally similar to Lemma XII.5.3; we need to know that (a) iff (b) in order to show the equivalence with (c). *)
Definition es_zig_fiber_projection `{Univalence} {n : nat} {C B B' A : AbGroup}
{F : ES n.+1 B A} {E : ES 1 C B} {Y : ES n.+1 B' A} {X : ES 1 C B'}
(zig : es_zig (es_abses_splice F E) (es_abses_splice Y X))
: es_ii_family F E -> es_ii_family Y X.
Proof.
intros [[B'' alpha] [zz [G p]]]; induction p.
unfold pr2 in zz, zig; unfold pr1 in G.
destruct zig as [phi [p q]]; cbn in phi, q; unfold es_abses_splice in p.
exists (B''; grp_homo_compose phi alpha); split; unfold pr2.
2: exact (G; abses_pushout_compose _ _ _ @ q).
rewrite <- es_pullback_compose.
etransitivity.
2: { apply rap_pullback.
destruct n.
+ by induction p.
+ exact (zig_to_eqrel _ p). }
assumption.
Defined.
Definition es_zag_fiber_inclusion `{Univalence} {n : nat} {C B B' A : AbGroup}
{F : ES n.+1 B A} {E : ES 1 C B} {Y : ES n.+1 B' A} {X : ES 1 C B'}
(zag : es_zig (es_abses_splice Y X) (es_abses_splice F E))
: rfiber es_eqrel (es_pullback (inclusion E)) F
-> rfiber es_eqrel (es_pullback (inclusion X)) Y.
Proof.
destruct n.
1: by apply es2_zag_fiber_inclusion.
intros [G zz].
destruct zag as [phi [p q]]; cbn in phi, q; unfold es_abses_splice in p.
pose (phi' := abses_path_pushout_inclusion_commsq phi _ _ q).
destruct phi' as [phi' r].
exists (es_pullback phi' G).
transitivity (es_pullback phi F).
2: exact (zag_to_eqrel _ p).
refine (transport (fun X => X ~ _) _ _).
{ refine (_ @ (es_pullback_compose _ _ _)^).
refine (_ @ es_pullback_homotopic (f:=inclusion E $o phi) _ _).
2: exact r.
exact (es_pullback_compose _ _ _). }
apply rap_pullback.
exact zz.
Defined.
(** Lemma XII.5.5 (i) -> (ii) *)
Definition es_spliceable_rfiber_inclusion_es_ii_family `{Univalence} {n : nat}
{C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B)
: rfiber es_eqrel (es_pullback (inclusion E)) F -> es_ii_family F E.
Proof.
destruct n.
1: intro; by apply XII_5_4,
abses_spliceable_hfiber_inclusion_to_hfiber_projection.
intros [[? [G0 G1]] p].
pose (T := abses_pullback (inclusion E) G1).
exists (middle T; projection T); split; unfold pr2.
- etransitivity.
2: exact (rap_pullback _ _ _ p).
unfold es_pullback.
rewrite <- abses_pullback_projection.
apply zig_to_eqrel.
nrapply es_splice_point_abses.
- apply abses_spliceable_hfiber_inclusion_to_hfiber_projection.
exact (G1; idpath).
Defined.
(** A preliminary result for Lemma XII.5.5: given Lemma XII.5.5 at level n, we deduce (i) iff (ii) on level n+1. *)
Lemma XII_5_5_prelim `{Univalence} {n : nat}
: (forall {C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B),
TFAE3 (rfiber es_eqrel (es_pullback (inclusion E)) F)
(es_ii_family F E)
(pt ~ (es_abses_splice F E)))
-> (forall {C B A : AbGroup} (F : ES n.+2 B A) (E : ES 1 C B),
(rfiber es_eqrel (es_pullback (inclusion E)) F)
<-> es_ii_family F E).
Proof.
intro IH; split.
1: apply es_spliceable_rfiber_inclusion_es_ii_family.
destruct F as [C' [T F]].
intros [[B' alpha] [p [E' q]]]; unfold pr2 in p, q.
assert (T' : rfiber es_eqrel
(es_pullback (inclusion (abses_pullback alpha F))) T).
1: apply IH; exact p.
assert (F' : hfiber (abses_pullback (inclusion E))
(abses_pushout (inclusion (abses_pullback alpha F)) F)).
{ apply XII_5_3.
induction q.
etransitivity.
2: nrapply es_morphism_abses_eqrel.
unfold es_pullback.
rewrite (abses_pushout_pullback_reorder F _ alpha)^.
rewrite abses_pushout_inclusion.
apply zag_to_eqrel.
nrapply es_point_splice_abses. }
destruct F' as [F' r], T' as [T' r'].
exists (es_abses_splice T' F').
unfold es_pullback, es_abses_splice.
rewrite r.
etransitivity.
1: symmetry; nrapply es_morphism_abses_eqrel.
exact (rap_splice _ _ _ r').
Defined.
(** It is useful to have a name for this family below. *)
Local Definition XII_5_5_family `{Univalence} {n : nat} {B A : AbGroup}
: ES n.+2 B A -> Type.
Proof.
intros [C [F E]].
exact (rfiber es_eqrel (es_pullback (inclusion E)) F).
Defined.
Lemma XII_5_5 `{Univalence} {n : nat}
: forall {C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B),
TFAE3 (rfiber es_eqrel (es_pullback (inclusion E)) F)
(es_ii_family F E)
(pt ~ (es_abses_splice F E)).
Proof.
induction n as [|n IHn]; intros.
1: apply XII_5_3'.
repeat split.
- apply es_spliceable_rfiber_inclusion_es_ii_family.
- intros [[B' alpha] [[m zzs] [G p]]]; induction p.
unfold pr1, pr2 in *.
etransitivity.
2: nrapply es_morphism_abses_eqrel.
etransitivity (es_abses_splice (pt : ES n.+2 B' A) G).
2: { rapply rap_splice.
exact (m; zzs). }
apply zag_to_eqrel.
apply es_point_splice_abses.
- intros [m zzs].
revert dependent B.
induction m as [|m IHm]; intros.
+ nrapply (transport XII_5_5_family zzs).
exists pt.
exists (0%nat); rapply es_pullback_point.
+ destruct zzs as [[D [X0 X1]] [zzs [zig|zag]]].
* apply (XII_5_5_prelim IHn).
apply (es_zig_fiber_projection zig).
apply (XII_5_5_prelim IHn).
by apply IHm.
* apply (es_zag_fiber_inclusion zag).
by apply IHm.
Defined.
(** * Lemma XII.5.5 for [Ext n] *)
(** Relating condition (i) for ES and Ext. *)
Definition es_rfiber_to_ext_hfiber `{Univalence} {n : nat}
{C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B)
: rfiber es_eqrel (es_pullback (inclusion E)) F
-> hfiber (ext_pullback (inclusion E)) (es_in F).
Proof.
apply (functor_sigma es_in); intros G rho.
destruct n.
1: by destruct rho. (* path induction *)
rapply path_quotient.
exact (tr rho).
Defined.
Definition ext_hfiber_to_mere_es_rfiber `{Univalence} {n : nat}
{C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B)
: hfiber (ext_pullback (inclusion E)) (es_in F)
-> merely (rfiber es_eqrel (es_pullback (inclusion E)) F).
Proof.
intros [G p].
(* First we choose a representative for G. *)
assert (G' : Tr (-1) (hfiber es_in G)).
1: destruct n; rapply center. (* both tr and class_of are surjective *)
strip_truncations.
destruct G' as [G' q]; induction q.
(* by inducting on [q], [G'] is definitionally in the image of [tr] *)
destruct n.
- pose proof (q := (equiv_path_Tr _ _)^-1 p); strip_truncations.
exact (tr (G'; q)).
-pose proof (q := (path_quotient _ _ _)^-1 p); strip_truncations.
exact (tr (G'; q)).
Defined.
Definition iff_es_rfiber_ext_hfiber `{Univalence} {n : nat}
{C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B)
: merely (rfiber es_eqrel (es_pullback (inclusion E)) F)
<-> merely (hfiber (ext_pullback (inclusion E)) (es_in F)).
Proof.
split.
- apply Trunc_functor, es_rfiber_to_ext_hfiber.
- apply Trunc_rec, ext_hfiber_to_mere_es_rfiber.
Defined.
(** Relating condition (ii) for ES and Ext. *)
Definition ext_ii_family `{Univalence} {n : nat} {C B A : AbGroup}
: Ext n.+1 B A -> Ext 1 C B -> Type
:= fun F E => { bt : { B' : AbGroup & B' $-> B }
& (pt = ext_pullback bt.2 F :> Ext n.+1 bt.1 A)
* (hfiber (ext_pushout bt.2) E) }.
(** Condition (iii) for ES and Ext. *)
Lemma iff_iii `{Univalence} {n : nat} {C B A : AbGroup}
(F : ES n.+1 B A) (E : ES 1 C B)
: (es_meqrel pt (es_abses_splice F E))
<-> (pt = ext_abses_splice (es_in F) E).
Proof.
apply (equiv_equiv_iff_hprop _ _)^-1.
destruct n; rapply path_quotient.
Defined.
(** Now we show that [ext_ii_family] corresponds to the propositional truncation of [ii_family] from ES.v. *)
Lemma iff_es_ext_ii_family `{Univalence} {n : nat} {C B A : AbGroup}
(F : ES n.+1 B A) (E : ES 1 C B)
: merely (es_ii_family F E)
<-> merely (ext_ii_family (es_in F) (es_in E)).
Proof.
apply (equiv_equiv_iff_hprop _ _)^-1.
refine (equiv_O_sigma_O _ _ oE _ oE (equiv_O_sigma_O _ _)^-1).
apply Trunc_functor_equiv.
apply equiv_functor_sigma_id; intros [B' alpha].
refine ((equiv_O_prod_cmp _ _ _)^-1 oE _ oE equiv_O_prod_cmp _ _ _).
apply equiv_functor_prod'.
{ destruct n.
all: refine (equiv_tr _ _ oE _).
- apply equiv_path_Tr.
- rapply path_quotient. }
refine (_ oE (equiv_O_sigma_O _ _)^-1).
apply equiv_iff_hprop.
- apply Trunc_functor.
apply (functor_sigma tr); cbn; intro G.
apply path_Tr.
- apply Trunc_rec; cbn; intros [G p].
revert p; strip_truncations; cbn.
rapply (equiv_ind (equiv_path_Tr _ _)).
apply Trunc_functor; intro p.
exact (G; tr p).
Defined.
(** Now Lemma XII.5.5 follows for Ext as well. *)
Lemma ext_XII_5_5 `{Univalence} {n : nat} {C B A : AbGroup}
(F : ES n.+1 B A) (E : ES 1 C B)
: TFAE3 (merely (hfiber (ext_pullback (inclusion E)) (es_in F)))
(merely (ext_ii_family (es_in F) (es_in E)))
(pt = ext_abses_splice (es_in F) E).
Proof.
rapply iff_TFAE3.
- apply iff_es_rfiber_ext_hfiber.
- apply iff_es_ext_ii_family.
- apply iff_iii.
- apply TFAE3_merely.
apply XII_5_5.
Defined.