Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Types.Require Import Diagrams.ParallelPair.Require Import Diagrams.Cocone.Require Import Colimits.Colimit.Require Import Colimits.Coeq.Generalizable All Variables.(** * Coequalizer as a colimit *)(** In this file, we define [Coequalizer] the coequalizer of two maps as the colimit of a particular diagram, and then show that it is equivalent to [Coeq] the primitive coequalizer defined as an HIT. *)(** ** [Coequalizer] *)SectionCoequalizer.Context {AB : Type}.DefinitionIsCoequalizer (fg : B -> A)
:= IsColimit (parallel_pair f g).DefinitionCoequalizer (fg : B -> A)
:= Colimit (parallel_pair f g).(** ** Equivalence with [Coeq] *)Context {fg : B -> A}.
A, B: Type f, g: B -> A
Cocone (parallel_pair f g) (Coeq f g)
A, B: Type f, g: B -> A
Cocone (parallel_pair f g) (Coeq f g)
A, B: Type f, g: B -> A
foralli : Graph.graph0 parallel_pair_graph,
Diagram.obj (parallel_pair f g) i -> Coeq f g
A, B: Type f, g: B -> A
forall (ij : Graph.graph0 parallel_pair_graph)
(g0 : Graph.graph1 parallel_pair_graph i j),
?legs j o Diagram.arr (parallel_pair f g) g0 ==
?legs i
A, B: Type f, g: B -> A
foralli : Graph.graph0 parallel_pair_graph,
Diagram.obj (parallel_pair f g) i -> Coeq f g
intros []; [exact (coeq o g)| exact coeq].
A, B: Type f, g: B -> A
forall (ij : Graph.graph0 parallel_pair_graph)
(g0 : Graph.graph1 parallel_pair_graph i j),
(funi0 : Graph.graph0 parallel_pair_graph =>
if i0 as b
return
(Diagram.obj (parallel_pair f g) b -> Coeq f g)
then coeq o g
else coeq) j o Diagram.arr (parallel_pair f g) g0 ==
(funi0 : Graph.graph0 parallel_pair_graph =>
if i0 as b
return
(Diagram.obj (parallel_pair f g) b -> Coeq f g)
then coeq o g
else coeq) i
intros i j phi x; destruct i, j, phi; simpl;
[ exact (cglue x) | reflexivity ].Defined.
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X
Coeq f g -> X
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X
A -> X
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X
forallb : B, ?coeq' (f b) = ?coeq' (g b)
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X
A -> X
exact (legs C false).
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X
forallb : B, C false (f b) = C false (g b)
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X b: B
C false (f b) = C false (g b)
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X b: B
C false (f b) = ?Goal
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X b: B
?Goal = C false (g b)
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X b: B
C false (f b) = ?Goal
exact (legs_comm C true false true b).
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X b: B
C true b = C false (g b)
exact (legs_comm C true false false b)^.
A, B: Type f, g: B -> A H: Funext X: Type
cocone_postcompose cocone_Coeq
o (funC : Cocone (parallel_pair f g) X =>
Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) == idmap
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X
cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) = C
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X
foralli : Graph.graph0 parallel_pair_graph,
cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) i == C i
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X
forall (ij : Graph.graph0 parallel_pair_graph)
(g0 : Graph.graph1 parallel_pair_graph i j)
(x : Diagram.obj (parallel_pair f g) i),
legs_comm
(cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^))) i j g0 x @
?path_legs i x =
?path_legs j (Diagram.arr (parallel_pair f g) g0 x) @
legs_comm C i j g0 x
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X
foralli : Graph.graph0 parallel_pair_graph,
cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) i == C i
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X x: Diagram.obj (parallel_pair f g) true
C false (g x) = C true x
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X x: Diagram.obj (parallel_pair f g) false
C false x = C false x
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X x: Diagram.obj (parallel_pair f g) true
C false (g x) = C true x
exact (legs_comm C true false false x).
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X x: Diagram.obj (parallel_pair f g) false
C false x = C false x
reflexivity.
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X
forall (ij : Graph.graph0 parallel_pair_graph)
(g0 : Graph.graph1 parallel_pair_graph i j)
(x : Diagram.obj (parallel_pair f g) i),
legs_comm
(cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^))) i j g0 x @
(funi0 : Graph.graph0 parallel_pair_graph =>
(funx0 : Diagram.obj (parallel_pair f g) i0 =>
(if i0 as b
return
(forallx1 : Diagram.obj (parallel_pair f g) b,
cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb0 : B =>
legs_comm C true false true b0 @
(legs_comm C true false false b0)^)) b x1 =
C b x1)
thenfunx1 : Diagram.obj (parallel_pair f g) true =>
legs_comm C true false false x1
:
cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) true x1 =
C true x1
elsefunx1 : Diagram.obj (parallel_pair f g) false =>
1
:
cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) false x1 =
C false x1) x0)
:
cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) i0 == C i0)
i x =
(funi0 : Graph.graph0 parallel_pair_graph =>
(funx0 : Diagram.obj (parallel_pair f g) i0 =>
(if i0 as b
return
(forallx1 : Diagram.obj (parallel_pair f g) b,
cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb0 : B =>
legs_comm C true false true b0 @
(legs_comm C true false false b0)^)) b x1 =
C b x1)
thenfunx1 : Diagram.obj (parallel_pair f g) true =>
legs_comm C true false false x1
:
cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) true x1 =
C true x1
elsefunx1 : Diagram.obj (parallel_pair f g) false =>
1
:
cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) false x1 =
C false x1) x0)
:
cocone_postcompose cocone_Coeq
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) i0 == C i0)
j (Diagram.arr (parallel_pair f g) g0 x) @
legs_comm C i j g0 x
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X x: Diagram.obj (parallel_pair f g) true
ap
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) (cglue x) @
legs_comm C true false false x =
1 @ legs_comm C true false true x
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X x: Diagram.obj (parallel_pair f g) true
1 @ legs_comm C true false false x =
1 @ legs_comm C true false false x
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X x: Diagram.obj (parallel_pair f g) true
ap
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) (cglue x) @
legs_comm C true false false x =
1 @ legs_comm C true false true x
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X x: Diagram.obj (parallel_pair f g) true
ap
(Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^)) (cglue x) @
legs_comm C true false false x =
legs_comm C true false true x
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X x: Diagram.obj (parallel_pair f g) true
(legs_comm C true false true x @
(legs_comm C true false false x)^) @
legs_comm C true false false x =
legs_comm C true false true x
hott_simpl.
A, B: Type f, g: B -> A H: Funext X: Type C: Cocone (parallel_pair f g) X x: Diagram.obj (parallel_pair f g) true
1 @ legs_comm C true false false x =
1 @ legs_comm C true false false x
reflexivity.
A, B: Type f, g: B -> A H: Funext X: Type
(funC : Cocone (parallel_pair f g) X =>
Coeq_rec X (C false)
(funb : B =>
legs_comm C true false true b @
(legs_comm C true false false b)^))
o cocone_postcompose cocone_Coeq == idmap
A, B: Type f, g: B -> A H: Funext X: Type F: Coeq f g -> X
Coeq_rec X (cocone_postcompose cocone_Coeq F false)
(funb : B =>
legs_comm (cocone_postcompose cocone_Coeq F) true
false true b @
(legs_comm (cocone_postcompose cocone_Coeq F) true
false false b)^) = F
A, B: Type f, g: B -> A H: Funext X: Type F: Coeq f g -> X
Coeq_rec X (cocone_postcompose cocone_Coeq F false)
(funb : B =>
legs_comm (cocone_postcompose cocone_Coeq F) true
false true b @
(legs_comm (cocone_postcompose cocone_Coeq F) true
false false b)^) == F
A, B: Type f, g: B -> A H: Funext X: Type F: Coeq f g -> X
foralla : A,
(funw : Coeq f g =>
Coeq_rec X (cocone_postcompose cocone_Coeq F false)
(funb : B =>
legs_comm (cocone_postcompose cocone_Coeq F) true
false true b @
(legs_comm (cocone_postcompose cocone_Coeq F) true
false false b)^) w = F w) (coeq a)
A, B: Type f, g: B -> A H: Funext X: Type F: Coeq f g -> X
forallb : B,
transport
(funw : Coeq f g =>
Coeq_rec X (cocone_postcompose cocone_Coeq F false)
(funb0 : B =>
legs_comm (cocone_postcompose cocone_Coeq F)
true false true b0 @
(legs_comm (cocone_postcompose cocone_Coeq F)
true false false b0)^) w = F w) (cglue b)
(?coeq' (f b)) = ?coeq' (g b)
A, B: Type f, g: B -> A H: Funext X: Type F: Coeq f g -> X
foralla : A,
(funw : Coeq f g =>
Coeq_rec X (cocone_postcompose cocone_Coeq F false)
(funb : B =>
legs_comm (cocone_postcompose cocone_Coeq F) true
false true b @
(legs_comm (cocone_postcompose cocone_Coeq F) true
false false b)^) w = F w) (coeq a)
reflexivity.
A, B: Type f, g: B -> A H: Funext X: Type F: Coeq f g -> X
forallb : B,
transport
(funw : Coeq f g =>
Coeq_rec X (cocone_postcompose cocone_Coeq F false)
(funb0 : B =>
legs_comm (cocone_postcompose cocone_Coeq F)
true false true b0 @
(legs_comm (cocone_postcompose cocone_Coeq F)
true false false b0)^) w = F w) (cglue b)
((funa : A => 1) (f b)) = (funa : A => 1) (g b)
A, B: Type f, g: B -> A H: Funext X: Type F: Coeq f g -> X b: B
transport
(funw : Coeq f g =>
Coeq_rec X (cocone_postcompose cocone_Coeq F false)
(funb : B =>
legs_comm (cocone_postcompose cocone_Coeq F)
true false true b @
(legs_comm (cocone_postcompose cocone_Coeq F)
true false false b)^) w = F w) (cglue b)
((funa : A => 1) (f b)) = (funa : A => 1) (g b)
A, B: Type f, g: B -> A H: Funext X: Type F: Coeq f g -> X b: B
ap
(Coeq_rec X (funx : A => F (coeq x))
(funb : B => ap F (cglue b) @ 1)) (cglue b) @ 1 =
1 @ ap F (cglue b)
A, B: Type f, g: B -> A H: Funext X: Type F: Coeq f g -> X b: B
ap
(Coeq_rec X (funx : A => F (coeq x))
(funb : B => ap F (cglue b) @ 1)) (cglue b) =
ap F (cglue b)
A, B: Type f, g: B -> A H: Funext X: Type F: Coeq f g -> X b: B