Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.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.
(* -*- mode: coq; mode: visual-line -*- *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Types.Paths Types.Arrow Types.Sigma Types.Sum Types.Universe.Require Export Colimits.Coeq.LocalOpen Scope path_scope.(** * Homotopy Pushouts *)(** We define pushouts in terms of coproducts and coequalizers. *)DefinitionPushout@{i j k l} {A : Type@{i}} {B : Type@{j}} {C : Type@{k}}
(f : A -> B) (g : A -> C) : Type@{l}
:= Coeq@{l l _} (inl o f) (inr o g).Definitionpush {ABC : Type} {f : A -> B} {g : A -> C}
: B+C -> Pushout f g
:= @coeq _ _ (inl o f) (inr o g).Definitionpushl {ABC} {f : A -> B} {g : A -> C} (b : B)
: Pushout f g := push (inl b).Definitionpushr {ABC} {f : A -> B} {g : A -> C} (c : C)
: Pushout f g := push (inr c).Definitionpglue {ABC : Type} {f : A -> B} {g : A -> C} (a : A)
: pushl (f a) = pushr (g a)
:= @cglue A (B+C) (inl o f) (inr o g) a.(* Some versions with explicit parameters. *)Definitionpushl' {ABC} (f : A -> B) (g : A -> C) (b : B) : Pushout f g := pushl b.Definitionpushr' {ABC} (f : A -> B) (g : A -> C) (c : C) : Pushout f g := pushr c.Definitionpglue' {ABC : Type} (f : A -> B) (g : A -> C) (a : A) : pushl (f a) = pushr (g a)
:= pglue a.SectionPushoutInd.Context {ABC : Type} {f : A -> B} {g : A -> C}
(P : Pushout f g -> Type)
(pushb : forallb : B, P (pushl b))
(pushc : forallc : C, P (pushr c))
(pusha : foralla : A, (pglue a) # (pushb (f a)) = pushc (g a)).DefinitionPushout_ind
: forall (w : Pushout f g), P w
:= Coeq_ind P (sum_ind (P o push) pushb pushc) pusha.DefinitionPushout_ind_beta_pushl (b:B) : Pushout_ind (pushl b) = pushb b
:= 1.DefinitionPushout_ind_beta_pushr (c:C) : Pushout_ind (pushr c) = pushc c
:= 1.DefinitionPushout_ind_beta_pglue (a:A)
: apD Pushout_ind (pglue a) = pusha a
:= Coeq_ind_beta_cglue P (funbc => match bc with inl b => pushb b | inr c => pushc c end) pusha a.EndPushoutInd.(** But we want to allow the user to forget that we've defined pushouts in terms of coequalizers. *)Arguments Pushout : simpl never.Arguments push : simpl never.Arguments pglue : simpl never.Arguments Pushout_ind_beta_pglue : simpl never.(** However, we do allow [Pushout_ind] to simplify, as it computes on point constructors. *)DefinitionPushout_rec {ABC} {f : A -> B} {g : A -> C} (P : Type)
(pushb : B -> P)
(pushc : C -> P)
(pusha : foralla : A, pushb (f a) = pushc (g a))
: @Pushout A B C f g -> P
:= @Coeq_rec _ _ (inl o f) (inr o g) P (sum_rec P pushb pushc) pusha.
A, B, C: Type f: A -> B g: A -> C P: Type pushb: B -> P pushc: C -> P pusha: foralla : A, pushb (f a) = pushc (g a) a: A
ap (Pushout_rec P pushb pushc pusha) (pglue a) =
pusha a
A, B, C: Type f: A -> B g: A -> C P: Type pushb: B -> P pushc: C -> P pusha: foralla : A, pushb (f a) = pushc (g a) a: A
ap (Pushout_rec P pushb pushc pusha) (pglue a) =
pusha a
A, B, C, P: Type f: A -> B g: A -> C h: Pushout f g -> P
foralla : A,
fst
(funx : B => h (pushl x), funx : C => h (pushr x))
(f a) =
snd
(funx : B => h (pushl x), funx : C => h (pushr x))
(g a)
A, B, C, P: Type f: A -> B g: A -> C h: Pushout f g -> P a: A
h (pushl (f a)) = h (pushr (g a))
exact (ap h (pglue a)).Defined.
A, B, C: Type f: A -> B g: A -> C P: Type e: Pushout f g -> P
Pushout_rec P (e o pushl) (e o pushr)
(funa : A => ap e (pglue a)) == e
A, B, C: Type f: A -> B g: A -> C P: Type e: Pushout f g -> P
Pushout_rec P (e o pushl) (e o pushr)
(funa : A => ap e (pglue a)) == e
A, B, C: Type f: A -> B g: A -> C P: Type e: Pushout f g -> P
forallb : B,
(funw : Pushout f g =>
Pushout_rec P (e o pushl) (e o pushr)
(funa : A => ap e (pglue a)) w = e w) (pushl b)
A, B, C: Type f: A -> B g: A -> C P: Type e: Pushout f g -> P
forallc : C,
(funw : Pushout f g =>
Pushout_rec P (e o pushl) (e o pushr)
(funa : A => ap e (pglue a)) w = e w) (pushr c)
A, B, C: Type f: A -> B g: A -> C P: Type e: Pushout f g -> P
foralla : A,
transport
(funw : Pushout f g =>
Pushout_rec P (e o pushl) (e o pushr)
(funa0 : A => ap e (pglue a0)) w = e w)
(pglue a) (?pushb (f a)) = ?pushc (g a)
A, B, C: Type f: A -> B g: A -> C P: Type e: Pushout f g -> P
foralla : A,
transport
(funw : Pushout f g =>
Pushout_rec P (e o pushl) (e o pushr)
(funa0 : A => ap e (pglue a0)) w = e w)
(pglue a) ((funb : B => 1) (f a)) =
(func : C => 1) (g a)
A, B, C: Type f: A -> B g: A -> C P: Type e: Pushout f g -> P a: A
transport
(funw : Pushout f g =>
Pushout_rec P (funx : B => e (pushl x))
(funx : C => e (pushr x))
(funa : A => ap e (pglue a)) w = e w) (pglue a)
1 = 1
A, B, C: Type f: A -> B g: A -> C P: Type e: Pushout f g -> P a: A
ap
(Pushout_rec P (funx : B => e (pushl x))
(funx : C => e (pushr x))
(funa : A => ap e (pglue a))) (pglue a) @ 1 =
1 @ ap e (pglue a)
A, B, C: Type f: A -> B g: A -> C P: Type e: Pushout f g -> P a: A
ap
(Pushout_rec P (funx : B => e (pushl x))
(funx : C => e (pushr x))
(funa : A => ap e (pglue a))) (pglue a) =
ap e (pglue a)
nrapply Pushout_rec_beta_pglue.Defined.
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type
(funp : {psh : (B -> P) * (C -> P) &
foralla : A, fst psh (f a) = snd psh (g a)} =>
Pushout_rec P (fst p.1) (snd p.1) p.2)
o pushout_unrec f g == idmap
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type
pushout_unrec f g
o (funp : {psh : (B -> P) * (C -> P) &
foralla : A, fst psh (f a) = snd psh (g a)}
=> Pushout_rec P (fst p.1) (snd p.1) p.2) == idmap
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type
(funp : {psh : (B -> P) * (C -> P) &
foralla : A, fst psh (f a) = snd psh (g a)} =>
Pushout_rec P (fst p.1) (snd p.1) p.2)
o pushout_unrec f g == idmap
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type e: Pushout f g -> P
Pushout_rec P (fst (pushout_unrec f g e).1)
(snd (pushout_unrec f g e).1)
(pushout_unrec f g e).2 = e
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type e: Pushout f g -> P
Pushout_rec P (fst (pushout_unrec f g e).1)
(snd (pushout_unrec f g e).1)
(pushout_unrec f g e).2 == e
apply pushout_rec_unrec.
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type
pushout_unrec f g
o (funp : {psh : (B -> P) * (C -> P) &
foralla : A, fst psh (f a) = snd psh (g a)}
=> Pushout_rec P (fst p.1) (snd p.1) p.2) == idmap
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type pushb: B -> P pushc: C -> P pusha: foralla : A,
fst (pushb, pushc) (f a) =
snd (pushb, pushc) (g a)
((funx : B =>
Pushout_rec P pushb pushc pusha (pushl x),
funx : C =>
Pushout_rec P pushb pushc pusha (pushr x));
funa : A =>
ap (Pushout_rec P pushb pushc pusha) (pglue a)) =
((pushb, pushc); pusha)
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type pushb: B -> P pushc: C -> P pusha: foralla : A,
fst (pushb, pushc) (f a) =
snd (pushb, pushc) (g a)
(funx : B =>
Pushout_rec P pushb pushc pusha (pushl x),
funx : C => Pushout_rec P pushb pushc pusha (pushr x)) =
(pushb, pushc)
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type pushb: B -> P pushc: C -> P pusha: foralla : A,
fst (pushb, pushc) (f a) =
snd (pushb, pushc) (g a)
transport
(funpsh : (B -> P) * (C -> P) =>
foralla : A, fst psh (f a) = snd psh (g a))
?p
(funa : A =>
ap (Pushout_rec P pushb pushc pusha) (pglue a)) =
pusha
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type pushb: B -> P pushc: C -> P pusha: foralla : A,
fst (pushb, pushc) (f a) =
snd (pushb, pushc) (g a)
(funx : B =>
Pushout_rec P pushb pushc pusha (pushl x),
funx : C => Pushout_rec P pushb pushc pusha (pushr x)) =
(pushb, pushc)
reflexivity.
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type pushb: B -> P pushc: C -> P pusha: foralla : A,
fst (pushb, pushc) (f a) =
snd (pushb, pushc) (g a)
transport
(funpsh : (B -> P) * (C -> P) =>
foralla : A, fst psh (f a) = snd psh (g a)) 1
(funa : A =>
ap (Pushout_rec P pushb pushc pusha) (pglue a)) =
pusha
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type pushb: B -> P pushc: C -> P pusha: foralla : A,
fst (pushb, pushc) (f a) =
snd (pushb, pushc) (g a)
(funa : A =>
ap (Pushout_rec P pushb pushc pusha) (pglue a)) =
pusha
H: Funext A, B, C: Type f: A -> B g: A -> C P: Type pushb: B -> P pushc: C -> P pusha: foralla : A,
fst (pushb, pushc) (f a) =
snd (pushb, pushc) (g a) a: A
ap (Pushout_rec P pushb pushc pusha) (pglue a) =
pusha a
apply Pushout_rec_beta_pglue.Defined.Definitionequiv_Pushout_rec `{Funext} {A B C} (f : A -> B) (g : A -> C) P
: {psh : (B -> P) * (C -> P) &
foralla, fst psh (f a) = snd psh (g a) }
<~> (Pushout f g -> P)
:= Build_Equiv _ _ _ (isequiv_Pushout_rec f g P).Definitionequiv_pushout_unrec `{Funext} {A B C} (f : A -> B) (g : A -> C) P
: (Pushout f g -> P)
<~> {psh : (B -> P) * (C -> P) &
foralla, fst psh (f a) = snd psh (g a) }
:= equiv_inverse (equiv_Pushout_rec f g P).(** ** Symmetry *)Definitionpushout_sym_map {ABC} {f : A -> B} {g : A -> C}
: Pushout f g -> Pushout g f
:= Pushout_rec (Pushout g f) pushr pushl (funa : A => (pglue a)^).
A, B, C: Type f: A -> B g: A -> C
pushout_sym_map o pushout_sym_map == idmap
A, B, C: Type f: A -> B g: A -> C
pushout_sym_map o pushout_sym_map == idmap
A, B, C: Type f: A -> B g: A -> C
forallb : C,
(funw : Pushout g f =>
(pushout_sym_map o pushout_sym_map) w = idmap w)
(pushl b)
A, B, C: Type f: A -> B g: A -> C
forallc : B,
(funw : Pushout g f =>
(pushout_sym_map o pushout_sym_map) w = idmap w)
(pushr c)
A, B, C: Type f: A -> B g: A -> C
foralla : A,
transport
(funw : Pushout g f =>
(pushout_sym_map o pushout_sym_map) w = idmap w)
(pglue a) (?pushb (g a)) = ?pushc (f a)
A, B, C: Type f: A -> B g: A -> C
forallb : C,
(funw : Pushout g f =>
(pushout_sym_map o pushout_sym_map) w = idmap w)
(pushl b)
intros; reflexivity.
A, B, C: Type f: A -> B g: A -> C
forallc : B,
(funw : Pushout g f =>
(pushout_sym_map o pushout_sym_map) w = idmap w)
(pushr c)
intros; reflexivity.
A, B, C: Type f: A -> B g: A -> C
foralla : A,
transport
(funw : Pushout g f =>
(pushout_sym_map o pushout_sym_map) w = idmap w)
(pglue a) ((funb : C => 1) (g a)) =
(func : B => 1) (f a)
A, B, C: Type f: A -> B g: A -> C a: A
transport
(funw : Pushout g f =>
(pushout_sym_map o pushout_sym_map) w = idmap w)
(pglue a) ((funb : C => 1) (g a)) =
(func : B => 1) (f a)
A, B, C: Type f: A -> B g: A -> C a: A
transport
(funw : Pushout g f =>
pushout_sym_map (pushout_sym_map w) = w) (pglue a)
1 = 1
abstract (rewrite transport_paths_FFlr, Pushout_rec_beta_pglue, ap_V, Pushout_rec_beta_pglue; hott_simpl).Defined.Definitionpushout_sym {ABC} {f : A -> B} {g : A -> C}
: Pushout f g <~> Pushout g f :=
equiv_adjointify pushout_sym_map pushout_sym_map sect_pushout_sym_map sect_pushout_sym_map.(** ** Functoriality *)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h
Pushout f g -> Pushout f' g'
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h
Pushout f g -> Pushout f' g'
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h
A -> A'
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h
B + C -> B' + C'
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h
?k o (funx : A => inl (f x)) ==
(funx : A' => inl (f' x)) o ?h
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h
?k o (funx : A => inr (g x)) ==
(funx : A' => inr (g' x)) o ?h
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h
A -> A'
exact h.
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h
B + C -> B' + C'
exact (functor_sum k l).
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h
functor_sum k l o (funx : A => inl (f x)) ==
(funx : A' => inl (f' x)) o h
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h a: A
inl (k (f a)) = inl (f' (h a))
apply ap, p.
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h
functor_sum k l o (funx : A => inr (g x)) ==
(funx : A' => inr (g' x)) o h
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h: A -> A' k: B -> B' l: C -> C' p: k o f == f' o h q: l o g == g' o h a: A
inr (l (g a)) = inr (g' (h a))
apply ap, q.Defined.
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a
functor_pushout h k l p q ==
functor_pushout h' k' l' p' q'
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a
functor_pushout h k l p q ==
functor_pushout h' k' l' p' q'
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a
h == h'
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a
functor_sum k l == functor_sum k' l'
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a
forallb : A,
?s ((funx : A => inl (f x)) b) @
(funa : A =>
ap inl (p' a)
:
functor_sum k' l' (inl (f a)) = inl (f' (h' a))) b =
(funa : A =>
ap inl (p a)
:
functor_sum k l (inl (f a)) = inl (f' (h a))) b @
ap (funx : A' => inl (f' x)) (?r b)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a
forallb : A,
?s ((funx : A => inr (g x)) b) @
(funa : A =>
ap inr (q' a)
:
functor_sum k' l' (inr (g a)) = inr (g' (h' a))) b =
(funa : A =>
ap inr (q a)
:
functor_sum k l (inr (g a)) = inr (g' (h a))) b @
ap (funx : A' => inr (g' x)) (?r b)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a
functor_sum k l == functor_sum k' l'
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a
forallb : A,
?s ((funx : A => inl (f x)) b) @
(funa : A =>
ap inl (p' a)
:
functor_sum k' l' (inl (f a)) = inl (f' (h' a))) b =
(funa : A =>
ap inl (p a)
:
functor_sum k l (inl (f a)) = inl (f' (h a))) b @
ap (funx : A' => inl (f' x)) (t b)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a
forallb : A,
?s ((funx : A => inr (g x)) b) @
(funa : A =>
ap inr (q' a)
:
functor_sum k' l' (inr (g a)) = inr (g' (h' a))) b =
(funa : A =>
ap inr (q a)
:
functor_sum k l (inr (g a)) = inr (g' (h a))) b @
ap (funx : A' => inr (g' x)) (t b)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a
forallb : A,
functor_sum_homotopic u v ((funx : A => inl (f x)) b) @
(funa : A =>
ap inl (p' a)
:
functor_sum k' l' (inl (f a)) = inl (f' (h' a))) b =
(funa : A =>
ap inl (p a)
:
functor_sum k l (inl (f a)) = inl (f' (h a))) b @
ap (funx : A' => inl (f' x)) (t b)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a
forallb : A,
functor_sum_homotopic u v ((funx : A => inr (g x)) b) @
(funa : A =>
ap inr (q' a)
:
functor_sum k' l' (inr (g a)) = inr (g' (h' a))) b =
(funa : A =>
ap inr (q a)
:
functor_sum k l (inr (g a)) = inr (g' (h a))) b @
ap (funx : A' => inr (g' x)) (t b)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a b: A
ap inl (u (f b)) @ ap inl (p' b) =
ap inl (p b) @ ap (funx : A' => inl (f' x)) (t b)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a b: A
ap inr (v (g b)) @ ap inr (q' b) =
ap inr (q b) @ ap (funx : A' => inr (g' x)) (t b)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a b: A
ap inl (u (f b)) @ ap inl (p' b) =
ap inl (p b @ ap f' (t b))
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a b: A
ap inr (v (g b)) @ ap inr (q' b) =
ap inr (q b @ ap g' (t b))
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a b: A
p b @ ap f' (t b) = u (f b) @ p' b
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a b: A
q b @ ap g' (t b) = v (g b) @ q' b
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' h, h': A -> A' k, k': B -> B' l, l': C -> C' p: k o f == f' o h q: l o g == g' o h p': k' o f == f' o h' q': l' o g == g' o h' t: h == h' u: k == k' v: l == l' i: foralla : A, p a @ ap f' (t a) = u (f a) @ p' a j: foralla : A, q a @ ap g' (t a) = v (g a) @ q' a b: A
q b @ ap g' (t b) = v (g b) @ q' b
exact (j b).Defined.(** ** Equivalences *)(** Pushouts preserve equivalences. *)SectionEquivPushout.Context {ABCfgA'B'C'f'g'}
(eA : A <~> A') (eB : B <~> B') (eC : C <~> C')
(p : eB o f == f' o eA) (q : eC o g == g' o eA).
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA
Pushout f g <~> Pushout f' g'
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA
Pushout f g <~> Pushout f' g'
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA
(funx : A => (eB +E eC) (inl (f x))) ==
(funx : A => inl (f' (eA x)))
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA
(funx : A => (eB +E eC) (inr (g x))) ==
(funx : A => inr (g' (eA x)))
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA x: A
eB (f x) = f' (eA x)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA x: A
eC (g x) = g' (eA x)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA x: A
eB (f x) = f' (eA x)
apply p.
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA x: A
eC (g x) = g' (eA x)
apply q.Defined.
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA a: A
ap equiv_pushout (pglue a) =
(ap pushl (p a) @ pglue (eA a)) @ ap pushr (q a)^
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA a: A
ap equiv_pushout (pglue a) =
(ap pushl (p a) @ pglue (eA a)) @ ap pushr (q a)^
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA a: A
(ap coeq (ap inl (p a)) @ cglue (eA a)) @
ap coeq (ap inr (q a))^ =
(ap pushl (p a) @ pglue (eA a)) @ ap pushr (q a)^
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA a: A
ap coeq (ap inl (p a)) = ap pushl (p a)
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA a: A
ap coeq (ap inr (q a))^ = ap pushr (q a)^
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA a: A
ap coeq (ap inl (p a)) = ap pushl (p a)
symmetry; refine (ap_compose inl coeq _).
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA a: A
ap coeq (ap inr (q a))^ = ap pushr (q a)^
A, B, C: Type f: A -> B g: A -> C A', B', C': Type f': A' -> B' g': A' -> C' eA: A <~> A' eB: B <~> B' eC: C <~> C' p: eB o f == f' o eA q: eC o g == g' o eA a: A
ap coeq (ap inr (q a)^) = ap pushr (q a)^
symmetry; refine (ap_compose inr coeq _).Defined.EndEquivPushout.(** ** Contractibility *)(** The pushout of a span of contractible types is contractible *)
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
Contr (Pushout f g)
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
Contr (Pushout f g)
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
forally : Pushout f g, pushl (center B) = y
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
forallb : B, pushl (center B) = pushl b
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
forallc : C, pushl (center B) = pushr c
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
foralla : A,
transport (paths (pushl (center B)))
(pglue a) (?pushb (f a)) =
?pushc (g a)
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
forallb : B, pushl (center B) = pushl b
intros b; apply ap, path_contr.
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
forallc : C, pushl (center B) = pushr c
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C c: C
pushl (center B) = pushr c
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C c: C
pushl (center B) = pushl (f (center A))
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C c: C
pushr (g (center A)) = pushr c
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C c: C
pushl (center B) = pushl (f (center A))
apply ap, path_contr.
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C c: C
pushr (g (center A)) = pushr c
apply ap, path_contr.
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
foralla : A,
transport (paths (pushl (center B))) (pglue a)
((funb : B => ap pushl (path_contr (center B) b))
(f a)) =
(func : C =>
(ap pushl (path_contr (center B) (f (center A))) @
pglue (center A)) @
ap pushr (path_contr (g (center A)) c)) (g a)
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C a: A
transport (paths (pushl (center B))) (pglue a)
((funb : B => ap pushl (path_contr (center B) b))
(f a)) =
(func : C =>
(ap pushl (path_contr (center B) (f (center A))) @
pglue (center A)) @
ap pushr (path_contr (g (center A)) c)) (g a)
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C a: A
ap pushl (path_contr (center B) (f a)) @ pglue a =
(ap pushl (path_contr (center B) (f (center A))) @
pglue (center A)) @
ap pushr (path_contr (g (center A)) (g a))
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C a: A p: center A = a
ap pushl (path_contr (center B) (f a)) @ pglue a =
(ap pushl (path_contr (center B) (f (center A))) @
pglue (center A)) @
ap pushr (path_contr (g (center A)) (g a))
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
ap pushl (path_contr (center B) (f (center A))) @
pglue (center A) =
(ap pushl (path_contr (center B) (f (center A))) @
pglue (center A)) @
ap pushr (path_contr (g (center A)) (g (center A)))
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
(ap pushl (path_contr (center B) (f (center A))) @
pglue (center A)) @ 1 =
(ap pushl (path_contr (center B) (f (center A))) @
pglue (center A)) @
ap pushr (path_contr (g (center A)) (g (center A)))
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
ap pushr 1 =
ap pushr (path_contr (g (center A)) (g (center A)))
A, B, C: Type Contr0: Contr A Contr1: Contr B Contr2: Contr C f: A -> B g: A -> C
1 = path_contr (g (center A)) (g (center A))
apply path_contr.Defined.(** ** Sigmas *)(** Pushouts commute with sigmas *)SectionEquivSigmaPushout.Context {X : Type}
(A : X -> Type) (B : X -> Type) (C : X -> Type)
(f : forallx, A x -> B x) (g : forallx, A x -> C x).
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x
foralla : {x : _ & A x},
functor_sigma idmap (funx : X => pushl)
(functor_sigma idmap f a) =
functor_sigma idmap (funx : X => pushr)
(functor_sigma idmap g a)
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x x: X a: A x
(x; pushl (f x a)) = (x; pushr (g x a))
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x x: X a: A x
pushl (f x a) = pushr (g x a)
apply pglue.Defined.
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x x: X a: A x
ap esp2 (pglue (x; a)) =
path_sigma' (funx : X => Pushout (f x) (g x)) 1
(pglue a)
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x x: X a: A x
ap esp2 (pglue (x; a)) =
path_sigma' (funx : X => Pushout (f x) (g x)) 1
(pglue a)
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x x: X a: A x
ap
(Pushout_rec {x : X & Pushout (f x) (g x)}
(functor_sigma idmap (funx : X => pushl))
(functor_sigma idmap (funx : X => pushr))
(funa0 : {x : _ & A x} =>
path_sigma' (funx : X => Pushout (f x) (g x)) 1
(pglue a0.2))) (pglue (x; a)) =
path_sigma' (funx : X => Pushout (f x) (g x)) 1
(pglue a)
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x x: X a: A x
path_sigma' (funx : X => Pushout (f x) (g x)) 1
(pglue a) =
path_sigma' (funx : X => Pushout (f x) (g x)) 1
(pglue a)
reflexivity.Qed.
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x x: X a: A x
ap (exist (funx : X => Pushout (f x) (g x)) x)
(pglue a) =
ap
(funx0 : Pushout (f x) (g x) => esp2 (esp1 (x; x0)))
(pglue a)
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x x: X a: A x
ap (exist (funx : X => Pushout (f x) (g x)) x)
(pglue a) =
ap
(funx : {x : X & Pushout (f x) (g x)} =>
esp2 (esp1 x))
(ap (exist (funx : X => Pushout (f x) (g x)) x)
(pglue a))
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x x: X a: A x
ap (exist (funx : X => Pushout (f x) (g x)) x)
(pglue a) =
ap esp2
(ap esp1
(ap (exist (funx : X => Pushout (f x) (g x)) x)
(pglue a)))
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x x: X a: A x
path_sigma' (funx : X => Pushout (f x) (g x)) 1
(pglue a) =
ap esp2
(ap esp1
(path_sigma' (funx : X => Pushout (f x) (g x)) 1
(pglue a)))
X: Type A, B, C: X -> Type f: forallx : X, A x -> B x g: forallx : X, A x -> C x x: X a: A x
path_sigma' (funx : X => Pushout (f x) (g x)) 1
(pglue a) =
path_sigma' (funx : X => Pushout (f x) (g x)) 1
(pglue a)
reflexivity.Defined.EndEquivSigmaPushout.(** ** Pushouts are associative *)SectionPushoutAssoc.Context {A1A2BCD : Type}
(f1 : A1 -> B) (g1 : A1 -> C) (f2 : A2 -> C) (g2 : A2 -> D).Definitionpushout_assoc_left := Pushout (pushr' f1 g1 o f2) g2.Letpushll : B -> pushout_assoc_left
:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1.Letpushlm : C -> pushout_assoc_left
:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1.Letpushlr : D -> pushout_assoc_left
:= pushr' (pushr' f1 g1 o f2) g2.Letpgluell : foralla1, pushll (f1 a1) = pushlm (g1 a1)
:= funa1 => ap (pushl' (pushr' f1 g1 o f2) g2) (pglue' f1 g1 a1).Letpgluelr : foralla2, pushlm (f2 a2) = pushlr (g2 a2)
:= funa2 => pglue' (pushr' f1 g1 o f2) g2 a2.
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: pushout_assoc_left -> Type pushb: forallb : B, P (pushll b) pushc: forallc : C, P (pushlm c) pushd: foralld : D, P (pushlr d) pusha1: foralla1 : A1,
transport P (pgluell a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluelr a2) (pushc (f2 a2)) =
pushd (g2 a2)
forallx : pushout_assoc_left, P x
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: pushout_assoc_left -> Type pushb: forallb : B, P (pushll b) pushc: forallc : C, P (pushlm c) pushd: foralld : D, P (pushlr d) pusha1: foralla1 : A1,
transport P (pgluell a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluelr a2) (pushc (f2 a2)) =
pushd (g2 a2)
forallx : pushout_assoc_left, P x
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: pushout_assoc_left -> Type pushb: forallb : B, P (pushll b) pushc: forallc : C, P (pushlm c) pushd: foralld : D, P (pushlr d) pusha1: foralla1 : A1,
transport P (pgluell a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluelr a2) (pushc (f2 a2)) =
pushd (g2 a2)
forallb : Pushout f1 g1, P (pushl b)
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: pushout_assoc_left -> Type pushb: forallb : B, P (pushll b) pushc: forallc : C, P (pushlm c) pushd: foralld : D, P (pushlr d) pusha1: foralla1 : A1,
transport P (pgluell a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluelr a2) (pushc (f2 a2)) =
pushd (g2 a2)
foralla : A2,
transport P (pglue a)
(?pushb ((funx : A2 => pushr' f1 g1 (f2 x)) a)) =
pushd (g2 a)
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: pushout_assoc_left -> Type pushb: forallb : B, P (pushll b) pushc: forallc : C, P (pushlm c) pushd: foralld : D, P (pushlr d) pusha1: foralla1 : A1,
transport P (pgluell a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluelr a2) (pushc (f2 a2)) =
pushd (g2 a2)
forallb : Pushout f1 g1, P (pushl b)
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: pushout_assoc_left -> Type pushb: forallb : B, P (pushll b) pushc: forallc : C, P (pushlm c) pushd: foralld : D, P (pushlr d) pusha1: foralla1 : A1,
transport P (pgluell a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluelr a2) (pushc (f2 a2)) =
pushd (g2 a2)
foralla : A1,
transport (funw : Pushout f1 g1 => P (pushl w))
(pglue a) (pushb (f1 a)) = pushc (g1 a)
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: pushout_assoc_left -> Type pushb: forallb : B, P (pushll b) pushc: forallc : C, P (pushlm c) pushd: foralld : D, P (pushlr d) pusha1: foralla1 : A1,
transport P (pgluell a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluelr a2) (pushc (f2 a2)) =
pushd (g2 a2) a1: A1
transport (funw : Pushout f1 g1 => P (pushl w))
(pglue a1) (pushb (f1 a1)) = pushc (g1 a1)
exact (transport_compose P pushl _ _ @ pusha1 a1).
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: pushout_assoc_left -> Type pushb: forallb : B, P (pushll b) pushc: forallc : C, P (pushlm c) pushd: foralld : D, P (pushlr d) pusha1: foralla1 : A1,
transport P (pgluell a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluelr a2) (pushc (f2 a2)) =
pushd (g2 a2)
foralla : A2,
transport P (pglue a)
(Pushout_ind (funw : Pushout f1 g1 => P (pushl w))
pushb pushc
(funa1 : A1 =>
transport_compose P pushl (pglue' f1 g1 a1)
(pushb (f1 a1)) @ pusha1 a1)
((funx : A2 => pushr' f1 g1 (f2 x)) a)) =
pushd (g2 a)
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2)
pushout_assoc_left -> P
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2)
pushout_assoc_left -> P
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2)
Pushout f1 g1 -> P
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2)
foralla : A2,
?pushb ((funx : A2 => pushr' f1 g1 (f2 x)) a) =
pushd (g2 a)
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2)
Pushout f1 g1 -> P
srefine (Pushout_rec _ pushb pushc pusha1).
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2)
foralla : A2,
Pushout_rec P pushb pushc pusha1
((funx : A2 => pushr' f1 g1 (f2 x)) a) =
pushd (g2 a)
exact pusha2.Defined.
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2) a1: A1
ap pushout_assoc_left_rec (pgluell a1) = pusha1 a1
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2) a1: A1
ap pushout_assoc_left_rec (pgluell a1) = pusha1 a1
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2) a1: A1
ap pushout_assoc_left_rec
(ap (pushl' (funx : A2 => pushr' f1 g1 (f2 x)) g2)
(pglue' f1 g1 a1)) = pusha1 a1
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2) a1: A1
ap
(funx : Pushout f1 g1 =>
pushout_assoc_left_rec
(pushl' (funx0 : A2 => pushr' f1 g1 (f2 x0)) g2
x)) (pglue' f1 g1 a1) = pusha1 a1
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2) a1: A1
ap (Pushout_rec P pushb pushc pusha1)
(pglue' f1 g1 a1) = pusha1 a1
apply Pushout_rec_beta_pglue.Defined.
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2) a2: A2
ap pushout_assoc_left_rec (pgluelr a2) = pusha2 a2
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2) a2: A2
ap pushout_assoc_left_rec (pgluelr a2) = pusha2 a2
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) P: Type pushb: B -> P pushc: C -> P pushd: D -> P pusha1: foralla1 : A1, pushb (f1 a1) = pushc (g1 a1) pusha2: foralla2 : A2, pushc (f2 a2) = pushd (g2 a2) a2: A2
ap
(Pushout_rec P (Pushout_rec P pushb pushc pusha1)
pushd pusha2)
(pglue' (funx : A2 => pushr' f1 g1 (f2 x)) g2 a2) =
pusha2 a2
apply (Pushout_rec_beta_pglue (f := pushr' f1 g1 o f2) (g := g2)).Defined.EndPushout_Assoc_Left_Rec.Definitionpushout_assoc_right := Pushout f1 (pushl' f2 g2 o g1).Letpushrl : B -> pushout_assoc_right
:= pushl' f1 (pushl' f2 g2 o g1).Letpushrm : C -> pushout_assoc_right
:= pushr' f1 (pushl' f2 g2 o g1) o pushl' f2 g2.Letpushrr : D -> pushout_assoc_right
:= pushr' f1 (pushl' f2 g2 o g1) o pushr' f2 g2.Letpgluerl : foralla1, pushrl (f1 a1) = pushrm (g1 a1)
:= funa1 => pglue' f1 (pushl' f2 g2 o g1) a1.Letpgluerr : foralla2, pushrm (f2 a2) = pushrr (g2 a2)
:= funa2 => ap (pushr' f1 (pushl' f2 g2 o g1)) (pglue' f2 g2 a2).
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) pushrl:= pushl' f1 (pushl' f2 g2 o g1): B -> pushout_assoc_right pushrm:= pushr' f1 (pushl' f2 g2 o g1) o pushl' f2 g2: C -> pushout_assoc_right pushrr:= pushr' f1 (pushl' f2 g2 o g1) o pushr' f2 g2: D -> pushout_assoc_right pgluerl:= funa1 : A1 =>
pglue' f1 (pushl' f2 g2 o g1) a1: foralla1 : A1,
pushrl (f1 a1) = pushrm (g1 a1) pgluerr:= funa2 : A2 =>
ap (pushr' f1 (pushl' f2 g2 o g1))
(pglue' f2 g2 a2): foralla2 : A2,
pushrm (f2 a2) = pushrr (g2 a2) P: pushout_assoc_right -> Type pushb: forallb : B, P (pushrl b) pushc: forallc : C, P (pushrm c) pushd: foralld : D, P (pushrr d) pusha1: foralla1 : A1,
transport P (pgluerl a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluerr a2) (pushc (f2 a2)) =
pushd (g2 a2)
forallx : pushout_assoc_right, P x
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) pushrl:= pushl' f1 (pushl' f2 g2 o g1): B -> pushout_assoc_right pushrm:= pushr' f1 (pushl' f2 g2 o g1) o pushl' f2 g2: C -> pushout_assoc_right pushrr:= pushr' f1 (pushl' f2 g2 o g1) o pushr' f2 g2: D -> pushout_assoc_right pgluerl:= funa1 : A1 =>
pglue' f1 (pushl' f2 g2 o g1) a1: foralla1 : A1,
pushrl (f1 a1) = pushrm (g1 a1) pgluerr:= funa2 : A2 =>
ap (pushr' f1 (pushl' f2 g2 o g1))
(pglue' f2 g2 a2): foralla2 : A2,
pushrm (f2 a2) = pushrr (g2 a2) P: pushout_assoc_right -> Type pushb: forallb : B, P (pushrl b) pushc: forallc : C, P (pushrm c) pushd: foralld : D, P (pushrr d) pusha1: foralla1 : A1,
transport P (pgluerl a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluerr a2) (pushc (f2 a2)) =
pushd (g2 a2)
forallx : pushout_assoc_right, P x
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) pushrl:= pushl' f1 (pushl' f2 g2 o g1): B -> pushout_assoc_right pushrm:= pushr' f1 (pushl' f2 g2 o g1) o pushl' f2 g2: C -> pushout_assoc_right pushrr:= pushr' f1 (pushl' f2 g2 o g1) o pushr' f2 g2: D -> pushout_assoc_right pgluerl:= funa1 : A1 =>
pglue' f1 (pushl' f2 g2 o g1) a1: foralla1 : A1,
pushrl (f1 a1) = pushrm (g1 a1) pgluerr:= funa2 : A2 =>
ap (pushr' f1 (pushl' f2 g2 o g1))
(pglue' f2 g2 a2): foralla2 : A2,
pushrm (f2 a2) = pushrr (g2 a2) P: pushout_assoc_right -> Type pushb: forallb : B, P (pushrl b) pushc: forallc : C, P (pushrm c) pushd: foralld : D, P (pushrr d) pusha1: foralla1 : A1,
transport P (pgluerl a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluerr a2) (pushc (f2 a2)) =
pushd (g2 a2)
forallc : Pushout f2 g2, P (pushr c)
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) pushrl:= pushl' f1 (pushl' f2 g2 o g1): B -> pushout_assoc_right pushrm:= pushr' f1 (pushl' f2 g2 o g1) o pushl' f2 g2: C -> pushout_assoc_right pushrr:= pushr' f1 (pushl' f2 g2 o g1) o pushr' f2 g2: D -> pushout_assoc_right pgluerl:= funa1 : A1 =>
pglue' f1 (pushl' f2 g2 o g1) a1: foralla1 : A1,
pushrl (f1 a1) = pushrm (g1 a1) pgluerr:= funa2 : A2 =>
ap (pushr' f1 (pushl' f2 g2 o g1))
(pglue' f2 g2 a2): foralla2 : A2,
pushrm (f2 a2) = pushrr (g2 a2) P: pushout_assoc_right -> Type pushb: forallb : B, P (pushrl b) pushc: forallc : C, P (pushrm c) pushd: foralld : D, P (pushrr d) pusha1: foralla1 : A1,
transport P (pgluerl a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluerr a2) (pushc (f2 a2)) =
pushd (g2 a2)
foralla : A1,
transport P (pglue a) (pushb (f1 a)) =
?pushc ((funx : A1 => pushl' f2 g2 (g1 x)) a)
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) pushrl:= pushl' f1 (pushl' f2 g2 o g1): B -> pushout_assoc_right pushrm:= pushr' f1 (pushl' f2 g2 o g1) o pushl' f2 g2: C -> pushout_assoc_right pushrr:= pushr' f1 (pushl' f2 g2 o g1) o pushr' f2 g2: D -> pushout_assoc_right pgluerl:= funa1 : A1 =>
pglue' f1 (pushl' f2 g2 o g1) a1: foralla1 : A1,
pushrl (f1 a1) = pushrm (g1 a1) pgluerr:= funa2 : A2 =>
ap (pushr' f1 (pushl' f2 g2 o g1))
(pglue' f2 g2 a2): foralla2 : A2,
pushrm (f2 a2) = pushrr (g2 a2) P: pushout_assoc_right -> Type pushb: forallb : B, P (pushrl b) pushc: forallc : C, P (pushrm c) pushd: foralld : D, P (pushrr d) pusha1: foralla1 : A1,
transport P (pgluerl a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluerr a2) (pushc (f2 a2)) =
pushd (g2 a2)
forallc : Pushout f2 g2, P (pushr c)
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) pushrl:= pushl' f1 (pushl' f2 g2 o g1): B -> pushout_assoc_right pushrm:= pushr' f1 (pushl' f2 g2 o g1) o pushl' f2 g2: C -> pushout_assoc_right pushrr:= pushr' f1 (pushl' f2 g2 o g1) o pushr' f2 g2: D -> pushout_assoc_right pgluerl:= funa1 : A1 =>
pglue' f1 (pushl' f2 g2 o g1) a1: foralla1 : A1,
pushrl (f1 a1) = pushrm (g1 a1) pgluerr:= funa2 : A2 =>
ap (pushr' f1 (pushl' f2 g2 o g1))
(pglue' f2 g2 a2): foralla2 : A2,
pushrm (f2 a2) = pushrr (g2 a2) P: pushout_assoc_right -> Type pushb: forallb : B, P (pushrl b) pushc: forallc : C, P (pushrm c) pushd: foralld : D, P (pushrr d) pusha1: foralla1 : A1,
transport P (pgluerl a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluerr a2) (pushc (f2 a2)) =
pushd (g2 a2)
foralla : A2,
transport (funw : Pushout f2 g2 => P (pushr w))
(pglue a) (pushc (f2 a)) = pushd (g2 a)
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) pushrl:= pushl' f1 (pushl' f2 g2 o g1): B -> pushout_assoc_right pushrm:= pushr' f1 (pushl' f2 g2 o g1) o pushl' f2 g2: C -> pushout_assoc_right pushrr:= pushr' f1 (pushl' f2 g2 o g1) o pushr' f2 g2: D -> pushout_assoc_right pgluerl:= funa1 : A1 =>
pglue' f1 (pushl' f2 g2 o g1) a1: foralla1 : A1,
pushrl (f1 a1) = pushrm (g1 a1) pgluerr:= funa2 : A2 =>
ap (pushr' f1 (pushl' f2 g2 o g1))
(pglue' f2 g2 a2): foralla2 : A2,
pushrm (f2 a2) = pushrr (g2 a2) P: pushout_assoc_right -> Type pushb: forallb : B, P (pushrl b) pushc: forallc : C, P (pushrm c) pushd: foralld : D, P (pushrr d) pusha1: foralla1 : A1,
transport P (pgluerl a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluerr a2) (pushc (f2 a2)) =
pushd (g2 a2) a2: A2
transport (funw : Pushout f2 g2 => P (pushr w))
(pglue a2) (pushc (f2 a2)) = pushd (g2 a2)
exact (transport_compose P pushr _ _ @ pusha2 a2).
A1, A2, B, C, D: Type f1: A1 -> B g1: A1 -> C f2: A2 -> C g2: A2 -> D pushll:= pushl' (pushr' f1 g1 o f2) g2 o pushl' f1 g1: B -> pushout_assoc_left pushlm:= pushl' (pushr' f1 g1 o f2) g2 o pushr' f1 g1: C -> pushout_assoc_left pushlr:= pushr' (pushr' f1 g1 o f2) g2: D -> pushout_assoc_left pgluell:= funa1 : A1 =>
ap (pushl' (pushr' f1 g1 o f2) g2)
(pglue' f1 g1 a1): foralla1 : A1,
pushll (f1 a1) = pushlm (g1 a1) pgluelr:= funa2 : A2 =>
pglue' (pushr' f1 g1 o f2) g2 a2: foralla2 : A2,
pushlm (f2 a2) = pushlr (g2 a2) pushrl:= pushl' f1 (pushl' f2 g2 o g1): B -> pushout_assoc_right pushrm:= pushr' f1 (pushl' f2 g2 o g1) o pushl' f2 g2: C -> pushout_assoc_right pushrr:= pushr' f1 (pushl' f2 g2 o g1) o pushr' f2 g2: D -> pushout_assoc_right pgluerl:= funa1 : A1 =>
pglue' f1 (pushl' f2 g2 o g1) a1: foralla1 : A1,
pushrl (f1 a1) = pushrm (g1 a1) pgluerr:= funa2 : A2 =>
ap (pushr' f1 (pushl' f2 g2 o g1))
(pglue' f2 g2 a2): foralla2 : A2,
pushrm (f2 a2) = pushrr (g2 a2) P: pushout_assoc_right -> Type pushb: forallb : B, P (pushrl b) pushc: forallc : C, P (pushrm c) pushd: foralld : D, P (pushrr d) pusha1: foralla1 : A1,
transport P (pgluerl a1) (pushb (f1 a1)) =
pushc (g1 a1) pusha2: foralla2 : A2,
transport P (pgluerr a2) (pushc (f2 a2)) =
pushd (g2 a2)
foralla : A1,
transport P (pglue a) (pushb (f1 a)) =
Pushout_ind (funw : Pushout f2 g2 => P (pushr w))
pushc pushd
(funa2 : A2 =>
transport_compose P pushr (pglue' f2 g2 a2)
(pushc (f2 a2)) @ pusha2 a2)
((funx : A1 => pushl' f2 g2 (g1 x)) a)
pushr' f g
o Pushout_rec C (g o f^-1) idmap
(funa : A =>
ap g (eissect f a)
:
(g o f^-1) (f a) = idmap (g a)) == idmap
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f
forallb : B,
pushr' f g
(Pushout_rec C (funx : B => g (f^-1 x)) idmap
(funa : A => ap g (eissect f a)) (pushl b)) =
pushl b
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f
forallc : C,
pushr' f g
(Pushout_rec C (funx : B => g (f^-1 x)) idmap
(funa : A => ap g (eissect f a)) (pushr c)) =
pushr c
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f
foralla : A,
transport
(funw : Pushout f g =>
pushr' f g
(Pushout_rec C (funx : B => g (f^-1 x)) idmap
(funa0 : A => ap g (eissect f a0)) w) = w)
(pglue a) (?Goal (f a)) = ?Goal0 (g a)
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f
forallb : B,
pushr' f g
(Pushout_rec C (funx : B => g (f^-1 x)) idmap
(funa : A => ap g (eissect f a)) (pushl b)) =
pushl b
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f b: B
pushr' f g (g (f^-1 b)) = pushl b
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f b: B
pushr' f g (g (f^-1 b)) = pushl' f g (f (f^-1 b))
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f b: B
pushl' f g (f (f^-1 b)) = pushl b
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f b: B
pushr' f g (g (f^-1 b)) = pushl' f g (f (f^-1 b))
symmetry; apply pglue.
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f b: B
pushl' f g (f (f^-1 b)) = pushl b
apply ap, eisretr.
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f
forallc : C,
pushr' f g
(Pushout_rec C (funx : B => g (f^-1 x)) idmap
(funa : A => ap g (eissect f a)) (pushr c)) =
pushr c
intros c; reflexivity.
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f
foralla : A,
transport
(funw : Pushout f g =>
pushr' f g
(Pushout_rec C (funx : B => g (f^-1 x)) idmap
(funa0 : A => ap g (eissect f a0)) w) = w)
(pglue a)
((funb : B =>
(pglue (f^-1 b))^ @ ap pushl (eisretr f b)) (f a)) =
(func : C => 1) (g a)
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f a: A
transport
(funw : Pushout f g =>
pushr' f g
(Pushout_rec C (funx : B => g (f^-1 x)) idmap
(funa : A => ap g (eissect f a)) w) = w)
(pglue a)
((funb : B =>
(pglue (f^-1 b))^ @ ap pushl (eisretr f b)) (f a)) =
(func : C => 1) (g a)
abstract (
rewrite transport_paths_FlFr, ap_compose, !concat_pp_p;
apply moveR_Vp; apply moveR_Vp;
rewrite Pushout_rec_beta_pglue, eisadj, ap_idmap, concat_p1;
rewrite <- ap_compose, <- (ap_compose g (pushr' f g));
exact (concat_Ap (pglue' f g) (eissect f a)) ).
A, B, C: Type f: A -> B g: A -> C H: IsEquiv f
Pushout_rec C (g o f^-1) idmap
(funa : A =>
ap g (eissect f a) : (g o f^-1) (f a) = idmap (g a))
o pushr' f g == idmap
intros c; reflexivity.Defined.
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
IsEquiv (pushl' f g)
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
IsEquiv (pushl' f g)
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
Pushout f g -> B
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
pushl' f g o ?g == idmap
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
?g o pushl' f g == idmap
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
Pushout f g -> B
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
foralla : A, idmap (f a) = (f o g^-1) (g a)
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g a: A
f a = f (g^-1 (g a))
symmetry; apply ap, eissect.
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
pushl' f g
o Pushout_rec B idmap (f o g^-1)
(funa : A =>
(ap f (eissect g a))^
:
idmap (f a) = (f o g^-1) (g a)) == idmap
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
forallb : B,
pushl' f g
(Pushout_rec B idmap (funx : C => f (g^-1 x))
(funa : A => (ap f (eissect g a))^) (pushl b)) =
pushl b
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
forallc : C,
pushl' f g
(Pushout_rec B idmap (funx : C => f (g^-1 x))
(funa : A => (ap f (eissect g a))^) (pushr c)) =
pushr c
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
foralla : A,
transport
(funw : Pushout f g =>
pushl' f g
(Pushout_rec B idmap (funx : C => f (g^-1 x))
(funa0 : A => (ap f (eissect g a0))^) w) = w)
(pglue a) (?Goal (f a)) = ?Goal0 (g a)
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
forallb : B,
pushl' f g
(Pushout_rec B idmap (funx : C => f (g^-1 x))
(funa : A => (ap f (eissect g a))^) (pushl b)) =
pushl b
intros b; reflexivity.
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
forallc : C,
pushl' f g
(Pushout_rec B idmap (funx : C => f (g^-1 x))
(funa : A => (ap f (eissect g a))^) (pushr c)) =
pushr c
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g c: C
pushl' f g (f (g^-1 c)) = pushr c
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g c: C
pushl' f g (f (g^-1 c)) = pushr' f g (g (g^-1 c))
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g c: C
pushr' f g (g (g^-1 c)) = pushr c
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g c: C
pushl' f g (f (g^-1 c)) = pushr' f g (g (g^-1 c))
apply pglue.
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g c: C
pushr' f g (g (g^-1 c)) = pushr c
apply ap, eisretr.
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g
foralla : A,
transport
(funw : Pushout f g =>
pushl' f g
(Pushout_rec B idmap (funx : C => f (g^-1 x))
(funa0 : A => (ap f (eissect g a0))^) w) = w)
(pglue a) ((funb : B => 1) (f a)) =
(func : C => pglue (g^-1 c) @ ap pushr (eisretr g c))
(g a)
A, B, C: Type f: A -> B g: A -> C H: IsEquiv g a: A
transport
(funw : Pushout f g =>
pushl' f g
(Pushout_rec B idmap (funx : C => f (g^-1 x))
(funa : A => (ap f (eissect g a))^) w) = w)
(pglue a) ((funb : B => 1) (f a)) =
(func : C => pglue (g^-1 c) @ ap pushr (eisretr g c))
(g a)
Pushout_rec B idmap (f o g^-1)
(funa : A =>
(ap f (eissect g a))^
:
idmap (f a) = (f o g^-1) (g a)) o pushl' f g ==
idmap
intros c; reflexivity.Defined.(** ** Flattening lemma for pushouts *)(** The flattening lemma for pushouts follows from the flattening lemma for coequalizers. *)SectionFlattening.Context `{Univalence} {A B C} {f : A -> B} {g : A -> C}
(F : B -> Type) (G : C -> Type) (e : foralla, F (f a) <~> G (g a)).Definitionpushout_flatten_fam : Pushout f g -> Type
:= Pushout_rec Type F G (funa => path_universe (e a)).(** In this result, the vertex of the pushout is taken to be [{ a : A & F(f(a))}], the pullback of [F] along [f]. *)
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
{x : _ & pushout_flatten_fam x} <~>
Pushout (functor_sigma f (funa : A => idmap))
(functor_sigma g (funa : A => e a))
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
{x : _ & pushout_flatten_fam x} <~>
Pushout (functor_sigma f (funa : A => idmap))
(functor_sigma g (funa : A => e a))
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
{x : _ &
Pushout_rec Type F G
(funa : A => path_universe (e a)) x} <~>
Pushout (functor_sigma f (funa : A => idmap))
(functor_sigma g (funa : A => e a))
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
Coeq
(functor_sigma (funx : A => inl (f x))
(funa : A => idmap))
(functor_sigma (funx : A => inr (g x))
(funb : A => e b)) <~>
Pushout (functor_sigma f (funa : A => idmap))
(functor_sigma g (funa : A => e a))
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
Coeq
(functor_sigma (funx : A => inl (f x))
(funa : A => idmap))
(functor_sigma (funx : A => inr (g x))
(funb : A => e b)) <~>
Coeq
(funx : {H : A & F (f H)} =>
inl (functor_sigma f (funa : A => idmap) x))
(funx : {H : A & F (f H)} =>
inr (functor_sigma g (funa : A => e a) x))
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
{H : A & sum_rec Type F G (inl (f H))} <~>
{H : A & F (f H)}
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
{x : _ & sum_rec Type F G x} <~>
{x : _ & F x} + {x : _ & G x}
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
?k
o functor_sigma (funx : A => inl (f x))
(funa : A => idmap) ==
(funx : {H : A & F (f H)} =>
inl (functor_sigma f (funa : A => idmap) x)) o ?h
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
?k
o functor_sigma (funx : A => inr (g x))
(funb : A => e b) ==
(funx : {H : A & F (f H)} =>
inr (functor_sigma g (funa : A => e a) x)) o ?h
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
{H : A & sum_rec Type F G (inl (f H))} <~>
{H : A & F (f H)}
reflexivity.
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
{x : _ & sum_rec Type F G x} <~>
{x : _ & F x} + {x : _ & G x}
apply equiv_sigma_sum.
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
equiv_sigma_sum B C (sum_rec Type F G)
o functor_sigma (funx : A => inl (f x))
(funa : A => idmap) ==
(funx : {H : A & F (f H)} =>
inl (functor_sigma f (funa : A => idmap) x))
o 1%equiv
reflexivity.
H: Univalence A, B, C: Type f: A -> B g: A -> C F: B -> Type G: C -> Type e: foralla : A, F (f a) <~> G (g a)
equiv_sigma_sum B C (sum_rec Type F G)
o functor_sigma (funx : A => inr (g x))
(funb : A => e b) ==
(funx : {H : A & F (f H)} =>
inr (functor_sigma g (funa : A => e a) x)) o 1%equiv