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.
(** * Typeclass instances to allow rewriting in categories *)(** The file using the setoid rewriting machinery from the Coq standard library to allow rewriting in wild-categories. Examples are given later in the file. *)(** Init.Tactics contains the definition of the Coq stdlib typeclass_inferences database. It must be imported before Basics.Overture. Otherwise, the typeclasses hintdb is cleared, breaking typeclass inference. Because of this, this file also needs to be the first file Require'd in any file that uses it. Moreover, if Foo Requires this file, then Foo must also be the first file Require'd in any file that Requires Foo, and so on. In the long term it would be good if this could be avoided. *)#[warnings="-deprecated-from-Coq"]
From Coq Require Init.Tactics.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
From HoTT Require Import Types.Forall.
[Loading ML file tauto_plugin.cmxs (using legacy method) ... done]
[Loading ML file cc_plugin.cmxs (using legacy method) ... done]
[Loading ML file firstorder_plugin.cmxs (using legacy method) ... done]
Import CMorphisms.ProperNotations.From HoTT Require Import WildCat.Core
WildCat.NatTrans WildCat.Equiv.(** ** Setoid rewriting *)#[export] Instancereflexive_proper_proxy {A : Type}
{R : Relation A} `(Reflexive A R) (x : A)
: CMorphisms.ProperProxy R x := reflexivity x.(** forall (x y : A), x $== y -> forall (a b : A), a $== b -> y $== b -> x $==a *)
(* Add the next line to the start of any proof to see what it means: *)
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A
forallxy : A,
x $== y ->
forallx0y0 : A, x0 $== y0 -> y $== y0 -> x $== x0
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A x, y: A eq_xy: x $== y a, b: A eq_ab: a $== b eq_yb: y $== b
x $== a
exact (transitivity eq_xy (transitivity eq_yb
(symmetry _ _ eq_ab))).(* We could also just write: exact (eq_xy $@ eq_yb $@ eq_ab^$). The advantage of the above proof is that it works for other transitive and symmetric relations. *)Defined.(** forall (x y : A), x $== y -> forall (a b : A), a $== b -> x $== a -> y $== b *)
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A x, y: A eq_xy: x $== y a, b: A eq_ab: a $== b eq_xa: x $== a
y $== b
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A x, y: A eq_xy: x $== y a, b: A eq_ab: a $== b eq_xa: x $== a
y $== a
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A x, y: A eq_xy: x $== y a, b: A eq_ab: a $== b eq_xa: x $== a
y $== x
exact (symmetry _ _ eq_xy).Defined.(** forall a x y : A, x $== y -> a $== x -> a $== y *)
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A a: A
CMorphisms.Proper (GpdHom ==> CRelationClasses.arrow)
(GpdHom a)
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A a: A
CMorphisms.Proper (GpdHom ==> CRelationClasses.arrow)
(GpdHom a)
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A a, x, y: A eq_xy: x $== y eq_ax: a $== x
a $== y
bytransitivity x.Defined.(** forall a x y : A, x $== y -> a $== y -> a $== x *)
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A a: A
CMorphisms.Proper
(GpdHom ==>
CRelationClasses.flip CRelationClasses.arrow)
(GpdHom a)
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A a: A
CMorphisms.Proper
(GpdHom ==>
CRelationClasses.flip CRelationClasses.arrow)
(GpdHom a)
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A a, x, y: A eq_xy: x $== y eq_ay: a $== y
a $== x
exact (transitivity eq_ay (symmetry _ _ eq_xy)).Defined.Open Scope signatureT_scope.(** If [R] is symmetric and [R x y -> R' (f x) (f y)], then [R y x -> R' (f x) (f y)]. *)
A, B: Type f: A -> B R: Relation A R': Relation B H: Symmetric R H0: CMorphisms.Proper (R ==> R') f
CMorphisms.Proper (R --> R') f
A, B: Type f: A -> B R: Relation A R': Relation B H: Symmetric R H0: CMorphisms.Proper (R ==> R') f
CMorphisms.Proper (R --> R') f
A, B: Type f: A -> B R: Relation A R': Relation B H: Symmetric R H0: CMorphisms.Proper (R ==> R') f a, b: A Rba: R b a
R' (f a) (f b)
A, B: Type f: A -> B R: Relation A R': Relation B H: Symmetric R H0: CMorphisms.Proper (R ==> R') f a, b: A Rba: R b a
R a b
A, B: Type f: A -> B R: Relation A R': Relation B H: Symmetric R H0: CMorphisms.Proper (R ==> R') f a, b: A Rba: R b a
R b a
exact Rba.Defined.(** If [R'] is symmetric and [R x y -> R' x' y' -> R'' (f x x') (f y y')], then [R x y -> R' y' x' -> R'' (f x x') (f y y')]. *)
A, B, C: Type R: Relation A R': Relation B R'': Relation C H: Symmetric R' f: A -> B -> C H1: CMorphisms.Proper (R ==> R' ==> R'') f
CMorphisms.Proper (R ==> R' --> R'') f
A, B, C: Type R: Relation A R': Relation B R'': Relation C H: Symmetric R' f: A -> B -> C H1: CMorphisms.Proper (R ==> R' ==> R'') f
CMorphisms.Proper (R ==> R' --> R'') f
A, B, C: Type R: Relation A R': Relation B R'': Relation C H: Symmetric R' f: A -> B -> C H1: CMorphisms.Proper (R ==> R' ==> R'') f a, b: A Rab: R a b x, y: B R'yx: CRelationClasses.flip R' x y
R'' (f a x) (f b y)
apply H1; [ assumption | symmetry; assumption ].Defined.#[export] InstanceIsProper_fmap {AB : Type}
(F : A -> B) `{Is1Functor _ _ F} (a b : A)
: CMorphisms.Proper (GpdHom ==> GpdHom) (@fmap _ _ _ _ F _ a b)
:= fun__ => fmap2 F.#[export] InstanceIsProper_catcomp_g {A : Type} `{Is1Cat A}
{a b c : A} (g : b $-> c)
: CMorphisms.Proper (GpdHom ==> GpdHom) (@cat_comp _ _ _ a b c g)
:= fun__ => cat_postwhisker g.
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A g1, g2: b $-> c eq_g: g1 $== g2 f1, f2: a $-> b eq_f: f1 $== f2
g1 $o f1 $== g2 $o f2
exact (cat_comp2 eq_f eq_g).Defined.
A, B: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A R: Relation B F: A -> B H2: CMorphisms.Proper (GpdHom ==> R) F
CMorphisms.Proper (Hom ==> R) F
A, B: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A R: Relation B F: A -> B H2: CMorphisms.Proper (GpdHom ==> R) F
CMorphisms.Proper (Hom ==> R) F
intros a b eq_ab; apply H2; exact eq_ab.Defined.
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A
CMorphisms.Proper
(Hom ==> Hom ==> CRelationClasses.arrow) Hom
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A
CMorphisms.Proper
(Hom ==> Hom ==> CRelationClasses.arrow) Hom
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A x, y: A eq_xy: x $-> y a, b: A eq_ab: a $-> b f: x $-> a
y $-> b
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A x, y: A eq_xy: x $-> y a, b: A eq_ab: a $-> b f: x $-> a
y $-> a
A: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A x, y: A eq_xy: x $-> y a, b: A eq_ab: a $-> b f: x $-> a
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b: A f: a $-> b
SectionOf f -> Epic f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b: A f: a $-> b
SectionOf f -> Epic f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b: A f: a $-> b right_inverse: b $-> a is_section: f $o right_inverse $== Id b c: A g, h: b $-> c eq_gf_hf: g $o f $== h $o f
g $== h
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b: A f: a $-> b right_inverse: b $-> a is_section: f $o right_inverse $== Id b c: A g, h: b $-> c eq_gf_hf: g $o f $o right_inverse $==
h $o f $o right_inverse
g $== h
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b: A f: a $-> b right_inverse: b $-> a is_section: f $o right_inverse $== Id b c: A g, h: b $-> c eq_gf_hf: g $== h
g $== h
exact eq_gf_hf.Defined.(** A different approach, working in the goal. *)
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A b, c: A f: b $-> c
RetractionOf f -> Monic f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A b, c: A f: b $-> c
RetractionOf f -> Monic f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A b, c: A f: b $-> c left_inverse: c $-> b is_retraction: left_inverse $o f $== Id b a: A g, h: a $-> b eq_fg_fh: f $o g $== f $o h
g $== h
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A b, c: A f: b $-> c left_inverse: c $-> b is_retraction: left_inverse $o f $== Id b a: A g, h: a $-> b eq_fg_fh: f $o g $== f $o h
Id b $o g $== Id b $o h
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A b, c: A f: b $-> c left_inverse: c $-> b is_retraction: left_inverse $o f $== Id b a: A g, h: a $-> b eq_fg_fh: f $o g $== f $o h
left_inverse $o f $o g $== left_inverse $o f $o h
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A b, c: A f: b $-> c left_inverse: c $-> b is_retraction: left_inverse $o f $== Id b a: A g, h: a $-> b eq_fg_fh: f $o g $== f $o h
A, B: Type F, G: A -> B IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F Is0Functor1: Is0Functor G Is1Functor0: Is1Functor G HasEquivs0: HasEquivs B tau: NatEquiv F G
Faithful F -> Faithful G
A, B: Type F, G: A -> B IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F Is0Functor1: Is0Functor G Is1Functor0: Is1Functor G HasEquivs0: HasEquivs B tau: NatEquiv F G
Faithful F -> Faithful G
A, B: Type F, G: A -> B IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F Is0Functor1: Is0Functor G Is1Functor0: Is1Functor G HasEquivs0: HasEquivs B tau: NatEquiv F G faithful_F: Faithful F x, y: A f, g: x $-> y eq_Gf_Gg: fmap G f $== fmap G g
f $== g
A, B: Type F, G: A -> B IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F Is0Functor1: Is0Functor G Is1Functor0: Is1Functor G HasEquivs0: HasEquivs B tau: NatEquiv F G faithful_F: Faithful F x, y: A f, g: x $-> y eq_Gf_Gg: fmap G f $== fmap G g
fmap F f $== fmap F g
A, B: Type F, G: A -> B IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F Is0Functor1: Is0Functor G Is1Functor0: Is1Functor G HasEquivs0: HasEquivs B tau: NatEquiv F G faithful_F: Faithful F x, y: A f, g: x $-> y eq_Gf_Gg: fmap G f $== fmap G g
tau y $o fmap F f $== tau y $o fmap F g
A, B: Type F, G: A -> B IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F Is0Functor1: Is0Functor G Is1Functor0: Is1Functor G HasEquivs0: HasEquivs B tau: NatEquiv F G faithful_F: Faithful F x, y: A f, g: x $-> y eq_Gf_Gg: fmap G f $== fmap G g
forall (A : Type) (H0 : IsGraph A) (H1 : Is01Cat A)
(H : Is0Gpd A) (abc : A),
a $== b -> b $== c -> a $== c
forall (A : Type) (H0 : IsGraph A) (H1 : Is01Cat A)
(H : Is0Gpd A) (abc : A),
a $== b -> b $== c -> a $== c
A: Type H0: IsGraph A H1: Is01Cat A H: Is0Gpd A a, b, c: A eq_ab: a $== b eq_bc: b $== c
a $== c
A: Type H0: IsGraph A H1: Is01Cat A H: Is0Gpd A a, b, c: A eq_ab: a $== b eq_bc: b $== c
b $== b
Abort.
forall (A : Type) (H0 : IsGraph A) (H1 : Is01Cat A)
(H : Is0Gpd A) (abc : A),
a $== b -> b $== c -> a $== c
forall (A : Type) (H0 : IsGraph A) (H1 : Is01Cat A)
(H : Is0Gpd A) (abc : A),
a $== b -> b $== c -> a $== c
A: Type H0: IsGraph A H1: Is01Cat A H: Is0Gpd A a, b, c: A eq_ab: a $== b eq_bc: b $== c
a $== c
A: Type H0: IsGraph A H1: Is01Cat A H: Is0Gpd A a, b, c: A eq_ab: a $== b eq_bc: b $== c
c $== a
A: Type H0: IsGraph A H1: Is01Cat A H: Is0Gpd A a, b, c: A eq_ab: a $== b eq_bc: b $== c
b $== b
A: Type H0: IsGraph A H1: Is01Cat A H: Is0Gpd A a, b, c: A eq_ab: a $== b eq_bc: b $== c
c $== c
A: Type H0: IsGraph A H1: Is01Cat A H: Is0Gpd A a, b, c: A eq_ab: a $== b eq_bc: b $== c
b $== b
Abort.
forall (AB : Type) (F : A -> B)
(IsGraph0 : IsGraph A) (Is2Graph0 : Is2Graph A)
(Is01Cat0 : Is01Cat A) (H : Is1Cat A)
(IsGraph1 : IsGraph B) (Is2Graph1 : Is2Graph B)
(Is01Cat1 : Is01Cat B) (H0 : Is1Cat B)
(Is0Functor0 : Is0Functor F),
Is1Functor F ->
forall (ab : A) (fg : a $-> b),
f $== g -> fmap F f $== fmap F g
forall (AB : Type) (F : A -> B)
(IsGraph0 : IsGraph A) (Is2Graph0 : Is2Graph A)
(Is01Cat0 : Is01Cat A) (H : Is1Cat A)
(IsGraph1 : IsGraph B) (Is2Graph1 : Is2Graph B)
(Is01Cat1 : Is01Cat B) (H0 : Is1Cat B)
(Is0Functor0 : Is0Functor F),
Is1Functor F ->
forall (ab : A) (fg : a $-> b),
f $== g -> fmap F f $== fmap F g
A, B: Type F: A -> B IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F a, b: A f, g: a $-> b
f $== g -> fmap F f $== fmap F g
A, B: Type F: A -> B IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F a, b: A f, g: a $-> b eq_fg: f $== g
fmap F f $== fmap F g
A, B: Type F: A -> B IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F a, b: A f, g: a $-> b eq_fg: f $== g
fmap F g $== fmap F g
Abort.
forall (A : Type) (IsGraph0 : IsGraph A)
(Is2Graph0 : Is2Graph A) (Is01Cat0 : Is01Cat A)
(H : Is1Cat A) (abc : A) (f1f2 : a $-> b)
(g : b $-> c), f1 $== f2 -> g $o f1 $== g $o f2
forall (A : Type) (IsGraph0 : IsGraph A)
(Is2Graph0 : Is2Graph A) (Is01Cat0 : Is01Cat A)
(H : Is1Cat A) (abc : A) (f1f2 : a $-> b)
(g : b $-> c), f1 $== f2 -> g $o f1 $== g $o f2
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f1, f2: a $-> b g: b $-> c
f1 $== f2 -> g $o f1 $== g $o f2
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f1, f2: a $-> b g: b $-> c eq: f1 $== f2
g $o f1 $== g $o f2
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f1, f2: a $-> b g: b $-> c eq: f1 $== f2
g $o f1 $== g $o f1
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f1, f2: a $-> b g: b $-> c eq: f1 $== f2
g $o f2 $== g $o f2
Abort.
forall (A : Type) (IsGraph0 : IsGraph A)
(Is2Graph0 : Is2Graph A) (Is01Cat0 : Is01Cat A)
(H : Is1Cat A) (abc : A) (f : a $-> b)
(g1g2 : b $-> c), g1 $== g2 -> g1 $o f $== g2 $o f
forall (A : Type) (IsGraph0 : IsGraph A)
(Is2Graph0 : Is2Graph A) (Is01Cat0 : Is01Cat A)
(H : Is1Cat A) (abc : A) (f : a $-> b)
(g1g2 : b $-> c), g1 $== g2 -> g1 $o f $== g2 $o f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f: a $-> b g1, g2: b $-> c
g1 $== g2 -> g1 $o f $== g2 $o f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f: a $-> b g1, g2: b $-> c eq: g1 $== g2
g1 $o f $== g2 $o f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f: a $-> b g1, g2: b $-> c eq: g1 $== g2
g1 $o f $== g1 $o f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f: a $-> b g1, g2: b $-> c eq: g1 $== g2
g2 $o f $== g2 $o f
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f: a $-> b g1, g2: b $-> c eq: g1 $== g2
g1 $o f $== g1 $o f
Abort.
forall (A : Type) (IsGraph0 : IsGraph A)
(Is2Graph0 : Is2Graph A) (Is01Cat0 : Is01Cat A)
(H : Is1Cat A) (abc : A) (f1f2 : a $-> b)
(g1g2 : b $-> c),
g1 $== g2 -> f1 $== f2 -> g1 $o f1 $== g2 $o f2
forall (A : Type) (IsGraph0 : IsGraph A)
(Is2Graph0 : Is2Graph A) (Is01Cat0 : Is01Cat A)
(H : Is1Cat A) (abc : A) (f1f2 : a $-> b)
(g1g2 : b $-> c),
g1 $== g2 -> f1 $== f2 -> g1 $o f1 $== g2 $o f2
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f1, f2: a $-> b g1, g2: b $-> c
g1 $== g2 -> f1 $== f2 -> g1 $o f1 $== g2 $o f2
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f1, f2: a $-> b g1, g2: b $-> c eq_g: g1 $== g2 eq_f: f1 $== f2
g1 $o f1 $== g2 $o f2
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f1, f2: a $-> b g1, g2: b $-> c eq_g: g1 $== g2 eq_f: f1 $== f2
g2 $o f1 $== g2 $o f2
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f1, f2: a $-> b g1, g2: b $-> c eq_g: g1 $== g2 eq_f: f1 $== f2
g2 $o f1 $== g2 $o f1
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f1, f2: a $-> b g1, g2: b $-> c eq_g: g1 $== g2 eq_f: f1 $== f2
g2 $o f2 $== g2 $o f2
A: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A a, b, c: A f1, f2: a $-> b g1, g2: b $-> c eq_g: g1 $== g2 eq_f: f1 $== f2