Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import WildCat.Core.Require Import WildCat.Opposite.(** We declare a scope for printing [CatEquiv] as [≅] *)Declare Scope wc_iso_scope.(** * Equivalences in wild categories *)(** We could define equivalences in any wild 1-category as bi-invertible maps, or in a wild 2-category as half-adjoint equivalences. However, in concrete cases there is often an equivalent definition of equivalences that we want to use instead, and the important property we need is that it's logically equivalent to (quasi-)isomorphism. In [cat_hasequivs] below, we show that bi-invertible maps do provide a [HasEquivs] structure for any wild 1-category. *)ClassHasEquivs (A : Type) `{Is1Cat A} :=
{
CatEquiv' : A -> A -> Typewhere"a $<~> b" := (CatEquiv' a b);
CatIsEquiv' : forallab, (a $-> b) -> Type;
cate_fun' : forallab, (a $<~> b) -> (a $-> b);
cate_isequiv' : forallab (f : a $<~> b), CatIsEquiv' a b (cate_fun' a b f);
cate_buildequiv' : forallab (f : a $-> b), CatIsEquiv' a b f -> CatEquiv' a b;
cate_buildequiv_fun' : forallab (f : a $-> b) (fe : CatIsEquiv' a b f),
cate_fun' a b (cate_buildequiv' a b f fe) $== f;
cate_inv' : forallab (f : a $<~> b), b $-> a;
cate_issect' : forallab (f : a $<~> b),
cate_inv' _ _ f $o cate_fun' _ _ f $== Id a;
cate_isretr' : forallab (f : a $<~> b),
cate_fun' _ _ f $o cate_inv' _ _ f $== Id b;
catie_adjointify' : forallab (f : a $-> b) (g : b $-> a)
(r : f $o g $== Id b) (s : g $o f $== Id a), CatIsEquiv' a b f;
}.(** Since apparently a field of a record can't be the source of a coercion (Coq complains about the uniform inheritance condition, although as officially stated that condition appears to be satisfied), we redefine all the fields of [HasEquivs]. *)DefinitionCatEquiv {A} `{HasEquivs A} (a b : A)
:= @CatEquiv' A _ _ _ _ _ a b.Notation"a $<~> b" := (CatEquiv a b).Infix"≅" := CatEquiv : wc_iso_scope.Arguments CatEquiv : simpl never.Definitioncate_fun {A} `{HasEquivs A} {a b : A} (f : a $<~> b)
: a $-> b
:= @cate_fun' A _ _ _ _ _ a b f.Coercioncate_fun : CatEquiv >-> Hom.(* Being an equivalence should be a typeclass, but we have to redefine it to work around https://github.com/coq/coq/issues/8994 . *)ClassCatIsEquiv {A} `{HasEquivs A} {a b : A} (f : a $-> b)
:= catisequiv : CatIsEquiv' a b f.Instancecate_isequiv {A} `{HasEquivs A} {a b : A} (f : a $<~> b)
: CatIsEquiv f
:= cate_isequiv' a b f.DefinitionBuild_CatEquiv {A} `{HasEquivs A} {a b : A}
(f : a $-> b) {fe : CatIsEquiv f}
: a $<~> b
:= cate_buildequiv' a b f fe.Definitioncate_buildequiv_fun {A} `{HasEquivs A} {a b : A}
(f : a $-> b) {fe : CatIsEquiv f}
: cate_fun (Build_CatEquiv f) $== f
:= cate_buildequiv_fun' a b f fe.Definitioncatie_adjointify {A} `{HasEquivs A} {a b : A}
(f : a $-> b) (g : b $-> a)
(r : f $o g $== Id b) (s : g $o f $== Id a)
: CatIsEquiv f
:= catie_adjointify' a b f g r s.Definitioncate_adjointify {A} `{HasEquivs A} {a b : A}
(f : a $-> b) (g : b $-> a)
(r : f $o g $== Id b) (s : g $o f $== Id a)
: a $<~> b
:= Build_CatEquiv f (fe:=catie_adjointify f g r s).(** This one we define to construct the whole inverse equivalence. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
b $<~> a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
b $<~> a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
b $-> a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
a $-> b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
?f $o ?g $== Id a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
?g $o ?f $== Id b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
b $-> a
exact (cate_inv' a b f).
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
a $-> b
exact f.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
cate_inv' a b f $o f $== Id a
exact (cate_issect' a b f).
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
f $o cate_inv' a b f $== Id b
exact (cate_isretr' a b f).Defined.Notation"f ^-1$" := (cate_inv f).(** * Opposite categories preserve having equivalences. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
HasEquivs A^op
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
HasEquivs A^op
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
Type
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
(b $-> a) -> Type
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
?Goal -> b $-> a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forallf : ?Goal, ?Goal0 (?Goal1 f)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forallf : b $-> a, ?Goal0 f -> ?Goal
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forall (f : b $-> a) (fe : ?Goal0 f),
?Goal1 (?Goal3 f fe) $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
?Goal -> a $-> b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forallf : ?Goal, ?Goal1 f $o ?Goal5 f $== Id a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forallf : ?Goal, ?Goal5 f $o ?Goal1 f $== Id b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forall (f : b $-> a) (g : a $-> b),
g $o f $== Id b -> f $o g $== Id a -> ?Goal0 f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
Type
exact (b $<~> a).
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
(b $-> a) -> Type
exact CatIsEquiv.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
b $<~> a -> b $-> a
apply cate_fun'.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forallf : b $<~> a, CatIsEquiv (cate_fun' b a f)
apply cate_isequiv'.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forallf : b $-> a, CatIsEquiv f -> b $<~> a
apply cate_buildequiv'.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forall (f : b $-> a) (fe : CatIsEquiv f),
cate_fun' b a (cate_buildequiv' b a f fe) $== f
rapply cate_buildequiv_fun'.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
b $<~> a -> a $-> b
apply cate_inv'.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forallf : b $<~> a,
cate_fun' b a f $o cate_inv' b a f $== Id a
rapply cate_isretr'.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forallf : b $<~> a,
cate_inv' b a f $o cate_fun' b a f $== Id b
rapply cate_issect'.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
forall (f : b $-> a) (g : a $-> b),
g $o f $== Id b -> f $o g $== Id a -> CatIsEquiv f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: b $-> a g: a $-> b s: g $o f $== Id b t: f $o g $== Id a
CatIsEquiv f
exact (catie_adjointify f g t s).Defined.Instanceisequiv_op {A : Type} `{HasEquivs A}
{a b : A} (f : a $-> b) {ief : CatIsEquiv f}
: @CatIsEquiv A^op _ _ _ _ _ b a f
:= ief.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
f^-1$ $o f $== Id a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
f^-1$ $o f $== Id a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
f^-1$ $o f $== cate_inv' a b f $o cate_fun' a b f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
f^-1$ $== cate_inv' a b f
apply cate_buildequiv_fun'.Defined.Definitioncate_isretr {A} `{HasEquivs A} {a b : A} (f : a $<~> b)
: f $o f^-1$ $== Id b
:= cate_issect (A:=A^op) (b:=a) (a:=b) f.(** If [g] is a section of an equivalence, then it is the inverse. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b g: b $-> a p: f $o g $== Id b
f^-1$ $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b g: b $-> a p: f $o g $== Id b
f^-1$ $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b g: b $-> a p: f $o g $== Id b
f^-1$ $o Id b $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b g: b $-> a p: f $o g $== Id b
f^-1$ $o (f $o g) $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b g: b $-> a p: f $o g $== Id b
f^-1$ $o f $o g $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b g: b $-> a p: f $o g $== Id b
Id a $o g $== g
apply cat_idl.Defined.(** If [g] is a retraction of an equivalence, then it is the inverse. *)Definitioncate_inverse_retr {A} `{HasEquivs A} {a b : A} (f : a $<~> b)
(g : b $-> a) (p : g $o f $== Id a)
: cate_fun f^-1$ $== g
:= cate_inverse_sect (A:=A^op) (a:=b) (b:=a) f g p.(** It follows that the inverse of the equivalence you get by adjointification is homotopic to the inverse [g] provided. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b g: b $-> a r: f $o g $== Id b s: g $o f $== Id a
(cate_adjointify f g r s)^-1$ $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b g: b $-> a r: f $o g $== Id b s: g $o f $== Id a
(cate_adjointify f g r s)^-1$ $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b g: b $-> a r: f $o g $== Id b s: g $o f $== Id a
cate_adjointify f g r s $o g $== Id b
exact ((cate_buildequiv_fun f $@R _) $@ r).Defined.(** The identity morphism is an equivalence *)Instancecatie_id {A} `{HasEquivs A} (a : A)
: CatIsEquiv (Id a)
:= catie_adjointify (Id a) (Id a) (cat_idl (Id a)) (cat_idr (Id a)).Definitionid_cate {A} `{HasEquivs A} (a : A)
: a $<~> a
:= Build_CatEquiv (Id a).Instancereflexive_cate {A} `{HasEquivs A}
: Reflexive (@CatEquiv A _ _ _ _ _)
:= id_cate.Instancesymmetric_cate {A} `{HasEquivs A}
: Symmetric (@CatEquiv A _ _ _ _ _)
:= funabf => cate_inv f.(** Anything homotopic to an equivalence is an equivalence. This should not be an instance. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
CatIsEquiv g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
CatIsEquiv g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
b $-> a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
g $o ?g $== Id b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
?g $o g $== Id a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
b $-> a
exact (Build_CatEquiv f)^-1$.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
g $o (Build_CatEquiv f)^-1$ $== Id b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
f $o (Build_CatEquiv f)^-1$ $== Id b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
Build_CatEquiv f $o (Build_CatEquiv f)^-1$ $== Id b
apply cate_isretr.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
(Build_CatEquiv f)^-1$ $o g $== Id a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
(Build_CatEquiv f)^-1$ $o f $== Id a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $-> b CatIsEquiv0: CatIsEquiv f g: a $-> b p: f $== g
(Build_CatEquiv f)^-1$ $o Build_CatEquiv f $== Id a
apply cate_issect.Defined.(** Equivalences can be composed. In order to make use of duality, we factor out parts of the proof as two lemmas. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $o f $o (f^-1$ $o g^-1$) $== Id c
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $o f $o (f^-1$ $o g^-1$) $== Id c
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $o (f $o (f^-1$ $o g^-1$)) $== Id c
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $o (f $o f^-1$ $o g^-1$) $== Id c
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $o (Id b $o g^-1$) $== Id c
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $o g^-1$ $== Id c
apply cate_isretr.Defined.Definitioncompose_catie_issect {A} `{HasEquivs A} {a b c : A}
(g : b $<~> c) (f : a $<~> b)
: (f^-1$ $o g^-1$ $o (g $o f) $== Id a)
:= compose_catie_isretr (A:=A^op) (a:=c) (b:=b) (c:=a) f g.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
CatIsEquiv (g $o f)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
CatIsEquiv (g $o f)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $o f $o (f^-1$ $o g^-1$) $== Id c
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
f^-1$ $o g^-1$ $o (g $o f) $== Id a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $o f $o (f^-1$ $o g^-1$) $== Id c
apply compose_catie_isretr.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
f^-1$ $o g^-1$ $o (g $o f) $== Id a
apply compose_catie_issect.Defined.Instancecompose_catie' {A} `{HasEquivs A} {a b c : A}
(g : b $-> c) `{!CatIsEquiv g} (f : a $-> b) `{!CatIsEquiv f}
: CatIsEquiv (g $o f)
:= catie_homotopic _ (cate_buildequiv_fun _ $@@ cate_buildequiv_fun _).Definitioncompose_cate {A} `{HasEquivs A} {a b c : A}
(g : b $<~> c) (f : a $<~> b) : a $<~> c
:= Build_CatEquiv (g $o f).Notation"g $oE f" := (compose_cate g f).
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $oE f $== g $o f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $oE f $== g $o f
apply cate_buildequiv_fun.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $o f $== g $oE f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $o f $== g $oE f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A g: b $<~> c f: a $<~> b
g $oE f $-> g $o f
apply cate_buildequiv_fun.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a: A
id_cate a $== Id a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a: A
id_cate a $== Id a
apply cate_buildequiv_fun.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c, d: A f: a $<~> b g: b $<~> c h: c $<~> d
h $oE g $oE f $== h $oE (g $oE f)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c, d: A f: a $<~> b g: b $<~> c h: c $<~> d
h $oE g $oE f $== h $oE (g $oE f)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c, d: A f: a $<~> b g: b $<~> c h: c $<~> d
h $oE g $o f $== h $o g $o f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c, d: A f: a $<~> b g: b $<~> c h: c $<~> d
h $o (g $o f) $== h $o (g $oE f)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c, d: A f: a $<~> b g: b $<~> c h: c $<~> d
h $oE g $o f $== h $o g $o f
exact (compose_cate_fun h g $@R _).
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c, d: A f: a $<~> b g: b $<~> c h: c $<~> d
h $o (g $o f) $== h $o (g $oE f)
exact (_ $@L compose_cate_funinv g f).Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c, d: A f: a $<~> b g: b $<~> c h: c $<~> d
h $oE (g $oE f) $== h $oE g $oE f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c, d: A f: a $<~> b g: b $<~> c h: c $<~> d
h $oE (g $oE f) $== h $oE g $oE f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c, d: A f: a $<~> b g: b $<~> c h: c $<~> d
h $oE (g $oE f) $== h $oE g $oE f
(* We use [exact_no_check] just to save a small amount of time. *)exact_no_check (compose_cate_assoc (A:=A^op) (a:=d) (b:=c) (c:=b) (d:=a) h g f).Defined.Transparent compose_catie_isretr.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
id_cate b $oE f $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
id_cate b $oE f $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A f: a $<~> b
id_cate b $o f $== Id b $o f
exact (cate_buildequiv_fun _ $@R _).Defined.Definitioncompose_cate_idr {A} `{HasEquivs A}
{a b : A} (f : a $<~> b)
: cate_fun (f $oE id_cate a) $== cate_fun f
:= compose_cate_idl (A:=A^op) (a:=b) (b:=a) f.Instancetransitive_cate {A} `{HasEquivs A}
: Transitive (@CatEquiv A _ _ _ _ _)
:= funabcfg => g $oE f.(** Some more convenient equalities for equivalences. The naming scheme is similar to [PathGroupoids.v].*)Definitioncompose_V_hh {A} `{HasEquivs A} {a b c : A} (f : b $<~> c) (g : a $-> b) :
f^-1$ $o (f $o g) $== g :=
(cat_assoc_opp _ _ _) $@ (cate_issect f $@R g) $@ cat_idl g.Definitioncompose_h_Vh {A} `{HasEquivs A} {a b c : A} (f : c $<~> b) (g : a $-> b) :
f $o (f^-1$ $o g) $== g :=
(cat_assoc_opp _ _ _) $@ (cate_isretr f $@R g) $@ cat_idl g.Definitioncompose_hh_V {A} `{HasEquivs A} {a b c : A} (f : b $-> c) (g : a $<~> b) :
(f $o g) $o g^-1$ $== f :=
cat_assoc _ _ _ $@ (f $@L cate_isretr g) $@ cat_idr f.Definitioncompose_hV_h {A} `{HasEquivs A} {a b c : A} (f : b $-> c) (g : b $<~> a) :
(f $o g^-1$) $o g $== f :=
cat_assoc _ _ _ $@ (f $@L cate_issect g) $@ cat_idr f.(** Equivalences are both monomorphisms and epimorphisms (but not the converse). *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b
Monic e
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b
Monic e
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b c: A f, g: c $-> a p: e $o f $== e $o g
f $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b c: A f, g: c $-> a p: e $o f $== e $o g
e^-1$ $o (e $o f) $== e^-1$ $o (e $o g)
exact (_ $@L p).Defined.Definitioncate_epic_equiv {A} `{HasEquivs A} {a b : A} (e : a $<~> b)
: Epic e
:= cate_monic_equiv (A:=A^op) (a:=b) (b:=a) e.(** ** Movement Lemmas *)(** These lemmas can be used to move equivalences around in an equation. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: a $-> c g: b $-> c p: f $o e^-1$ $== g
f $== g $o e
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: a $-> c g: b $-> c p: f $o e^-1$ $== g
f $== g $o e
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: a $-> c g: b $-> c p: f $o e^-1$ $== g
f $o e^-1$ $== g $o e $o e^-1$
exact (p $@ (compose_hh_V _ _)^$).Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: b $<~> a f: a $-> c g: b $-> c p: f $== g $o e^-1$
f $o e $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: b $<~> a f: a $-> c g: b $-> c p: f $== g $o e^-1$
f $o e $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: b $<~> a f: a $-> c g: b $-> c p: f $== g $o e^-1$
f $o e $o e^-1$ $== g $o e^-1$
exact (compose_hh_V _ _ $@ p).Defined.Definitioncate_moveL_Me {A} `{HasEquivs A} {a b c : A}
(e : b $<~> c) (f : a $-> c) (g : a $-> b)
(p : e^-1$ $o f $== g)
: f $== e $o g
:= cate_moveL_eM (A:=A^op) (a:=c) (b:=b) (c:=a) e f g p.Definitioncate_moveR_Me {A} `{HasEquivs A} {a b c : A}
(e : c $<~> b) (f : a $-> c) (g : a $-> b)
(p : f $== e^-1$ $o g)
: e $o f $== g
:= cate_moveR_eM (A:=A^op) (a:=c) (b:=b) (c:=a) e f g p.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: b $-> c g: a $-> c p: f $o e $== g
f $== g $o e^-1$
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: b $-> c g: a $-> c p: f $o e $== g
f $== g $o e^-1$
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: b $-> c g: a $-> c p: f $o e $== g
f $o e $== g $o e^-1$ $o e
exact (p $@ (compose_hV_h _ _)^$).Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: b $<~> a f: b $-> c g: a $-> c p: f $== g $o e
f $o e^-1$ $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: b $<~> a f: b $-> c g: a $-> c p: f $== g $o e
f $o e^-1$ $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: b $<~> a f: b $-> c g: a $-> c p: f $== g $o e
f $o e^-1$ $o e $== g $o e
exact (compose_hV_h _ _ $@ p).Defined.Definitioncate_moveL_Ve {A} `{HasEquivs A} {a b c : A}
(e : b $<~> c) (f : a $-> b) (g : a $-> c)
(p : e $o f $== g)
: f $== e^-1$ $o g
:= cate_moveL_eV (A:=A^op) (a:=c) (b:=b) (c:=a) e f g p.Definitioncate_moveR_Ve {A} `{HasEquivs A} {a b c : A}
(e : b $<~> c) (f : a $-> c) (g : a $-> b)
(p : f $== e $o g)
: e^-1$ $o f $== g
:= cate_moveR_eV (A:=A^op) (a:=b) (b:=c) (c:=a) e f g p.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b f: b $-> a p: e $o f $== Id b
f $== e^-1$
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b f: b $-> a p: e $o f $== Id b
f $== e^-1$
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b f: b $-> a p: e $o f $== Id b
e $o f $== e $o e^-1$
exact (p $@ (cate_isretr e)^$).Defined.Definitioncate_moveL_1V {A} `{HasEquivs A} {a b : A} {e : a $<~> b} (f : b $-> a)
(p : f $o e $== Id _)
: f $== cate_fun e^-1$
:= cate_moveL_V1 (A:=A^op) (a:=b) (b:=a) f p.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b f: b $-> a p: Id b $== e $o f
e^-1$ $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b f: b $-> a p: Id b $== e $o f
e^-1$ $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b f: b $-> a p: Id b $== e $o f
e $o e^-1$ $== e $o f
exact (cate_isretr e $@ p).Defined.Definitioncate_moveR_1V {A} `{HasEquivs A} {a b : A} {e : a $<~> b} (f : b $-> a)
(p : Id _ $== f $o e)
: cate_fun e^-1$ $== f
:= cate_moveR_V1 (A:=A^op) (a:=b) (b:=a) f p.(** Lemmas about the underlying map of an equivalence. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e, f: a $<~> b p: e $== f
e^-1$ $== f^-1$
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e, f: a $<~> b p: e $== f
e^-1$ $== f^-1$
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e, f: a $<~> b p: e $== f
f $o e^-1$ $== Id b
exact ((p^$ $@R _) $@ cate_isretr _).Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: b $<~> c
(f $oE e)^-1$ $== e^-1$ $oE f^-1$
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: b $<~> c
(f $oE e)^-1$ $== e^-1$ $oE f^-1$
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: b $<~> c
(f $oE e)^-1$ $== e^-1$ $o f^-1$
apply cate_inv_adjointify.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: b $<~> c
(f $oE e)^-1$ $== e^-1$ $o f^-1$
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: b $<~> c
(f $oE e)^-1$ $== e^-1$ $o f^-1$
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: A e: a $<~> b f: b $<~> c
(f $oE e)^-1$ $== Build_CatEquiv (e^-1$ $o f^-1$)
napply cate_inv_compose.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b
(e^-1$)^-1$ $== e
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b
(e^-1$)^-1$ $== e
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A e: a $<~> b
Id a $== e^-1$ $o e
symmetry; apply cate_issect.Defined.(** Any sufficiently coherent functor preserves equivalences. *)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b: A f: a $<~> b
CatIsEquiv (fmap F f)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b: A f: a $<~> b
CatIsEquiv (fmap F f)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b: A f: a $<~> b
fmap F f $o fmap F f^-1$ $== Id (F b)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b: A f: a $<~> b
fmap F f^-1$ $o fmap F f $== Id (F a)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b: A f: a $<~> b
fmap F f $o fmap F f^-1$ $== Id (F b)
exact ((fmap_comp F f^-1$ f)^$ $@ fmap2 F (cate_isretr _) $@ fmap_id F _).
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b: A f: a $<~> b
fmap F f^-1$ $o fmap F f $== Id (F a)
exact ((fmap_comp F f f^-1$)^$ $@ fmap2 F (cate_issect _) $@ fmap_id F _).Defined.Definitionemap {AB : Type} `{HasEquivs A} `{HasEquivs B}
(F : A -> B) `{!Is0Functor F, !Is1Functor F}
{a b : A} (f : a $<~> b)
: F a $<~> F b
:= Build_CatEquiv (fmap F f).
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a: A
emap F (id_cate a) $== id_cate (F a)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a: A
emap F (id_cate a) $== id_cate (F a)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a: A
fmap F (id_cate a) $== id_cate (F a)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a: A
fmap F (Id a) $== Id (F a)
rapply fmap_id.Defined.
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b, c: A f: a $<~> b g: b $<~> c
emap F (g $oE f) $== fmap F g $o fmap F f
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b, c: A f: a $<~> b g: b $<~> c
emap F (g $oE f) $== fmap F g $o fmap F f
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b, c: A f: a $<~> b g: b $<~> c
fmap F (g $oE f) $== fmap F g $o fmap F f
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b, c: A f: a $<~> b g: b $<~> c
fmap F (g $o f) $== fmap F g $o fmap F f
rapply fmap_comp.Defined.(** A variant. *)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b, c: A f: a $<~> b g: b $<~> c
emap F (g $oE f) $== emap F g $oE emap F f
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b, c: A f: a $<~> b g: b $<~> c
emap F (g $oE f) $== emap F g $oE emap F f
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b, c: A f: a $<~> b g: b $<~> c
fmap F g $o fmap F f $== emap F g $oE emap F f
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b, c: A f: a $<~> b g: b $<~> c
emap F g $oE emap F f $== fmap F g $o fmap F f
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b, c: A f: a $<~> b g: b $<~> c
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b: A e: a $<~> b
(emap F e)^-1$ $== emap F e^-1$
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b: A e: a $<~> b
(emap F e)^-1$ $== emap F e^-1$
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B F: A -> B Is0Functor0: Is0Functor F Is1Functor0: Is1Functor F a, b: A e: a $<~> b
fmap F e^-1$ $== emap F e^-1$
exact (cate_buildequiv_fun _)^$.Defined.Definitionemap_inv' {AB : Type} `{HasEquivs A} `{HasEquivs B}
(F : A -> B) `{!Is0Functor F, !Is1Functor F}
{a b : A} (e : a $<~> b)
: cate_fun (emap F e)^-1$ $== fmap F e^-1$
:= emap_inv F e $@ cate_buildequiv_fun _.(** When we have equivalences, we can define what it means for a category to be univalent. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
a = b -> a $<~> b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: A
a = b -> a $<~> b
intros []; reflexivity.Defined.ClassIsUnivalent1Cat (A : Type) `{HasEquivs A}
:= isequiv_cat_equiv_path :: forallab, IsEquiv (@cat_equiv_path A _ _ _ _ _ a b).Definitioncat_path_equiv {A : Type} `{IsUnivalent1Cat A} (a b : A)
: (a $<~> b) -> (a = b)
:= (cat_equiv_path a b)^-1.(** ** Core of a 1-category *)Recordcore (A : Type) := { uncore : A }.Arguments uncore {A} c.Arguments Build_core {A} a : rename.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
IsGraph (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
IsGraph (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
core A -> core A -> Type
intros a b ; exact (uncore a $<~> uncore b).Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
Is01Cat (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
Is01Cat (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
foralla : core A, CatEquiv' (uncore a) (uncore a)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forallabc : core A,
CatEquiv' (uncore b) (uncore c) ->
CatEquiv' (uncore a) (uncore b) ->
CatEquiv' (uncore a) (uncore c)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
foralla : core A, CatEquiv' (uncore a) (uncore a)
intros; apply id_cate.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forallabc : core A,
CatEquiv' (uncore b) (uncore c) ->
CatEquiv' (uncore a) (uncore b) ->
CatEquiv' (uncore a) (uncore c)
intros a b c ; exact compose_cate.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
Is2Graph (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
Is2Graph (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A
IsGraph (a $-> b)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A
(a $-> b) -> (a $-> b) -> Type
intros f g ; exact (cate_fun f $== cate_fun g).Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A
Is01Cat (a $-> b)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A
Is01Cat (a $-> b)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A
foralla0 : a $-> b, a0 $-> a0
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A
foralla0b0c : a $-> b,
(b0 $-> c) -> (a0 $-> b0) -> a0 $-> c
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A
foralla0 : a $-> b, a0 $-> a0
intro f; cbn; apply Id.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A
foralla0b0c : a $-> b,
(b0 $-> c) -> (a0 $-> b0) -> a0 $-> c
intros f g h; cbn; exact cat_comp.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A
Is0Gpd (a $-> b)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A
Is0Gpd (a $-> b)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A
foralla0b0 : a $-> b, (a0 $-> b0) -> b0 $-> a0
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f, g: a $-> b
(cate_fun' (uncore a) (uncore b) f $->
cate_fun' (uncore a) (uncore b) g) ->
cate_fun' (uncore a) (uncore b) g $->
cate_fun' (uncore a) (uncore b) f
exact gpd_rev.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: core A h: b $-> c
Is0Functor (cat_postcomp a h)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: core A h: b $-> c
Is0Functor (cat_postcomp a h)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: core A h: b $-> c
foralla0b0 : a $-> b,
(a0 $-> b0) ->
cat_postcomp a h a0 $-> cat_postcomp a h b0
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: core A h: uncore b $<~> uncore c f, g: a $-> b al: f $-> g
cat_postcomp a h f $-> cat_postcomp a h g
exact (compose_cate_fun h f
$@ (h $@L al)
$@ (compose_cate_fun h g)^$).Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: core A h: a $-> b
Is0Functor (cat_precomp c h)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: core A h: a $-> b
Is0Functor (cat_precomp c h)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: core A h: a $-> b
foralla0b0 : b $-> c,
(a0 $-> b0) ->
cat_precomp c h a0 $-> cat_precomp c h b0
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: core A h: uncore a $<~> uncore b f, g: b $-> c al: f $-> g
cat_precomp c h f $-> cat_precomp c h g
(** TODO: Why can't Coq resolve this? *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b, c: core A h: uncore a $<~> uncore b f, g: b $-> c al: f $-> g
f $== g
exact al.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
Is1Cat (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
Is1Cat (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (abcd : core A)
(f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o g $o f $== h $o (g $o f)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (abcd : core A)
(f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o (g $o f) $== h $o g $o f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : a $-> b), Id b $o f $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : a $-> b), f $o Id a $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (abcd : core A)
(f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o g $o f $== h $o (g $o f)
intros; apply compose_cate_assoc.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (abcd : core A)
(f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o (g $o f) $== h $o g $o f
intros; apply compose_cate_assoc_opp.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : a $-> b), Id b $o f $== f
intros; apply compose_cate_idl.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : a $-> b), f $o Id a $== f
intros; apply compose_cate_idr.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
Is0Gpd (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
Is0Gpd (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forallab : core A, (a $-> b) -> b $-> a
intros a b f; cbnin *; exact (f^-1$).Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
Is1Gpd (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
Is1Gpd (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: uncore a $<~> uncore b
f^-1$ $o f $== Id (uncore a)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: uncore a $<~> uncore b
f $o f^-1$ $== Id (uncore b)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: uncore a $<~> uncore b
f^-1$ $o f $== Id (uncore a)
apply cate_issect.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: uncore a $<~> uncore b
f $o f^-1$ $== Id (uncore b)
apply cate_isretr.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
HasEquivs (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
HasEquivs (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
core A -> core A -> Type
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forallab : core A, (a $-> b) -> Type
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forallab : core A, ?CatEquiv' a b -> a $-> b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : ?CatEquiv' a b),
?CatIsEquiv' a b (?cate_fun' a b f)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : a $-> b),
?CatIsEquiv' a b f -> ?CatEquiv' a b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : a $-> b)
(fe : ?CatIsEquiv' a b f),
?cate_fun' a b (?cate_buildequiv' a b f fe) $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forallab : core A, ?CatEquiv' a b -> b $-> a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : ?CatEquiv' a b),
?cate_inv' a b f $o ?cate_fun' a b f $== Id a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : ?CatEquiv' a b),
?cate_fun' a b f $o ?cate_inv' a b f $== Id b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : a $-> b)
(g : b $-> a),
f $o g $== Id b ->
g $o f $== Id a -> ?CatIsEquiv' a b f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forallab : core A, (a $-> b) -> Type
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forallab : core A,
(funa0b0 : core A => a0 $-> b0) a b -> a $-> b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A)
(f : (funa0b0 : core A => a0 $-> b0) a b),
?CatIsEquiv' a b (?cate_fun' a b f)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : a $-> b),
?CatIsEquiv' a b f ->
(funa0b0 : core A => a0 $-> b0) a b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : a $-> b)
(fe : ?CatIsEquiv' a b f),
?cate_fun' a b (?cate_buildequiv' a b f fe) $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forallab : core A,
(funa0b0 : core A => a0 $-> b0) a b -> b $-> a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A)
(f : (funa0b0 : core A => a0 $-> b0) a b),
?cate_inv' a b f $o ?cate_fun' a b f $== Id a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A)
(f : (funa0b0 : core A => a0 $-> b0) a b),
?cate_fun' a b f $o ?cate_inv' a b f $== Id b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A
forall (ab : core A) (f : a $-> b)
(g : b $-> a),
f $o g $== Id b ->
g $o f $== Id a -> ?CatIsEquiv' a b f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: a $-> b
Type
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
uncore a $<~> uncore b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
?Goal@{f:=?Goal0}
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: a $-> b X: ?Goal
uncore a $<~> uncore b
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: a $-> b fe: ?Goal
?Goal0@{f:=(funH1 : ?Goal => ?Goal5@{X:=H1}) fe} $==
f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
uncore b $<~> uncore a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
?Goal2 $oE ?Goal0 $== id_cate (uncore a)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
?Goal0 $oE ?Goal2 $== id_cate (uncore b)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: a $-> b g: uncore b $<~> uncore a r: f $oE g $== id_cate (uncore b) s: g $oE f $== id_cate (uncore a)
?Goal
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: a $-> b
Type
exact Unit. (* Or [CatIsEquiv' (uncore a) (uncore b) (cate_fun f)]? *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
uncore a $<~> uncore b
exact f.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
Unit
exact tt. (* Or [cate_isequiv' _ _ _]? *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: a $-> b X: Unit
uncore a $<~> uncore b
exact f.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: a $-> b fe: Unit
(fun_ : Unit => f) fe $== f
reflexivity.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
uncore b $<~> uncore a
exact f^-1$.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
f^-1$ $oE f $== id_cate (uncore a)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
f^-1$ $o f $== id_cate (uncore a)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
Id (uncore a) $== id_cate (uncore a)
symmetry; apply id_cate_fun.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
f $oE f^-1$ $== id_cate (uncore b)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
f $o f^-1$ $== id_cate (uncore b)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: (funab : core A => a $-> b) a b
Id (uncore b) $== id_cate (uncore b)
symmetry; apply id_cate_fun.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A a, b: core A f: a $-> b g: uncore b $<~> uncore a r: f $oE g $== id_cate (uncore b) s: g $oE f $== id_cate (uncore a)
Unit
exact tt.Defined.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A HasMorExt0: HasMorExt A H1: forall (xy : core A)
(fg : uncore x $<~> uncore y),
IsEquiv (ap cate_fun)
HasMorExt (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A HasMorExt0: HasMorExt A H1: forall (xy : core A)
(fg : uncore x $<~> uncore y),
IsEquiv (ap cate_fun)
HasMorExt (core A)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A HasMorExt0: HasMorExt A H1: forall (xy : core A)
(fg : uncore x $<~> uncore y),
IsEquiv (ap cate_fun) X, Y: core A f, g: uncore X $<~> uncore Y
IsEquiv GpdHom_path
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A HasMorExt0: HasMorExt A H1: forall (xy : core A)
(fg : uncore x $<~> uncore y),
IsEquiv (ap cate_fun) X, Y: core A f, g: uncore X $<~> uncore Y
f = g -> f $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A HasMorExt0: HasMorExt A H1: forall (xy : core A)
(fg : uncore x $<~> uncore y),
IsEquiv (ap cate_fun) X, Y: core A f, g: uncore X $<~> uncore Y
IsEquiv ?f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A HasMorExt0: HasMorExt A H1: forall (xy : core A)
(fg : uncore x $<~> uncore y),
IsEquiv (ap cate_fun) X, Y: core A f, g: uncore X $<~> uncore Y
?f == GpdHom_path
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A HasMorExt0: HasMorExt A H1: forall (xy : core A)
(fg : uncore x $<~> uncore y),
IsEquiv (ap cate_fun) X, Y: core A f, g: uncore X $<~> uncore Y
f = g -> f $== g
exact (GpdHom_path o (ap (x:=f) (y:=g) cate_fun)).
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A HasMorExt0: HasMorExt A H1: forall (xy : core A)
(fg : uncore x $<~> uncore y),
IsEquiv (ap cate_fun) X, Y: core A f, g: uncore X $<~> uncore Y
IsEquiv (GpdHom_path o ap cate_fun)
rapply isequiv_compose.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A HasMorExt0: HasMorExt A H1: forall (xy : core A)
(fg : uncore x $<~> uncore y),
IsEquiv (ap cate_fun) X, Y: core A f, g: uncore X $<~> uncore Y
GpdHom_path o ap cate_fun == GpdHom_path
intro p; byinduction p.Defined.(** * Initial objects and terminal objects are all respectively equivalent. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A
IsInitial x -> IsInitial y -> x $<~> y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A
IsInitial x -> IsInitial y -> x $<~> y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A inx: IsInitial x iny: IsInitial y
x $<~> y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A inx: IsInitial x iny: IsInitial y
(inx y).1 $o (iny x).1 $== Id y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A inx: IsInitial x iny: IsInitial y
(iny x).1 $o (inx y).1 $== Id x
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A inx: IsInitial x iny: IsInitial y
(iny x).1 $o (inx y).1 $== Id x
1: exact (((inx _).2 _)^$ $@ (inx _).2 _).Defined.Definitioncate_isterminalA `{HasEquivs A} (x y : A)
: IsTerminal x -> IsTerminal y -> y $<~> x
:= cate_isinitial A^op x y.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A
x $<~> y -> IsInitial x -> IsInitial y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A
x $<~> y -> IsInitial x -> IsInitial y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A f: x $<~> y inx: IsInitial x z: A
{f : y $-> z & forallg : y $-> z, f $== g}
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A f: x $<~> y inx: IsInitial x z: A
forallg : y $-> z, (inx z).1 $o f^-1$ $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A f: x $<~> y inx: IsInitial x z: A g: y $-> z
(inx z).1 $o f^-1$ $== g
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A f: x $<~> y inx: IsInitial x z: A g: y $-> z
(inx z).1 $o f^-1$ $== g $o f $o f^-1$
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A x, y: A f: x $<~> y inx: IsInitial x z: A g: y $-> z
(inx z).1 $== g $o f
exact ((inx z).2 _).Defined.Definitionisterminal_cateA `{HasEquivs A} (x y : A)
: y $<~> x -> IsTerminal x -> IsTerminal y
:= isinitial_cate A^op x y.(** * There is a default notion of equivalence for a 1-category, namely bi-invertibility. *)(** We do not use the half-adjoint definition, since we can't prove adjointification for that definition. *)ClassCat_IsBiInv {A} `{Is1Cat A} {x y : A} (f : x $-> y) := {
cat_equiv_inv : y $-> x;
cat_eisretr : f $o cat_equiv_inv $== Id y;
cat_equiv_inv' : y $-> x;
cat_eissect' : cat_equiv_inv' $o f $== Id x;
}.Arguments cat_equiv_inv {A}%_type_scope { _ _ _ _ x y} f {_}.Arguments cat_eisretr {A}%_type_scope { _ _ _ _ x y} f {_}.Arguments cat_equiv_inv' {A}%_type_scope { _ _ _ _ x y} f {_}.Arguments cat_eissect' {A}%_type_scope { _ _ _ _ x y} f {_}.Arguments Build_Cat_IsBiInv {A}%_type_scope {_ _ _ _ x y f} cat_equiv_inv cat_eisretr cat_equiv_inv' cat_eissect'.RecordCat_BiInvA `{Is1Cat A} (x y : A) := {
cat_equiv_fun :> x $-> y;
cat_equiv_isequiv : Cat_IsBiInv cat_equiv_fun;
}.Existing Instancecat_equiv_isequiv.(** The two inverses are necessarily homotopic. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y bif: Cat_IsBiInv f
cat_equiv_inv f $== cat_equiv_inv' f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y bif: Cat_IsBiInv f
cat_equiv_inv f $== cat_equiv_inv' f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y bif: Cat_IsBiInv f
Id x $o cat_equiv_inv f $== cat_equiv_inv' f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y bif: Cat_IsBiInv f
cat_equiv_inv' f $o f $o cat_equiv_inv f $==
cat_equiv_inv' f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y bif: Cat_IsBiInv f
cat_equiv_inv' f $o (f $o cat_equiv_inv f) $==
cat_equiv_inv' f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y bif: Cat_IsBiInv f
cat_equiv_inv' f $o Id y $== cat_equiv_inv' f
apply cat_idr.Defined.(** Therefore we can prove [eissect] for the first inverse as well. *)Definitioncat_eissect {A} `{Is1Cat A} {x y : A} (f : x $-> y) {bif : Cat_IsBiInv f}
: cat_equiv_inv f $o f $== Id x
:= (cat_inverses_homotopic f $@R f) $@ cat_eissect' f.(** This shows that any 1-category satisfies [HasEquivs]. We do not make it an instance, since we may want to use a different [HasEquivs] structure in particular cases. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A
HasEquivs A
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A
HasEquivs A
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
Type
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
(x $-> y) -> Type
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
(funxy : A => ?Goal) x y -> x $-> y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forallf : (funxy : A => ?Goal) x y,
(funxy : A => ?Goal0) x y
((funxy : A => ?Goal1) x y f)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forallf : x $-> y,
(funxy : A => ?Goal0) x y f ->
(funxy : A => ?Goal) x y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forall (f : x $-> y)
(fe : (funxy : A => ?Goal0) x y f),
(funxy : A => ?Goal1) x y
((funxy : A => ?Goal3) x y f fe) $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
(funxy : A => ?Goal) x y -> y $-> x
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forallf : (funxy : A => ?Goal) x y,
(funxy : A => ?Goal5) x y f $o
(funxy : A => ?Goal1) x y f $==
Id x
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forallf : (funxy : A => ?Goal) x y,
(funxy : A => ?Goal1) x y f $o
(funxy : A => ?Goal5) x y f $==
Id y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forall (f : x $-> y) (g : y $-> x),
f $o g $== Id y ->
g $o f $== Id x -> (funxy : A => ?Goal0) x y f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
(x $-> y) -> Type
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
(funxy : A => Cat_BiInv A x y) x y -> x $-> y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forallf : (funxy : A => Cat_BiInv A x y) x y,
(funxy : A => ?Goal) x y
((funxy : A => ?Goal0) x y f)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forallf : x $-> y,
(funxy : A => ?Goal) x y f ->
(funxy : A => Cat_BiInv A x y) x y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forall (f : x $-> y)
(fe : (funxy : A => ?Goal) x y f),
(funxy : A => ?Goal0) x y
((funxy : A => ?Goal2) x y f fe) $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
(funxy : A => Cat_BiInv A x y) x y -> y $-> x
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forallf : (funxy : A => Cat_BiInv A x y) x y,
(funxy : A => ?Goal4) x y f $o
(funxy : A => ?Goal0) x y f $==
Id x
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forallf : (funxy : A => Cat_BiInv A x y) x y,
(funxy : A => ?Goal0) x y f $o
(funxy : A => ?Goal4) x y f $==
Id y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A
forall (f : x $-> y) (g : y $-> x),
f $o g $== Id y ->
g $o f $== Id x -> (funxy : A => ?Goal) x y f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y
Type
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: Cat_BiInv A x y
x $-> y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: Cat_BiInv A x y
?Goal@{f:=?Goal0}
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y
?Goal -> Cat_BiInv A x y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y
forallfe : ?Goal, ?Goal0@{f:=?Goal2 fe} $== f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: Cat_BiInv A x y
y $-> x
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: Cat_BiInv A x y
?Goal4 $o ?Goal0 $== Id x
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: Cat_BiInv A x y
?Goal0 $o ?Goal4 $== Id y
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y
forallg : y $-> x,
f $o g $== Id y -> g $o f $== Id x -> ?Goal
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y
Type
exact (Cat_IsBiInv f).
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: Cat_BiInv A x y
x $-> y
exact f.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: Cat_BiInv A x y
Cat_IsBiInv f
exact _.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y
Cat_IsBiInv f -> Cat_BiInv A x y
apply Build_Cat_BiInv.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y
forallfe : Cat_IsBiInv f,
{| cat_equiv_fun := f; cat_equiv_isequiv := fe |} $==
f
intros; reflexivity.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: Cat_BiInv A x y
y $-> x
exact (cat_equiv_inv f).
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: Cat_BiInv A x y
cat_equiv_inv f $o f $== Id x
apply cat_eissect.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: Cat_BiInv A x y
f $o cat_equiv_inv f $== Id y
apply cat_eisretr.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y
forallg : y $-> x,
f $o g $== Id y -> g $o f $== Id x -> Cat_IsBiInv f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A x, y: A f: x $-> y g: y $-> x r: f $o g $== Id y s: g $o f $== Id x