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 Basics.Tactics.Require Import Basics.PathGroupoids.Require Import Types.Paths.Require Import Colimits.Coeq.Require Import Cubical.DPath.Require Import WildCat.Core.Require Import WildCat.Displayed.Require Import WildCat.Equiv.Require Import WildCat.EquivGpd.Require Import WildCat.Forall.Require Import WildCat.Paths.Require Import WildCat.ZeroGroupoid.(** Using wild 0-groupoids, the universal property can be proven without funext. A simple equivalence of 0-groupoids between [Coeq f g -> P] and [{ h : A -> P & h o f == h o g }] would not carry all the higher-dimensional information, but if we generalize it to dependent functions, then it does suffice. *)SectionUnivProp.Context {BA : Type} (fg : B -> A) (P : Coeq f g -> Type).(** This allows Coq to infer 0-groupoid structures of the form [@isgraph_forall C P (fun c => isgraph_paths (P c))] on any type of the form [forall c, P c]. *)Local Existing Instances isgraph_forall is01cat_forall is0gpd_forall | 1.Local Existing Instances isgraph_total is01cat_total is0gpd_total | 1.Local Existing Instances isgraph_paths is01cat_paths is0gpd_paths | 2.(** The codomain of the equivalence is a sigma-groupoid of this family. *)DefinitionCoeq_ind_data (h : foralla : A, P (coeq a))
:= forallb : B, DPath P (cglue b) (h (f b)) (h (g b)).(** We consider [Coeq_ind_data] to be a displayed 0-groupoid, where objects over [h : forall a : A, P (coeq a)] are dependent paths as defined above and morphisms over [p : h == k] are witnesses that p commutes with the homotopies over [h] and [k]. *)
B, A: Type f, g: B -> A P: Coeq f g -> Type
IsDGraph Coeq_ind_data
B, A: Type f, g: B -> A P: Coeq f g -> Type
IsDGraph Coeq_ind_data
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: foralla : A, P (coeq a) p: h $-> k r: Coeq_ind_data h s: Coeq_ind_data k
Type
exact (forallb, ap (transport P (cglue b)) (p (f b)) @ s b = r b @ p (g b)).Defined.
B, A: Type f, g: B -> A P: Coeq f g -> Type
IsD01Cat Coeq_ind_data
B, A: Type f, g: B -> A P: Coeq f g -> Type
IsD01Cat Coeq_ind_data
B, A: Type f, g: B -> A P: Coeq f g -> Type
forall (a : foralla : A, P (coeq a))
(a' : Coeq_ind_data a), DHom (Id a) a' a'
B, A: Type f, g: B -> A P: Coeq f g -> Type
forall (a : foralla : A, P (coeq a))
(bc : foralla0 : A, P (coeq a0)) (g0 : b $-> c)
(f0 : a $-> b) (a' : Coeq_ind_data a)
(b' : Coeq_ind_data b) (c' : Coeq_ind_data c),
DHom g0 b' c' ->
DHom f0 a' b' -> DHom (g0 $o f0) a' c'
B, A: Type f, g: B -> A P: Coeq f g -> Type
forall (a : foralla : A, P (coeq a))
(a' : Coeq_ind_data a), DHom (Id a) a' a'
intros h h' b; exact (concat_1p_p1 _).
B, A: Type f, g: B -> A P: Coeq f g -> Type
forall (a : foralla : A, P (coeq a))
(bc : foralla0 : A, P (coeq a0)) (g0 : b $-> c)
(f0 : a $-> b) (a' : Coeq_ind_data a)
(b' : Coeq_ind_data b) (c' : Coeq_ind_data c),
DHom g0 b' c' ->
DHom f0 a' b' -> DHom (g0 $o f0) a' c'
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k, j: foralla : A, P (coeq a) p: k $-> j q: h $-> k h': Coeq_ind_data h k': Coeq_ind_data k j': Coeq_ind_data j p': DHom p k' j' q': DHom q h' k' b: B
ap (transport P (cglue b)) ((p $o q) (f b)) @ j' b =
h' b @ (p $o q) (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k, j: foralla : A, P (coeq a) p: k $-> j q: h $-> k h': Coeq_ind_data h k': Coeq_ind_data k j': Coeq_ind_data j p': DHom p k' j' q': DHom q h' k' b: B
ap (transport P (cglue b)) (q (f b)) @
(ap (transport P (cglue b)) (p (f b)) @ j' b) =
h' b @ (p $o q) (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k, j: foralla : A, P (coeq a) p: k $-> j q: h $-> k h': Coeq_ind_data h k': Coeq_ind_data k j': Coeq_ind_data j p': DHom p k' j' q': DHom q h' k' b: B
ap (transport P (cglue b)) (q (f b)) @
(k' b @ p (g b)) = h' b @ (p $o q) (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k, j: foralla : A, P (coeq a) p: k $-> j q: h $-> k h': Coeq_ind_data h k': Coeq_ind_data k j': Coeq_ind_data j p': DHom p k' j' q': DHom q h' k' b: B
(ap (transport P (cglue b)) (q (f b)) @ k' b) @
p (g b) = h' b @ (p $o q) (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k, j: foralla : A, P (coeq a) p: k $-> j q: h $-> k h': Coeq_ind_data h k': Coeq_ind_data k j': Coeq_ind_data j p': DHom p k' j' q': DHom q h' k' b: B
(h' b @ q (g b)) @ p (g b) = h' b @ (p $o q) (g b)
nrapply concat_pp_p.Defined.
B, A: Type f, g: B -> A P: Coeq f g -> Type
IsD0Gpd Coeq_ind_data
B, A: Type f, g: B -> A P: Coeq f g -> Type
IsD0Gpd Coeq_ind_data
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: foralla : A, P (coeq a) p: h $== k r: Coeq_ind_data h s: Coeq_ind_data k p': DHom p r s b: B
ap (transport P (cglue b)) (p^$ (f b)) @ r b =
s b @ p^$ (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: foralla : A, P (coeq a) p: h $== k r: Coeq_ind_data h s: Coeq_ind_data k p': DHom p r s b: B
(ap (transport P (cglue b)) (p (f b)))^ @ r b =
s b @ p^$ (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: foralla : A, P (coeq a) p: h $== k r: Coeq_ind_data h s: Coeq_ind_data k p': DHom p r s b: B
((ap (transport P (cglue b)) (p (f b)))^ @ r b) @
p (g b) = s b
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: foralla : A, P (coeq a) p: h $== k r: Coeq_ind_data h s: Coeq_ind_data k p': DHom p r s b: B
(ap (transport P (cglue b)) (p (f b)))^ @
(r b @ p (g b)) = s b
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: foralla : A, P (coeq a) p: h $== k r: Coeq_ind_data h s: Coeq_ind_data k p': DHom p r s b: B
(ap (transport P (cglue b)) (p (f b)))^ @
(ap (transport P (cglue b)) (p (f b)) @ s b) = s b
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: foralla : A, P (coeq a) p: h $== k r: Coeq_ind_data h s: Coeq_ind_data k p': DHom p r s b: B
((ap (transport P (cglue b)) (p (f b)))^ @
ap (transport P (cglue b)) (p (f b))) @ s b = s b
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: foralla : A, P (coeq a) p: h $== k r: Coeq_ind_data h s: Coeq_ind_data k p': DHom p r s b: B
1 @ s b = s b
nrapply concat_1p.Defined.(** Here is the functor. The domain is the fully-applied type of [Coeq_ind]: sections of [P] over [Coeq f g]. The codomain consists of input data for [Coeq_ind] given a 0-groupoid structure via [is0gpd_total]. *)
B, A: Type f, g: B -> A P: Coeq f g -> Type
(forallz : Coeq f g, P z) ->
{x : _ & Coeq_ind_data x}
B, A: Type f, g: B -> A P: Coeq f g -> Type
(forallz : Coeq f g, P z) ->
{x : _ & Coeq_ind_data x}
B, A: Type f, g: B -> A P: Coeq f g -> Type h: forallz : Coeq f g, P z
{x : _ & Coeq_ind_data x}
B, A: Type f, g: B -> A P: Coeq f g -> Type h: forallz : Coeq f g, P z
Coeq_ind_data (funx : A => h (coeq x))
B, A: Type f, g: B -> A P: Coeq f g -> Type h: forallz : Coeq f g, P z b: B
DPath P (cglue b) (h (coeq (f b))) (h (coeq (g b)))
exact (apD h (cglue b)).Defined.(** Use [Set Printing Implicit] to see the 0-groupoid structures described above. *)
B, A: Type f, g: B -> A P: Coeq f g -> Type
Is0Functor Coeq_ind_inv
B, A: Type f, g: B -> A P: Coeq f g -> Type
Is0Functor Coeq_ind_inv
B, A: Type f, g: B -> A P: Coeq f g -> Type
forallab : forallz : Coeq f g, P z,
(a $-> b) -> Coeq_ind_inv a $-> Coeq_ind_inv b
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: h $-> k
Coeq_ind_inv h $-> Coeq_ind_inv k
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: h $-> k
DHom (funx : A => p (coeq x)) (Coeq_ind_inv h).2
(Coeq_ind_inv k).2
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: h $-> k b: B
ap (transport P (cglue b)) (p (coeq (f b))) @
(Coeq_ind_inv k).2 b =
(Coeq_ind_inv h).2 b @ p (coeq (g b))
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: h $-> k b: B
(ap (transport P (cglue b)) (p (coeq (f b))) @
(Coeq_ind_inv k).2 b) @ (p (coeq (g b)))^ =
apD h (cglue b)
exact ((apD_homotopic p (cglue b))^).Defined.
B, A: Type f, g: B -> A P: Coeq f g -> Type
IsSurjInj Coeq_ind_inv
B, A: Type f, g: B -> A P: Coeq f g -> Type
IsSurjInj Coeq_ind_inv
B, A: Type f, g: B -> A P: Coeq f g -> Type
SplEssSurj Coeq_ind_inv
B, A: Type f, g: B -> A P: Coeq f g -> Type
forallxy : forallz : Coeq f g, P z,
Coeq_ind_inv x $== Coeq_ind_inv y -> x $== y
B, A: Type f, g: B -> A P: Coeq f g -> Type
SplEssSurj Coeq_ind_inv
B, A: Type f, g: B -> A P: Coeq f g -> Type h: foralla : A, P (coeq a) r: Coeq_ind_data h
{a : forallz : Coeq f g, P z &
Coeq_ind_inv a $== (h; r)}
B, A: Type f, g: B -> A P: Coeq f g -> Type h: foralla : A, P (coeq a) r: Coeq_ind_data h
Coeq_ind_inv (Coeq_ind P h r) $== (h; r)
B, A: Type f, g: B -> A P: Coeq f g -> Type h: foralla : A, P (coeq a) r: Coeq_ind_data h
DHom (funa : A => 1)
(Coeq_ind_inv (Coeq_ind P h r)).2 r
B, A: Type f, g: B -> A P: Coeq f g -> Type h: foralla : A, P (coeq a) r: Coeq_ind_data h b: B
ap (transport P (cglue b)) 1 @ r b =
(Coeq_ind_inv (Coeq_ind P h r)).2 b @ 1
B, A: Type f, g: B -> A P: Coeq f g -> Type h: foralla : A, P (coeq a) r: Coeq_ind_data h b: B
r b = apD (Coeq_ind P h r) (cglue b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h: foralla : A, P (coeq a) r: Coeq_ind_data h b: B
apD (Coeq_ind P h r) (cglue b) = r b
nrapply Coeq_ind_beta_cglue.
B, A: Type f, g: B -> A P: Coeq f g -> Type
forallxy : forallz : Coeq f g, P z,
Coeq_ind_inv x $== Coeq_ind_inv y -> x $== y
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: (Coeq_ind_inv h).1 $-> (Coeq_ind_inv k).1 p': DHom p (Coeq_ind_inv h).2 (Coeq_ind_inv k).2
h $== k
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: (Coeq_ind_inv h).1 $-> (Coeq_ind_inv k).1 p': DHom p (Coeq_ind_inv h).2 (Coeq_ind_inv k).2
foralla : A,
(funw : Coeq f g => h w $-> k w) (coeq a)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: (Coeq_ind_inv h).1 $-> (Coeq_ind_inv k).1 p': DHom p (Coeq_ind_inv h).2 (Coeq_ind_inv k).2
forallb : B,
transport (funw : Coeq f g => h w $-> k w) (cglue b)
(?coeq' (f b)) = ?coeq' (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: (Coeq_ind_inv h).1 $-> (Coeq_ind_inv k).1 p': DHom p (Coeq_ind_inv h).2 (Coeq_ind_inv k).2
forallb : B,
transport (funw : Coeq f g => h w $-> k w) (cglue b)
(p (f b)) = p (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: (Coeq_ind_inv h).1 $-> (Coeq_ind_inv k).1 b: B p': ap (transport P (cglue b)) (p (f b)) @
(Coeq_ind_inv k).2 b =
(Coeq_ind_inv h).2 b @ p (g b)
transport (funw : Coeq f g => h w $-> k w) (cglue b)
(p (f b)) = p (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: (Coeq_ind_inv h).1 $-> (Coeq_ind_inv k).1 b: B p': ap (transport P (cglue b)) (p (f b)) @
(Coeq_ind_inv k).2 b =
(Coeq_ind_inv h).2 b @ p (g b)
((apD h (cglue b))^ @
ap (transport P (cglue b)) (p (f b))) @
apD k (cglue b) = p (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: (Coeq_ind_inv h).1 $-> (Coeq_ind_inv k).1 b: B p': ap (transport P (cglue b)) (p (f b)) @
(Coeq_ind_inv k).2 b =
(Coeq_ind_inv h).2 b @ p (g b)
(apD h (cglue b))^ @
(ap (transport P (cglue b)) (p (f b)) @
apD k (cglue b)) = p (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: (Coeq_ind_inv h).1 $-> (Coeq_ind_inv k).1 b: B p': ap (transport P (cglue b)) (p (f b)) @
(Coeq_ind_inv k).2 b =
(Coeq_ind_inv h).2 b @ p (g b)
(apD h (cglue b))^ @ ((Coeq_ind_inv h).2 b @ p (g b)) =
p (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: (Coeq_ind_inv h).1 $-> (Coeq_ind_inv k).1 b: B p': ap (transport P (cglue b)) (p (f b)) @
(Coeq_ind_inv k).2 b =
(Coeq_ind_inv h).2 b @ p (g b)
((apD h (cglue b))^ @ apD h (cglue b)) @ p (g b) =
p (g b)
B, A: Type f, g: B -> A P: Coeq f g -> Type h, k: forallz : Coeq f g, P z p: (Coeq_ind_inv h).1 $-> (Coeq_ind_inv k).1 b: B p': ap (transport P (cglue b)) (p (f b)) @
(Coeq_ind_inv k).2 b =
(Coeq_ind_inv h).2 b @ p (g b)
1 @ p (g b) = p (g b)
nrapply concat_1p.Defined.
B, A: Type f, g: B -> A P: Coeq f g -> Type
{|
carrier := forallz : Coeq f g, P z;
isgraph_carrier := isgraph_forall (Coeq f g) P;
is01cat_carrier := is01cat_forall (Coeq f g) P;
is0gpd_carrier := is0gpd_forall (Coeq f g) P
|} $<~>
{|
carrier := {x : _ & Coeq_ind_data x};
isgraph_carrier := isgraph_total Coeq_ind_data;
is01cat_carrier := is01cat_total Coeq_ind_data;
is0gpd_carrier := is0gpd_total Coeq_ind_data
|}
B, A: Type f, g: B -> A P: Coeq f g -> Type
{|
carrier := forallz : Coeq f g, P z;
isgraph_carrier := isgraph_forall (Coeq f g) P;
is01cat_carrier := is01cat_forall (Coeq f g) P;
is0gpd_carrier := is0gpd_forall (Coeq f g) P
|} $<~>
{|
carrier := {x : _ & Coeq_ind_data x};
isgraph_carrier := isgraph_total Coeq_ind_data;
is01cat_carrier := is01cat_total Coeq_ind_data;
is0gpd_carrier := is0gpd_total Coeq_ind_data
|}
B, A: Type f, g: B -> A P: Coeq f g -> Type
{|
carrier := forallz : Coeq f g, P z;
isgraph_carrier := isgraph_forall (Coeq f g) P;
is01cat_carrier := is01cat_forall (Coeq f g) P;
is0gpd_carrier := is0gpd_forall (Coeq f g) P
|} $->
{|
carrier := {x : _ & Coeq_ind_data x};
isgraph_carrier := isgraph_total Coeq_ind_data;
is01cat_carrier := is01cat_total Coeq_ind_data;
is0gpd_carrier := is0gpd_total Coeq_ind_data
|}