Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
From HoTT.WildCat Require Import Core Equiv EquivGpd Prod UnitCat
Forall Graph Induced FunctorCat.(** * The wild 1-category of 0-groupoids. *)(** Here we define a wild 1-category structure on the type of 0-groupoids. We think of the 1-cells [g $== h] in a 0-groupoid [G] as a substitute for the paths [g = h], and so we closely follow the definitions used for the 1-category of types with [=] replaced by [$==]. In fact, the 1-category structure on types should be the pullback of the 1-category structure on 0-groupoids along a natural map [Type -> ZeroGpd] which sends [A] to [A] equipped with its path types. A second motivating example is the 0-groupoid with underlying type [A -> B] and homotopies as the 1-cells. The definitions chosen here exactly make the Yoneda lemma [opyon_equiv_0gpd] go through. *)RecordZeroGpd := {
carrier :> Type;
isgraph_carrier :: IsGraph carrier;
is01cat_carrier :: Is01Cat carrier;
is0gpd_carrier :: Is0Gpd carrier;
}.Definitionzerogpd_graph (C : ZeroGpd) : Graph := {|
graph_carrier := carrier C;
isgraph_graph_carrier := isgraph_carrier C
|}.Instanceisgraph_0gpd : IsGraph ZeroGpd := isgraph_induced zerogpd_graph.Instanceis01cat_0gpd : Is01Cat ZeroGpd := is01cat_induced zerogpd_graph.Instanceis2graph_0gpd : Is2Graph ZeroGpd := is2graph_induced zerogpd_graph.
Is1Cat ZeroGpd
Is1Cat ZeroGpd
forallab : ZeroGpd, Is01Cat (a $-> b)
forallab : ZeroGpd, Is0Gpd (a $-> b)
forall (abc : ZeroGpd) (g : b $-> c),
Is0Functor (cat_postcomp a g)
forall (abc : ZeroGpd) (f : a $-> b),
Is0Functor (cat_precomp c f)
forall (abcd : ZeroGpd) (f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o g $o f $== h $o (g $o f)
forall (abcd : ZeroGpd) (f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o (g $o f) $== h $o g $o f
forall (ab : ZeroGpd) (f : a $-> b), Id b $o f $== f
forall (ab : ZeroGpd) (f : a $-> b), f $o Id a $== f
forallab : ZeroGpd, Is01Cat (a $-> b)
G, H: ZeroGpd
Is01Cat (G $-> H)
G, H: ZeroGpd
foralla : G $-> H, a $-> a
G, H: ZeroGpd
forallabc : G $-> H,
(b $-> c) -> (a $-> b) -> a $-> c
G, H: ZeroGpd
foralla : G $-> H, a $-> a
G, H: ZeroGpd f: G $-> H
f $-> f
exact (funx => Id (f x)).
G, H: ZeroGpd
forallabc : G $-> H,
(b $-> c) -> (a $-> b) -> a $-> c
G, H: ZeroGpd f, g, h: G $-> H p: g $-> h q: f $-> g
f $-> h
exact (funx => q x $@ p x).
forallab : ZeroGpd, Is0Gpd (a $-> b)
G, H: ZeroGpd
Is0Gpd (G $-> H)
G, H: ZeroGpd
forallab : G $-> H, (a $-> b) -> b $-> a
G, H: ZeroGpd f, g: G $-> H p: f $-> g
g $-> f
exact (funx => (p x)^$).
forall (abc : ZeroGpd) (g : b $-> c),
Is0Functor (cat_postcomp a g)
G, H, K: ZeroGpd f: H $-> K
Is0Functor (cat_postcomp G f)
G, H, K: ZeroGpd f: H $-> K
forallab : G $-> H,
(a $-> b) -> cat_postcomp G f a $-> cat_postcomp G f b
G, H, K: ZeroGpd f: H $-> K g, h: G $-> H p: g $-> h x: zerogpd_graph G
cat_postcomp G f g x $-> cat_postcomp G f h x
G, H, K: ZeroGpd f: H $-> K g, h: G $-> H p: g $-> h x: zerogpd_graph G
f (g x) $-> f (h x)
exact (fmap f (p x)).
forall (abc : ZeroGpd) (f : a $-> b),
Is0Functor (cat_precomp c f)
G, H, K: ZeroGpd f: G $-> H
Is0Functor (cat_precomp K f)
G, H, K: ZeroGpd f: G $-> H
forallab : H $-> K,
(a $-> b) -> cat_precomp K f a $-> cat_precomp K f b
G, H, K: ZeroGpd f: G $-> H g, h: H $-> K p: g $-> h x: zerogpd_graph G
cat_precomp K f g x $-> cat_precomp K f h x
G, H, K: ZeroGpd f: G $-> H g, h: H $-> K p: g $-> h x: zerogpd_graph G
g (f x) $-> h (f x)
exact (p (f x)).
forall (abcd : ZeroGpd) (f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o g $o f $== h $o (g $o f)
reflexivity. (* Associativity. *)
forall (abcd : ZeroGpd) (f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o (g $o f) $== h $o g $o f
reflexivity. (* Associativity in opposite direction. *)
forall (ab : ZeroGpd) (f : a $-> b), Id b $o f $== f
reflexivity. (* Left identity. *)
forall (ab : ZeroGpd) (f : a $-> b), f $o Id a $== f
reflexivity. (* Right identity. *)Defined.(** We define equivalences of 0-groupoids as the bi-invertible maps, using [Cat_BiInv] and [Cat_IsBiInv]. This definition is chosen to provide what is needed for the Yoneda lemma, and because it specializes to one of the correct definitions for types. *)Instancehasequivs_0gpd : HasEquivs ZeroGpd
:= cat_hasequivs ZeroGpd.(** Coq can't find the composite of the coercions [cate_fun : G $<~> H >-> G $-> H] and [fun_0gpd : Morphism_0Gpd G H >-> G -> H], probably because it passes through the definitional equality of [G $-> H] and [Morphism_0Gpd G H]. I couldn't find a solution, so instead here is a helper function to manually do the coercion when needed. *)Definitionequiv_fun_0gpd {GH : ZeroGpd} (f : G $<~> H) : G -> H
:= fun01_F (cat_equiv_fun _ _ _ f).(** ** Tools for manipulating equivalences of 0-groupoids Even though the proofs are easy, in certain contexts Coq gets confused about [$==] vs [$->], which makes it hard to prove this inline. So we record them here. *)(** Every equivalence is injective. *)
G, H: ZeroGpd f: G $<~> H x, y: G h: equiv_fun_0gpd f x $== equiv_fun_0gpd f y
x $== y
G, H: ZeroGpd f: G $<~> H x, y: G h: equiv_fun_0gpd f x $== equiv_fun_0gpd f y
x $== y
exact ((cat_eissect f x)^$ $@ fmap (equiv_fun_0gpd f^-1$) h $@ cat_eissect f y).Defined.Definitionisinj_isequiv_0gpd {GH : ZeroGpd} (f : G $-> H) `{!Cat_IsBiInv f}
{x y : G} (h : f x $== f y)
: x $== y
:= isinj_equiv_0gpd (Build_Cat_BiInv _ _ _ _ _ _ _ f _) h.(** These are some examples of things that could be ported from Basics/Equivalences.v. *)DefinitionmoveR_equiv_V_0gpd {GH : ZeroGpd} (f : G $<~> H) {x : H} {y : G} (p : x $== equiv_fun_0gpd f y)
: equiv_fun_0gpd f^-1$ x $== y
:= fmap (equiv_fun_0gpd f^-1$) p $@ cat_eissect f y.DefinitionmoveL_equiv_V_0gpd {GH : ZeroGpd} (f : G $<~> H) {x : H} {y : G} (p : equiv_fun_0gpd f y $== x)
: y $== equiv_fun_0gpd f^-1$ x
:= (cat_eissect f y)^$ $@ fmap (equiv_fun_0gpd f^-1$) p.DefinitionmoveR_equiv_M_0gpd {GH : ZeroGpd} (f : G $<~> H) {x : G} {y : H} (p : x $== equiv_fun_0gpd f^-1$ y)
: equiv_fun_0gpd f x $== y
:= fmap (equiv_fun_0gpd f) p $@ cat_eisretr f y.DefinitionmoveL_equiv_M_0gpd {GH : ZeroGpd} (f : G $<~> H) {x : G} {y : H} (p : equiv_fun_0gpd f^-1$ y $== x)
: y $== equiv_fun_0gpd f x
:= (cat_eisretr f y)^$ $@ fmap (equiv_fun_0gpd f) p.(** ** [f] is an equivalence of 0-groupoids iff [IsSurjInj f] We now give a different characterization of the equivalences of 0-groupoids, as the injective split essentially surjective 0-functors, which are defined in EquivGpd. Advantages of this logically equivalent formulation are that it tends to be easier to prove in examples and that in some cases it is definitionally equal to [ExtensionAlong], which is convenient. See Homotopy/Suspension.v and Algebra/AbGroups/Abelianization for examples. Advantages of the bi-invertible definition are that it reproduces a definition that is equivalent to [IsEquiv] when applied to types, assuming [Funext]. It also works in any 1-category. *)(** Every equivalence is injective and split essentially surjective. *)
G, H: ZeroGpd f: G $<~> H
IsSurjInj (equiv_fun_0gpd f)
G, H: ZeroGpd f: G $<~> H
IsSurjInj (equiv_fun_0gpd f)
G, H: ZeroGpd f: G $<~> H
SplEssSurj (equiv_fun_0gpd f)
G, H: ZeroGpd f: G $<~> H
forallxy : G,
equiv_fun_0gpd f x $== equiv_fun_0gpd f y -> x $== y
G, H: ZeroGpd f: G $<~> H
SplEssSurj (equiv_fun_0gpd f)
G, H: ZeroGpd f: G $<~> H y: H
{a : G & equiv_fun_0gpd f a $== y}
G, H: ZeroGpd f: G $<~> H y: H
equiv_fun_0gpd f (equiv_fun_0gpd f^-1$ y) $== y
tapply cat_eisretr.
G, H: ZeroGpd f: G $<~> H
forallxy : G,
equiv_fun_0gpd f x $== equiv_fun_0gpd f y -> x $== y
apply isinj_equiv_0gpd.Defined.(** Conversely, every injective split essentially surjective 0-functor is an equivalence. In practice, this is often the easiest way to prove that a functor is an equivalence. *)
G, H: ZeroGpd F: G $-> H e: IsSurjInj F
Cat_IsBiInv F
G, H: ZeroGpd F: G $-> H e: IsSurjInj F
Cat_IsBiInv F
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
Cat_IsBiInv F
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
H $-> G
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
F $o ?g $== Id H
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
?g $o F $== Id G
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
H $-> G
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
zerogpd_graph H -> zerogpd_graph G
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
forallab : zerogpd_graph H,
(a $-> b) -> ?F a $-> ?F b
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
forallab : zerogpd_graph H,
(a $-> b) ->
(funy : zerogpd_graph H => (e0 y).1) a $->
(funy : zerogpd_graph H => (e0 y).1) b
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
forallab : zerogpd_graph H,
(a $-> b) -> (e0 a).1 $-> (e0 b).1
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y y1, y2: zerogpd_graph H m: y1 $-> y2
(e0 y1).1 $-> (e0 y2).1
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y y1, y2: zerogpd_graph H m: y1 $-> y2
F (e0 y1).1 $== F (e0 y2).1
exact ((e0 y1).2 $@ m $@ ((e0 y2).2)^$).
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
F $o
Build_Fun01' (funy : zerogpd_graph H => (e0 y).1)
((fun (y1y2 : zerogpd_graph H) (m : y1 $-> y2) =>
e1 (e0 y1).1 (e0 y2).1
(((e0 y1).2 $@ m) $@ ((e0 y2).2)^$))
:
forallab : zerogpd_graph H,
(a $-> b) ->
(funy : zerogpd_graph H => (e0 y).1) a $->
(funy : zerogpd_graph H => (e0 y).1) b) $== Id H
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
NatTrans.Transformation (funx : H => F (e0 x).1)
idmap
exact (funa => (e0 a).2).
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
Build_Fun01' (funy : zerogpd_graph H => (e0 y).1)
((fun (y1y2 : zerogpd_graph H) (m : y1 $-> y2) =>
e1 (e0 y1).1 (e0 y2).1
(((e0 y1).2 $@ m) $@ ((e0 y2).2)^$))
:
forallab : zerogpd_graph H,
(a $-> b) ->
(funy : zerogpd_graph H => (e0 y).1) a $->
(funy : zerogpd_graph H => (e0 y).1) b) $o F $==
Id G
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y
NatTrans.Transformation (funx : G => (e0 (F x)).1)
idmap
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y x: G
(e0 (F x)).1 $-> x
G, H: ZeroGpd F: G $-> H e0: forallb : zerogpd_graph H,
{a : zerogpd_graph G & F a $== b} e1: forallxy : zerogpd_graph G,
F x $== F y -> x $== y x: G
intros a b; exact idmap.Defined.(** ** Products of families of 0-groupoids *)(** Here we define products of families of 0-groupoids. *)(** [I]-indexed products for an [I]-indexed family of 0-groupoids. *)
I: Type G: I -> ZeroGpd
ZeroGpd
I: Type G: I -> ZeroGpd
ZeroGpd
rapply (Build_ZeroGpd (foralli, G i)).Defined.(** The [i]-th projection from the [I]-indexed product of 0-groupoids. *)
I: Type G: I -> ZeroGpd
foralli : I, prod_0gpd I G $-> G i
I: Type G: I -> ZeroGpd
foralli : I, prod_0gpd I G $-> G i
I: Type G: I -> ZeroGpd i: I
prod_0gpd I G $-> G i
I: Type G: I -> ZeroGpd i: I
forallab : forallx : I, G x,
(a $-> b) -> a i $-> b i
I: Type G: I -> ZeroGpd i: I f, g: forallx : I, G x p: f $-> g
f i $-> g i
exact (p i).Defined.(** The universal property of the product of 0-groupoids holds almost definitionally. *)
I: Type G: ZeroGpd H: I -> ZeroGpd
(foralli : I, G $-> H i) <~> (G $-> prod_0gpd I H)
I: Type G: ZeroGpd H: I -> ZeroGpd
(foralli : I, G $-> H i) <~> (G $-> prod_0gpd I H)
I: Type G: ZeroGpd H: I -> ZeroGpd
(foralli : I, G $-> H i) -> G $-> prod_0gpd I H
I: Type G: ZeroGpd H: I -> ZeroGpd
IsEquiv ?equiv_fun
I: Type G: ZeroGpd H: I -> ZeroGpd
(foralli : I, G $-> H i) -> G $-> prod_0gpd I H
I: Type G: ZeroGpd H: I -> ZeroGpd f: foralli : I, G $-> H i
G $-> prod_0gpd I H
I: Type G: ZeroGpd H: I -> ZeroGpd f: foralli : I, G $-> H i
forallab : zerogpd_graph G,
(a $-> b) ->
(funi : I => f i a) $-> (funi : I => f i b)
I: Type G: ZeroGpd H: I -> ZeroGpd f: foralli : I, G $-> H i x, y: zerogpd_graph G p: x $-> y i: I
f i x $-> f i y
exact (fmap (f i) p).
I: Type G: ZeroGpd H: I -> ZeroGpd
IsEquiv
(funf : foralli : I, G $-> H i =>
Build_Fun01'
(fun (x : zerogpd_graph G) (i : I) => f i x)
(fun (xy : zerogpd_graph G) (p : x $-> y) =>
(funi : I => fmap (f i) p)
:
(funi : I => f i x) $-> (funi : I => f i y)))
I: Type G: ZeroGpd H: I -> ZeroGpd
(G $-> prod_0gpd I H) -> foralli : I, G $-> H i
I: Type G: ZeroGpd H: I -> ZeroGpd
(funf : foralli : I, G $-> H i =>
Build_Fun01'
(fun (x : zerogpd_graph G) (i : I) => f i x)
(fun (xy : zerogpd_graph G) (p : x $-> y) =>
(funi : I => fmap (f i) p)
:
(funi : I => f i x) $-> (funi : I => f i y)))
o ?equiv_inv == idmap
I: Type G: ZeroGpd H: I -> ZeroGpd
?equiv_inv
o (funf : foralli : I, G $-> H i =>
Build_Fun01'
(fun (x : zerogpd_graph G) (i : I) => f i x)
(fun (xy : zerogpd_graph G) (p : x $-> y) =>
(funi : I => fmap (f i) p)
:
(funi : I => f i x) $-> (funi : I => f i y))) ==
idmap
I: Type G: ZeroGpd H: I -> ZeroGpd
forallx : foralli : I, G $-> H i,
?eisretr
((funf : foralli : I, G $-> H i =>
Build_Fun01'
(fun (x0 : zerogpd_graph G) (i : I) => f i x0)
(fun (x0y : zerogpd_graph G) (p : x0 $-> y) =>
(funi : I => fmap (f i) p)
:
(funi : I => f i x0) $-> (funi : I => f i y)))
x) =
ap
(funf : foralli : I, G $-> H i =>
Build_Fun01'
(fun (x0 : zerogpd_graph G) (i : I) => f i x0)
(fun (x0y : zerogpd_graph G) (p : x0 $-> y) =>
(funi : I => fmap (f i) p)
:
(funi : I => f i x0) $-> (funi : I => f i y)))
(?eissect x)
I: Type G: ZeroGpd H: I -> ZeroGpd
(G $-> prod_0gpd I H) -> foralli : I, G $-> H i
I: Type G: ZeroGpd H: I -> ZeroGpd f: G $-> prod_0gpd I H
foralli : I, G $-> H i
I: Type G: ZeroGpd H: I -> ZeroGpd f: G $-> prod_0gpd I H i: I
G $-> H i
exact (prod_0gpd_pr i $o f).
I: Type G: ZeroGpd H: I -> ZeroGpd
(funf : foralli : I, G $-> H i =>
Build_Fun01'
(fun (x : zerogpd_graph G) (i : I) => f i x)
(fun (xy : zerogpd_graph G) (p : x $-> y) =>
(funi : I => fmap (f i) p)
:
(funi : I => f i x) $-> (funi : I => f i y)))
o (fun (f : G $-> prod_0gpd I H) (i : I) =>
prod_0gpd_pr i $o f) == idmap
I: Type G: ZeroGpd H: I -> ZeroGpd
(fun (f : G $-> prod_0gpd I H) (i : I) =>
prod_0gpd_pr i $o f)
o (funf : foralli : I, G $-> H i =>
Build_Fun01'
(fun (x : zerogpd_graph G) (i : I) => f i x)
(fun (xy : zerogpd_graph G) (p : x $-> y) =>
(funi : I => fmap (f i) p)
:
(funi : I => f i x) $-> (funi : I => f i y))) ==
idmap
I: Type G: ZeroGpd H: I -> ZeroGpd
forallx : foralli : I, G $-> H i,
?eisretr
((funf : foralli : I, G $-> H i =>
Build_Fun01'
(fun (x0 : zerogpd_graph G) (i : I) => f i x0)
(fun (x0y : zerogpd_graph G) (p : x0 $-> y) =>
(funi : I => fmap (f i) p)
:
(funi : I => f i x0) $-> (funi : I => f i y)))
x) =
ap
(funf : foralli : I, G $-> H i =>
Build_Fun01'
(fun (x0 : zerogpd_graph G) (i : I) => f i x0)
(fun (x0y : zerogpd_graph G) (p : x0 $-> y) =>
(funi : I => fmap (f i) p)
:
(funi : I => f i x0) $-> (funi : I => f i y)))
(?eissect x)
all: reflexivity.Defined.(** Indexed products of groupoids with equivalent indices and fiberwise equivalent factors are equivalent. *)
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
prod_0gpd I G $<~> prod_0gpd J H
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
prod_0gpd I G $<~> prod_0gpd J H
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
prod_0gpd I G $-> prod_0gpd J H
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
prod_0gpd J H $-> prod_0gpd I G
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
?f $o ?g $== Id (prod_0gpd J H)
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
?g $o ?f $== Id (prod_0gpd I G)
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
prod_0gpd I G $-> prod_0gpd J H
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
zerogpd_graph (prod_0gpd I G) ->
zerogpd_graph (prod_0gpd J H)
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
forallab : zerogpd_graph (prod_0gpd I G),
(a $-> b) -> ?F a $-> ?F b
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
zerogpd_graph (prod_0gpd I G) ->
zerogpd_graph (prod_0gpd J H)
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i) h: zerogpd_graph (prod_0gpd I G) j: J
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
forallab : zerogpd_graph (prod_0gpd I G),
(a $-> b) ->
(funh : zerogpd_graph (prod_0gpd I G) =>
(funj : J =>
transport (funx : J => H x) (eisretr ie j)
(f (ie^-1 j) (h (ie^-1 j))))
:
zerogpd_graph (prod_0gpd J H)) a $->
(funh : zerogpd_graph (prod_0gpd I G) =>
(funj : J =>
transport (funx : J => H x) (eisretr ie j)
(f (ie^-1 j) (h (ie^-1 j))))
:
zerogpd_graph (prod_0gpd J H)) b
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
forallab : foralli : I, G i,
(foralla0 : I, a a0 $-> b a0) ->
foralla0 : J,
transport (funx : J => H x) (eisretr ie a0)
(f (ie^-1 a0) (a (ie^-1 a0))) $->
transport (funx : J => H x) (eisretr ie a0)
(f (ie^-1 a0) (b (ie^-1 a0)))
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i) g, h: foralli : I, G i p: foralla : I, g a $-> h a j: J
transport (funx : J => H x) (eisretr ie j)
(f (ie^-1 j) (g (ie^-1 j))) $->
transport (funx : J => H x) (eisretr ie j)
(f (ie^-1 j) (h (ie^-1 j)))
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i) g, h: foralli : I, G i p: foralla : I, g a $-> h a j: J
f (ie^-1 j) (g (ie^-1 j)) $->
f (ie^-1 j) (h (ie^-1 j))
exact (fmap _ (p _)).
I, J: Type ie: I <~> J G: I -> ZeroGpd H: J -> ZeroGpd f: foralli : I, G i $<~> H (ie i)
exact (cate_issect (f _) _).Defined.(** ** Binary products of 0-groupoids *)(** Binary products can be obtained from indexed products by indexing over [Bool], and indeed this follows from [hasbinaryproducts_hasproductsbool] in WildCat.Products. However, we can avoid [Funext] in [equiv_binprod_0gpd_corec] if we separately define binary products of 0-groupoids using the product of types. *)SectionBinProd.Context (GH : ZeroGpd).(** This uses instances from WildCat.Prod. *)Definitionbinprod_0gpd : ZeroGpd
:= Build_ZeroGpd (G * H) _ _ _.(* Helper function to produce a term of binprod_0gpd. *)Definitionbinprod_0gpd_pair (g : G) (h : H) : binprod_0gpd
:= (g, h).(** The projections. *)
G, H: ZeroGpd
binprod_0gpd $-> G
G, H: ZeroGpd
binprod_0gpd $-> G
G, H: ZeroGpd
forallab : G * H, (a $-> b) -> fst a $-> fst b
G, H: ZeroGpd f, g: G * H
(f $-> g) -> fst f $-> fst g
exact fst.Defined.
G, H: ZeroGpd
binprod_0gpd $-> H
G, H: ZeroGpd
binprod_0gpd $-> H
G, H: ZeroGpd
forallab : G * H, (a $-> b) -> snd a $-> snd b
G, H: ZeroGpd f, g: G * H
(f $-> g) -> snd f $-> snd g
exact snd.Defined.(** The universal property of the product of 0-groupoids holds almost definitionally. *)
G, H, K: ZeroGpd
(K $-> G) * (K $-> H) <~> (K $-> binprod_0gpd)
G, H, K: ZeroGpd
(K $-> G) * (K $-> H) <~> (K $-> binprod_0gpd)
G, H, K: ZeroGpd
(K $-> G) * (K $-> H) -> K $-> binprod_0gpd
G, H, K: ZeroGpd
IsEquiv ?equiv_fun
G, H, K: ZeroGpd
(K $-> G) * (K $-> H) -> K $-> binprod_0gpd
G, H, K: ZeroGpd f: K $-> G g: K $-> H
K $-> binprod_0gpd
G, H, K: ZeroGpd f: K $-> G g: K $-> H
forallab : K,
(a $-> b) -> (f a $-> f b) * (g a $-> g b)
G, H, K: ZeroGpd f: K $-> G g: K $-> H x, y: K p: x $-> y
(f x $-> f y) * (g x $-> g y)
exact (fmap f p, fmap g p).
G, H, K: ZeroGpd
IsEquiv
(funX : (K $-> G) * (K $-> H) =>
(fun (f : K $-> G) (g : K $-> H) =>
Build_Fun01'
(funk : zerogpd_graph K => (f k, g k))
((fun (xy : K) (p : x $-> y) =>
(fmap f p, fmap g p))
:
forallab : zerogpd_graph K,
(a $-> b) ->
(funk : zerogpd_graph K => (f k, g k)) a $->
(funk : zerogpd_graph K => (f k, g k)) b))
(fst X) (snd X))
G, H, K: ZeroGpd
(K $-> binprod_0gpd) -> (K $-> G) * (K $-> H)
G, H, K: ZeroGpd
(funX : (K $-> G) * (K $-> H) =>
(fun (f : K $-> G) (g : K $-> H) =>
Build_Fun01' (funk : zerogpd_graph K => (f k, g k))
((fun (xy : K) (p : x $-> y) =>
(fmap f p, fmap g p))
:
forallab : zerogpd_graph K,
(a $-> b) ->
(funk : zerogpd_graph K => (f k, g k)) a $->
(funk : zerogpd_graph K => (f k, g k)) b))
(fst X) (snd X)) o ?equiv_inv == idmap
G, H, K: ZeroGpd
?equiv_inv
o (funX : (K $-> G) * (K $-> H) =>
(fun (f : K $-> G) (g : K $-> H) =>
Build_Fun01'
(funk : zerogpd_graph K => (f k, g k))
((fun (xy : K) (p : x $-> y) =>
(fmap f p, fmap g p))
:
forallab : zerogpd_graph K,
(a $-> b) ->
(funk : zerogpd_graph K => (f k, g k)) a $->
(funk : zerogpd_graph K => (f k, g k)) b))
(fst X) (snd X)) == idmap
G, H, K: ZeroGpd
forallx : (K $-> G) * (K $-> H),
?eisretr
((funX : (K $-> G) * (K $-> H) =>
(fun (f : K $-> G) (g : K $-> H) =>
Build_Fun01'
(funk : zerogpd_graph K => (f k, g k))
((fun (x0y : K) (p : x0 $-> y) =>
(fmap f p, fmap g p))
:
forallab : zerogpd_graph K,
(a $-> b) ->
(funk : zerogpd_graph K => (f k, g k)) a $->
(funk : zerogpd_graph K => (f k, g k)) b))
(fst X) (snd X)) x) =
ap
(funX : (K $-> G) * (K $-> H) =>
(fun (f : K $-> G) (g : K $-> H) =>
Build_Fun01'
(funk : zerogpd_graph K => (f k, g k))
((fun (x0y : K) (p : x0 $-> y) =>
(fmap f p, fmap g p))
:
forallab : zerogpd_graph K,
(a $-> b) ->
(funk : zerogpd_graph K => (f k, g k)) a $->
(funk : zerogpd_graph K => (f k, g k)) b))
(fst X) (snd X)) (?eissect x)
G, H, K: ZeroGpd
(funX : (K $-> G) * (K $-> H) =>
(fun (f : K $-> G) (g : K $-> H) =>
Build_Fun01' (funk : zerogpd_graph K => (f k, g k))
((fun (xy : K) (p : x $-> y) =>
(fmap f p, fmap g p))
:
forallab : zerogpd_graph K,
(a $-> b) ->
(funk : zerogpd_graph K => (f k, g k)) a $->
(funk : zerogpd_graph K => (f k, g k)) b))
(fst X) (snd X))
o (funf : K $-> binprod_0gpd =>
(binprod_0gpd_pr1 $o f, binprod_0gpd_pr2 $o f)) ==
idmap
G, H, K: ZeroGpd
(funf : K $-> binprod_0gpd =>
(binprod_0gpd_pr1 $o f, binprod_0gpd_pr2 $o f))
o (funX : (K $-> G) * (K $-> H) =>
(fun (f : K $-> G) (g : K $-> H) =>
Build_Fun01'
(funk : zerogpd_graph K => (f k, g k))
((fun (xy : K) (p : x $-> y) =>
(fmap f p, fmap g p))
:
forallab : zerogpd_graph K,
(a $-> b) ->
(funk : zerogpd_graph K => (f k, g k)) a $->
(funk : zerogpd_graph K => (f k, g k)) b))
(fst X) (snd X)) == idmap
G, H, K: ZeroGpd
forallx : (K $-> G) * (K $-> H),
?eisretr
((funX : (K $-> G) * (K $-> H) =>
(fun (f : K $-> G) (g : K $-> H) =>
Build_Fun01'
(funk : zerogpd_graph K => (f k, g k))
((fun (x0y : K) (p : x0 $-> y) =>
(fmap f p, fmap g p))
:
forallab : zerogpd_graph K,
(a $-> b) ->
(funk : zerogpd_graph K => (f k, g k)) a $->
(funk : zerogpd_graph K => (f k, g k)) b))
(fst X) (snd X)) x) =
ap
(funX : (K $-> G) * (K $-> H) =>
(fun (f : K $-> G) (g : K $-> H) =>
Build_Fun01'
(funk : zerogpd_graph K => (f k, g k))
((fun (x0y : K) (p : x0 $-> y) =>
(fmap f p, fmap g p))
:
forallab : zerogpd_graph K,
(a $-> b) ->
(funk : zerogpd_graph K => (f k, g k)) a $->
(funk : zerogpd_graph K => (f k, g k)) b))
(fst X) (snd X)) (?eissect x)
all: reflexivity.Defined.EndBinProd.(** ** The terminal 0-groupoid *)DefinitionUnit_0gpd : ZeroGpd := Build_ZeroGpd Unit _ _ _.
IsTerminal Unit_0gpd
IsTerminal Unit_0gpd
A: ZeroGpd
{f : A $-> Unit_0gpd &
forallg : A $-> Unit_0gpd, f $== g}
A: ZeroGpd f: Fun01 A Unit
{f : A $-> Unit_0gpd &
forallg : A $-> Unit_0gpd, f $== g}
A: ZeroGpd f: Fun01 A Unit
forallg : A $-> Unit_0gpd, f $== g
A: ZeroGpd f: Fun01 A Unit g: A $-> Unit_0gpd a: zerogpd_graph A
Unit
exact tt.Defined.(** ** Pullbacks of 0-groupoids *)SectionZeroGpdPullback.Context {GHK : ZeroGpd} (g : G $-> K) (h : H $-> K).(* The underlying type for the pullback of 0-groupoids is [{x : G & { y : H & g x $== h y }}]. The pullbacks we define here do not assume any 2-cells, so the 1-cells in the pullback only involve the corners [G] and [H] and can therefore be induced from the product of these 0-groupoids. (Because of this, this definition would not give the correct notion of pullback of types when we regard types as 0-groupoids.) *)Definitionpullback_0gpd : ZeroGpd
:= @zerogpd_induced {x : G & { y : H & g x $== h y }} (binprod_0gpd G H)
(fun '(x; (y; p)) => (x, y)).Definitionpullback_0gpd_pr1 : pullback_0gpd $-> G
:= binprod_0gpd_pr1 G H $o zerogpd_induced_map _.Definitionpullback_0gpd_pr2 : pullback_0gpd $-> H
:= binprod_0gpd_pr2 G H $o zerogpd_induced_map _.Definitionpullback_0gpd_glue : g $o pullback_0gpd_pr1 $== h $o pullback_0gpd_pr2
:= fun '(x; (y; p)) => p.(** The universal property of the product of 0-groupoids holds almost definitionally. *)
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
{f1 : Z $-> G & {f2 : Z $-> H & g $o f1 $== h $o f2}} <~>
(Z $-> pullback_0gpd)
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
{f1 : Z $-> G & {f2 : Z $-> H & g $o f1 $== h $o f2}} <~>
(Z $-> pullback_0gpd)
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
{f1 : Z $-> G & {f2 : Z $-> H & g $o f1 $== h $o f2}} ->
Z $-> pullback_0gpd
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
IsEquiv ?equiv_fun
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
{f1 : Z $-> G & {f2 : Z $-> H & g $o f1 $== h $o f2}} ->
Z $-> pullback_0gpd
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd f1: Z $-> G f2: Z $-> H q: g $o f1 $== h $o f2
Z $-> pullback_0gpd
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd f1: Z $-> G f2: Z $-> H q: g $o f1 $== h $o f2
zerogpd_graph Z -> zerogpd_graph pullback_0gpd
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd f1: Z $-> G f2: Z $-> H q: g $o f1 $== h $o f2
forallab : zerogpd_graph Z,
(a $-> b) -> ?F a $-> ?F b
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd f1: Z $-> G f2: Z $-> H q: g $o f1 $== h $o f2
zerogpd_graph Z -> zerogpd_graph pullback_0gpd
exact (funz => (f1 z; (f2 z; q z))).
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd f1: Z $-> G f2: Z $-> H q: g $o f1 $== h $o f2
forallab : zerogpd_graph Z,
(a $-> b) ->
(funz : zerogpd_graph Z => (f1 z; f2 z; q z)) a $->
(funz : zerogpd_graph Z => (f1 z; f2 z; q z)) b
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd f1: Z $-> G f2: Z $-> H q: g $o f1 $== h $o f2 z, z': zerogpd_graph Z p: z $-> z'
(f1 z; f2 z; q z) $-> (f1 z'; f2 z'; q z')
exact (fmap f1 p, fmap f2 p).
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
IsEquiv
(funX : {f1 : Z $-> G &
{f2 : Z $-> H & g $o f1 $== h $o f2}} =>
(fun (f1 : Z $-> G)
(proj2 : {f2 : Z $-> H & g $o f1 $== h $o f2})
=>
(fun (f2 : Z $-> H) (q : g $o f1 $== h $o f2) =>
Build_Fun01'
(funz : zerogpd_graph Z => (f1 z; f2 z; q z))
(fun (zz' : zerogpd_graph Z) (p : z $-> z') =>
(fmap f1 p, fmap f2 p)
:
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z $->
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z')) proj2.1 proj2.2)
X.1 X.2)
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
(Z $-> pullback_0gpd) ->
{f1 : Z $-> G & {f2 : Z $-> H & g $o f1 $== h $o f2}}
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
(funX : {f1 : Z $-> G &
{f2 : Z $-> H & g $o f1 $== h $o f2}} =>
(fun (f1 : Z $-> G)
(proj2 : {f2 : Z $-> H & g $o f1 $== h $o f2}) =>
(fun (f2 : Z $-> H) (q : g $o f1 $== h $o f2) =>
Build_Fun01'
(funz : zerogpd_graph Z => (f1 z; f2 z; q z))
(fun (zz' : zerogpd_graph Z) (p : z $-> z') =>
(fmap f1 p, fmap f2 p)
:
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z $->
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z')) proj2.1 proj2.2) X.1
X.2) o ?equiv_inv == idmap
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
?equiv_inv
o (funX : {f1 : Z $-> G &
{f2 : Z $-> H & g $o f1 $== h $o f2}} =>
(fun (f1 : Z $-> G)
(proj2 : {f2 : Z $-> H & g $o f1 $== h $o f2})
=>
(fun (f2 : Z $-> H) (q : g $o f1 $== h $o f2) =>
Build_Fun01'
(funz : zerogpd_graph Z => (f1 z; f2 z; q z))
(fun (zz' : zerogpd_graph Z) (p : z $-> z') =>
(fmap f1 p, fmap f2 p)
:
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z $->
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z')) proj2.1 proj2.2)
X.1 X.2) == idmap
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
forallx : {f1 : Z $-> G &
{f2 : Z $-> H & g $o f1 $== h $o f2}},
?eisretr
((funX : {f1 : Z $-> G &
{f2 : Z $-> H & g $o f1 $== h $o f2}} =>
(fun (f1 : Z $-> G)
(proj2 : {f2 : Z $-> H & g $o f1 $== h $o f2})
=>
(fun (f2 : Z $-> H) (q : g $o f1 $== h $o f2) =>
Build_Fun01'
(funz : zerogpd_graph Z => (f1 z; f2 z; q z))
(fun (zz' : zerogpd_graph Z) (p : z $-> z')
=>
(fmap f1 p, fmap f2 p)
:
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z $->
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z')) proj2.1 proj2.2)
X.1 X.2) x) =
ap
(funX : {f1 : Z $-> G &
{f2 : Z $-> H & g $o f1 $== h $o f2}} =>
(fun (f1 : Z $-> G)
(proj2 : {f2 : Z $-> H & g $o f1 $== h $o f2})
=>
(fun (f2 : Z $-> H) (q : g $o f1 $== h $o f2) =>
Build_Fun01'
(funz : zerogpd_graph Z => (f1 z; f2 z; q z))
(fun (zz' : zerogpd_graph Z) (p : z $-> z') =>
(fmap f1 p, fmap f2 p)
:
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z $->
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z')) proj2.1 proj2.2)
X.1 X.2) (?eissect x)
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
(Z $-> pullback_0gpd) ->
{f1 : Z $-> G & {f2 : Z $-> H & g $o f1 $== h $o f2}}
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd f: Z $-> pullback_0gpd
{f1 : Z $-> G & {f2 : Z $-> H & g $o f1 $== h $o f2}}
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd f: Z $-> pullback_0gpd
(funf2 : Z $-> H =>
g $o (pullback_0gpd_pr1 $o f) $== h $o f2)
(pullback_0gpd_pr2 $o f)
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd f: Z $-> pullback_0gpd
g $o (pullback_0gpd_pr1 $o f) $==
h $o (pullback_0gpd_pr2 $o f)
exact (funz => pullback_0gpd_glue (f z)).
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
(funX : {f1 : Z $-> G &
{f2 : Z $-> H & g $o f1 $== h $o f2}} =>
(fun (f1 : Z $-> G)
(proj2 : {f2 : Z $-> H & g $o f1 $== h $o f2}) =>
(fun (f2 : Z $-> H) (q : g $o f1 $== h $o f2) =>
Build_Fun01'
(funz : zerogpd_graph Z => (f1 z; f2 z; q z))
(fun (zz' : zerogpd_graph Z) (p : z $-> z') =>
(fmap f1 p, fmap f2 p)
:
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z $->
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z')) proj2.1 proj2.2) X.1
X.2)
o (funf : Z $-> pullback_0gpd =>
(pullback_0gpd_pr1 $o f; pullback_0gpd_pr2 $o f;
(funz : zerogpd_graph Z =>
pullback_0gpd_glue (f z))
:
(funf2 : Z $-> H =>
g $o (pullback_0gpd_pr1 $o f) $== h $o f2)
(pullback_0gpd_pr2 $o f))) == idmap
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
(funf : Z $-> pullback_0gpd =>
(pullback_0gpd_pr1 $o f; pullback_0gpd_pr2 $o f;
(funz : zerogpd_graph Z => pullback_0gpd_glue (f z))
:
(funf2 : Z $-> H =>
g $o (pullback_0gpd_pr1 $o f) $== h $o f2)
(pullback_0gpd_pr2 $o f)))
o (funX : {f1 : Z $-> G &
{f2 : Z $-> H & g $o f1 $== h $o f2}} =>
(fun (f1 : Z $-> G)
(proj2 : {f2 : Z $-> H & g $o f1 $== h $o f2})
=>
(fun (f2 : Z $-> H) (q : g $o f1 $== h $o f2) =>
Build_Fun01'
(funz : zerogpd_graph Z => (f1 z; f2 z; q z))
(fun (zz' : zerogpd_graph Z) (p : z $-> z') =>
(fmap f1 p, fmap f2 p)
:
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z $->
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z')) proj2.1 proj2.2)
X.1 X.2) == idmap
G, H, K: ZeroGpd g: G $-> K h: H $-> K Z: ZeroGpd
forallx : {f1 : Z $-> G &
{f2 : Z $-> H & g $o f1 $== h $o f2}},
?eisretr
((funX : {f1 : Z $-> G &
{f2 : Z $-> H & g $o f1 $== h $o f2}} =>
(fun (f1 : Z $-> G)
(proj2 : {f2 : Z $-> H & g $o f1 $== h $o f2})
=>
(fun (f2 : Z $-> H) (q : g $o f1 $== h $o f2) =>
Build_Fun01'
(funz : zerogpd_graph Z => (f1 z; f2 z; q z))
(fun (zz' : zerogpd_graph Z) (p : z $-> z')
=>
(fmap f1 p, fmap f2 p)
:
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z $->
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z')) proj2.1 proj2.2)
X.1 X.2) x) =
ap
(funX : {f1 : Z $-> G &
{f2 : Z $-> H & g $o f1 $== h $o f2}} =>
(fun (f1 : Z $-> G)
(proj2 : {f2 : Z $-> H & g $o f1 $== h $o f2})
=>
(fun (f2 : Z $-> H) (q : g $o f1 $== h $o f2) =>
Build_Fun01'
(funz : zerogpd_graph Z => (f1 z; f2 z; q z))
(fun (zz' : zerogpd_graph Z) (p : z $-> z') =>
(fmap f1 p, fmap f2 p)
:
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z $->
(funz0 : zerogpd_graph Z =>
(f1 z0; f2 z0; q z0)) z')) proj2.1 proj2.2)
X.1 X.2) (?eissect x)
all: reflexivity.Defined.(** The square brackets denote a non-maximally inserted implicit argument. *)Definitionpullback_0gpd_homotopic [Z : ZeroGpd]
(j k : Z $-> pullback_0gpd)
(p1 : pullback_0gpd_pr1 $o j $== pullback_0gpd_pr1 $o k)
(p2 : pullback_0gpd_pr2 $o j $== pullback_0gpd_pr2 $o k)
: j $== k
:= funz => (p1 z, p2 z).EndZeroGpdPullback.(** Taking pullbacks of 0-groupoids is symmetric. *)
G, H, K: ZeroGpd g: G $-> K h: H $-> K
pullback_0gpd g h $-> pullback_0gpd h g
G, H, K: ZeroGpd g: G $-> K h: H $-> K
pullback_0gpd g h $-> pullback_0gpd h g
G, H, K: ZeroGpd g: G $-> K h: H $-> K
zerogpd_graph (pullback_0gpd g h) ->
zerogpd_graph (pullback_0gpd h g)
G, H, K: ZeroGpd g: G $-> K h: H $-> K
forallab : zerogpd_graph (pullback_0gpd g h),
(a $-> b) -> ?F a $-> ?F b
G, H, K: ZeroGpd g: G $-> K h: H $-> K
zerogpd_graph (pullback_0gpd g h) ->
zerogpd_graph (pullback_0gpd h g)
intros [x [y p]]; exact (y; (x; p^$)).
G, H, K: ZeroGpd g: G $-> K h: H $-> K
forallab : zerogpd_graph (pullback_0gpd g h),
(a $-> b) ->
(funX : zerogpd_graph (pullback_0gpd g h) =>
(fun (x : G) (proj2 : {y : H & g x $== h y}) =>
(fun (y : H) (p : g x $== h y) => (y; x; p^$))
proj2.1 proj2.2) X.1 X.2) a $->
(funX : zerogpd_graph (pullback_0gpd g h) =>
(fun (x : G) (proj2 : {y : H & g x $== h y}) =>
(fun (y : H) (p : g x $== h y) => (y; x; p^$))
proj2.1 proj2.2) X.1 X.2) b
G, H, K: ZeroGpd g: G $-> K h: H $-> K
forallab : {x : G & {y : H & g x $== h y}},
(a.1 $-> b.1) * ((a.2).1 $-> (b.2).1) ->
((a.2).1 $-> (b.2).1) * (a.1 $-> b.1)
intros ? ? [q1 q2]; exact (q2, q1).Defined.
G, H, K: ZeroGpd g: G $-> K h: H $-> K
flip_pullback_0gpd g h $o flip_pullback_0gpd h g $==
Id (pullback_0gpd h g)
G, H, K: ZeroGpd g: G $-> K h: H $-> K
flip_pullback_0gpd g h $o flip_pullback_0gpd h g $==
Id (pullback_0gpd h g)
intros ?; cbn; split; reflexivity.Defined.
G, H, K: ZeroGpd g: G $-> K h: H $-> K
pullback_0gpd g h $<~> pullback_0gpd h g
G, H, K: ZeroGpd g: G $-> K h: H $-> K
pullback_0gpd g h $<~> pullback_0gpd h g
G, H, K: ZeroGpd g: G $-> K h: H $-> K
pullback_0gpd g h $-> pullback_0gpd h g
G, H, K: ZeroGpd g: G $-> K h: H $-> K
pullback_0gpd h g $-> pullback_0gpd g h
G, H, K: ZeroGpd g: G $-> K h: H $-> K
?f $o ?g $== Id (pullback_0gpd h g)
G, H, K: ZeroGpd g: G $-> K h: H $-> K
?g $o ?f $== Id (pullback_0gpd g h)
G, H, K: ZeroGpd g: G $-> K h: H $-> K
flip_pullback_0gpd g h $o flip_pullback_0gpd h g $==
Id (pullback_0gpd h g)
G, H, K: ZeroGpd g: G $-> K h: H $-> K
flip_pullback_0gpd h g $o flip_pullback_0gpd g h $==
Id (pullback_0gpd g h)