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.Paths Types.Arrow Types.Sigma Types.Forall Types.UniverseTypes.Prod.Require Import Colimits.GraphQuotient.Require Import Homotopy.IdentitySystems.LocalOpen Scope path_scope.(** * Homotopy coequalizers *)(** ** Definition *)DefinitionCoeq@{i j u} {B : Type@{i}} {A : Type@{j}} (f g : B -> A) : Type@{u}
:= GraphQuotient@{i j u} (funab => {x : B & (f x = a) * (g x = b)}).Definitioncoeq {BAfg} (a : A) : @Coeq B A f g := gq a.Definitioncglue {BAfg} b : @coeq B A f g (f b) = coeq (g b)
:= gqglue (b; (idpath,idpath)).Arguments Coeq : simpl never.Arguments coeq : simpl never.Arguments cglue : simpl never.
B, A: Type f, g: B -> A P: Coeq f g -> Type coeq': foralla : A, P (coeq a) cglue': forallb : B,
transport P (cglue b) (coeq' (f b)) =
coeq' (g b)
forallw : Coeq f g, P w
B, A: Type f, g: B -> A P: Coeq f g -> Type coeq': foralla : A, P (coeq a) cglue': forallb : B,
transport P (cglue b) (coeq' (f b)) =
coeq' (g b)
forallw : Coeq f g, P w
B, A: Type f, g: B -> A P: Coeq f g -> Type coeq': foralla : A, P (coeq a) cglue': forallb : B,
transport P (cglue b) (coeq' (f b)) =
coeq' (g b)
forall (ab : A)
(s : {x : B & (f x = a) * (g x = b)}),
transport P (gqglue s) (?Goal a) = ?Goal b
B, A: Type f, g: B -> A P: Coeq f g -> Type coeq': foralla : A, P (coeq a) cglue': forallb : B,
transport P (cglue b) (coeq' (f b)) =
coeq' (g b) a, b: A x: B
transport P (gqglue (x; (1, 1))) (?Goal (f x)) =
?Goal (g x)
exact (cglue' x).Defined.
B, A: Type f, g: B -> A P: Coeq f g -> Type coeq': foralla : A, P (coeq a) cglue': forallb : B,
transport P (cglue b) (coeq' (f b)) =
coeq' (g b) b: B
apD (Coeq_ind P coeq' cglue') (cglue b) = cglue' b
B, A: Type f, g: B -> A P: Coeq f g -> Type coeq': foralla : A, P (coeq a) cglue': forallb : B,
transport P (cglue b) (coeq' (f b)) =
coeq' (g b) b: B
apD (Coeq_ind P coeq' cglue') (cglue b) = cglue' b
rapply GraphQuotient_ind_beta_gqglue.Defined.
B, A: Type f, g: B -> A P: Type coeq': A -> P cglue': forallb : B, coeq' (f b) = coeq' (g b)
Coeq f g -> P
B, A: Type f, g: B -> A P: Type coeq': A -> P cglue': forallb : B, coeq' (f b) = coeq' (g b)
Coeq f g -> P
B, A: Type f, g: B -> A P: Type coeq': A -> P cglue': forallb : B, coeq' (f b) = coeq' (g b)
forallab : A,
{x : B & (f x = a) * (g x = b)} -> ?Goal a = ?Goal b
B, A: Type f, g: B -> A P: Type coeq': A -> P cglue': forallb : B, coeq' (f b) = coeq' (g b) a, b: A x: B
?Goal (f x) = ?Goal (g x)
exact (cglue' x).Defined.
B, A: Type f, g: B -> A P: Type coeq': A -> P cglue': forallb : B, coeq' (f b) = coeq' (g b) b: B
ap (Coeq_rec P coeq' cglue') (cglue b) = cglue' b
B, A: Type f, g: B -> A P: Type coeq': A -> P cglue': forallb : B, coeq' (f b) = coeq' (g b) b: B
ap (Coeq_rec P coeq' cglue') (cglue b) = cglue' b
rapply GraphQuotient_rec_beta_gqglue.Defined.
B, A: Type f, g: B -> A P: Coeq f g -> Type H: forallx : Coeq f g, IsHProp (P x) i: foralla : A, P (coeq a)
forallx : Coeq f g, P x
B, A: Type f, g: B -> A P: Coeq f g -> Type H: forallx : Coeq f g, IsHProp (P x) i: foralla : A, P (coeq a)
forallx : Coeq f g, P x
B, A: Type f, g: B -> A P: Coeq f g -> Type H: forallx : Coeq f g, IsHProp (P x) i: foralla : A, P (coeq a)
foralla : A, P (coeq a)
B, A: Type f, g: B -> A P: Coeq f g -> Type H: forallx : Coeq f g, IsHProp (P x) i: foralla : A, P (coeq a)
forallb : B,
transport P (cglue b) (?coeq' (f b)) = ?coeq' (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type H: forallx : Coeq f g, IsHProp (P x) i: foralla : A, P (coeq a)
forallb : B,
transport P (cglue b) (i (f b)) = i (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type H: forallx : Coeq f g, IsHProp (P x) i: foralla : A, P (coeq a) b: B
transport P (cglue b) (i (f b)) = i (g b)
rapply path_ishprop.Defined.
B, A: Type f, g: B -> A P: Coeq f g -> Type h: forallw : Coeq f g, P w
h ==
Coeq_ind P (h o coeq) (funb : B => apD h (cglue b))
B, A: Type f, g: B -> A P: Coeq f g -> Type h: forallw : Coeq f g, P w
h ==
Coeq_ind P (h o coeq) (funb : B => apD h (cglue b))
B, A: Type f, g: B -> A P: Coeq f g -> Type h: forallw : Coeq f g, P w
forallx : Coeq f g,
h x =
Coeq_ind P (funx0 : A => h (coeq x0))
(funb : B => apD h (cglue b)) x
B, A: Type f, g: B -> A P: Coeq f g -> Type h: forallw : Coeq f g, P w
forallb : B,
transport
(funw : Coeq f g =>
h w =
Coeq_ind P (funx : A => h (coeq x))
(funb0 : B => apD h (cglue b0)) w) (cglue b) 1 =
1
B, A: Type f, g: B -> A P: Coeq f g -> Type h: forallw : Coeq f g, P w b: B
transport
(funw : Coeq f g =>
h w =
Coeq_ind P (funx : A => h (coeq x))
(funb : B => apD h (cglue b)) w) (cglue b) 1 = 1
B, A: Type f, g: B -> A P: Coeq f g -> Type h: forallw : Coeq f g, P w b: B
((apD h (cglue b))^ @ ap (transport P (cglue b)) 1) @
apD
(Coeq_ind P (funx : A => h (coeq x))
(funb : B => apD h (cglue b))) (cglue b) = 1
B, A: Type f, g: B -> A P: Coeq f g -> Type h: forallw : Coeq f g, P w b: B
((apD h (cglue b))^ @ ap (transport P (cglue b)) 1) @
apD h (cglue b) = 1
B, A: Type f, g: B -> A P: Coeq f g -> Type h: forallw : Coeq f g, P w b: B
(apD h (cglue b))^ @ apD h (cglue b) = 1
napply concat_Vp.Defined.
B, A: Type f, g: B -> A P: Type h: Coeq f g -> P
h ==
Coeq_rec P (h o coeq) (funb : B => ap h (cglue b))
B, A: Type f, g: B -> A P: Type h: Coeq f g -> P
h ==
Coeq_rec P (h o coeq) (funb : B => ap h (cglue b))
B, A: Type f, g: B -> A P: Type h: Coeq f g -> P
forallx : Coeq f g,
h x =
Coeq_rec P (funx0 : A => h (coeq x0))
(funb : B => ap h (cglue b)) x
B, A: Type f, g: B -> A P: Type h: Coeq f g -> P
forallb : B,
transport
(funw : Coeq f g =>
h w =
Coeq_rec P (funx : A => h (coeq x))
(funb0 : B => ap h (cglue b0)) w) (cglue b) 1 =
1
B, A: Type f, g: B -> A P: Type h: Coeq f g -> P b: B
transport
(funw : Coeq f g =>
h w =
Coeq_rec P (funx : A => h (coeq x))
(funb : B => ap h (cglue b)) w) (cglue b) 1 = 1
B, A: Type f, g: B -> A P: Type h: Coeq f g -> P b: B
ap h (cglue b) @ 1 =
1 @
ap
(Coeq_rec P (funx : A => h (coeq x))
(funb : B => ap h (cglue b))) (cglue b)
B, A: Type f, g: B -> A P: Type h: Coeq f g -> P b: B
ap h (cglue b) =
ap
(Coeq_rec P (funx : A => h (coeq x))
(funb : B => ap h (cglue b))) (cglue b)
symmetry; napply Coeq_rec_beta_cglue.Defined.DefinitionCoeq_ind_eta `{Funext}
{B A f g} {P : @Coeq B A f g -> Type} (h : forallw : Coeq f g, P w)
: h = Coeq_ind P (h o coeq) (funb => apD h (cglue b))
:= path_forall _ _ (Coeq_ind_eta_homotopic h).DefinitionCoeq_rec_eta `{Funext}
{B A f g} {P : Type} (h : @Coeq B A f g -> P)
: h = Coeq_rec P (h o coeq) (funb => ap h (cglue b))
:= path_forall _ _ (Coeq_rec_eta_homotopic h).
B, A: Type f, g: B -> A P: Coeq f g -> Type m, n: foralla : A, P (coeq a) u: m == n r: forallb : B,
transport P (cglue b) (m (f b)) = m (g b) s: forallb : B,
transport P (cglue b) (n (f b)) = n (g b) p: forallb : B,
ap (transport P (cglue b)) (u (f b)) @ s b =
r b @ u (g b)
Coeq_ind P m r == Coeq_ind P n s
B, A: Type f, g: B -> A P: Coeq f g -> Type m, n: foralla : A, P (coeq a) u: m == n r: forallb : B,
transport P (cglue b) (m (f b)) = m (g b) s: forallb : B,
transport P (cglue b) (n (f b)) = n (g b) p: forallb : B,
ap (transport P (cglue b)) (u (f b)) @ s b =
r b @ u (g b)
Coeq_ind P m r == Coeq_ind P n s
B, A: Type f, g: B -> A P: Coeq f g -> Type m, n: foralla : A, P (coeq a) u: m == n r: forallb : B,
transport P (cglue b) (m (f b)) = m (g b) s: forallb : B,
transport P (cglue b) (n (f b)) = n (g b) p: forallb : B,
ap (transport P (cglue b)) (u (f b)) @ s b =
r b @ u (g b)
forallx : Coeq f g,
Coeq_ind P m r x = Coeq_ind P n s x
B, A: Type f, g: B -> A P: Coeq f g -> Type m, n: foralla : A, P (coeq a) u: m == n r: forallb : B,
transport P (cglue b) (m (f b)) = m (g b) s: forallb : B,
transport P (cglue b) (n (f b)) = n (g b) p: forallb : B,
ap (transport P (cglue b)) (u (f b)) @ s b =
r b @ u (g b) b: B
transport
(funw : Coeq f g =>
Coeq_ind P m r w = Coeq_ind P n s w) (cglue b)
(?Goal (f b)) = ?Goal (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type m, n: foralla : A, P (coeq a) u: m == n r: forallb : B,
transport P (cglue b) (m (f b)) = m (g b) s: forallb : B,
transport P (cglue b) (n (f b)) = n (g b) p: forallb : B,
ap (transport P (cglue b)) (u (f b)) @ s b =
r b @ u (g b) b: B
((apD (Coeq_ind P m r) (cglue b))^ @
ap (transport P (cglue b)) (?Goal (f b))) @
apD (Coeq_ind P n s) (cglue b) = ?Goal (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type m, n: foralla : A, P (coeq a) u: m == n r: forallb : B,
transport P (cglue b) (m (f b)) = m (g b) s: forallb : B,
transport P (cglue b) (n (f b)) = n (g b) p: forallb : B,
ap (transport P (cglue b)) (u (f b)) @ s b =
r b @ u (g b) b: B
((apD (Coeq_ind P m r) (cglue b))^ @
ap (transport P (cglue b)) (?Goal (f b))) @ s b =
?Goal (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type m, n: foralla : A, P (coeq a) u: m == n r: forallb : B,
transport P (cglue b) (m (f b)) = m (g b) s: forallb : B,
transport P (cglue b) (n (f b)) = n (g b) p: forallb : B,
ap (transport P (cglue b)) (u (f b)) @ s b =
r b @ u (g b) b: B
((r b)^ @ ap (transport P (cglue b)) (?Goal (f b))) @
s b = ?Goal (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type m, n: foralla : A, P (coeq a) u: m == n r: forallb : B,
transport P (cglue b) (m (f b)) = m (g b) s: forallb : B,
transport P (cglue b) (n (f b)) = n (g b) p: forallb : B,
ap (transport P (cglue b)) (u (f b)) @ s b =
r b @ u (g b) b: B
ap (transport P (cglue b)) (?Goal (f b)) @ s b =
((r b)^)^ @ ?Goal (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type m, n: foralla : A, P (coeq a) u: m == n r: forallb : B,
transport P (cglue b) (m (f b)) = m (g b) s: forallb : B,
transport P (cglue b) (n (f b)) = n (g b) p: forallb : B,
ap (transport P (cglue b)) (u (f b)) @ s b =
r b @ u (g b) b: B
ap (transport P (cglue b)) (?Goal (f b)) @ s b =
r b @ ?Goal (g b)
exact (p b).Defined.(** ** Universal property *)(** See Colimits/CoeqUnivProp.v for a similar universal property without [Funext]. *)
B, A: Type f, g: B -> A P: Type h: Coeq f g -> P
{k : A -> P & k o f == k o g}
B, A: Type f, g: B -> A P: Type h: Coeq f g -> P
{k : A -> P & k o f == k o g}
B, A: Type f, g: B -> A P: Type h: Coeq f g -> P
(funx : B => h (coeq (f x))) ==
(funx : B => h (coeq (g x)))
B, A: Type f, g: B -> A P: Type h: Coeq f g -> P b: B
h (coeq (f b)) = h (coeq (g b))
exact (ap h (cglue b)).Defined.
H: Funext B, A: Type f, g: B -> A P: Type
IsEquiv
(funp : {h : A -> P & h o f == h o g} =>
Coeq_rec P p.1 p.2)
H: Funext B, A: Type f, g: B -> A P: Type
IsEquiv
(funp : {h : A -> P & h o f == h o g} =>
Coeq_rec P p.1 p.2)
H: Funext B, A: Type f, g: B -> A P: Type
(funp : {h : A -> P & h o f == h o g} =>
Coeq_rec P p.1 p.2) o Coeq_unrec f g == idmap
H: Funext B, A: Type f, g: B -> A P: Type
Coeq_unrec f g
o (funp : {h : A -> P & h o f == h o g} =>
Coeq_rec P p.1 p.2) == idmap
H: Funext B, A: Type f, g: B -> A P: Type
(funp : {h : A -> P & h o f == h o g} =>
Coeq_rec P p.1 p.2) o Coeq_unrec f g == idmap
H: Funext B, A: Type f, g: B -> A P: Type h: Coeq f g -> P
Coeq_rec P (Coeq_unrec f g h).1 (Coeq_unrec f g h).2 =
h
H: Funext B, A: Type f, g: B -> A P: Type h: Coeq f g -> P
Coeq_rec P (Coeq_unrec f g h).1 (Coeq_unrec f g h).2 ==
h
H: Funext B, A: Type f, g: B -> A P: Type h: Coeq f g -> P b: A
(funw : Coeq f g =>
Coeq_rec P (Coeq_unrec f g h).1 (Coeq_unrec f g h).2
w = h w) (coeq b)
H: Funext B, A: Type f, g: B -> A P: Type h: Coeq f g -> P b: B
transport
(funw : Coeq f g =>
Coeq_rec P (Coeq_unrec f g h).1
(Coeq_unrec f g h).2 w = h w) (cglue b)
((funb : A => ?Goal) (f b)) =
(funb : A => ?Goal) (g b)
H: Funext B, A: Type f, g: B -> A P: Type h: Coeq f g -> P b: B
transport
(funw : Coeq f g =>
Coeq_rec P (Coeq_unrec f g h).1
(Coeq_unrec f g h).2 w = h w) (cglue b)
((funb : A =>
1
:
(funw : Coeq f g =>
Coeq_rec P (Coeq_unrec f g h).1
(Coeq_unrec f g h).2 w = h w) (coeq b)) (f b)) =
(funb : A =>
1
:
(funw : Coeq f g =>
Coeq_rec P (Coeq_unrec f g h).1 (Coeq_unrec f g h).2
w = h w) (coeq b)) (g b)
H: Funext B, A: Type f, g: B -> A P: Type h: Coeq f g -> P b: B
transport
(funw : Coeq f g =>
Coeq_rec P (funx : A => h (coeq x))
(funb : B => ap h (cglue b)) w = h w) (cglue b)
1 = 1
H: Funext B, A: Type f, g: B -> A P: Type h: Coeq f g -> P b: B
ap
(Coeq_rec P (funx : A => h (coeq x))
(funb : B => ap h (cglue b))) (cglue b) @ 1 =
1 @ ap h (cglue b)
H: Funext B, A: Type f, g: B -> A P: Type h: Coeq f g -> P b: B
ap
(Coeq_rec P (funx : A => h (coeq x))
(funb : B => ap h (cglue b))) (cglue b) =
ap h (cglue b)
napply Coeq_rec_beta_cglue.
H: Funext B, A: Type f, g: B -> A P: Type
Coeq_unrec f g
o (funp : {h : A -> P & h o f == h o g} =>
Coeq_rec P p.1 p.2) == idmap
H: Funext B, A: Type f, g: B -> A P: Type h: A -> P q: (funx : B => h (f x)) == (funx : B => h (g x))
(funx : A => Coeq_rec P (h; q).1 (h; q).2 (coeq x)) =
h
H: Funext B, A: Type f, g: B -> A P: Type h: A -> P q: (funx : B => h (f x)) == (funx : B => h (g x))
transport
(funk : A -> P =>
(funx : B => k (f x)) == (funx : B => k (g x)))
?p
(funb : B =>
ap (Coeq_rec P (h; q).1 (h; q).2) (cglue b)) = q
H: Funext B, A: Type f, g: B -> A P: Type h: A -> P q: (funx : B => h (f x)) == (funx : B => h (g x))
(funx : A => Coeq_rec P (h; q).1 (h; q).2 (coeq x)) =
h
reflexivity.
H: Funext B, A: Type f, g: B -> A P: Type h: A -> P q: (funx : B => h (f x)) == (funx : B => h (g x))
transport
(funk : A -> P =>
(funx : B => k (f x)) == (funx : B => k (g x))) 1
(funb : B =>
ap (Coeq_rec P (h; q).1 (h; q).2) (cglue b)) = q
H: Funext B, A: Type f, g: B -> A P: Type h: A -> P q: (funx : B => h (f x)) == (funx : B => h (g x))
(funb : B => ap (Coeq_rec P h q) (cglue b)) = q
H: Funext B, A: Type f, g: B -> A P: Type h: A -> P q: (funx : B => h (f x)) == (funx : B => h (g x)) b: B
ap (Coeq_rec P h q) (cglue b) = q b
apply Coeq_rec_beta_cglue.Defined.Definitionequiv_Coeq_rec `{Funext} {B A} (f g : B -> A) P
: {h : A -> P & h o f == h o g} <~> (Coeq f g -> P)
:= Build_Equiv _ _ _ (isequiv_Coeq_rec f g P).(** ** Functoriality *)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h
Coeq f g -> Coeq f' g'
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h
Coeq f g -> Coeq f' g'
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h b: B
coeq (k (f b)) = coeq (k (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h b: B
coeq (f' (h b)) = coeq (g' (h b))
apply cglue.Defined.Definitionfunctor_coeq_beta_cglue {BAfgB'A'f'g'}
(h : B -> B') (k : A -> A')
(p : k o f == f' o h) (q : k o g == g' o h)
(b : B)
: ap (functor_coeq h k p q) (cglue b)
= ap coeq (p b) @ cglue (h b) @ ap coeq (q b)^
:= (Coeq_rec_beta_cglue _ _ _ b).
B, A: Type f, g: B -> A
functor_coeq idmap idmap (funx : B => 1)
(funx : B => 1) == idmap
B, A: Type f, g: B -> A
functor_coeq idmap idmap (funx : B => 1)
(funx : B => 1) == idmap
B, A: Type f, g: B -> A
foralla : A,
(funw : Coeq f g =>
functor_coeq idmap idmap (funx : B => 1)
(funx : B => 1) w = idmap w) (coeq a)
B, A: Type f, g: B -> A
forallb : B,
transport
(funw : Coeq f g =>
functor_coeq idmap idmap (funx : B => 1)
(funx : B => 1) w = idmap w) (cglue b)
(?coeq' (f b)) = ?coeq' (g b)
B, A: Type f, g: B -> A
forallb : B,
transport
(funw : Coeq f g =>
functor_coeq idmap idmap (funx : B => 1)
(funx : B => 1) w = idmap w) (cglue b)
((funa : A => 1) (f b)) = (funa : A => 1) (g b)
B, A: Type f, g: B -> A b: B
transport
(funw : Coeq f g =>
functor_coeq idmap idmap (funx : B => 1)
(funx : B => 1) w = idmap w) (cglue b)
((funa : A => 1) (f b)) = (funa : A => 1) (g b)
B, A: Type f, g: B -> A b: B
ap
(functor_coeq idmap idmap (funx : B => 1)
(funx : B => 1)) (cglue b) @ 1 = 1 @ cglue b
B, A: Type f, g: B -> A b: B
ap
(functor_coeq idmap idmap (funx : B => 1)
(funx : B => 1)) (cglue b) = (1 @ cglue b) @ 1^
napply functor_coeq_beta_cglue.Defined.
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' B'', A'': Type f'', g'': B'' -> A'' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B'' k': A' -> A'' p': k' o f' == f'' o h' q': k' o g' == g'' o h'
functor_coeq (h' o h) (k' o k)
(funb : B => ap k' (p b) @ p' (h b))
(funb : B => ap k' (q b) @ q' (h b)) ==
functor_coeq h' k' p' q' o functor_coeq h k p q
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' B'', A'': Type f'', g'': B'' -> A'' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B'' k': A' -> A'' p': k' o f' == f'' o h' q': k' o g' == g'' o h'
functor_coeq (h' o h) (k' o k)
(funb : B => ap k' (p b) @ p' (h b))
(funb : B => ap k' (q b) @ q' (h b)) ==
functor_coeq h' k' p' q' o functor_coeq h k p q
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' B'', A'': Type f'', g'': B'' -> A'' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B'' k': A' -> A'' p': k' o f' == f'' o h' q': k' o g' == g'' o h' b: B
transport
(funw : Coeq f g =>
functor_coeq (funx : B => h' (h x))
(funx : A => k' (k x))
(funb : B => ap k' (p b) @ p' (h b))
(funb : B => ap k' (q b) @ q' (h b)) w =
functor_coeq h' k' p' q' (functor_coeq h k p q w))
(cglue b) 1 = 1
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' B'', A'': Type f'', g'': B'' -> A'' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B'' k': A' -> A'' p': k' o f' == f'' o h' q': k' o g' == g'' o h' b: B
ap
(functor_coeq (funx : B => h' (h x))
(funx : A => k' (k x))
(funb : B => ap k' (p b) @ p' (h b))
(funb : B => ap k' (q b) @ q' (h b))) (cglue b) @
1 =
1 @
ap
(funx : Coeq f g =>
functor_coeq h' k' p' q' (functor_coeq h k p q x))
(cglue b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' B'', A'': Type f'', g'': B'' -> A'' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B'' k': A' -> A'' p': k' o f' == f'' o h' q': k' o g' == g'' o h' b: B
ap
(funx : Coeq f g =>
functor_coeq h' k' p' q' (functor_coeq h k p q x))
(cglue b) =
ap
(functor_coeq (funx : B => h' (h x))
(funx : A => k' (k x))
(funb : B => ap k' (p b) @ p' (h b))
(funb : B => ap k' (q b) @ q' (h b))) (cglue b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' B'', A'': Type f'', g'': B'' -> A'' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B'' k': A' -> A'' p': k' o f' == f'' o h' q': k' o g' == g'' o h' b: B
ap (functor_coeq h' k' p' q')
(ap (functor_coeq h k p q) (cglue b)) =
ap
(functor_coeq (funx : B => h' (h x))
(funx : A => k' (k x))
(funb : B => ap k' (p b) @ p' (h b))
(funb : B => ap k' (q b) @ q' (h b))) (cglue b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' B'', A'': Type f'', g'': B'' -> A'' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B'' k': A' -> A'' p': k' o f' == f'' o h' q': k' o g' == g'' o h' b: B
(ap (functor_coeq h' k' p' q') (ap coeq (p b)) @
((ap coeq (p' (h b)) @ cglue (h' (h b))) @
ap coeq (q' (h b))^)) @
ap (functor_coeq h' k' p' q') (ap coeq (q b)^) =
((ap coeq (ap k' (p b)) @ ap coeq (p' (h b))) @
cglue (h' (h b))) @ ap coeq (ap k' (q b) @ q' (h b))^
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' B'', A'': Type f'', g'': B'' -> A'' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B'' k': A' -> A'' p': k' o f' == f'' o h' q': k' o g' == g'' o h' b: B
(ap (funx : A' => functor_coeq h' k' p' q' (coeq x))
(p b) @
((ap coeq (p' (h b)) @ cglue (h' (h b))) @
ap coeq (q' (h b))^)) @
ap (funx : A' => functor_coeq h' k' p' q' (coeq x))
(q b)^ =
((ap (funx : A' => coeq (k' x)) (p b) @
ap coeq (p' (h b))) @ cglue (h' (h b))) @
ap coeq (ap k' (q b) @ q' (h b))^
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' B'', A'': Type f'', g'': B'' -> A'' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B'' k': A' -> A'' p': k' o f' == f'' o h' q': k' o g' == g'' o h' b: B
(ap (funx : A' => functor_coeq h' k' p' q' (coeq x))
(p b) @
((ap coeq (p' (h b)) @ cglue (h' (h b))) @
ap coeq (q' (h b))^)) @
ap (funx : A' => functor_coeq h' k' p' q' (coeq x))
(q b)^ =
((ap (funx : A' => coeq (k' x)) (p b) @
ap coeq (p' (h b))) @ cglue (h' (h b))) @
ap coeq (ap k' (q b) @ q' (h b))^
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' B'', A'': Type f'', g'': B'' -> A'' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B'' k': A' -> A'' p': k' o f' == f'' o h' q': k' o g' == g'' o h' b: B
(((ap
(funx : A' => functor_coeq h' k' p' q' (coeq x))
(p b) @ ap coeq (p' (h b))) @ cglue (h' (h b))) @
(ap coeq (q' (h b)))^) @
(ap (funx : A' => functor_coeq h' k' p' q' (coeq x))
(q b))^ =
(((ap (funx : A' => coeq (k' x)) (p b) @
ap coeq (p' (h b))) @ cglue (h' (h b))) @
(ap coeq (q' (h b)))^) @
(ap (funx : A' => coeq (k' x)) (q b))^
reflexivity.Qed.
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b) @ p' b = p b @ ap f' (r b) v: forallb : B, s (g b) @ q' b = q b @ ap g' (r b)
functor_coeq h k p q == functor_coeq h' k' p' q'
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b) @ p' b = p b @ ap f' (r b) v: forallb : B, s (g b) @ q' b = q b @ ap g' (r b)
functor_coeq h k p q == functor_coeq h' k' p' q'
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b) @ p' b = p b @ ap f' (r b) v: forallb : B, s (g b) @ q' b = q b @ ap g' (r b) b: B
transport
(funw : Coeq f g =>
functor_coeq h k p q w = functor_coeq h' k' p' q' w)
(cglue b) (ap coeq (s (f b))) = ap coeq (s (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b) @ p' b = p b @ ap f' (r b) v: forallb : B, s (g b) @ q' b = q b @ ap g' (r b) b: B
ap (functor_coeq h k p q) (cglue b) @
ap coeq (s (g b)) =
ap coeq (s (f b)) @
ap (functor_coeq h' k' p' q') (cglue b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b) @ p' b = p b @ ap f' (r b) v: forallb : B, s (g b) @ q' b = q b @ ap g' (r b) b: B
((ap coeq (p b) @ cglue (h b)) @ ap coeq (q b)^) @
ap coeq (s (g b)) =
ap coeq (s (f b)) @
((ap coeq (p' b) @ cglue (h' b)) @ ap coeq (q' b)^)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b)
@' p' b = p b
@' ap f' (r b) v: forallb : B, s (g b)
@' q' b = q b
@' ap g' (r b) b: B
ap coeq (p b)
@' cglue (h b)
@' ap coeq (q b)^
@' ap coeq (s (g b)) =
ap coeq (s (f b))
@' (ap coeq (p' b)
@' cglue (h' b)
@' ap coeq (q' b)^)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b)
@' p' b = p b
@' ap f' (r b) v: forallb : B, s (g b)
@' q' b = q b
@' ap g' (r b) b: B
ap coeq (p b)
@' cglue (h b)
@' (ap coeq (q b))^
@' ap coeq (s (g b)) =
ap coeq (s (f b))
@' (ap coeq (p' b)
@' cglue (h' b)
@' (ap coeq (q' b))^)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b)
@' p' b = p b
@' ap f' (r b) v: forallb : B, s (g b)
@' q' b = q b
@' ap g' (r b) b: B
ap coeq (p b)
@' cglue (h b)
@' (ap coeq (q b))^
@' ap coeq (s (g b)) =
ap coeq (s (f b))
@' ap coeq (p' b)
@' cglue (h' b)
@' (ap coeq (q' b))^
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b)
@' p' b = p b
@' ap f' (r b) v: forallb : B, s (g b)
@' q' b = q b
@' ap g' (r b) b: B
ap coeq (p b)
@' cglue (h b)
@' (ap coeq (q b))^
@' ap coeq (s (g b))
@' ap coeq (q' b) =
ap coeq (s (f b))
@' ap coeq (p' b)
@' cglue (h' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b)
@' p' b = p b
@' ap f' (r b) v: forallb : B, s (g b)
@' q' b = q b
@' ap g' (r b) b: B
ap coeq (p b)
@' cglue (h b)
@' (ap coeq (q b))^
@' ap coeq (s (g b))
@' ap coeq (q' b) =
ap coeq (s (f b)
@' p' b)
@' cglue (h' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b)
@' p' b = p b
@' ap f' (r b) v: forallb : B, s (g b)
@' q' b = q b
@' ap g' (r b) b: B
ap coeq (p b)
@' cglue (h b)
@' (ap coeq (q b))^
@' ap coeq (s (g b))
@' ap coeq (q' b) =
ap coeq (p b)
@' ap coeq (ap f' (r b))
@' cglue (h' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b)
@' p' b = p b
@' ap f' (r b) v: forallb : B, s (g b)
@' q' b = q b
@' ap g' (r b) b: B
cglue (h b)
@' ((ap coeq (q b))^
@' (ap coeq (s (g b))
@' ap coeq (q' b))) =
ap coeq (ap f' (r b))
@' cglue (h' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b)
@' p' b = p b
@' ap f' (r b) v: forallb : B, s (g b)
@' q' b = q b
@' ap g' (r b) b: B
cglue (h b)
@' ((ap coeq (q b))^
@' ap coeq (s (g b)
@' q' b)) =
ap coeq (ap f' (r b))
@' cglue (h' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b)
@' p' b = p b
@' ap f' (r b) v: forallb : B, s (g b)
@' q' b = q b
@' ap g' (r b) b: B
cglue (h b)
@' ((ap coeq (q b))^
@' (ap coeq (q b)
@' ap coeq (ap g' (r b)))) =
ap coeq (ap f' (r b))
@' cglue (h' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b)
@' p' b = p b
@' ap f' (r b) v: forallb : B, s (g b)
@' q' b = q b
@' ap g' (r b) b: B
cglue (h b)
@' ap coeq (ap g' (r b)) =
ap coeq (ap f' (r b))
@' cglue (h' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B -> B' k': A -> A' p': k' o f == f' o h' q': k' o g == g' o h' r: h == h' s: k == k' u: forallb : B, s (f b)
@' p' b = p b
@' ap f' (r b) v: forallb : B, s (g b)
@' q' b = q b
@' ap g' (r b) b: B
cglue (h b)
@' ap (funx : B' => coeq (g' x)) (r b) =
ap (funx : B' => coeq (f' x)) (r b)
@' cglue (h' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
(ap k' (p b) @ p' (h b)) @ ap f (r b) = s (f b) v: forallb : B,
(ap k' (q b) @ q' (h b)) @ ap g (r b) = s (g b)
functor_coeq h' k' p' q' o functor_coeq h k p q ==
idmap
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
(ap k' (p b) @ p' (h b)) @ ap f (r b) = s (f b) v: forallb : B,
(ap k' (q b) @ q' (h b)) @ ap g (r b) = s (g b)
functor_coeq h' k' p' q' o functor_coeq h k p q ==
idmap
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
(ap k' (p b) @ p' (h b)) @ ap f (r b) = s (f b) v: forallb : B,
(ap k' (q b) @ q' (h b)) @ ap g (r b) = s (g b) b: B
transport
(funw : Coeq f g =>
functor_coeq h' k' p' q' (functor_coeq h k p q w) =
w) (cglue b) (ap coeq (s (f b))) =
ap coeq (s (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
(ap k' (p b) @ p' (h b)) @ ap f (r b) = s (f b) v: forallb : B,
(ap k' (q b) @ q' (h b)) @ ap g (r b) = s (g b) b: B
((ap (functor_coeq h' k' p' q')
(ap (functor_coeq h k p q) (cglue b)))^ @
ap coeq (s (f b))) @ cglue b = ap coeq (s (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
(ap k' (p b) @ p' (h b)) @ ap f (r b) = s (f b) v: forallb : B,
(ap k' (q b) @ q' (h b)) @ ap g (r b) = s (g b) b: B
ap coeq (s (f b)) @ cglue b =
ap (functor_coeq h' k' p' q')
(ap (functor_coeq h k p q) (cglue b)) @
ap coeq (s (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
(ap k' (p b) @ p' (h b)) @ ap f (r b) = s (f b) v: forallb : B,
(ap k' (q b) @ q' (h b)) @ ap g (r b) = s (g b) b: B
ap coeq (s (f b)) @ cglue b =
((ap (functor_coeq h' k' p' q') (ap coeq (p b)) @
ap (functor_coeq h' k' p' q') (cglue (h b))) @
ap (functor_coeq h' k' p' q') (ap coeq (q b)^)) @
ap coeq (s (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
(ap k' (p b) @ p' (h b)) @ ap f (r b) = s (f b) v: forallb : B,
(ap k' (q b) @ q' (h b)) @ ap g (r b) = s (g b) b: B
ap coeq (s (f b)) @ cglue b =
((ap (funx : A' => functor_coeq h' k' p' q' (coeq x))
(p b) @
ap (functor_coeq h' k' p' q') (cglue (h b))) @
ap (funx : A' => functor_coeq h' k' p' q' (coeq x))
(q b)^) @ ap coeq (s (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
(ap k' (p b) @ p' (h b)) @ ap f (r b) = s (f b) v: forallb : B,
(ap k' (q b) @ q' (h b)) @ ap g (r b) = s (g b) b: B
ap coeq (s (f b)) @ cglue b =
((ap (funx : A' => functor_coeq h' k' p' q' (coeq x))
(p b) @
((ap coeq (p' (h b)) @ cglue (h' (h b))) @
ap coeq (q' (h b))^)) @
ap (funx : A' => functor_coeq h' k' p' q' (coeq x))
(q b)^) @ ap coeq (s (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
ap k' (p b)
@' p' (h b)
@' ap f (r b) = s (f b) v: forallb : B,
ap k' (q b)
@' q' (h b)
@' ap g (r b) = s (g b) b: B
ap coeq (s (f b))
@' cglue b =
ap (funx : A' => functor_coeq h' k' p' q' (coeq x))
(p b)
@' (ap coeq (p' (h b))
@' cglue (h' (h b))
@' ap coeq (q' (h b))^)
@' ap
(funx : A' => functor_coeq h' k' p' q' (coeq x))
(q b)^
@' ap coeq (s (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
ap k' (p b)
@' p' (h b)
@' ap f (r b) = s (f b) v: forallb : B,
ap k' (q b)
@' q' (h b)
@' ap g (r b) = s (g b) b: B
ap coeq (s (f b))
@' cglue b =
ap (funx : A' => functor_coeq h' k' p' q' (coeq x))
(p b)
@' ap coeq (p' (h b))
@' cglue (h' (h b))
@' ap coeq (q' (h b))^
@' ap
(funx : A' => functor_coeq h' k' p' q' (coeq x))
(q b)^
@' ap coeq (s (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
ap k' (p b)
@' p' (h b)
@' ap f (r b) = s (f b) v: forallb : B,
ap k' (q b)
@' q' (h b)
@' ap g (r b) = s (g b) b: B
ap coeq (ap k' (p b))
@' ap coeq (p' (h b))
@' ap coeq (ap f (r b))
@' cglue b =
ap coeq (ap k' (p b))
@' ap coeq (p' (h b))
@' cglue (h' (h b))
@' ap coeq (q' (h b))^
@' ap coeq (ap k' (q b)^)
@' ap coeq (s (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
ap k' (p b)
@' p' (h b)
@' ap f (r b) = s (f b) v: forallb : B,
ap k' (q b)
@' q' (h b)
@' ap g (r b) = s (g b) b: B
ap coeq (ap f (r b))
@' cglue b =
cglue (h' (h b))
@' (ap coeq (q' (h b))^
@' (ap coeq (ap k' (q b)^)
@' ap coeq (s (g b))))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
ap k' (p b)
@' p' (h b)
@' ap f (r b) = s (f b) v: forallb : B,
ap k' (q b)
@' q' (h b)
@' ap g (r b) = s (g b) b: B
ap coeq (ap f (r b))
@' cglue b =
cglue (h' (h b))
@' ap coeq (q' (h b))^
@' ap coeq (ap k' (q b)^)
@' ap coeq (s (g b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
ap k' (p b)
@' p' (h b)
@' ap f (r b) = s (f b) v: forallb : B,
ap k' (q b)
@' q' (h b)
@' ap g (r b) = s (g b) b: B
ap coeq (ap f (r b))
@' cglue b =
cglue (h' (h b))
@' ap coeq (q' (h b))^
@' ap coeq (ap k' (q b)^)
@' ap coeq (ap k' (q b)
@' q' (h b)
@' ap g (r b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
ap k' (p b)
@' p' (h b)
@' ap f (r b) = s (f b) v: forallb : B,
ap k' (q b)
@' q' (h b)
@' ap g (r b) = s (g b) b: B
ap coeq (ap f (r b))
@' cglue b = cglue (h' (h b))
@' ap coeq (ap g (r b))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' p: k o f == f' o h q: k o g == g' o h h': B' -> B k': A' -> A p': k' o f' == f o h' q': k' o g' == g o h' r: h' o h == idmap s: k' o k == idmap u: forallb : B,
ap k' (p b)
@' p' (h b)
@' ap f (r b) = s (f b) v: forallb : B,
ap k' (q b)
@' q' (h b)
@' ap g (r b) = s (g b) b: B
ap (funx : B => coeq (f x)) (r b)
@' cglue b =
cglue (h' (h b))
@' ap (funx : B => coeq (g x)) (r b)
exact (concat_Ap cglue (r b)).Close Scope long_path_scope.Qed.SectionIsEquivFunctorCoeq.Context {BAfgB'A'f'g'}
(h : B -> B') (k : A -> A')
`{IsEquiv _ _ h} `{IsEquiv _ _ k}
(p : k o f == f' o h) (q : k o g == g' o h).
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
Coeq f' g' -> Coeq f g
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
Coeq f' g' -> Coeq f g
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
(funx : B' => k^-1 (f' x)) ==
(funx : B' => f (h^-1 x))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
(funx : B' => k^-1 (g' x)) ==
(funx : B' => g (h^-1 x))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
(funx : B' => k^-1 (f' x)) ==
(funx : B' => f (h^-1 x))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
k^-1 (f' b) = f (h^-1 b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
k^-1 (f' (h (h^-1 b))) = k^-1 (k (f (h^-1 b)))
apply ap, inverse, p.
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
(funx : B' => k^-1 (g' x)) ==
(funx : B' => g (h^-1 x))
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
k^-1 (g' b) = g (h^-1 b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
k^-1 (g' (h (h^-1 b))) = k^-1 (k (g (h^-1 b)))
apply ap, inverse, q.Defined.
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
functor_coeq h k p q o functor_coeq_inverse == idmap
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
functor_coeq h k p q o functor_coeq_inverse == idmap
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
functor_coeq h k p q o functor_coeq_inverse == idmap
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap k
(ap (funx : B' => k^-1 (f' x)) (eisretr h b)^
@' ap k^-1 (p (h^-1 b))^
@' eissect k (f (h^-1 b)))
@' p (h^-1 b)
@' ap f' (eisretr h b) = eisretr k (f' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap k
(ap (funx : B' => k^-1 (g' x)) (eisretr h b)^
@' ap k^-1 (q (h^-1 b))^
@' eissect k (g (h^-1 b)))
@' q (h^-1 b)
@' ap g' (eisretr h b) = eisretr k (g' b)
(** The two proofs are identical modulo replacing [f] by [g], [f'] by [g'], and [p] by [q]. *)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap k (ap (funx : B' => k^-1 (f' x)) (eisretr h b)^)
@' ap k (ap k^-1 (p (h^-1 b))^)
@' eisretr k (k (f (h^-1 b)))
@' p (h^-1 b)
@' ap f' (eisretr h b) = eisretr k (f' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap k (ap (funx : B' => k^-1 (g' x)) (eisretr h b)^)
@' ap k (ap k^-1 (q (h^-1 b))^)
@' eisretr k (k (g (h^-1 b)))
@' q (h^-1 b)
@' ap g' (eisretr h b) = eisretr k (g' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap k (ap (funx : B' => k^-1 (f' x)) (eisretr h b)^)
@' ap (funx : A' => k (k^-1 x)) (p (h^-1 b))^
@' eisretr k (k (f (h^-1 b)))
@' p (h^-1 b)
@' ap f' (eisretr h b) = eisretr k (f' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap k (ap (funx : B' => k^-1 (g' x)) (eisretr h b)^)
@' ap (funx : A' => k (k^-1 x)) (q (h^-1 b))^
@' eisretr k (k (g (h^-1 b)))
@' q (h^-1 b)
@' ap g' (eisretr h b) = eisretr k (g' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap k (ap (funx : B' => k^-1 (f' x)) (eisretr h b)^)
@' eisretr k (f' (h (h^-1 b)))
@' (p (h^-1 b))^
@' p (h^-1 b)
@' ap f' (eisretr h b) = eisretr k (f' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap k (ap (funx : B' => k^-1 (g' x)) (eisretr h b)^)
@' eisretr k (g' (h (h^-1 b)))
@' (q (h^-1 b))^
@' q (h^-1 b)
@' ap g' (eisretr h b) = eisretr k (g' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap k (ap (funx : B' => k^-1 (f' x)) (eisretr h b)^)
@' eisretr k (f' (h (h^-1 b)))
@' ap f' (eisretr h b) = eisretr k (f' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap k (ap (funx : B' => k^-1 (g' x)) (eisretr h b)^)
@' eisretr k (g' (h (h^-1 b)))
@' ap g' (eisretr h b) = eisretr k (g' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap (funx : B' => k (k^-1 (f' x))) (eisretr h b)^
@' eisretr k (f' (h (h^-1 b)))
@' ap f' (eisretr h b) = eisretr k (f' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap (funx : B' => k (k^-1 (g' x))) (eisretr h b)^
@' eisretr k (g' (h (h^-1 b)))
@' ap g' (eisretr h b) = eisretr k (g' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap (funx : A' => k (k^-1 x)) (ap f' (eisretr h b)^)
@' eisretr k (f' (h (h^-1 b)))
@' ap f' (eisretr h b) = eisretr k (f' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
ap (funx : A' => k (k^-1 x)) (ap g' (eisretr h b)^)
@' eisretr k (g' (h (h^-1 b)))
@' ap g' (eisretr h b) = eisretr k (g' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
eisretr k (f' b)
@' ap f' (eisretr h b)^
@' ap f' (eisretr h b) = eisretr k (f' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B'
eisretr k (g' b)
@' ap g' (eisretr h b)^
@' ap g' (eisretr h b) = eisretr k (g' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
functor_coeq_inverse o functor_coeq h k p q == idmap
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
functor_coeq_inverse o functor_coeq h k p q == idmap
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h
functor_coeq_inverse o functor_coeq h k p q == idmap
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1 (p b)
@' (ap (funx : B' => k^-1 (f' x)) (eisretr h (h b))^
@' ap k^-1 (p (h^-1 (h b)))^
@' eissect k (f (h^-1 (h b))))
@' ap f (eissect h b) = eissect k (f b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1 (q b)
@' (ap (funx : B' => k^-1 (g' x)) (eisretr h (h b))^
@' ap k^-1 (q (h^-1 (h b)))^
@' eissect k (g (h^-1 (h b))))
@' ap g (eissect h b) = eissect k (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1 (p b)
@' ap (funx : B => k^-1 (f' (h x))) (eissect h b)^
@' ap k^-1 (p (h^-1 (h b)))^
@' eissect k (f (h^-1 (h b)))
@' ap f (eissect h b) = eissect k (f b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1 (q b)
@' ap (funx : B => k^-1 (g' (h x))) (eissect h b)^
@' ap k^-1 (q (h^-1 (h b)))^
@' eissect k (g (h^-1 (h b)))
@' ap g (eissect h b) = eissect k (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1 (p b)
@' ap k^-1 (ap (funx : B => f' (h x)) (eissect h b)^)
@' ap k^-1 (p (h^-1 (h b)))^
@' eissect k (f (h^-1 (h b)))
@' ap f (eissect h b) = eissect k (f b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1 (q b)
@' ap k^-1 (ap (funx : B => g' (h x)) (eissect h b)^)
@' ap k^-1 (q (h^-1 (h b)))^
@' eissect k (g (h^-1 (h b)))
@' ap g (eissect h b) = eissect k (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1
(p b
@' (ap (funx : B => f' (h x)) (eissect h b)^
@' (p (h^-1 (h b)))^))
@' (eissect k (f (h^-1 (h b)))
@' ap f (eissect h b)) = eissect k (f b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1
(q b
@' (ap (funx : B => g' (h x)) (eissect h b)^
@' (q (h^-1 (h b)))^))
@' (eissect k (g (h^-1 (h b)))
@' ap g (eissect h b)) = eissect k (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1
(p b
@' ((p b)^
@' ap (funb : B => k (f b)) (eissect h b)^))
@' (eissect k (f (h^-1 (h b)))
@' ap f (eissect h b)) = eissect k (f b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1
(q b
@' (ap (funx : B => g' (h x)) (eissect h b)^
@' (q (h^-1 (h b)))^))
@' (eissect k (g (h^-1 (h b)))
@' ap g (eissect h b)) = eissect k (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1
(p b
@' ((p b)^
@' ap (funb : B => k (f b)) (eissect h b)^))
@' (eissect k (f (h^-1 (h b)))
@' ap f (eissect h b)) = eissect k (f b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1
(q b
@' ((q b)^
@' ap (funb : B => k (g b)) (eissect h b)^))
@' (eissect k (g (h^-1 (h b)))
@' ap g (eissect h b)) = eissect k (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1 (ap (funb : B => k (f b)) (eissect h b)^)
@' eissect k (f (h^-1 (h b)))
@' ap f (eissect h b) = eissect k (f b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap k^-1 (ap (funb : B => k (g b)) (eissect h b)^)
@' eissect k (g (h^-1 (h b)))
@' ap g (eissect h b) = eissect k (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap (funx : A => k^-1 (k x)) (ap f (eissect h b)^)
@' eissect k (f (h^-1 (h b)))
@' ap f (eissect h b) = eissect k (f b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
ap (funx : A => k^-1 (k x)) (ap g (eissect h b)^)
@' eissect k (g (h^-1 (h b)))
@' ap g (eissect h b) = eissect k (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
eissect k (f b)
@' ap f (eissect h b)^
@' ap f (eissect h b) = eissect k (f b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' h: B -> B' k: A -> A' H: IsEquiv h H0: IsEquiv k p: k o f == f' o h q: k o g == g' o h b: B
eissect k (g b)
@' ap g (eissect h b)^
@' ap g (eissect h b) = eissect k (g b)
all:rewrite ap_V, concat_pV_p; reflexivity.Close Scope long_path_scope.Qed.#[export] Instanceisequiv_functor_coeq
: IsEquiv (functor_coeq h k p q)
:= isequiv_adjointify _ functor_coeq_inverse
functor_coeq_eissect functor_coeq_eisretr.Definitionequiv_functor_coeq
: @Coeq B A f g <~> @Coeq B' A' f' g'
:= Build_Equiv _ _ (functor_coeq h k p q) _.EndIsEquivFunctorCoeq.Definitionequiv_functor_coeq' {BAfgB'A'f'g'}
(h : B <~> B') (k : A <~> A')
(p : k o f == f' o h) (q : k o g == g' o h)
: @Coeq B A f g <~> @Coeq B' A' f' g'
:= equiv_functor_coeq h k p q.(** ** A double recursion principle *)SectionCoeqRec2.Context {BA : Type} {fg : B -> A} {B'A' : Type} {f'g' : B' -> A'}
(P : Type) (coeq' : A -> A' -> P)
(cgluel : forallba', coeq' (f b) a' = coeq' (g b) a')
(cgluer : forallab', coeq' a (f' b') = coeq' a (g' b'))
(cgluelr : forallbb', cgluel b (f' b') @ cgluer (g b) b'
= cgluer (f b) b' @ cgluel b (g' b')).
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b')
Coeq f g -> Coeq f' g' -> P
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b')
Coeq f g -> Coeq f' g' -> P
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') y: Coeq f' g'
Coeq f g -> P
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') y: Coeq f' g'
A -> P
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') y: Coeq f' g'
forallb : B, ?coeq' (f b) = ?coeq' (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') y: Coeq f' g'
A -> P
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') y: Coeq f' g' a: A
P
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') a: A
Coeq f' g' -> P
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') a: A
A' -> P
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') a: A
forallb : B', ?coeq' (f' b) = ?coeq' (g' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') a: A
A' -> P
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') a: A a': A'
P
exact (coeq' a a').
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') a: A
forallb : B',
(funa' : A' => coeq' a a') (f' b) =
(funa' : A' => coeq' a a') (g' b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') a: A b': B'
coeq' a (f' b') = coeq' a (g' b')
apply cgluer.
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') y: Coeq f' g'
forallb : B,
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) y) (f b) =
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) y) (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') y: Coeq f' g' b: B
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) y) (f b) =
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) y) (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B
forally : Coeq f' g',
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) y) (f b) =
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) y) (g b)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B
foralla : A',
(funw : Coeq f' g' =>
(funa0 : A =>
Coeq_rec P (funa' : A' => coeq' a0 a')
(funb' : B' =>
cgluer a0 b'
:
(funa' : A' => coeq' a0 a') (f' b') =
(funa' : A' => coeq' a0 a') (g' b')) w) (f b) =
(funa0 : A =>
Coeq_rec P (funa' : A' => coeq' a0 a')
(funb' : B' =>
cgluer a0 b'
:
(funa' : A' => coeq' a0 a') (f' b') =
(funa' : A' => coeq' a0 a') (g' b')) w) (g b))
(coeq a)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B
forallb0 : B',
transport
(funw : Coeq f' g' =>
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) w)
(f b) =
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) w)
(g b)) (cglue b0) (?coeq' (f' b0)) =
?coeq' (g' b0)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B
foralla : A',
(funw : Coeq f' g' =>
(funa0 : A =>
Coeq_rec P (funa' : A' => coeq' a0 a')
(funb' : B' =>
cgluer a0 b'
:
(funa' : A' => coeq' a0 a') (f' b') =
(funa' : A' => coeq' a0 a') (g' b')) w) (f b) =
(funa0 : A =>
Coeq_rec P (funa' : A' => coeq' a0 a')
(funb' : B' =>
cgluer a0 b'
:
(funa' : A' => coeq' a0 a') (f' b') =
(funa' : A' => coeq' a0 a') (g' b')) w) (g b))
(coeq a)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B a': A'
(funw : Coeq f' g' =>
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) w) (f b) =
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) w) (g b))
(coeq a')
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B a': A'
Coeq_rec P (funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b') (coeq a') =
Coeq_rec P (funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b') (coeq a')
apply cgluel.
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B
forallb0 : B',
transport
(funw : Coeq f' g' =>
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) w) (f b) =
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) w) (g b))
(cglue b0)
((funa' : A' =>
cgluel b a'
:
(funw : Coeq f' g' =>
(funa : A =>
Coeq_rec P (funa'0 : A' => coeq' a a'0)
(funb' : B' =>
cgluer a b'
:
(funa'0 : A' => coeq' a a'0) (f' b') =
(funa'0 : A' => coeq' a a'0) (g' b')) w)
(f b) =
(funa : A =>
Coeq_rec P (funa'0 : A' => coeq' a a'0)
(funb' : B' =>
cgluer a b'
:
(funa'0 : A' => coeq' a a'0) (f' b') =
(funa'0 : A' => coeq' a a'0) (g' b')) w)
(g b)) (coeq a')) (f' b0)) =
(funa' : A' =>
cgluel b a'
:
(funw : Coeq f' g' =>
(funa : A =>
Coeq_rec P (funa'0 : A' => coeq' a a'0)
(funb' : B' =>
cgluer a b'
:
(funa'0 : A' => coeq' a a'0) (f' b') =
(funa'0 : A' => coeq' a a'0) (g' b')) w) (f b) =
(funa : A =>
Coeq_rec P (funa'0 : A' => coeq' a a'0)
(funb' : B' =>
cgluer a b'
:
(funa'0 : A' => coeq' a a'0) (f' b') =
(funa'0 : A' => coeq' a a'0) (g' b')) w) (g b))
(coeq a')) (g' b0)
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B b': B'
transport
(funw : Coeq f' g' =>
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) w) (f b) =
(funa : A =>
Coeq_rec P (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
(funa' : A' => coeq' a a') (f' b') =
(funa' : A' => coeq' a a') (g' b')) w) (g b))
(cglue b')
((funa' : A' =>
cgluel b a'
:
(funw : Coeq f' g' =>
(funa : A =>
Coeq_rec P (funa'0 : A' => coeq' a a'0)
(funb' : B' =>
cgluer a b'
:
(funa'0 : A' => coeq' a a'0) (f' b') =
(funa'0 : A' => coeq' a a'0) (g' b')) w)
(f b) =
(funa : A =>
Coeq_rec P (funa'0 : A' => coeq' a a'0)
(funb' : B' =>
cgluer a b'
:
(funa'0 : A' => coeq' a a'0) (f' b') =
(funa'0 : A' => coeq' a a'0) (g' b')) w)
(g b)) (coeq a')) (f' b')) =
(funa' : A' =>
cgluel b a'
:
(funw : Coeq f' g' =>
(funa : A =>
Coeq_rec P (funa'0 : A' => coeq' a a'0)
(funb' : B' =>
cgluer a b'
:
(funa'0 : A' => coeq' a a'0) (f' b') =
(funa'0 : A' => coeq' a a'0) (g' b')) w) (f b) =
(funa : A =>
Coeq_rec P (funa'0 : A' => coeq' a a'0)
(funb' : B' =>
cgluer a b'
:
(funa'0 : A' => coeq' a a'0) (f' b') =
(funa'0 : A' => coeq' a a'0) (g' b')) w) (g b))
(coeq a')) (g' b')
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B b': B'
ap
(Coeq_rec P (funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) (cglue b') @
cgluel b (g' b') =
cgluel b (f' b') @
ap
(Coeq_rec P (funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b')) (cglue b')
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B b': B'
ap
(Coeq_rec P (funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) (cglue b') =
?Goal
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B b': B'
?Goal @ cgluel b (g' b') =
cgluel b (f' b') @
ap
(Coeq_rec P (funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b'))
(cglue b')
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B b': B'
cgluer (f b) b' @ cgluel b (g' b') =
cgluel b (f' b') @
ap
(Coeq_rec P (funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b')) (cglue b')
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B b': B'
cgluer (f b) b' @ cgluel b (g' b') =
cgluel b (f' b') @ ?Goal
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B b': B'
ap
(Coeq_rec P (funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b'))
(cglue b') = ?Goal
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B b': B'
cgluer (f b) b' @ cgluel b (g' b') =
cgluel b (f' b') @ cgluer (g b) b'
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B b': B'
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b')
apply cgluelr.Defined.DefinitionCoeq_rec2_beta (a : A) (a' : A')
: Coeq_rec2 (coeq a) (coeq a') = coeq' a a'
:= 1.
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') a: A b': B'
ap (Coeq_rec2 (coeq a)) (cglue b') = cgluer a b'
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') a: A b': B'
ap (Coeq_rec2 (coeq a)) (cglue b') = cgluer a b'
napply Coeq_rec_beta_cglue.Defined.
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B a': A'
ap (funx : Coeq f g => Coeq_rec2 x (coeq a'))
(cglue b) = cgluel b a'
B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Type coeq': A -> A' -> P cgluel: forall (b : B) (a' : A'),
coeq' (f b) a' = coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
coeq' a (f' b') = coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
cgluel b (f' b') @ cgluer (g b) b' =
cgluer (f b) b' @ cgluel b (g' b') b: B a': A'
ap (funx : Coeq f g => Coeq_rec2 x (coeq a'))
(cglue b) = cgluel b a'
napply Coeq_rec_beta_cglue.Defined.(** TODO: [Coeq_rec2_beta_cgluelr] *)EndCoeqRec2.(** ** A double induction principle *)SectionCoeqInd2.Context `{Funext}
{B A : Type} {f g : B -> A} {B' A' : Type} {f' g' : B' -> A'}
(P : Coeq f g -> Coeq f' g' -> Type)
(coeq' : forallaa', P (coeq a) (coeq a'))
(cgluel : forallba',
transport (funx => P x (coeq a')) (cglue b)
(coeq' (f b) a') = coeq' (g b) a')
(cgluer : forallab',
transport (funy => P (coeq a) y) (cglue b')
(coeq' a (f' b')) = coeq' a (g' b'))
(** Perhaps this should really be written using [concatD]. *)
(cgluelr : forallbb',
ap (transport (P (coeq (g b))) (cglue b')) (cgluel b (f' b'))
@ cgluer (g b) b'
= transport_transport P (cglue b) (cglue b') (coeq' (f b) (f' b'))
@ ap (transport (funx => P x (coeq (g' b'))) (cglue b))
(cgluer (f b) b')
@ cgluel b (g' b')).
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b')
forall (x : Coeq f g) (y : Coeq f' g'), P x y
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b')
forall (x : Coeq f g) (y : Coeq f' g'), P x y
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b')
foralla : A,
(funw : Coeq f g => forally : Coeq f' g', P w y)
(coeq a)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b')
forallb : B,
transport
(funw : Coeq f g => forally : Coeq f' g', P w y)
(cglue b) (?coeq' (f b)) =
?coeq' (g b)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b')
foralla : A,
(funw : Coeq f g => forally : Coeq f' g', P w y)
(coeq a)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') a: A
(funw : Coeq f g => forally : Coeq f' g', P w y)
(coeq a)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') a: A
foralla0 : A', P (coeq a) (coeq a0)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') a: A
forallb : B',
transport (P (coeq a)) (cglue b) (?coeq' (f' b)) =
?coeq' (g' b)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') a: A
foralla0 : A', P (coeq a) (coeq a0)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') a: A a': A'
P (coeq a) (coeq a')
exact (coeq' a a').
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') a: A
forallb : B',
transport (P (coeq a)) (cglue b)
((funa' : A' => coeq' a a') (f' b)) =
(funa' : A' => coeq' a a') (g' b)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') a: A b': B'
transport (P (coeq a)) (cglue b') (coeq' a (f' b')) =
coeq' a (g' b')
apply cgluer.
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b')
forallb : B,
transport
(funw : Coeq f g => forally : Coeq f' g', P w y)
(cglue b)
((funa : A =>
Coeq_ind (P (coeq a)) (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
transport (P (coeq a)) (cglue b')
((funa' : A' => coeq' a a') (f' b')) =
(funa' : A' => coeq' a a') (g' b'))) (f b)) =
(funa : A =>
Coeq_ind (P (coeq a)) (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
transport (P (coeq a)) (cglue b')
((funa' : A' => coeq' a a') (f' b')) =
(funa' : A' => coeq' a a') (g' b'))) (g b)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B
transport
(funw : Coeq f g => forally : Coeq f' g', P w y)
(cglue b)
((funa : A =>
Coeq_ind (P (coeq a)) (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
transport (P (coeq a)) (cglue b')
((funa' : A' => coeq' a a') (f' b')) =
(funa' : A' => coeq' a a') (g' b'))) (f b)) =
(funa : A =>
Coeq_ind (P (coeq a)) (funa' : A' => coeq' a a')
(funb' : B' =>
cgluer a b'
:
transport (P (coeq a)) (cglue b')
((funa' : A' => coeq' a a') (f' b')) =
(funa' : A' => coeq' a a') (g' b'))) (g b)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B a: Coeq f' g'
transport
(funw : Coeq f g => forally : Coeq f' g', P w y)
(cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) a =
Coeq_ind (P (coeq (g b)))
(funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b') a
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B
foralla : A',
(funw : Coeq f' g' =>
transport
(funw0 : Coeq f g => forally : Coeq f' g', P w0 y)
(cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) w =
Coeq_ind (P (coeq (g b)))
(funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b') w) (coeq a)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B
forallb0 : B',
transport
(funw : Coeq f' g' =>
transport
(funw0 : Coeq f g =>
forally : Coeq f' g', P w0 y)
(cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) w =
Coeq_ind (P (coeq (g b)))
(funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b') w)
(cglue b0) (?coeq' (f' b0)) =
?coeq' (g' b0)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B
foralla : A',
(funw : Coeq f' g' =>
transport
(funw0 : Coeq f g => forally : Coeq f' g', P w0 y)
(cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) w =
Coeq_ind (P (coeq (g b)))
(funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b') w) (coeq a)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B a': A'
(funw : Coeq f' g' =>
transport
(funw0 : Coeq f g => forally : Coeq f' g', P w0 y)
(cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) w =
Coeq_ind (P (coeq (g b)))
(funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b') w) (coeq a')
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B a': A'
transport
(funw : Coeq f g => forally : Coeq f' g', P w y)
(cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) (coeq a') =
Coeq_ind (P (coeq (g b)))
(funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b') (coeq a')
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B a': A'
transport (funx : Coeq f g => P x (coeq a'))
(cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b') (coeq a')) =
Coeq_ind (P (coeq (g b)))
(funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b') (coeq a')
apply cgluel.
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B
forallb0 : B',
transport
(funw : Coeq f' g' =>
transport
(funw0 : Coeq f g =>
forally : Coeq f' g', P w0 y) (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) w =
Coeq_ind (P (coeq (g b)))
(funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b') w) (cglue b0)
((funa' : A' =>
transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa'0 : A' => coeq' (f b) a'0)
(funb' : B' => cgluer (f b) b')) (coeq a') @
cgluel b a'
:
(funw : Coeq f' g' =>
transport
(funw0 : Coeq f g =>
forally : Coeq f' g', P w0 y) (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa'0 : A' => coeq' (f b) a'0)
(funb' : B' => cgluer (f b) b')) w =
Coeq_ind (P (coeq (g b)))
(funa'0 : A' => coeq' (g b) a'0)
(funb' : B' => cgluer (g b) b') w) (coeq a'))
(f' b0)) =
(funa' : A' =>
transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa'0 : A' => coeq' (f b) a'0)
(funb' : B' => cgluer (f b) b')) (coeq a') @
cgluel b a'
:
(funw : Coeq f' g' =>
transport
(funw0 : Coeq f g =>
forally : Coeq f' g', P w0 y) (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa'0 : A' => coeq' (f b) a'0)
(funb' : B' => cgluer (f b) b')) w =
Coeq_ind (P (coeq (g b)))
(funa'0 : A' => coeq' (g b) a'0)
(funb' : B' => cgluer (g b) b') w) (coeq a'))
(g' b0)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B b': B'
transport
(funw : Coeq f' g' =>
transport
(funw0 : Coeq f g =>
forally : Coeq f' g', P w0 y) (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) w =
Coeq_ind (P (coeq (g b)))
(funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b') w) (cglue b')
(transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b'))
(coeq (f' b')) @ cgluel b (f' b')) =
transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) (coeq (g' b')) @
cgluel b (g' b')
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B b': B'
((apD
(transport
(funw : Coeq f g =>
forally : Coeq f' g', P w y) (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')))
(cglue b'))^ @
ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b'))
(coeq (f' b')) @ cgluel b (f' b'))) @
apD
(Coeq_ind (P (coeq (g b)))
(funa' : A' => coeq' (g b) a')
(funb' : B' => cgluer (g b) b')) (cglue b') =
transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) (coeq (g' b')) @
cgluel b (g' b')
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')) @ cgluer (g b) b' =
(transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b')) @
ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')) @
cgluel b (g' b') b: B b': B'
((apD
(transport
(funw : Coeq f g =>
forally : Coeq f' g', P w y) (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')))
(cglue b'))^ @
ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b'))
(coeq (f' b')) @ cgluel b (f' b'))) @
cgluer (g b) b' =
transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) (coeq (g' b')) @
cgluel b (g' b')
(** Now begins the long haul. *)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')
@' cgluel b (g' b') b: B b': B'
(apD
(transport
(funw : Coeq f g =>
forally : Coeq f' g', P w y) (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b'))) (cglue b'))^
@' ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b'))
(coeq (f' b'))
@' cgluel b (f' b'))
@' cgluer (g b) b' =
transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) (coeq (g' b'))
@' cgluel b (g' b')
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')
@' cgluel b (g' b') b: B b': B'
(apD
(transport
(funw : Coeq f g =>
forally : Coeq f' g', P w y) (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b'))) (cglue b'))^
@' (ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b'))
(coeq (f' b')))
@' ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b')))
@' cgluer (g b) b' =
transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) (coeq (g' b'))
@' cgluel b (g' b')
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')
@' cgluel b (g' b') b: B b': B'
(apD
(transport
(funw : Coeq f g =>
forally : Coeq f' g', P w y) (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b'))) (cglue b'))^
@' ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b'))
(coeq (f' b')))
@' ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_forall_constant (cglue b)
(Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb' : B' => cgluer (f b) b')) (coeq (g' b'))
@' cgluel b (g' b')
(** Our first order of business is to get rid of the [Coeq_ind]s, which only occur in the following incarnation. *)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')
@' cgluel b (g' b') b: B b': B' G:= Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb'0 : B' => cgluer (f b) b'0): forallw : Coeq f' g', P (coeq (f b)) w
(apD
(transport
(funw : Coeq f g =>
forally : Coeq f' g', P w y) (cglue b) G)
(cglue b'))^
@' ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b) G
(coeq (f' b')))
@' ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_forall_constant (cglue b) G (coeq (g' b'))
@' cgluel b (g' b')
(** Let's reduce the [apD (loop # G)] first. *)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')
@' cgluel b (g' b') b: B b': B' G:= Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb'0 : B' => cgluer (f b) b'0): forallw : Coeq f' g', P (coeq (f b)) w
(ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b) G
(coeq (f' b')))
@' transport_transport P (cglue b) (cglue b')
(coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g => P x (coeq (g' b')))
(cglue b)) (apD G (cglue b'))
@' (transport_forall_constant (cglue b) G
(coeq (g' b')))^)^
@' ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b) G
(coeq (f' b')))
@' ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_forall_constant (cglue b) G (coeq (g' b'))
@' cgluel b (g' b')
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')
@' cgluel b (g' b') b: B b': B' G:= Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb'0 : B' => cgluer (f b) b'0): forallw : Coeq f' g', P (coeq (f b)) w
transport_forall_constant (cglue b) G (coeq (g' b'))
@' ((ap
(transport
(funx : Coeq f g => P x (coeq (g' b')))
(cglue b)) (apD G (cglue b')))^
@' ((transport_transport P (cglue b) (cglue b')
(coeq' (f b) (f' b')))^
@' (ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b) G
(coeq (f' b'))))^))
@' ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b) G
(coeq (f' b')))
@' ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_forall_constant (cglue b) G (coeq (g' b'))
@' cgluel b (g' b')
(** Now we can cancel a [transport_forall_constant]. *)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')
@' cgluel b (g' b') b: B b': B' G:= Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb'0 : B' => cgluer (f b) b'0): forallw : Coeq f' g', P (coeq (f b)) w
(ap
(transport (funx : Coeq f g => P x (coeq (g' b')))
(cglue b)) (apD G (cglue b')))^
@' ((transport_transport P (cglue b) (cglue b')
(coeq' (f b) (f' b')))^
@' ((ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b) G
(coeq (f' b'))))^
@' (ap (transport (P (coeq (g b))) (cglue b'))
(transport_forall_constant (cglue b) G
(coeq (f' b')))
@' (ap
(transport (P (coeq (g b)))
(cglue b')) (cgluel b (f' b'))
@' cgluer (g b) b')))) =
cgluel b (g' b')
(** And a path-inverse pair. This removes all the [transport_forall_constant]s. *)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')
@' cgluel b (g' b') b: B b': B' G:= Coeq_ind (P (coeq (f b)))
(funa' : A' => coeq' (f b) a')
(funb'0 : B' => cgluer (f b) b'0): forallw : Coeq f' g', P (coeq (f b)) w
(ap
(transport (funx : Coeq f g => P x (coeq (g' b')))
(cglue b)) (apD G (cglue b')))^
@' (transport_transport P (cglue b) (cglue b')
(coeq' (f b) (f' b')))^
@' ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' = cgluel b (g' b')
(** Now we can beta-reduce the last remaining [G]. *)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')
@' cgluel b (g' b') b: B b': B'
(ap
(transport (funx : Coeq f g => P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b'))^
@' (transport_transport P (cglue b) (cglue b')
(coeq' (f b) (f' b')))^
@' ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' = cgluel b (g' b')
(** Now we just have to rearrange it a bit. *)
H: Funext B, A: Type f, g: B -> A B', A': Type f', g': B' -> A' P: Coeq f g -> Coeq f' g' -> Type coeq': forall (a : A) (a' : A'), P (coeq a) (coeq a') cgluel: forall (b : B) (a' : A'),
transport (funx : Coeq f g => P x (coeq a'))
(cglue b) (coeq' (f b) a') =
coeq' (g b) a' cgluer: forall (a : A) (b' : B'),
transport
(funy : Coeq f' g' => P (coeq a) y)
(cglue b') (coeq' a (f' b')) =
coeq' a (g' b') cgluelr: forall (b : B) (b' : B'),
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_transport P (cglue b)
(cglue b') (coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g =>
P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')
@' cgluel b (g' b') b: B b': B'
ap (transport (P (coeq (g b))) (cglue b'))
(cgluel b (f' b'))
@' cgluer (g b) b' =
transport_transport P (cglue b) (cglue b')
(coeq' (f b) (f' b'))
@' ap
(transport
(funx : Coeq f g => P x (coeq (g' b')))
(cglue b)) (cgluer (f b) b')
@' cgluel b (g' b')
apply cgluelr.Close Scope long_path_scope.Qed.EndCoeqInd2.(** ** Symmetry *)DefinitionCoeq_sym_map {BA} (fg : B -> A) : Coeq f g -> Coeq g f :=
Coeq_rec (Coeq g f) coeq (funb : B => (cglue b)^).
B, A: Type f, g: B -> A
Coeq_sym_map f g o Coeq_sym_map g f == idmap
B, A: Type f, g: B -> A
Coeq_sym_map f g o Coeq_sym_map g f == idmap
B, A: Type f, g: B -> A
foralla : A,
(funw : Coeq g f =>
(Coeq_sym_map f g o Coeq_sym_map g f) w = idmap w)
(coeq a)
B, A: Type f, g: B -> A
forallb : B,
transport
(funw : Coeq g f =>
(Coeq_sym_map f g o Coeq_sym_map g f) w = idmap w)
(cglue b) (?coeq' (g b)) = ?coeq' (f b)
B, A: Type f, g: B -> A
foralla : A,
(funw : Coeq g f =>
(Coeq_sym_map f g o Coeq_sym_map g f) w = idmap w)
(coeq a)
reflexivity.
B, A: Type f, g: B -> A
forallb : B,
transport
(funw : Coeq g f =>
(Coeq_sym_map f g o Coeq_sym_map g f) w = idmap w)
(cglue b) ((funa : A => 1) (g b)) =
(funa : A => 1) (f b)
B, A: Type f, g: B -> A b: B
transport
(funw : Coeq g f =>
(Coeq_sym_map f g o Coeq_sym_map g f) w = idmap w)
(cglue b) ((funa : A => 1) (g b)) =
(funa : A => 1) (f b)
B, A: Type f, g: B -> A b: B
transport
(funw : Coeq g f =>
Coeq_sym_map f g (Coeq_sym_map g f w) = w)
(cglue b) 1 = 1
exact (equiv_adjointify (Coeq_sym_map f g) (Coeq_sym_map g f) sect_Coeq_sym_map sect_Coeq_sym_map).Defined.(** ** Descent *)(** We study "equifibrant" type families over a parallel pair [f, g: B -> A]. By univalence, the descent property tells us that these type families correspond to type families over the coequalizer, and we obtain an induction principle for such type families. Dependent descent data over some particular descent data are "equifibrant" type families over this descent data. The "equifibrancy" is only taken over the parallel pair [f g : B -> A], but there is an extra level of dependency coming from the descent data. In this case, we obtain an induction and recursion principle, but only with a computation rule for the recursion principle.The theory of descent is interesting to consider in itself. However, we will use it as a means to structure the code, and to obtain induction and recursion principles that are valuable in proving the flattening lemma, and characterizing path spaces. Thus we will gloss over the bigger picture, and not consider equivalences of descent data, nor homotopies of their sections. We will also not elaborate on uniqueness of the induced families.It's possible to prove the results in the Descent, Flattening and Paths Sections without univalence, by replacing all equivalences with paths, but in practice these results will be used with equivalences as input, making the form below more convenient. See https://github.com/HoTT/Coq-HoTT/pull/2147#issuecomment-2521570830 for further information *)SectionDescent.Context `{Univalence}.(** Descent data over [f g : B -> A] is an "equifibrant" or "cartesian" type family [cd_fam : A -> Type]. This means that if [b : B], then the fibers [cd_fam (f b)] and [cd_fam (g b)] are equivalent, witnessed by [cd_e]. *)RecordcDescent {AB : Type} {fg : B -> A} := {
cd_fam (a : A) : Type;
cd_e (b : B) : cd_fam (f b) <~> cd_fam (g b)
}.GlobalArguments cDescent {A B} f g.(** Let [A] and [B] be types, with a parallel pair [f g : B -> A]. *)Context {AB : Type} {fg : B -> A}.(** Descent data induces a type family over [Coeq f g]. *)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
Coeq f g -> Type
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
Coeq f g -> Type
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forallb : B, cd_fam Pe (f b) = cd_fam Pe (g b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B
cd_fam Pe (f b) = cd_fam Pe (g b)
exact (path_universe_uncurried (cd_e Pe b)).Defined.(** A type family over [Coeq f g] induces descent data. *)
H: Univalence A, B: Type f, g: B -> A P: Coeq f g -> Type
cDescent f g
H: Univalence A, B: Type f, g: B -> A P: Coeq f g -> Type
cDescent f g
H: Univalence A, B: Type f, g: B -> A P: Coeq f g -> Type
A -> Type
H: Univalence A, B: Type f, g: B -> A P: Coeq f g -> Type
forallb : B, ?cd_fam (f b) <~> ?cd_fam (g b)
H: Univalence A, B: Type f, g: B -> A P: Coeq f g -> Type
A -> Type
exact (P o coeq).
H: Univalence A, B: Type f, g: B -> A P: Coeq f g -> Type
forallb : B, (P o coeq) (f b) <~> (P o coeq) (g b)
H: Univalence A, B: Type f, g: B -> A P: Coeq f g -> Type b: B
(P o coeq) (f b) <~> (P o coeq) (g b)
exact (equiv_transport P (cglue b)).Defined.(** Transporting over [fam_cdescent] along [cglue b] is given by [cd_e]. *)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
transport (fam_cdescent Pe) (cglue b) pf =
cd_e Pe b pf
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
transport (fam_cdescent Pe) (cglue b) pf =
cd_e Pe b pf
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
ap (fam_cdescent Pe) (cglue b) =
path_universe (cd_e Pe b)
napply Coeq_rec_beta_cglue.Defined.(** A section on the descent data is a fiberwise section that respects the equivalences. *)RecordcDescentSection {Pe : cDescent f g} := {
cds_sect (a : A) : cd_fam Pe a;
cds_e (b : B) : cd_e Pe b (cds_sect (f b)) = cds_sect (g b)
}.GlobalArguments cDescentSection Pe : clear implicits.(** A descent section induces a genuine section of [fam_cdescent Pe]. *)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g s: cDescentSection Pe
forallx : Coeq f g, fam_cdescent Pe x
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g s: cDescentSection Pe
forallx : Coeq f g, fam_cdescent Pe x
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g s: cDescentSection Pe
forallb : B,
transport (fam_cdescent Pe) (cglue b)
(cds_sect s (f b)) = cds_sect s (g b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g s: cDescentSection Pe b: B
transport (fam_cdescent Pe) (cglue b)
(cds_sect s (f b)) = cds_sect s (g b)
exact (transport_fam_cdescent_cglue Pe b _ @ cds_e s b).Defined.(** We record its computation rule *)Definitioncdescent_ind_beta_cglue {Pe : cDescent f g}
(s : cDescentSection Pe) (b : B)
: apD (cdescent_ind s) (cglue b) = transport_fam_cdescent_cglue Pe b _ @ cds_e s b
:= Coeq_ind_beta_cglue _ (cds_sect s) _ _.(** Dependent descent data over descent data [Pe : cDescent f g] consists of a type family [cdd_fam : forall a : A, cd_fam Pe a -> Type] together with coherences [cdd_e b pf]. *)RecordcDepDescent {Pe : cDescent f g} := {
cdd_fam (a : A) (pa : cd_fam Pe a) : Type;
cdd_e (b : B) (pf : cd_fam Pe (f b))
: cdd_fam (f b) pf <~> cdd_fam (g b) (cd_e Pe b pf)
}.GlobalArguments cDepDescent Pe : clear implicits.(** A dependent type family over [fam_cdescent Pe] induces dependent descent data over [Pe]. *)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type
cDepDescent Pe
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type
cDepDescent Pe
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type
foralla : A, cd_fam Pe a -> Type
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type
forall (b : B) (pf : cd_fam Pe (f b)),
?cdd_fam (f b) pf <~> ?cdd_fam (g b) (cd_e Pe b pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type
foralla : A, cd_fam Pe a -> Type
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type a: A
cd_fam Pe a -> Type
exact (Q (coeq a)).
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type
forall (b : B) (pf : cd_fam Pe (f b)),
(funa : A => Q (coeq a) : cd_fam Pe a -> Type) (f b)
pf <~>
(funa : A => Q (coeq a) : cd_fam Pe a -> Type) (g b)
(cd_e Pe b pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type b: B pf: cd_fam Pe (f b)
(funa : A => Q (coeq a) : cd_fam Pe a -> Type) (f b)
pf <~>
(funa : A => Q (coeq a) : cd_fam Pe a -> Type) (g b)
(cd_e Pe b pf)
exact (equiv_transportDD (fam_cdescent Pe) Q
(cglue b) (transport_fam_cdescent_cglue Pe b pf)).Defined.(** Dependent descent data over [Pe] induces a dependent type family over [fam_cdescent Pe]. *)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe
forallx : Coeq f g, fam_cdescent Pe x -> Type
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe
forallx : Coeq f g, fam_cdescent Pe x -> Type
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe
foralla : A,
(funw : Coeq f g => fam_cdescent Pe w -> Type)
(coeq a)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe
forallb : B,
transport
(funw : Coeq f g => fam_cdescent Pe w -> Type)
(cglue b) (?coeq' (f b)) = ?coeq' (g b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe
foralla : A,
(funw : Coeq f g => fam_cdescent Pe w -> Type)
(coeq a)
exact (cdd_fam Qe).
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe
forallb : B,
transport
(funw : Coeq f g => fam_cdescent Pe w -> Type)
(cglue b) (cdd_fam Qe (f b)) = cdd_fam Qe (g b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe b: B
transport
(funw : Coeq f g => fam_cdescent Pe w -> Type)
(cglue b) (cdd_fam Qe (f b)) = cdd_fam Qe (g b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe b: B
cdd_fam Qe (f b) =
transport
(funw : Coeq f g => fam_cdescent Pe w -> Type)
(cglue b)^ (cdd_fam Qe (g b))
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe b: B pa: fam_cdescent Pe (coeq (f b))
cdd_fam Qe (f b) pa =
transport
(funw : Coeq f g => fam_cdescent Pe w -> Type)
(cglue b)^ (cdd_fam Qe (g b)) pa
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe b: B pa: fam_cdescent Pe (coeq (f b))
cdd_fam Qe (f b) pa =
cdd_fam Qe (g b)
(transport (fam_cdescent Pe) ((cglue b)^)^ pa)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe b: B pa: fam_cdescent Pe (coeq (f b))
cdd_fam Qe (f b) pa = cdd_fam Qe (g b) ?Goal
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe b: B pa: fam_cdescent Pe (coeq (f b))
transport (fam_cdescent Pe) ((cglue b)^)^ pa = ?Goal
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe b: B pa: fam_cdescent Pe (coeq (f b))
cdd_fam Qe (f b) pa = cdd_fam Qe (g b) ?Goal
exact (path_universe (cdd_e _ _ _)).
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe b: B pa: fam_cdescent Pe (coeq (f b))
transport (fam_cdescent Pe) ((cglue b)^)^ pa =
cd_e Pe b pa
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Qe: cDepDescent Pe b: B pa: fam_cdescent Pe (coeq (f b))
transport (fam_cdescent Pe) (cglue b) pa =
cd_e Pe b pa
exact (transport_fam_cdescent_cglue _ _ _).Defined.(** A section of dependent descent data [Qe : cDepDescent Pe] is a fiberwise section [cdds_sect], together with coherences [cdds_e]. *)RecordcDepDescentSection {Pe : cDescent f g} {Qe : cDepDescent Pe} := {
cdds_sect (a : A) (pa : cd_fam Pe a) : cdd_fam Qe a pa;
cdds_e (b : B) (pf : cd_fam Pe (f b))
: cdd_e Qe b pf (cdds_sect (f b) pf) = cdds_sect (g b) (cd_e Pe b pf)
}.GlobalArguments cDepDescentSection {Pe} Qe.(** A dependent descent section induces a genuine section over the total space of [fam_cdescent Pe]. *)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type s: cDepDescentSection (cdepdescent_fam Q)
forall (x : Coeq f g) (px : fam_cdescent Pe x), Q x px
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type s: cDepDescentSection (cdepdescent_fam Q)
forall (x : Coeq f g) (px : fam_cdescent Pe x), Q x px
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type s: cDepDescentSection (cdepdescent_fam Q)
forallb : B,
transport
(funw : Coeq f g =>
forallpx : fam_cdescent Pe w, Q w px) (cglue b)
(cdds_sect s (f b)) = cdds_sect s (g b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type s: cDepDescentSection (cdepdescent_fam Q) b: B
transport
(funw : Coeq f g =>
forallpx : fam_cdescent Pe w, Q w px) (cglue b)
(cdds_sect s (f b)) = cdds_sect s (g b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type s: cDepDescentSection (cdepdescent_fam Q) b: B
forally1 : fam_cdescent Pe (coeq (f b)),
transportD (fam_cdescent Pe) Q (cglue b) y1
(cdds_sect s (f b) y1) =
cdds_sect s (g b)
(transport (fam_cdescent Pe) (cglue b) y1)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type s: cDepDescentSection (cdepdescent_fam Q) b: B pf: fam_cdescent Pe (coeq (f b))
transportD (fam_cdescent Pe) Q (cglue b) pf
(cdds_sect s (f b) pf) =
cdds_sect s (g b)
(transport (fam_cdescent Pe) (cglue b) pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type s: cDepDescentSection (cdepdescent_fam Q) b: B pf: fam_cdescent Pe (coeq (f b))
transport (Q (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf)
(transportD (fam_cdescent Pe) Q (cglue b) pf
(cdds_sect s (f b) pf)) =
transport (Q (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf)
(cdds_sect s (g b)
(transport (fam_cdescent Pe) (cglue b) pf))
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: forallx : Coeq f g, fam_cdescent Pe x -> Type s: cDepDescentSection (cdepdescent_fam Q) b: B pf: fam_cdescent Pe (coeq (f b))
transport (Q (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf)
(transportD (fam_cdescent Pe) Q (cglue b) pf
(cdds_sect s (f b) pf)) =
cdds_sect s (g b) (cd_e Pe b pf)
exact (cdds_e s b pf).Defined.(** The data for a section into a constant type family. *)RecordcDepDescentConstSection {Pe : cDescent f g} {Q : Type} := {
cddcs_sect (a : A) (pa : cd_fam Pe a) : Q;
cddcs_e (b : B) (pf : cd_fam Pe (f b))
: cddcs_sect (f b) pf = cddcs_sect (g b) (cd_e Pe b pf)
}.GlobalArguments cDepDescentConstSection Pe Q : clear implicits.(** The data for a section of a constant family induces a section over the total space of [fam_cdescent Pe]. *)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q
forallx : Coeq f g, fam_cdescent Pe x -> Q
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q
forallx : Coeq f g, fam_cdescent Pe x -> Q
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q
forallb : B,
transport (funw : Coeq f g => fam_cdescent Pe w -> Q)
(cglue b) (cddcs_sect s (f b)) = cddcs_sect s (g b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B
transport (funw : Coeq f g => fam_cdescent Pe w -> Q)
(cglue b) (cddcs_sect s (f b)) = cddcs_sect s (g b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B
forally1 : fam_cdescent Pe (coeq (f b)),
transport (fun_ : Coeq f g => Q) (cglue b)
(cddcs_sect s (f b) y1) =
cddcs_sect s (g b)
(transport (fam_cdescent Pe) (cglue b) y1)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: fam_cdescent Pe (coeq (f b))
transport (fun_ : Coeq f g => Q) (cglue b)
(cddcs_sect s (f b) pf) =
cddcs_sect s (g b)
(transport (fam_cdescent Pe) (cglue b) pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: fam_cdescent Pe (coeq (f b))
cddcs_sect s (f b) pf =
cddcs_sect s (g b)
(transport (fam_cdescent Pe) (cglue b) pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: fam_cdescent Pe (coeq (f b))
cddcs_sect s (f b) pf =
cddcs_sect s (g b) (cd_e Pe b pf)
exact (cddcs_e s b pf).Defined.(** Here is the computation rule on paths. *)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b) pg: cd_fam Pe (g b) pb: cd_e Pe b pf = pg
ap (sig_rec (cdepdescent_rec s))
(path_sigma (fam_cdescent Pe) (coeq (f b); pf)
(coeq (g b); pg) (cglue b)
(transport_fam_cdescent_cglue Pe b pf @ pb)) =
cddcs_e s b pf @ ap (cddcs_sect s (g b)) pb
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b) pg: cd_fam Pe (g b) pb: cd_e Pe b pf = pg
ap (sig_rec (cdepdescent_rec s))
(path_sigma (fam_cdescent Pe) (coeq (f b); pf)
(coeq (g b); pg) (cglue b)
(transport_fam_cdescent_cglue Pe b pf @ pb)) =
cddcs_e s b pf @ ap (cddcs_sect s (g b)) pb
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b) pg: cd_fam Pe (g b) pb: cd_e Pe b pf = pg
ap (sig_rec (cdepdescent_rec s))
(path_sigma (fam_cdescent Pe) (coeq (f b); pf)
(coeq (g b); pg) (cglue b)
(transport_fam_cdescent_cglue Pe b pf
@' pb)) =
cddcs_e s b pf
@' ap (cddcs_sect s (g b)) pb
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
ap (sig_rec (cdepdescent_rec s))
(path_sigma (fam_cdescent Pe) (coeq (f b); pf)
(coeq (g b); cd_e Pe b pf) (cglue b)
(transport_fam_cdescent_cglue Pe b pf
@' 1)) =
cddcs_e s b pf
@' ap (cddcs_sect s (g b)) 1
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
ap (sig_rec (cdepdescent_rec s))
(path_sigma (fam_cdescent Pe) (coeq (f b); pf)
(coeq (g b); cd_e Pe b pf) (cglue b)
(transport_fam_cdescent_cglue Pe b pf
@' 1)) = cddcs_e s b pf
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(transport_const (cglue b)
(cdepdescent_rec s (coeq (f b)) pf))^
@' (ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf))^
@' (transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf))^
@' ap10 (apD (cdepdescent_rec s) (cglue b))
(transport (fam_cdescent Pe) (cglue b) pf)
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1) = cddcs_e s b pf
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
apD (cdepdescent_rec s) (cglue b) = ?Goal
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(transport_const (cglue b)
(cdepdescent_rec s (coeq (f b)) pf))^
@' (ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf))^
@' (transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf))^
@' ap10 ?Goal
(transport (fam_cdescent Pe) (cglue b) pf)
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1) = cddcs_e s b pf
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(transport_const (cglue b)
(cdepdescent_rec s (coeq (f b)) pf))^
@' (ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf))^
@' (transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf))^
@' ap10
(dpath_arrow (fam_cdescent Pe)
(fun_ : Coeq f g => Q) (cglue b)
(cddcs_sect s (f b)) (cddcs_sect s (g b))
(funpf : fam_cdescent Pe (coeq (f b)) =>
transport_const (cglue b)
(cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue Pe b
pf))^)))
(transport (fam_cdescent Pe) (cglue b) pf)
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1) = cddcs_e s b pf
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(transport_const (cglue b)
(cdepdescent_rec s (coeq (f b)) pf))^
@' ((ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf))^
@' ((transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf))^
@' (ap10
(dpath_arrow (fam_cdescent Pe)
(fun_ : Coeq f g => Q) (cglue b)
(cddcs_sect s (f b))
(cddcs_sect s (g b))
(funpf : fam_cdescent Pe (coeq (f b))
=>
transport_const (cglue b)
(cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue
Pe b pf))^)))
(transport (fam_cdescent Pe) (cglue b)
pf)
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1)))) = cddcs_e s b pf
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf))^
@' ((transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf))^
@' (ap10
(dpath_arrow (fam_cdescent Pe)
(fun_ : Coeq f g => Q) (cglue b)
(cddcs_sect s (f b)) (cddcs_sect s (g b))
(funpf : fam_cdescent Pe (coeq (f b)) =>
transport_const (cglue b)
(cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue
Pe b pf))^)))
(transport (fam_cdescent Pe) (cglue b) pf)
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1))) =
transport_const (cglue b)
(cdepdescent_rec s (coeq (f b)) pf)
@' cddcs_e s b pf
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
ap10
(dpath_arrow (fam_cdescent Pe)
(fun_ : Coeq f g => Q) (cglue b)
(cddcs_sect s (f b)) (cddcs_sect s (g b))
(funpf : fam_cdescent Pe (coeq (f b)) =>
transport_const (cglue b)
(cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue Pe b pf))^)))
(transport (fam_cdescent Pe) (cglue b) pf) = ?Goal
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf))^
@' ((transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf))^
@' (?Goal
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1))) =
transport_const (cglue b)
(cdepdescent_rec s (coeq (f b)) pf)
@' cddcs_e s b pf
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf))^
@' ((transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf))^
@' (transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf)
@' ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q)
(cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b)
pf)
@' (funpf : fam_cdescent Pe (coeq (f b)) =>
transport_const (cglue b)
(cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue Pe
b pf))^)) pf
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1))) =
transport_const (cglue b)
(cdepdescent_rec s (coeq (f b)) pf)
@' cddcs_e s b pf
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf))^
@' (transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf)
@' ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf)
@' (transport_const (cglue b)
(cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue Pe b
pf))^))
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1)) = ?Goal
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf))^
@' ?Goal =
transport_const (cglue b)
(cdepdescent_rec s (coeq (f b)) pf)
@' cddcs_e s b pf
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf))^
@' (transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf)
@' ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf)
@' (transport_const (cglue b)
(cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue Pe b
pf))^))
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1)) = ?Goal
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf))^
@' (transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf)
@' ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf)
@' (transport_const (cglue b)
(cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue Pe b
pf))^)
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1))) = ?Goal
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf))^
@' (transport_arrow (cglue b)
(cdepdescent_rec s (coeq (f b)))
(transport (fam_cdescent Pe) (cglue b) pf)
@' (ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf)
@' (transport_const (cglue b)
(cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue Pe
b pf))^)
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1)))) = ?Goal
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf)
@' (transport_const (cglue b) (cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue Pe b pf))^)
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1)) = ?Goal
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf)
@' (transport_const (cglue b) (cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue Pe b pf))^
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf
@' 1))) = ?Goal
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf)
@' (transport_const (cglue b) (cddcs_sect s (f b) pf)
@' (cddcs_e s b pf
@' (ap (cddcs_sect s (g b))
(transport_fam_cdescent_cglue Pe b pf))^
@' ap (cdepdescent_rec s (coeq (g b)))
(transport_fam_cdescent_cglue Pe b pf))) =
?Goal
exact (1 @@ (1 @@ concat_pV_p _ _)).
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g Q: Type s: cDepDescentConstSection Pe Q b: B pf: cd_fam Pe (f b)
(ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf))^
@' (ap
(funx : fam_cdescent Pe (coeq (f b)) =>
transport (fun_ : Coeq f g => Q) (cglue b)
(cdepdescent_rec s (coeq (f b)) x))
(transport_Vp (fam_cdescent Pe) (cglue b) pf)
@' (transport_const (cglue b)
(cddcs_sect s (f b) pf)
@' cddcs_e s b pf)) =
transport_const (cglue b)
(cdepdescent_rec s (coeq (f b)) pf)
@' cddcs_e s b pf
napply concat_V_pp.Close Scope long_path_scope.Defined.EndDescent.(** ** The flattening lemma *)(** We saw above that given descent data [Pe] over a parallel pair [f g : B -> A], we obtained a type family [fam_cdescent Pe] over the coequalizer. The flattening lemma describes the total space [sig (fam_cdescent Pe)] of this type family as a coequalizer of [sig (cd_fam Pe)] by a certain parallel pair. This follows from the work above, which shows that [sig (fam_cdescent Pe)] has the same universal property as this coequalizer.The flattening lemma here also follows from the flattening lemma for [GraphQuotients], avoiding the need for the material in Section Descent. However, that material is likely useful in general, so we have given an independent proof of the flattening lemma. See versions of the library before December 5, 2024 for the proof using the flattening lemma for [GraphQuotients]. *)SectionFlattening.Context `{Univalence} {A B : Type} {f g : B -> A} (Pe : cDescent f g).(** We mimic the constructors of [Coeq] for the total space. Here is the point constructor, in curried form. *)Definitionflatten_cd {a : A} (pa : cd_fam Pe a) : sig (fam_cdescent Pe)
:= (coeq a; pa).(** And here is the path constructor. *)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b) pg: cd_fam Pe (g b) pb: cd_e Pe b pf = pg
flatten_cd pf = flatten_cd pg
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b) pg: cd_fam Pe (g b) pb: cd_e Pe b pf = pg
flatten_cd pf = flatten_cd pg
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b) pg: cd_fam Pe (g b) pb: cd_e Pe b pf = pg
(flatten_cd pf).1 = (flatten_cd pg).1
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b) pg: cd_fam Pe (g b) pb: cd_e Pe b pf = pg
transport (fam_cdescent Pe) ?p (flatten_cd pf).2 =
(flatten_cd pg).2
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b) pg: cd_fam Pe (g b) pb: cd_e Pe b pf = pg
(flatten_cd pf).1 = (flatten_cd pg).1
byapply cglue.
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b) pg: cd_fam Pe (g b) pb: cd_e Pe b pf = pg
transport (fam_cdescent Pe) (cglue b)
(flatten_cd pf).2 = (flatten_cd pg).2
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b) pg: cd_fam Pe (g b) pb: cd_e Pe b pf = pg
cd_e Pe b (flatten_cd pf).2 = (flatten_cd pg).2
exact pb.Defined.(** Now that we've shown that [fam_cdescent Pe] acts like a [Coeq] of [sig (cd_fam Pe)] by an appropriate parallel pair, we can use this to prove the flattening lemma. The maps back and forth are very easy so this could almost be a formal consequence of the induction principle. *)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
{x : _ & fam_cdescent Pe x} <~>
Coeq (functor_sigma f (funa : B => idmap))
(functor_sigma g (funb : B => cd_e Pe b))
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
{x : _ & fam_cdescent Pe x} <~>
Coeq (functor_sigma f (funa : B => idmap))
(functor_sigma g (funb : B => cd_e Pe b))
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
{x : _ & fam_cdescent Pe x} ->
Coeq (functor_sigma f (funa : B => idmap))
(functor_sigma g (funb : B => cd_e Pe b))
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
Coeq (functor_sigma f (funa : B => idmap))
(functor_sigma g (funb : B => cd_e Pe b)) ->
{x : _ & fam_cdescent Pe x}
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
?f o ?g == idmap
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
?g o ?f == idmap
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
{x : _ & fam_cdescent Pe x} ->
Coeq (functor_sigma f (funa : B => idmap))
(functor_sigma g (funb : B => cd_e Pe b))
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forallproj1 : Coeq f g,
fam_cdescent Pe proj1 ->
Coeq (functor_sigma f (funa : B => idmap))
(functor_sigma g (funb : B => cd_e Pe b))
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
cDepDescentConstSection Pe
(Coeq (functor_sigma f (funa : B => idmap))
(functor_sigma g (funb : B => cd_e Pe b)))
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
foralla : A,
cd_fam Pe a ->
Coeq (functor_sigma f (funa0 : B => idmap))
(functor_sigma g (funb : B => cd_e Pe b))
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forall (b : B) (pf : cd_fam Pe (f b)),
?cddcs_sect (f b) pf =
?cddcs_sect (g b) (cd_e Pe b pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
foralla : A,
cd_fam Pe a ->
Coeq (functor_sigma f (funa0 : B => idmap))
(functor_sigma g (funb : B => cd_e Pe b))
exact (funax => coeq (a; x)).
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forall (b : B) (pf : cd_fam Pe (f b)),
(fun (a : A) (x : cd_fam Pe a) => coeq (a; x)) (f b)
pf =
(fun (a : A) (x : cd_fam Pe a) => coeq (a; x)) (g b)
(cd_e Pe b pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
(fun (a : A) (x : cd_fam Pe a) => coeq (a; x)) (f b)
pf =
(fun (a : A) (x : cd_fam Pe a) => coeq (a; x)) (g b)
(cd_e Pe b pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
coeq (f b; pf) = coeq (g b; cd_e Pe b pf)
exact (@cglue _ _
(functor_sigma f (fun_ => idmap)) (functor_sigma g (cd_e Pe)) (b; pf)).
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
Coeq (functor_sigma f (funa : B => idmap))
(functor_sigma g (funb : B => cd_e Pe b)) ->
{x : _ & fam_cdescent Pe x}
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
{x : _ & cd_fam Pe x} -> {x : _ & fam_cdescent Pe x}
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forallb : {H : B & cd_fam Pe (f H)},
?coeq' (functor_sigma f (funa : B => idmap) b) =
?coeq' (functor_sigma g (funb0 : B => cd_e Pe b0) b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
{x : _ & cd_fam Pe x} -> {x : _ & fam_cdescent Pe x}
exact (fun '(a; x) => (coeq a; x)).
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forallb : {H : B & cd_fam Pe (f H)},
(funpat : {x : _ & cd_fam Pe x} =>
letx := pat inleta := x.1inletx0 := x.2in (coeq a; x0))
(functor_sigma f (funa : B => idmap) b) =
(funpat : {x : _ & cd_fam Pe x} =>
letx := pat inleta := x.1inletx0 := x.2in (coeq a; x0))
(functor_sigma g (funb0 : B => cd_e Pe b0) b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
(coeq (f b); pf) = (coeq (g b); cd_e Pe b pf)
exact (flatten_cd_glue b 1).
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) => coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
:
(fun (a : A) (x : cd_fam Pe a) => coeq (a; x))
(f b) pf =
(fun (a : A) (x : cd_fam Pe a) => coeq (a; x))
(g b) (cd_e Pe b pf)
|})
o Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
letx := pat inleta := x.1inletx0 := x.2in (coeq a; x0))
(funb0 : {H : B & cd_fam Pe (f H)} =>
(fun (b : B) (pf : cd_fam Pe (f b)) =>
flatten_cd_glue b 1
:
(letx :=
functor_sigma f (funa : B => idmap) (b; pf)
inleta := x.1inletx0 := x.2in (coeq a; x0)) =
(letx :=
functor_sigma g (funb1 : B => cd_e Pe b1)
(b; pf) inleta := x.1inletx0 := x.2in (coeq a; x0)))
b0.1 b0.2) == idmap
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
foralla : {x : _ & cd_fam Pe x},
sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a0 : A) (x : cd_fam Pe a0) =>
coeq (a0; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|})
(Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
letx := pat inleta0 := x.1inletx0 := x.2in (coeq a0; x0))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11) (coeq a)) = coeq a
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forallb : {H : B & cd_fam Pe (f H)},
transport
(funw : Coeq (functor_sigma f (funa : B => idmap))
(functor_sigma g (funb0 : B => cd_e Pe b0))
=>
sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x);
cddcs_e :=
fun (b0 : B) (pf : cd_fam Pe (f b0)) =>
cglue (b0; pf)
|})
(Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
letx := pat inleta := x.1inletx0 := x.2in (coeq a; x0))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11) w) = w) (cglue b)
(?Goal (functor_sigma f (funa : B => idmap) b)) =
?Goal (functor_sigma g (funb0 : B => cd_e Pe b0) b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forallb : {H : B & cd_fam Pe (f H)},
transport
(funw : Coeq (functor_sigma f (funa : B => idmap))
(functor_sigma g (funb0 : B => cd_e Pe b0))
=>
sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x);
cddcs_e :=
fun (b0 : B) (pf : cd_fam Pe (f b0)) =>
cglue (b0; pf)
|})
(Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
letx := pat inleta := x.1inletx0 := x.2in (coeq a; x0))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11) w) = w) (cglue b)
((funa : {x : _ & cd_fam Pe x} => 1)
(functor_sigma f (funa : B => idmap) b)) =
(funa : {x : _ & cd_fam Pe x} => 1)
(functor_sigma g (funb0 : B => cd_e Pe b0) b)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
transport
(funw : Coeq (functor_sigma f (funa : B => idmap))
(functor_sigma g (funb : B => cd_e Pe b))
=>
sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|})
(Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
(coeq pat.1; pat.2))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11) w) = w)
(cglue (b; pf)) 1 = 1
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
ap
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|}))
(ap
(Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
(coeq pat.1; pat.2))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11)) (cglue (b; pf))) =
cglue (b; pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
ap
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|})) (flatten_cd_glue b 1) = cglue (b; pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
cddcs_e
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) => coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|} (b; pf).1 (b; pf).2 @
ap
(cddcs_sect
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) => coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|} (g (b; pf).1)) 1 = cglue (b; pf)
napply concat_p1.
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
letx := pat inleta := x.1inletx0 := x.2in (coeq a; x0))
(funb0 : {H : B & cd_fam Pe (f H)} =>
(fun (b : B) (pf : cd_fam Pe (f b)) =>
flatten_cd_glue b 1
:
(letx :=
functor_sigma f (funa : B => idmap) (b; pf) inleta := x.1inletx0 := x.2in (coeq a; x0)) =
(letx :=
functor_sigma g (funb1 : B => cd_e Pe b1)
(b; pf) inleta := x.1inletx0 := x.2in (coeq a; x0)))
b0.1 b0.2)
o sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
:
(fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x)) (f b) pf =
(fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x)) (g b) (cd_e Pe b pf)
|}) == idmap
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forall (x : Coeq f g) (px : fam_cdescent Pe x),
Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
letx0 := pat inleta := x0.1inletx1 := x0.2in (coeq a; x1))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11)
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x0 : cd_fam Pe a) =>
coeq (a; x0);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|}) (x; px)) = (x; px)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
cDepDescentSection
(cdepdescent_fam
(fun (x : Coeq f g) (px : fam_cdescent Pe x) =>
Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
letx0 := pat inleta := x0.1inletx1 := x0.2in (coeq a; x1))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11)
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x0 : cd_fam Pe a) =>
coeq (a; x0);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b))
=> cglue (b; pf)
|}) (x; px)) = (x; px)))
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forall (a : A) (pa : cd_fam Pe a),
cdd_fam
(cdepdescent_fam
(fun (x : Coeq f g) (px : fam_cdescent Pe x) =>
Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
letx0 := pat inleta0 := x0.1inletx1 := x0.2in (coeq a0; x1))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11)
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a0 : A) (x0 : cd_fam Pe a0) =>
coeq (a0; x0);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b))
=> cglue (b; pf)
|}) (x; px)) = (x; px))) a pa
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forall (b : B) (pf : cd_fam Pe (f b)),
cdd_e
(cdepdescent_fam
(fun (x : Coeq f g) (px : fam_cdescent Pe x) =>
Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
letx0 := pat inleta := x0.1inletx1 := x0.2in (coeq a; x1))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11)
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x0 : cd_fam Pe a) =>
coeq (a; x0);
cddcs_e :=
fun (b0 : B)
(pf0 : cd_fam Pe (f b0)) =>
cglue (b0; pf0)
|}) (x; px)) = (x; px))) b pf
(?cdds_sect (f b) pf) =
?cdds_sect (g b) (cd_e Pe b pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forall (a : A) (pa : cd_fam Pe a),
cdd_fam
(cdepdescent_fam
(fun (x : Coeq f g) (px : fam_cdescent Pe x) =>
Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
letx0 := pat inleta0 := x0.1inletx1 := x0.2in (coeq a0; x1))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11)
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a0 : A) (x0 : cd_fam Pe a0) =>
coeq (a0; x0);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b))
=> cglue (b; pf)
|}) (x; px)) = (x; px))) a pa
byintros a pa.
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g
forall (b : B) (pf : cd_fam Pe (f b)),
cdd_e
(cdepdescent_fam
(fun (x : Coeq f g) (px : fam_cdescent Pe x) =>
Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
letx0 := pat inleta := x0.1inletx1 := x0.2in (coeq a; x1))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11)
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x0 : cd_fam Pe a) =>
coeq (a; x0);
cddcs_e :=
fun (b0 : B)
(pf0 : cd_fam Pe (f b0)) =>
cglue (b0; pf0)
|}) (x; px)) = (x; px))) b pf
((fun (a : A) (pa : cd_fam Pe a) => 1) (f b) pf) =
(fun (a : A) (pa : cd_fam Pe a) => 1) (g b)
(cd_e Pe b pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
transportDD (fam_cdescent Pe)
(fun (x : Coeq f g) (px : fam_cdescent Pe x) =>
Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
(coeq pat.1; pat.2))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11)
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x0 : cd_fam Pe a) =>
coeq (a; x0);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|}) (x; px)) = (x; px)) (cglue b)
(transport_fam_cdescent_cglue Pe b pf) 1 = 1
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
transport
(funab : {x : _ & fam_cdescent Pe x} =>
Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
(coeq pat.1; pat.2))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11)
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|}) (ab.1; ab.2)) = (ab.1; ab.2))
(path_sigma' (fam_cdescent Pe) (cglue b)
(transport_fam_cdescent_cglue Pe b pf)) 1 = 1
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
ap
(Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
(coeq pat.1; pat.2))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11))
(ap
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|}))
(path_sigma' (fam_cdescent Pe) (cglue b)
(transport_fam_cdescent_cglue Pe b pf))) =
path_sigma' (fam_cdescent Pe) (cglue b)
(transport_fam_cdescent_cglue Pe b pf)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
ap
(Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
(coeq pat.1; pat.2))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11))
(ap
(sig_rec
(cdepdescent_rec
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|}))
(path_sigma' (fam_cdescent Pe) (cglue b)
(transport_fam_cdescent_cglue Pe b pf @ 1))) =
path_sigma' (fam_cdescent Pe) (cglue b)
(transport_fam_cdescent_cglue Pe b pf @ 1)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
ap
(Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
(coeq pat.1; pat.2))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11))
(cddcs_e
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) => coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|} b pf @
ap
(cddcs_sect
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) =>
coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|} (g b)) 1) =
path_sigma' (fam_cdescent Pe) (cglue b)
(transport_fam_cdescent_cglue Pe b pf @ 1)
H: Univalence A, B: Type f, g: B -> A Pe: cDescent f g b: B pf: cd_fam Pe (f b)
ap
(Coeq_rec {x : _ & fam_cdescent Pe x}
(funpat : {x : _ & cd_fam Pe x} =>
(coeq pat.1; pat.2))
(funb0 : {H : B & cd_fam Pe (f H)} =>
flatten_cd_glue b0.11))
(cddcs_e
{|
cddcs_sect :=
fun (a : A) (x : cd_fam Pe a) => coeq (a; x);
cddcs_e :=
fun (b : B) (pf : cd_fam Pe (f b)) =>
cglue (b; pf)
|} b pf) =
path_sigma' (fam_cdescent Pe) (cglue b)
(transport_fam_cdescent_cglue Pe b pf @ 1)
exact (Coeq_rec_beta_cglue _ _ _ (b; pf)).Defined.EndFlattening.(** ** Characterization of path spaces *)(** A pointed type family over a coequalizer has an identity system structure precisely when its associated descent data satisfies Kraus and von Raumer's induction principle, https://arxiv.org/pdf/1901.06022. *)SectionPaths.(** Let [f g : B -> A] be a parallel pair, with a distinguished point [a0 : A]. Let [Pe : cDescent f g] be descent data over [f g] with a distinguished point [p0 : cd_fam Pe a0]. Assume that any dependent descent data [Qe : cDepDescent Pe] with a distinguished point [q0 : cdd_fam Qe a0 p0] has a section that respects the distinguished points. This is the induction principle provided by Kraus and von Raumer. *)Context `{Univalence} {A B: Type} {f g : B -> A} (a0 : A)
(Pe : cDescent f g) (p0 : cd_fam Pe a0)
(based_cdepdescent_ind : forall (Qe : cDepDescent Pe) (q0 : cdd_fam Qe a0 p0),
cDepDescentSection Qe)
(based_cdepdescent_ind_beta : forall (Qe : cDepDescent Pe) (q0 : cdd_fam Qe a0 p0),
cdds_sect (based_cdepdescent_ind Qe q0) a0 p0 = q0).(** Under these hypotheses, we get an identity system structure on [fam_cdescent Pe]. *)
H: Univalence A, B: Type f, g: B -> A a0: A Pe: cDescent f g p0: cd_fam Pe a0 based_cdepdescent_ind: forallQe : cDepDescent Pe,
cdd_fam Qe a0 p0 ->
cDepDescentSection Qe based_cdepdescent_ind_beta: forall
(Qe : cDepDescent Pe)
(q0 : cdd_fam Qe a0 p0),
cdds_sect
(based_cdepdescent_ind
Qe q0) a0 p0 = q0
IsIdentitySystem (fam_cdescent Pe) p0
H: Univalence A, B: Type f, g: B -> A a0: A Pe: cDescent f g p0: cd_fam Pe a0 based_cdepdescent_ind: forallQe : cDepDescent Pe,
cdd_fam Qe a0 p0 ->
cDepDescentSection Qe based_cdepdescent_ind_beta: forall
(Qe : cDepDescent Pe)
(q0 : cdd_fam Qe a0 p0),
cdds_sect
(based_cdepdescent_ind
Qe q0) a0 p0 = q0
IsIdentitySystem (fam_cdescent Pe) p0
H: Univalence A, B: Type f, g: B -> A a0: A Pe: cDescent f g p0: cd_fam Pe a0 based_cdepdescent_ind: forallQe : cDepDescent Pe,
cdd_fam Qe a0 p0 ->
cDepDescentSection Qe based_cdepdescent_ind_beta: forall
(Qe : cDepDescent Pe)
(q0 : cdd_fam Qe a0 p0),
cdds_sect
(based_cdepdescent_ind
Qe q0) a0 p0 = q0
forallD : foralla : Coeq f g, fam_cdescent Pe a -> Type,
D (coeq a0) p0 ->
forall (a : Coeq f g) (r : fam_cdescent Pe a), D a r
H: Univalence A, B: Type f, g: B -> A a0: A Pe: cDescent f g p0: cd_fam Pe a0 based_cdepdescent_ind: forallQe : cDepDescent Pe,
cdd_fam Qe a0 p0 ->
cDepDescentSection Qe based_cdepdescent_ind_beta: forall
(Qe : cDepDescent Pe)
(q0 : cdd_fam Qe a0 p0),
cdds_sect
(based_cdepdescent_ind
Qe q0) a0 p0 = q0
forall
(D : foralla : Coeq f g, fam_cdescent Pe a -> Type)
(d : D (coeq a0) p0),
?idsys_ind D d (coeq a0) p0 = d
H: Univalence A, B: Type f, g: B -> A a0: A Pe: cDescent f g p0: cd_fam Pe a0 based_cdepdescent_ind: forallQe : cDepDescent Pe,
cdd_fam Qe a0 p0 ->
cDepDescentSection Qe based_cdepdescent_ind_beta: forall
(Qe : cDepDescent Pe)
(q0 : cdd_fam Qe a0 p0),
cdds_sect
(based_cdepdescent_ind
Qe q0) a0 p0 = q0
forallD : foralla : Coeq f g, fam_cdescent Pe a -> Type,
D (coeq a0) p0 ->
forall (a : Coeq f g) (r : fam_cdescent Pe a), D a r
H: Univalence A, B: Type f, g: B -> A a0: A Pe: cDescent f g p0: cd_fam Pe a0 based_cdepdescent_ind: forallQe : cDepDescent Pe,
cdd_fam Qe a0 p0 ->
cDepDescentSection Qe based_cdepdescent_ind_beta: forall
(Qe : cDepDescent Pe)
(q0 : cdd_fam Qe a0 p0),
cdds_sect
(based_cdepdescent_ind
Qe q0) a0 p0 = q0 Q: foralla : Coeq f g, fam_cdescent Pe a -> Type q0: Q (coeq a0) p0 x: Coeq f g p: fam_cdescent Pe x
Q x p
H: Univalence A, B: Type f, g: B -> A a0: A Pe: cDescent f g p0: cd_fam Pe a0 based_cdepdescent_ind: forallQe : cDepDescent Pe,
cdd_fam Qe a0 p0 ->
cDepDescentSection Qe based_cdepdescent_ind_beta: forall
(Qe : cDepDescent Pe)
(q0 : cdd_fam Qe a0 p0),
cdds_sect
(based_cdepdescent_ind
Qe q0) a0 p0 = q0 Q: foralla : Coeq f g, fam_cdescent Pe a -> Type q0: Q (coeq a0) p0 x: Coeq f g p: fam_cdescent Pe x
cDepDescentSection (cdepdescent_fam Q)
byapply based_cdepdescent_ind.
H: Univalence A, B: Type f, g: B -> A a0: A Pe: cDescent f g p0: cd_fam Pe a0 based_cdepdescent_ind: forallQe : cDepDescent Pe,
cdd_fam Qe a0 p0 ->
cDepDescentSection Qe based_cdepdescent_ind_beta: forall
(Qe : cDepDescent Pe)
(q0 : cdd_fam Qe a0 p0),
cdds_sect
(based_cdepdescent_ind
Qe q0) a0 p0 = q0
forall
(D : foralla : Coeq f g, fam_cdescent Pe a -> Type)
(d : D (coeq a0) p0),
(fun
(Q : foralla : Coeq f g, fam_cdescent Pe a -> Type)
(q0 : Q (coeq a0) p0) (x : Coeq f g)
(p : fam_cdescent Pe x) =>
cdepdescent_ind
(based_cdepdescent_ind (cdepdescent_fam Q) q0) x p)
D d (coeq a0) p0 = d
H: Univalence A, B: Type f, g: B -> A a0: A Pe: cDescent f g p0: cd_fam Pe a0 based_cdepdescent_ind: forallQe : cDepDescent Pe,
cdd_fam Qe a0 p0 ->
cDepDescentSection Qe based_cdepdescent_ind_beta: forall
(Qe : cDepDescent Pe)
(q0 : cdd_fam Qe a0 p0),
cdds_sect
(based_cdepdescent_ind
Qe q0) a0 p0 = q0 Q: foralla : Coeq f g, fam_cdescent Pe a -> Type q0: Q (coeq a0) p0
napply (based_cdepdescent_ind_beta (cdepdescent_fam Q)).Defined.(** It follows that the fibers [fam_cdescent Pe x] are equivalent to path spaces [(coeq a0) = x]. *)Definitioninduced_fam_cd_equiv_path (x : Coeq f g)
: (coeq a0) = x <~> fam_cdescent Pe x
:= @equiv_transport_identitysystem _ (coeq a0) (fam_cdescent Pe) p0 _ x.EndPaths.