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.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Pointed.Core Pointed.pSusp.Require Import Colimits.Pushout.Require Import WildCat.Require Import Homotopy.Suspension.Local Set Universe Minimization ToSet.(** * Wedge sums *)LocalOpen Scope pointed_scope.DefinitionWedge (XY : pType) : pType
:= [Pushout (fun_ : Unit => point X) (fun_ => point Y), pushl (point X)].Notation"X \/ Y" := (Wedge X Y) : pointed_scope.
X, Y: pType
X $-> X \/ Y
X, Y: pType
X $-> X \/ Y
X, Y: pType
X -> X \/ Y
X, Y: pType
?Goal pt = pt
X, Y: pType
X -> X \/ Y
exact (funx => pushl x).
X, Y: pType
(funx : X => pushl x) pt = pt
reflexivity.Defined.
X, Y: pType
Y $-> X \/ Y
X, Y: pType
Y $-> X \/ Y
X, Y: pType
Y -> X \/ Y
X, Y: pType
?Goal pt = pt
X, Y: pType
Y -> X \/ Y
exact (funx => pushr x).
X, Y: pType
(funx : Y => pushr x) pt = pt
X, Y: pType
pt = (funx : Y => pushr x) pt
by rapply pglue.Defined.Definitionwglue {XY : pType}
: pushl (point X) = (pushr (point Y)) :> (X \/ Y) := pglue tt.(** Wedge recursion into an unpointed type. *)
X, Y: pType Z: Type f: X -> Z g: Y -> Z w: f pt = g pt
X \/ Y -> Z
X, Y: pType Z: Type f: X -> Z g: Y -> Z w: f pt = g pt
X \/ Y -> Z
X, Y: pType Z: Type f: X -> Z g: Y -> Z w: f pt = g pt
X -> Z
X, Y: pType Z: Type f: X -> Z g: Y -> Z w: f pt = g pt
Y -> Z
X, Y: pType Z: Type f: X -> Z g: Y -> Z w: f pt = g pt
foralla : Unit,
?pushb (unit_name pt a) = ?pushc (unit_name pt a)
X, Y: pType Z: Type f: X -> Z g: Y -> Z w: f pt = g pt
X -> Z
exact f.
X, Y: pType Z: Type f: X -> Z g: Y -> Z w: f pt = g pt
Y -> Z
exact g.
X, Y: pType Z: Type f: X -> Z g: Y -> Z w: f pt = g pt
foralla : Unit,
f (unit_name pt a) = g (unit_name pt a)
X, Y: pType Z: Type f: X -> Z g: Y -> Z w: f pt = g pt a: Unit
f (unit_name pt a) = g (unit_name pt a)
exact w.Defined.
X, Y, Z: pType f: X $-> Z g: Y $-> Z
X \/ Y $-> Z
X, Y, Z: pType f: X $-> Z g: Y $-> Z
X \/ Y $-> Z
X, Y, Z: pType f: X $-> Z g: Y $-> Z
X \/ Y -> Z
X, Y, Z: pType f: X $-> Z g: Y $-> Z
?Goal pt = pt
X, Y, Z: pType f: X $-> Z g: Y $-> Z
X \/ Y -> Z
X, Y, Z: pType f: X $-> Z g: Y $-> Z
f pt = g pt
exact (point_eq f @ (point_eq g)^).
X, Y, Z: pType f: X $-> Z g: Y $-> Z
wedge_rec' f g (point_eq f @ (point_eq g)^) pt = pt
exact (point_eq f).Defined.Definitionwedge_rec_beta_wglue {XYZ : pType} (f : X $-> Z) (g : Y $-> Z)
: ap (wedge_rec f g) wglue = point_eq f @ (point_eq g)^
:= Pushout_rec_beta_pglue _ f g _ tt.Definitionwedge_pr1 {XY : pType} : X \/ Y $-> X
:= wedge_rec pmap_idmap pconst.Definitionwedge_pr2 {XY : pType} : X \/ Y $-> Y
:= wedge_rec pconst pmap_idmap.Definitionwedge_incl (XY : pType) : X \/ Y $-> X * Y
:= pprod_corec _ wedge_pr1 wedge_pr2.
X, Y: pType
ap (wedge_incl X Y) wglue = 1
X, Y: pType
ap (wedge_incl X Y) wglue = 1
X, Y: pType
path_prod (wedge_incl X Y (pushl pt))
(wedge_incl X Y (pushr pt))
(ap fst (ap (wedge_incl X Y) wglue))
(ap snd (ap (wedge_incl X Y) wglue)) = 1
X, Y: pType
ap snd (ap (wedge_incl X Y) wglue) = ?Goal0
X, Y: pType
ap fst (ap (wedge_incl X Y) wglue) = ?Goal
X, Y: pType
path_prod (wedge_incl X Y (pushl pt))
(wedge_incl X Y (pushr pt)) ?Goal?Goal0 = 1
X, Y: pType
ap snd (ap (wedge_incl X Y) wglue) = ?Goal0
X, Y: pType
ap
(funx : Pushout (unit_name pt) (unit_name pt) =>
snd (wedge_incl X Y x)) wglue = ?Goal0
nrapply wedge_rec_beta_wglue.
X, Y: pType
ap fst (ap (wedge_incl X Y) wglue) = ?Goal
X, Y: pType
ap
(funx : Pushout (unit_name pt) (unit_name pt) =>
fst (wedge_incl X Y x)) wglue = ?Goal
nrapply wedge_rec_beta_wglue.
X, Y: pType
path_prod (wedge_incl X Y (pushl pt))
(wedge_incl X Y (pushr pt))
(point_eq pmap_idmap @ (point_eq pconst)^)
(point_eq pconst @ (point_eq pmap_idmap)^) = 1
reflexivity.Defined.(** 1-universal property of wedge. *)
X, Y, Z: pType f, g: X \/ Y $-> Z
f $o wedge_inl $== g $o wedge_inl ->
f $o wedge_inr $== g $o wedge_inr -> f $== g
X, Y, Z: pType f, g: X \/ Y $-> Z
f $o wedge_inl $== g $o wedge_inl ->
f $o wedge_inr $== g $o wedge_inr -> f $== g
X, Y, Z: pType f, g: X \/ Y $-> Z p: f $o wedge_inl $== g $o wedge_inl q: f $o wedge_inr $== g $o wedge_inr
f $== g
X, Y, Z: pType f, g: X \/ Y $-> Z p: f $o wedge_inl $== g $o wedge_inl q: f $o wedge_inr $== g $o wedge_inr
f == g
X, Y, Z: pType f, g: X \/ Y $-> Z p: f $o wedge_inl $== g $o wedge_inl q: f $o wedge_inr $== g $o wedge_inr
?p pt = dpoint_eq f @ (dpoint_eq g)^
X, Y, Z: pType f, g: X \/ Y $-> Z p: f $o wedge_inl $== g $o wedge_inl q: f $o wedge_inr $== g $o wedge_inr
f == g
X, Y, Z: pType f, g: X \/ Y $-> Z p: f $o wedge_inl $== g $o wedge_inl q: f $o wedge_inr $== g $o wedge_inr
foralla : Unit,
transport
(funw : Pushout (unit_name pt) (unit_name pt) =>
f w = g w) (pglue a) (p (unit_name pt a)) =
q (unit_name pt a)
X, Y, Z: pType f, g: X \/ Y $-> Z p: f $o wedge_inl $== g $o wedge_inl q: f $o wedge_inr $== g $o wedge_inr
transport
(funw : Pushout (unit_name pt) (unit_name pt) =>
f w = g w) (pglue tt) (p pt) = q pt
X, Y, Z: pType f, g: X \/ Y $-> Z p: f $o wedge_inl $== g $o wedge_inl q: f $o wedge_inr $== g $o wedge_inr
ap f (pglue tt) @ q pt = p pt @ ap g (pglue tt)
X, Y, Z: pType f, g: X \/ Y $-> Z p: f $o wedge_inl $== g $o wedge_inl q: f $o wedge_inr $== g $o wedge_inr
ap f (pglue tt) @
dpoint
(pfam_phomotopy (f $o wedge_inr) (g $o wedge_inr)) =
p pt @ ap g (pglue tt)
X, Y, Z: pType f, g: X \/ Y $-> Z p: f $o wedge_inl $== g $o wedge_inl q: f $o wedge_inr $== g $o wedge_inr
ap f (pglue tt) @
dpoint
(pfam_phomotopy (f $o wedge_inr) (g $o wedge_inr)) =
dpoint
(pfam_phomotopy (f $o wedge_inl) (g $o wedge_inl)) @
ap g (pglue tt)
X, Y, Z: pType f, g: X \/ Y $-> Z
ap f (pglue tt) @
dpoint
(pfam_phomotopy (f $o wedge_inr) (g $o wedge_inr)) =
dpoint
(pfam_phomotopy (f $o wedge_inl) (g $o wedge_inl)) @
ap g (pglue tt)
X, Y, Z: pType f, g: X \/ Y $-> Z
(ap f (pglue tt) @ dpoint_eq (f $o wedge_inr)) @
(dpoint_eq (g $o wedge_inr))^ =
dpoint
(pfam_phomotopy (f $o wedge_inl) (g $o wedge_inl)) @
ap g (pglue tt)
X, Y, Z: pType f, g: X \/ Y $-> Z
(ap f (pglue tt) @ (ap f (pglue tt)^ @ point_eq f)) @
(ap g (pglue tt)^ @ point_eq g)^ =
((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)
X, Y, Z: pType f, g: X \/ Y $-> Z
ap f (pglue tt) @ (ap f (pglue tt)^ @ point_eq f) =
(((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ (ap g (pglue tt)^ @ point_eq g)
X, Y, Z: pType f, g: X \/ Y $-> Z
ap f (pglue tt)^ @ point_eq f = ?Goal
X, Y, Z: pType f, g: X \/ Y $-> Z
ap f (pglue tt) @ ?Goal =
(((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ (ap g (pglue tt)^ @ point_eq g)
X, Y, Z: pType f, g: X \/ Y $-> Z
ap f (pglue tt)^ @ point_eq f = ?Goal
X, Y, Z: pType f, g: X \/ Y $-> Z
ap f (pglue tt)^ = ?Goal0
apply ap_V.
X, Y, Z: pType f, g: X \/ Y $-> Z
ap f (pglue tt) @ ((ap f (pglue tt))^ @ point_eq f) =
(((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ (ap g (pglue tt)^ @ point_eq g)
X, Y, Z: pType f, g: X \/ Y $-> Z
(ap f (pglue tt) @ (ap f (pglue tt))^) @ point_eq f =
(((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ (ap g (pglue tt)^ @ point_eq g)
X, Y, Z: pType f, g: X \/ Y $-> Z
ap f (pglue tt) @ (ap f (pglue tt))^ = ?Goal
X, Y, Z: pType f, g: X \/ Y $-> Z
?Goal @ point_eq f =
(((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ (ap g (pglue tt)^ @ point_eq g)
X, Y, Z: pType f, g: X \/ Y $-> Z
1 @ point_eq f =
(((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ (ap g (pglue tt)^ @ point_eq g)
X, Y, Z: pType f, g: X \/ Y $-> Z
1 @ point_eq f =
((((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ ap g (pglue tt)^) @ point_eq g
X, Y, Z: pType f, g: X \/ Y $-> Z
(1 @ point_eq f) @ (point_eq g)^ =
(((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ ap g (pglue tt)^
X, Y, Z: pType f, g: X \/ Y $-> Z
((1 @ point_eq f) @ (point_eq g)^) @ 1 =
(((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ ap g (pglue tt)^
X, Y, Z: pType f, g: X \/ Y $-> Z
(1 @ point_eq f) @ ((point_eq g)^ @ 1) =
(((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ ap g (pglue tt)^
X, Y, Z: pType f, g: X \/ Y $-> Z
?Goal = (point_eq g)^ @ 1
X, Y, Z: pType f, g: X \/ Y $-> Z
(1 @ point_eq f) @ ?Goal =
(((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ ap g (pglue tt)^
X, Y, Z: pType f, g: X \/ Y $-> Z
(1 @ point_eq f) @ (1 @ point_eq g)^ =
(((1 @ point_eq f) @ (1 @ point_eq g)^) @
ap g (pglue tt)) @ ap g (pglue tt)^
exact (inverse2 (wedge_rec_beta_wglue pconst pmap_idmap)^).Defined.(** Wedge of an indexed family of pointed types *)(** Note that the index type is not necessarily pointed. An empty wedge is the unit type which is the zero object in the category of pointed types. *)
I: Type X: I -> pType
pType
I: Type X: I -> pType
pType
I: Type X: I -> pType
Type
I: Type X: I -> pType
IsPointed ?pointed_type
I: Type X: I -> pType
Type
I: Type X: I -> pType
I -> {x : I & X x}
I: Type X: I -> pType
I -> pUnit
I: Type X: I -> pType
I -> {x : I & X x}
exact (funi => (i; pt)).
I: Type X: I -> pType
I -> pUnit
exact (fun_ => pt).
I: Type X: I -> pType
IsPointed
(Pushout (funi : I => (i; pt)) (fun_ : I => pt))
I: Type X: I -> pType
pUnit
exact pt.Defined.Definitionfwedge_in' (I : Type) (X : I -> pType)
: foralli, X i $-> FamilyWedge I X
:= funi => Build_pMap _ _ (funx => pushl (i; x)) (pglue i).(** We have an inclusion map [pushl : sig X -> FamilyWedge X]. When [I] is pointed, so is [sig X], and then this inclusion map is pointed. *)Definitionfwedge_in (I : pType) (X : I -> pType)
: psigma (pointed_fam X) $-> FamilyWedge I X
:= Build_pMap _ _ pushl (pglue pt).(** Recursion principle for the wedge of an indexed family of pointed types. *)
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
FamilyWedge I X $-> Z
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
FamilyWedge I X $-> Z
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
FamilyWedge I X -> Z
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
?Goal pt = pt
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
FamilyWedge I X -> Z
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
{x : I & X x} -> Z
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
pUnit -> Z
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
foralla : I,
?pushb ((funi : I => (i; pt)) a) =
?pushc ((fun_ : I => pt) a)
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
{x : I & X x} -> Z
apply (sig_rec _ _ _ f).
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
pUnit -> Z
exact pconst.
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
foralla : I,
sig_rec I (funi : I => X i) Z (funi : I => f i)
((funi : I => (i; pt)) a) =
pconst ((fun_ : I => pt) a)
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z i: I
sig_rec I (funi : I => X i) Z (funi : I => f i)
((funi : I => (i; pt)) i) =
pconst ((fun_ : I => pt) i)
exact (point_eq (f i)).
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z
Pushout_rec Z
(sig_rec I (funi : I => X i) Z (funi : I => f i))
pconst (funi : I => point_eq (f i)) pt = pt
exact idpath.Defined.(** We specify a universe variable here to prevent minimization to [Set]. *)
HasAllCoproducts pType
HasAllCoproducts pType
I: Type X: I -> pType
Coproduct I X
I: Type X: I -> pType
pType
I: Type X: I -> pType
foralli : I, X i $-> ?cat_coprod
I: Type X: I -> pType
forallz : pType,
(foralli : I, X i $-> z) -> ?cat_coprod $-> z
I: Type X: I -> pType
forall (z : pType) (f : foralli : I, X i $-> z)
(i : I), ?cat_coprod_rec z f $o ?cat_in i $== f i
I: Type X: I -> pType
forall (z : pType) (fg : ?cat_coprod $-> z),
(foralli : I, f $o ?cat_in i $== g $o ?cat_in i) ->
f $== g
I: Type X: I -> pType
pType
exact (FamilyWedge I X).
I: Type X: I -> pType
foralli : I, X i $-> FamilyWedge I X
exact (fwedge_in' I X).
I: Type X: I -> pType
forallz : pType,
(foralli : I, X i $-> z) -> FamilyWedge I X $-> z
exact (fwedge_rec I X).
I: Type X: I -> pType
forall (z : pType) (f : foralli : I, X i $-> z)
(i : I),
fwedge_rec I X z f $o fwedge_in' I X i $== f i
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z i: I
fwedge_rec I X Z f $o fwedge_in' I X i $== f i
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z i: I
fwedge_rec I X Z f $o fwedge_in' I X i == f i
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z i: I
?p pt =
dpoint_eq (fwedge_rec I X Z f $o fwedge_in' I X i) @
(dpoint_eq (f i))^
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z i: I
(funx0 : X i => 1) pt =
dpoint_eq (fwedge_rec I X Z f $o fwedge_in' I X i) @
(dpoint_eq (f i))^
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z i: I
1 =
(ap
(Pushout_rec Z
(sig_rec I (funi : I => X i) Z
(funi : I => f i)) (unit_name pt)
(funi : I => point_eq (f i))) (pglue i) @ 1) @
(dpoint_eq (f i))^
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z i: I
1 @ dpoint_eq (f i) =
ap
(Pushout_rec Z
(sig_rec I (funi : I => X i) Z
(funi : I => f i)) (unit_name pt)
(funi : I => point_eq (f i))) (pglue i) @ 1
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z i: I
dpoint_eq (f i) =
ap
(Pushout_rec Z
(sig_rec I (funi : I => X i) Z
(funi : I => f i)) (unit_name pt)
(funi : I => point_eq (f i))) (pglue i)
I: Type X: I -> pType Z: pType f: foralli : I, X i $-> Z i: I
ap
(Pushout_rec Z
(sig_rec I (funi : I => X i) Z
(funi : I => f i)) (unit_name pt)
(funi : I => point_eq (f i))) (pglue i) =
dpoint_eq (f i)
forall (z : pType) (fg : FamilyWedge I X $-> z),
(foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i) ->
f $== g
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
f $== g
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
f == g
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
?p pt = dpoint_eq f @ (dpoint_eq g)^
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
f == g
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
forallb : {x : I & X x},
(funw : Pushout (funi : I => (i; pt))
(fun_ : I => pt) => f w = g w) (pushl b)
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
forallc : pUnit,
(funw : Pushout (funi : I => (i; pt))
(fun_ : I => pt) => f w = g w) (pushr c)
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
foralla : I,
transport
(funw : Pushout (funi : I => (i; pt))
(fun_ : I => pt) => f w = g w) (pglue a)
(?pushb ((funi : I => (i; pt)) a)) =
?pushc ((fun_ : I => pt) a)
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
forallb : {x : I & X x},
(funw : Pushout (funi : I => (i; pt))
(fun_ : I => pt) => f w = g w) (pushl b)
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i i: I x: X i
f (pushl (i; x)) = g (pushl (i; x))
nrapply h.
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
forallc : pUnit,
(funw : Pushout (funi : I => (i; pt))
(fun_ : I => pt) => f w = g w) (pushr c)
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
f (pushr tt) = g (pushr tt)
exact (point_eq _ @ (point_eq _)^).
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
foralla : I,
transport
(funw : Pushout (funi : I => (i; pt))
(fun_ : I => pt) => f w = g w) (pglue a)
((funb : {x : I & X x} =>
(fun (i : I) (x : X i) => h i x) b.1 b.2)
((funi : I => (i; pt)) a)) =
(func : pUnit =>
match c as u return (f (pushr u) = g (pushr u)) with
| tt => point_eq f @ (point_eq g)^
end) ((fun_ : I => pt) a)
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i i: I
transport
(funw : Pushout (funi : I => (i; pt))
(fun_ : I => pt) => f w = g w) (pglue i)
(h i pt) = point_eq f @ (point_eq g)^
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i i: I
ap f (pglue i) @ (point_eq f @ (point_eq g)^) =
h i pt @ ap g (pglue i)
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i i: I
(ap f (pglue i) @ point_eq f) @ (point_eq g)^ =
h i pt @ ap g (pglue i)
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i i: I
ap f (pglue i) @ point_eq f =
(h i pt @ ap g (pglue i)) @ point_eq g
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i i: I
ap f (pglue i) @ point_eq f =
h i pt @ (ap g (pglue i) @ point_eq g)
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i i: I
(ap f (pglue i) @ point_eq f) @
(ap g (pglue i) @ point_eq g)^ = h i pt
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i i: I
h i pt =
(ap f (pglue i) @ point_eq f) @
(ap g (pglue i) @ point_eq g)^
exact (dpoint_eq (h i)).
I: Type X: I -> pType Z: pType f, g: FamilyWedge I X $-> Z h: foralli : I,
f $o fwedge_in' I X i $== g $o fwedge_in' I X i
Pushout_ind
(funw : Pushout (funi : I => (i; pt))
(fun_ : I => pt) => f w = g w)
(funb : {x : I & X x} =>
(fun (i : I) (x : X i) => h i x) b.1 b.2)
(func : pUnit =>
match
c as u return (f (pushr u) = g (pushr u))
with
| tt => point_eq f @ (point_eq g)^
end)
(funi : I =>
transport_paths_FlFr' (pglue i) (h i pt)
(point_eq f @ (point_eq g)^)
(concat_p_pp (ap f (pglue i)) (point_eq f)
(point_eq g)^ @
moveR_pV (point_eq g) (h i pt @ ap g (pglue i))
(ap f (pglue i) @ point_eq f)
(moveL_pM (ap g (pglue i) @ point_eq g)
(ap f (pglue i) @ point_eq f) (h i pt)
(dpoint_eq (h i))^ @
(concat_pp_p (h i pt) (ap g (pglue i))
(point_eq g))^))
:
transport
(funw : Pushout (funi0 : I => (i0; pt))
(fun_ : I => pt) => f w = g w)
(pglue i)
((funb : {x : I & X x} =>
(fun (i0 : I) (x : X i0) => h i0 x) b.1 b.2)
((funi0 : I => (i0; pt)) i)) =
(func : pUnit =>
match
c as u return (f (pushr u) = g (pushr u))
with
| tt => point_eq f @ (point_eq g)^
end) ((fun_ : I => pt) i)) pt =
dpoint_eq f @ (dpoint_eq g)^
reflexivity.Defined.(** Wedge inclusions into the product can be defined if the indexing type has decidable paths. This is because we need to choose which factor a given wedge summand should land in. *)Definitionfwedge_incl `{Funext} (I : Type) `(DecidablePaths I) (X : I -> pType)
: FamilyWedge I X $-> pproduct X
:= cat_coprod_prod X.(** ** The pinch map on the suspension *)(** Given a suspension, there is a natural map from the suspension to the wedge of the suspension with itself. This is known as the pinch map.This is the image to keep in mind:<< * /|\ / | \ Susp X / | \ / | \ * * merid(x)* /|\ \ | / / | \ \ | / / | \ \ | / / | \ Pinch \|/ * merid(x)* ----------> * \ | / /|\ \ | / / | \ \ | / / | \ \|/ / | \ * * merid(x)* \ | / \ | / \ | / \|/ *>>Note that this is only a conceptual picture as we aren't working with "reduced suspensions". This means we have to track back along [merid pt] making this map a little trickier to imagine. *)(** The pinch map for a suspension. *)
X: pType
psusp X $-> psusp X \/ psusp X
X: pType
psusp X $-> psusp X \/ psusp X
X: pType
X -> pt = pt
X: pType x: X
pt = pt
X: pType x: X
pt = pt
X: pType x: X
pt = pt
1,2: exact (loop_susp_unit X x).Defined.(** It should compute when [ap]ed on a merid. *)
X: pType x: X
ap (psusp_pinch X) (merid x) =
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) @ wglue^
X: pType x: X
ap (psusp_pinch X) (merid x) =
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) @ wglue^
rapply Susp_rec_beta_merid.Defined.(** Doing wedge projections on the pinch map gives the identity. *)
(wedge_pr1 $o psusp_pinch X) North =
Id (psusp X) North
X: pType
(wedge_pr1 $o psusp_pinch X) South =
Id (psusp X) South
X: pType
forallx : X,
ap (wedge_pr1 $o psusp_pinch X) (merid x) @ ?HS =
?HN @ ap (Id (psusp X)) (merid x)
X: pType
(wedge_pr1 $o psusp_pinch X) North =
Id (psusp X) North
reflexivity.
X: pType
(wedge_pr1 $o psusp_pinch X) South =
Id (psusp X) South
exact (merid pt).
X: pType
forallx : X,
ap (wedge_pr1 $o psusp_pinch X) (merid x) @ merid pt =
1 @ ap (Id (psusp X)) (merid x)
X: pType x: X
ap (wedge_pr1 $o psusp_pinch X) (merid x) @ merid pt =
1 @ ap (Id (psusp X)) (merid x)
X: pType x: X
ap (wedge_pr1 $o psusp_pinch X) (merid x) @ merid pt =
ap (Id (psusp X)) (merid x)
X: pType x: X
ap (wedge_pr1 $o psusp_pinch X) (merid x) @ merid pt =
merid x
X: pType x: X
ap (wedge_pr1 $o psusp_pinch X) (merid x) =
merid x @ (merid pt)^
X: pType x: X
ap (wedge_pr1 $o psusp_pinch X) (merid x) =
loop_susp_unit X x
X: pType x: X
ap wedge_pr1 (ap (psusp_pinch X) (merid x)) =
loop_susp_unit X x
X: pType x: X
ap wedge_pr1
(((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) @ wglue^) =
loop_susp_unit X x
X: pType x: X
ap wedge_pr1
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) @
ap wedge_pr1 wglue^ = loop_susp_unit X x
X: pType x: X
ap wedge_pr1
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) @
(ap wedge_pr1 wglue)^ = loop_susp_unit X x
X: pType x: X
ap wedge_pr1
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) =
loop_susp_unit X x @ ap wedge_pr1 wglue
X: pType x: X
ap wedge_pr1
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) =
loop_susp_unit X x @
(point_eq pmap_idmap @ (point_eq pconst)^)
X: pType x: X
ap wedge_pr1
(ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_pr1 (ap wedge_inr (loop_susp_unit X x)) =
loop_susp_unit X x @
(point_eq pmap_idmap @ (point_eq pconst)^)
X: pType x: X
ap wedge_pr1 (ap wedge_inr (loop_susp_unit X x)) =
?Goal
X: pType x: X
ap wedge_pr1
(ap wedge_inl (loop_susp_unit X x) @ wglue) @ ?Goal =
loop_susp_unit X x @
(point_eq pmap_idmap @ (point_eq pconst)^)
X: pType x: X
ap wedge_pr1 (ap wedge_inr (loop_susp_unit X x)) =
?Goal
X: pType x: X
ap (funx : psusp X => wedge_pr1 (pushr x))
(loop_susp_unit X x) = ?Goal
apply ap_const.
X: pType x: X
ap wedge_pr1
(ap wedge_inl (loop_susp_unit X x) @ wglue) @ 1 =
loop_susp_unit X x @
(point_eq pmap_idmap @ (point_eq pconst)^)
X: pType x: X
ap wedge_pr1
(ap wedge_inl (loop_susp_unit X x) @ wglue) =
loop_susp_unit X x @
(point_eq pmap_idmap @ (point_eq pconst)^)
X: pType x: X
ap wedge_pr1 (ap wedge_inl (loop_susp_unit X x)) @
ap wedge_pr1 wglue =
loop_susp_unit X x @
(point_eq pmap_idmap @ (point_eq pconst)^)
X: pType x: X
ap wedge_pr1 (ap wedge_inl (loop_susp_unit X x)) @
(point_eq pmap_idmap @ (point_eq pconst)^) =
loop_susp_unit X x @
(point_eq pmap_idmap @ (point_eq pconst)^)
X: pType x: X
ap wedge_pr1 (ap wedge_inl (loop_susp_unit X x)) =
loop_susp_unit X x
X: pType x: X
ap (funx : psusp X => wedge_pr1 (wedge_inl x))
(loop_susp_unit X x) = loop_susp_unit X x
apply ap_idmap.
X: pType
Susp_ind_FlFr (wedge_pr1 $o psusp_pinch X)
(Id (psusp X)) 1 (merid pt)
(funx : X =>
(moveR_pM (merid pt) (merid x)
(ap (wedge_pr1 $o psusp_pinch X) (merid x))
(ap_compose (psusp_pinch X) wedge_pr1 (merid x) @
(ap (ap wedge_pr1) (psusp_pinch_beta_merid x) @
(ap_pp wedge_pr1
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) wglue^ @
(ap
(funx0 : wedge_pr1 (wedge_inr pt) =
wedge_pr1 (psusp_pinch X South) =>
ap wedge_pr1
((ap wedge_inl (...) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) @
x0) (ap_V wedge_pr1 wglue) @
moveR_pV (ap wedge_pr1 wglue)
(loop_susp_unit X x)
(ap wedge_pr1
((ap wedge_inl (loop_susp_unit X x) @
wglue) @
ap wedge_inr (loop_susp_unit X x)))
((ap_pp wedge_pr1
(ap wedge_inl (loop_susp_unit X x) @
wglue)
(ap wedge_inr (loop_susp_unit X x)) @
(ap (fun ... => ... @ x0)
((...)^ @ ap_const ... ...) @
(concat_p1 (...) @ (... @ ...)))) @
(whiskerL (loop_susp_unit X x)
(wedge_rec_beta_wglue pmap_idmap
pconst))^))))) @
(ap_idmap (merid x))^) @
(concat_1p (ap (Id (psusp X)) (merid x)))^) pt =
dpoint_eq (wedge_pr1 $o psusp_pinch X) @
(dpoint_eq (Id (psusp X)))^
(wedge_pr2 $o psusp_pinch X) North =
Id (psusp X) North
X: pType
(wedge_pr2 $o psusp_pinch X) South =
Id (psusp X) South
X: pType
forallx : X,
ap (wedge_pr2 $o psusp_pinch X) (merid x) @ ?HS =
?HN @ ap (Id (psusp X)) (merid x)
X: pType
(wedge_pr2 $o psusp_pinch X) North =
Id (psusp X) North
reflexivity.
X: pType
(wedge_pr2 $o psusp_pinch X) South =
Id (psusp X) South
exact (merid pt).
X: pType
forallx : X,
ap (wedge_pr2 $o psusp_pinch X) (merid x) @ merid pt =
1 @ ap (Id (psusp X)) (merid x)
X: pType x: X
ap (wedge_pr2 $o psusp_pinch X) (merid x) @ merid pt =
1 @ ap (Id (psusp X)) (merid x)
X: pType x: X
ap (wedge_pr2 $o psusp_pinch X) (merid x) @ merid pt =
ap (Id (psusp X)) (merid x)
X: pType x: X
ap (wedge_pr2 $o psusp_pinch X) (merid x) @ merid pt =
merid x
X: pType x: X
ap (wedge_pr2 $o psusp_pinch X) (merid x) =
merid x @ (merid pt)^
X: pType x: X
ap (wedge_pr2 $o psusp_pinch X) (merid x) =
loop_susp_unit X x
X: pType x: X
ap wedge_pr2 (ap (psusp_pinch X) (merid x)) =
loop_susp_unit X x
X: pType x: X
ap wedge_pr2
(((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) @ wglue^) =
loop_susp_unit X x
X: pType x: X
ap wedge_pr2
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) @
ap wedge_pr2 wglue^ = loop_susp_unit X x
X: pType x: X
ap wedge_pr2
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) @
(ap wedge_pr2 wglue)^ = loop_susp_unit X x
X: pType x: X
ap wedge_pr2
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) =
loop_susp_unit X x @ ap wedge_pr2 wglue
X: pType x: X
ap wedge_pr2
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) =
loop_susp_unit X x @
(point_eq pconst @ (point_eq pmap_idmap)^)
X: pType x: X
ap wedge_pr2
(ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_pr2 (ap wedge_inr (loop_susp_unit X x)) =
loop_susp_unit X x @
(point_eq pconst @ (point_eq pmap_idmap)^)
X: pType x: X
ap wedge_pr2 (ap wedge_inr (loop_susp_unit X x)) =
?Goal
X: pType x: X
ap wedge_pr2
(ap wedge_inl (loop_susp_unit X x) @ wglue) @ ?Goal =
loop_susp_unit X x @
(point_eq pconst @ (point_eq pmap_idmap)^)
X: pType x: X
ap wedge_pr2 (ap wedge_inr (loop_susp_unit X x)) =
?Goal
X: pType x: X
ap (funx : psusp X => wedge_pr2 (pushr x))
(loop_susp_unit X x) = ?Goal
apply ap_idmap.
X: pType x: X
ap wedge_pr2
(ap wedge_inl (loop_susp_unit X x) @ wglue) @
loop_susp_unit X x =
loop_susp_unit X x @
(point_eq pconst @ (point_eq pmap_idmap)^)
X: pType x: X
ap wedge_pr2
(ap wedge_inl (loop_susp_unit X x) @ wglue) @
loop_susp_unit X x = loop_susp_unit X x
X: pType x: X
ap wedge_pr2
(ap wedge_inl (loop_susp_unit X x) @ wglue) =
loop_susp_unit X x @ (loop_susp_unit X x)^
X: pType x: X
ap wedge_pr2 (ap wedge_inl (loop_susp_unit X x)) @
ap wedge_pr2 wglue =
loop_susp_unit X x @ (loop_susp_unit X x)^
X: pType x: X
ap wedge_pr2 (ap wedge_inl (loop_susp_unit X x)) @
ap wedge_pr2 wglue = 1
X: pType x: X
ap wedge_pr2 (ap wedge_inl (loop_susp_unit X x)) @
(point_eq pconst @ (point_eq pmap_idmap)^) = 1
X: pType x: X
ap wedge_pr2 (ap wedge_inl (loop_susp_unit X x)) =
1 @ (point_eq pconst @ (point_eq pmap_idmap)^)^
X: pType x: X
ap (funx : psusp X => wedge_pr2 (wedge_inl x))
(loop_susp_unit X x) =
1 @ (point_eq pconst @ (point_eq pmap_idmap)^)^
rapply ap_const.
X: pType
Susp_ind_FlFr (wedge_pr2 $o psusp_pinch X)
(Id (psusp X)) 1 (merid pt)
(funx : X =>
(moveR_pM (merid pt) (merid x)
(ap (wedge_pr2 $o psusp_pinch X) (merid x))
(ap_compose (psusp_pinch X) wedge_pr2 (merid x) @
(ap (ap wedge_pr2) (psusp_pinch_beta_merid x) @
(ap_pp wedge_pr2
((ap wedge_inl (loop_susp_unit X x) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) wglue^ @
(ap
(funx0 : wedge_pr2 (wedge_inr pt) =
wedge_pr2 (psusp_pinch X South) =>
ap wedge_pr2
((ap wedge_inl (...) @ wglue) @
ap wedge_inr (loop_susp_unit X x)) @
x0) (ap_V wedge_pr2 wglue) @
moveR_pV (ap wedge_pr2 wglue)
(loop_susp_unit X x)
(ap wedge_pr2
((ap wedge_inl (loop_susp_unit X x) @
wglue) @
ap wedge_inr (loop_susp_unit X x)))
((ap_pp wedge_pr2
(ap wedge_inl (loop_susp_unit X x) @
wglue)
(ap wedge_inr (loop_susp_unit X x)) @
(ap (fun ... => ... @ x0)
((...)^ @ ap_idmap ...) @
(moveR_pM (...) (...) (...) (...) @
(concat_p1 ...)^))) @
(whiskerL (loop_susp_unit X x)
(wedge_rec_beta_wglue pconst
pmap_idmap))^))))) @
(ap_idmap (merid x))^) @
(concat_1p (ap (Id (psusp X)) (merid x)))^) pt =
dpoint_eq (wedge_pr2 $o psusp_pinch X) @
(dpoint_eq (Id (psusp X)))^