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] Instance reflexive_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 *)
A: Type
H: IsGraph A
H0: Is01Cat A
H1: Is0Gpd A

CMorphisms.Proper (GpdHom ==> GpdHom ==> CRelationClasses.flip CRelationClasses.arrow) GpdHom
A: Type
H: IsGraph A
H0: Is01Cat A
H1: Is0Gpd A

CMorphisms.Proper (GpdHom ==> GpdHom ==> CRelationClasses.flip CRelationClasses.arrow) GpdHom
(* 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

forall x y : A, x $== y -> forall x0 y0 : 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

CMorphisms.Proper (GpdHom ==> GpdHom ==> CRelationClasses.arrow) GpdHom
A: Type
H: IsGraph A
H0: Is01Cat A
H1: Is0Gpd A

CMorphisms.Proper (GpdHom ==> GpdHom ==> CRelationClasses.arrow) GpdHom
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
by transitivity 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] Instance IsProper_fmap {A B : Type} (F : A -> B) `{Is1Functor _ _ F} (a b : A) : CMorphisms.Proper (GpdHom ==> GpdHom) (@fmap _ _ _ _ F _ a b) := fun _ _ => fmap2 F. #[export] Instance IsProper_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

CMorphisms.Proper (GpdHom ==> GpdHom ==> GpdHom) cat_comp
A: Type
IsGraph0: IsGraph A
Is2Graph0: Is2Graph A
Is01Cat0: Is01Cat A
H: Is1Cat A
a, b, c: A

CMorphisms.Proper (GpdHom ==> GpdHom ==> GpdHom) cat_comp
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

y $-> x
symmetry; exact eq_xy. Defined. #[export] Instance transitive_hom {A : Type} `{Is01Cat A} {x : A} : CMorphisms.Proper (Hom ==> CRelationClasses.arrow) (Hom x) := fun y z => cat_comp. (** ** Examples of setoid rewriting *) (** Rewriting works in hypotheses. *)
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

left_inverse $o (f $o g) $== left_inverse $o (f $o h)
exact (_ $@L eq_fg_fh). Defined.
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

fmap G f $o tau x $== fmap G g $o tau x
by apply cat_prewhisker. Defined. Section SetoidRewriteTests.

forall (A : Type) (H0 : IsGraph A) (H1 : Is01Cat A) (H : Is0Gpd A) (a b c : A), a $== b -> b $== c -> a $== c

forall (A : Type) (H0 : IsGraph A) (H1 : Is01Cat A) (H : Is0Gpd A) (a b c : 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) (a b c : A), a $== b -> b $== c -> a $== c

forall (A : Type) (H0 : IsGraph A) (H1 : Is01Cat A) (H : Is0Gpd A) (a b c : 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 (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), Is1Functor F -> forall (a b : A) (f g : a $-> b), f $== g -> fmap F f $== fmap F g

forall (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), Is1Functor F -> forall (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

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) (a b c : A) (f1 f2 : 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) (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

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) (a b c : A) (f : a $-> b) (g1 g2 : 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) (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

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) (a b c : A) (f1 f2 : a $-> b) (g1 g2 : 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) (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

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

g1 $o f2 $== g1 $o f2
Abort. End SetoidRewriteTests.