Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import WildCat.Core.Require Import Truncations.Core.Require Import Algebra.Groups.Group.Require Import Colimits.Coeq.Require Import Algebra.Groups.FreeProduct.LocalOpen Scope mc_scope.LocalOpen Scope mc_mult_scope.(** Coequalizers of group homomorphisms *)
A, B: Group f, g: A $-> B
Group
A, B: Group f, g: A $-> B
Group
A, B: Group f, g: A $-> B
GroupHomomorphism (FreeProduct A A) A
A, B: Group f, g: A $-> B
GroupHomomorphism (FreeProduct A A) B
A, B: Group f, g: A $-> B
GroupHomomorphism A A
A, B: Group f, g: A $-> B
GroupHomomorphism A A
A, B: Group f, g: A $-> B
GroupHomomorphism A B
A, B: Group f, g: A $-> B
GroupHomomorphism A B
A, B: Group f, g: A $-> B
GroupHomomorphism A A
exact grp_homo_id.
A, B: Group f, g: A $-> B
GroupHomomorphism A A
exact grp_homo_id.
A, B: Group f, g: A $-> B
GroupHomomorphism A B
exact f.
A, B: Group f, g: A $-> B
GroupHomomorphism A B
exact g.Defined.
H: Funext A, B, C: Group f, g: GroupHomomorphism A B
{h : B $-> C & h o f == h o g} <~>
(GroupCoeq f g $-> C)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B
{h : B $-> C & h o f == h o g} <~>
(GroupCoeq f g $-> C)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B
{h : B $-> C &
(funx : A => h (f x)) == (funx : A => h (g x))} <~>
{h : GroupHomomorphism A C &
{k : GroupHomomorphism B C &
(funx : FreeProduct A A =>
h (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
k (FreeProduct_rec A A B f g x))}}
H: Funext A, B, C: Group f, g: GroupHomomorphism A B
{h : B $-> C &
(funx : A => h (f x)) == (funx : A => h (g x))} <~>
{a : GroupHomomorphism B C &
{b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
a (FreeProduct_rec A A B f g x))}}
H: Funext A, B, C: Group f, g: GroupHomomorphism A B
foralla : B $-> C,
(funx : A => a (f x)) == (funx : A => a (g x)) <~>
{b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
a (FreeProduct_rec A A B f g x))}
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
(funx : A => h (f x)) == (funx : A => h (g x)) <~>
{b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))}
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
(funx : A => h (f x)) == (funx : A => h (g x)) ->
{b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))}
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
{b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))} ->
(funx : A => h (f x)) == (funx : A => h (g x))
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
?f o ?g == idmap
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
?g o ?f == idmap
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
(funx : A => h (f x)) == (funx : A => h (g x)) ->
{b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))}
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x))
{b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))}
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x))
(funx : FreeProduct A A =>
grp_homo_compose h f
(FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) x: FreeProduct A A
grp_homo_compose h f
(FreeProduct_rec A A A grp_homo_id grp_homo_id x) =
h (FreeProduct_rec A A B f g x)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) x: FreeProduct A A
h
(g (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) =
h (FreeProduct_rec A A B f g x)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x))
forallx : FreeProduct A A,
h
(g (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) =
h (FreeProduct_rec A A B f g x)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x))
foralla : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)),
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
(tr a))) =
h (FreeProduct_rec A A B f g (tr a))
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x))
foralla : FreeProduct.Words A A,
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
(tr w))) =
h (FreeProduct_rec A A B f g (tr w))) (coeq a)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x))
forallb : FreeProduct.pc1 A A + FreeProduct.pc2 A A +
FreeProduct.pc3 grp_trivial A A +
FreeProduct.pc4 A A + FreeProduct.pc5 A A,
transport
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
(tr w))) =
h (FreeProduct_rec A A B f g (tr w))) (cglue b)
(?coeq'
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A) b)) =
?coeq'
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A) b)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x))
foralla : FreeProduct.Words A A,
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
(tr w))) =
h (FreeProduct_rec A A B f g (tr w))) (coeq a)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) w: FreeProduct.Words A A
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
(tr w))) =
h (FreeProduct_rec A A B f g (tr w))) (coeq w)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) w: FreeProduct.Words A A
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
(tr (coeq w)))) =
h (FreeProduct_rec A A B f g (tr (coeq w)))
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x))
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
(tr (coeq Core.nil)))) =
h (FreeProduct_rec A A B f g (tr (coeq Core.nil)))
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) a: (A + A)%type w: Core.list (A + A) IHw: h (g (FreeProduct_rec A A A grp_homo_id grp_homo_id (tr (coeq w)))) =
h (FreeProduct_rec A A B f g (tr (coeq w)))
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
(tr (coeq (Core.cons a w))))) =
h
(FreeProduct_rec A A B f g
(tr (coeq (Core.cons a w))))
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) a: (A + A)%type w: Core.list (A + A) IHw: h (g (FreeProduct_rec A A A grp_homo_id grp_homo_id (tr (coeq w)))) =
h (FreeProduct_rec A A B f g (tr (coeq w)))
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
(tr (coeq (Core.cons a w))))) =
h
(FreeProduct_rec A A B f g
(tr (coeq (Core.cons a w))))
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) a: (A + A)%type w: Core.list (A + A) IHw: h (g (FreeProduct_rec A A A grp_homo_id grp_homo_id (tr (coeq w)))) =
h (FreeProduct_rec A A B f g (tr (coeq w)))
h
(g
(match a with
| inl g | inr g => funx : A => g * x
end
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g | inr g => funx : A => g * x
end) mon_unit w))) =
h
(match a with
| inl g => funx : B => f g * x
| inr g0 => funx : B => g g0 * x
end
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g => funx : B => f g * x
| inr g0 => funx : B => g g0 * x
end) mon_unit w))
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) a: A w: Core.list (A + A) IHw: h (g (FreeProduct_rec A A A grp_homo_id grp_homo_id (tr (coeq w)))) =
h (FreeProduct_rec A A B f g (tr (coeq w)))
h
(g
(a *
Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g | inr g => funx : A => g * x
end) mon_unit w)) =
h
(f a *
Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g => funx : B => f g * x
| inr g0 => funx : B => g g0 * x
end) mon_unit w)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) a: A w: Core.list (A + A) IHw: h (g (FreeProduct_rec A A A grp_homo_id grp_homo_id (tr (coeq w)))) =
h (FreeProduct_rec A A B f g (tr (coeq w)))
h
(g
(a *
Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g | inr g => funx : A => g * x
end) mon_unit w)) =
h
(g a *
Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g => funx : B => f g * x
| inr g0 => funx : B => g g0 * x
end) mon_unit w)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) a: A w: Core.list (A + A) IHw: h (g (FreeProduct_rec A A A grp_homo_id grp_homo_id (tr (coeq w)))) =
h (FreeProduct_rec A A B f g (tr (coeq w)))
h
(g a *
g
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g | inr g => funx : A => g * x
end) mon_unit w)) =
h
(f a *
Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g => funx : B => f g * x
| inr g0 => funx : B => g g0 * x
end) mon_unit w)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) a: A w: Core.list (A + A) IHw: h (g (FreeProduct_rec A A A grp_homo_id grp_homo_id (tr (coeq w)))) =
h (FreeProduct_rec A A B f g (tr (coeq w)))
h
(g a *
g
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g | inr g => funx : A => g * x
end) mon_unit w)) =
h
(g a *
Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g => funx : B => f g * x
| inr g0 => funx : B => g g0 * x
end) mon_unit w)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) a: A w: Core.list (A + A) IHw: h (g (FreeProduct_rec A A A grp_homo_id grp_homo_id (tr (coeq w)))) =
h (FreeProduct_rec A A B f g (tr (coeq w)))
h (g a) = h (f a)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C p: (funx : A => h (f x)) == (funx : A => h (g x)) a: A w: Core.list (A + A) IHw: h (g (FreeProduct_rec A A A grp_homo_id grp_homo_id (tr (coeq w)))) =
h (FreeProduct_rec A A B f g (tr (coeq w)))
h (f a) = h (g a)
apply p.
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
{b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))} ->
(funx : A => h (f x)) == (funx : A => h (g x))
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
(funp : (funx : A => h (f x)) ==
(funx : A => h (g x)) =>
(grp_homo_compose h f;
(funx : FreeProduct A A =>
p (FreeProduct_rec A A A grp_homo_id grp_homo_id x) @
Trunc_ind
(funaa : Trunc 0
(Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A))) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id aa)) =
h (FreeProduct_rec A A B f g aa))
(Coeq_ind
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (...)))) =
h
(FreeProduct_rec A A B f g (tr (coeq w0))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(...))) =
h
(FreeProduct_rec A A B f g
(tr (...)))) =>
match
a as s return (h (...) = h (...))
with
| inl g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
| inr g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
end
:
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr ...))) =
h
(FreeProduct_rec A A B f g
(tr (coeq ...)))) w
:
(funw0 : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w0))) =
h (FreeProduct_rec A A B f g (tr w0)))
(coeq w))
(funb : FreeProduct.pc1 A A +
FreeProduct.pc2 A A +
FreeProduct.pc3 grp_trivial A A +
FreeProduct.pc4 A A +
FreeProduct.pc5 A A =>
path_ishprop
(transport
(funw : Coeq
(FreeProduct.map1 grp_trivial A
A (grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A
A (grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(cglue b)
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : ... => h ... = h ...)
(ap h (grp_homo_unit g))
(fun (a : ...) (w0 : ...) (IHw : ...)
=> ...
...
...
end : ... = ...) w
:
(funw0 : ... => h ... = h ...)
(coeq w))
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A) b)))
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (...))
(IHw : h ... = h ...) =>
match ... ... with
| ... => ... g0
| ... => ... g0
end
:
h (...) = h (...)) w
:
(funw0 : Coeq (...) (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(coeq w))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A) b)))) x)
:
(funx : FreeProduct A A =>
grp_homo_compose h f
(FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)))) o ?g == idmap
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
?g
o (funp : (funx : A => h (f x)) ==
(funx : A => h (g x)) =>
(grp_homo_compose h f;
(funx : FreeProduct A A =>
p
(FreeProduct_rec A A A grp_homo_id grp_homo_id x) @
Trunc_ind
(funaa : Trunc 0
(Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A))) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id aa)) =
h (FreeProduct_rec A A B f g aa))
(Coeq_ind
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (...)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w0))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(...))) =
h
(FreeProduct_rec A A B f g
(tr (...)))) =>
match
a as s return (h (...) = h (...))
with
| inl g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
| inr g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
end
:
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr ...))) =
h
(FreeProduct_rec A A B f g
(tr (coeq ...)))) w
:
(funw0 : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w0))) =
h (FreeProduct_rec A A B f g (tr w0)))
(coeq w))
(funb : FreeProduct.pc1 A A +
FreeProduct.pc2 A A +
FreeProduct.pc3 grp_trivial A A +
FreeProduct.pc4 A A +
FreeProduct.pc5 A A =>
path_ishprop
(transport
(funw : Coeq
(FreeProduct.map1 grp_trivial
A A (grp_trivial_rec A))
(FreeProduct.map2 grp_trivial
A A (grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(cglue b)
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : ... => h ... = h ...)
(ap h (grp_homo_unit g))
(fun (a : ...) (w0 : ...)
(IHw : ...) =>
...
...
...
end : ... = ...) w
:
(funw0 : ... => h ... = h ...)
(coeq w))
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A) b)))
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(ap h (grp_homo_unit g))
(fun (a : A + A)
(w0 : Core.list (...))
(IHw : h ... = h ...) =>
match ... ... with
| ... => ... g0
| ... => ... g0
end
:
h (...) = h (...)) w
:
(funw0 : Coeq (...) (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(coeq w))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A) b)))) x)
:
(funx : FreeProduct A A =>
grp_homo_compose h f
(FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)))) == idmap
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
{b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b (FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))} ->
(funx : A => h (f x)) == (funx : A => h (g x))
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)) x: A
h (f x) = h (g x)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)) x: A q1: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) (freeproduct_inl x) =
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))
(freeproduct_inl x)
h (f x) = h (g x)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)) x: A q1: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) (freeproduct_inl x) =
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))
(freeproduct_inl x) q2: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) (freeproduct_inr x) =
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))
(freeproduct_inr x)
h (f x) = h (g x)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)) x: A q1: k (x * mon_unit) = h (f x * mon_unit) q2: k (x * mon_unit) = h (g x * mon_unit)
h (f x) = h (g x)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)) x: A q1: k x = h (f x) q2: k x = h (g x)
h (f x) = h (g x)
refine (q1^ @ q2).
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
(funp : (funx : A => h (f x)) ==
(funx : A => h (g x)) =>
(grp_homo_compose h f;
(funx : FreeProduct A A =>
p (FreeProduct_rec A A A grp_homo_id grp_homo_id x) @
Trunc_ind
(funaa : Trunc 0
(Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A))) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id aa)) =
h (FreeProduct_rec A A B f g aa))
(Coeq_ind
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (...)))) =
h
(FreeProduct_rec A A B f g (tr (coeq w0))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(...))) =
h
(FreeProduct_rec A A B f g
(tr (...)))) =>
match
a as s return (h (...) = h (...))
with
| inl g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
| inr g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
end
:
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr ...))) =
h
(FreeProduct_rec A A B f g
(tr (coeq ...)))) w
:
(funw0 : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w0))) =
h (FreeProduct_rec A A B f g (tr w0)))
(coeq w))
(funb : FreeProduct.pc1 A A +
FreeProduct.pc2 A A +
FreeProduct.pc3 grp_trivial A A +
FreeProduct.pc4 A A +
FreeProduct.pc5 A A =>
path_ishprop
(transport
(funw : Coeq
(FreeProduct.map1 grp_trivial A
A (grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A
A (grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(cglue b)
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : ... => h ... = h ...)
(ap h (grp_homo_unit g))
(fun (a : ...) (w0 : ...) (IHw : ...)
=> ...
...
...
end : ... = ...) w
:
(funw0 : ... => h ... = h ...)
(coeq w))
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A) b)))
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (...))
(IHw : h ... = h ...) =>
match ... ... with
| ... => ... g0
| ... => ... g0
end
:
h (...) = h (...)) w
:
(funw0 : Coeq (...) (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(coeq w))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A) b)))) x)
:
(funx : FreeProduct A A =>
grp_homo_compose h f
(FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))))
o (funX : {b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))} =>
(fun (k : GroupHomomorphism A C)
(p : (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))) =>
(funx : A =>
letq1 := p (freeproduct_inl x) inletq2 := p (freeproduct_inr x) inletq3 :=
internal_paths_rew
(fung : A => k g = h (f x * mon_unit)) q1
(right_identity x) inletq4 :=
internal_paths_rew
(fung0 : A => k g0 = h (g x * mon_unit)) q2
(right_identity x) inletq5 :=
internal_paths_rew (fung : B => k x = h g) q3
(right_identity (f x)) inletq6 :=
internal_paths_rew (fung : B => k x = h g) q4
(right_identity (g x)) in
q5^ @ q6)
:
(funx : A => h (f x)) == (funx : A => h (g x)))
X.1 X.2) == idmap
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
(funX : {b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))} =>
(fun (k : GroupHomomorphism A C)
(p : (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))) =>
(funx : A =>
letq1 := p (freeproduct_inl x) inletq2 := p (freeproduct_inr x) inletq3 :=
internal_paths_rew
(fung : A => k g = h (f x * mon_unit)) q1
(right_identity x) inletq4 :=
internal_paths_rew
(fung0 : A => k g0 = h (g x * mon_unit)) q2
(right_identity x) inletq5 :=
internal_paths_rew (fung : B => k x = h g) q3
(right_identity (f x)) inletq6 :=
internal_paths_rew (fung : B => k x = h g) q4
(right_identity (g x)) in
q5^ @ q6)
:
(funx : A => h (f x)) == (funx : A => h (g x)))
X.1 X.2)
o (funp : (funx : A => h (f x)) ==
(funx : A => h (g x)) =>
(grp_homo_compose h f;
(funx : FreeProduct A A =>
p
(FreeProduct_rec A A A grp_homo_id grp_homo_id x) @
Trunc_ind
(funaa : Trunc 0
(Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A))) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id aa)) =
h (FreeProduct_rec A A B f g aa))
(Coeq_ind
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (...)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w0))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(...))) =
h
(FreeProduct_rec A A B f g
(tr (...)))) =>
match
a as s return (h (...) = h (...))
with
| inl g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
| inr g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
end
:
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr ...))) =
h
(FreeProduct_rec A A B f g
(tr (coeq ...)))) w
:
(funw0 : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w0))) =
h (FreeProduct_rec A A B f g (tr w0)))
(coeq w))
(funb : FreeProduct.pc1 A A +
FreeProduct.pc2 A A +
FreeProduct.pc3 grp_trivial A A +
FreeProduct.pc4 A A +
FreeProduct.pc5 A A =>
path_ishprop
(transport
(funw : Coeq
(FreeProduct.map1 grp_trivial
A A (grp_trivial_rec A))
(FreeProduct.map2 grp_trivial
A A (grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(cglue b)
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : ... => h ... = h ...)
(ap h (grp_homo_unit g))
(fun (a : ...) (w0 : ...)
(IHw : ...) =>
...
...
...
end : ... = ...) w
:
(funw0 : ... => h ... = h ...)
(coeq w))
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A) b)))
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(ap h (grp_homo_unit g))
(fun (a : A + A)
(w0 : Core.list (...))
(IHw : h ... = h ...) =>
match ... ... with
| ... => ... g0
| ... => ... g0
end
:
h (...) = h (...)) w
:
(funw0 : Coeq (...) (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(coeq w))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A) b)))) x)
:
(funx : FreeProduct A A =>
grp_homo_compose h f
(FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)))) == idmap
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
(funp : (funx : A => h (f x)) ==
(funx : A => h (g x)) =>
(grp_homo_compose h f;
(funx : FreeProduct A A =>
p (FreeProduct_rec A A A grp_homo_id grp_homo_id x) @
Trunc_ind
(funaa : Trunc 0
(Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A))) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id aa)) =
h (FreeProduct_rec A A B f g aa))
(Coeq_ind
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (...)))) =
h
(FreeProduct_rec A A B f g (tr (coeq w0))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(...))) =
h
(FreeProduct_rec A A B f g
(tr (...)))) =>
match
a as s return (h (...) = h (...))
with
| inl g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
| inr g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
end
:
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr ...))) =
h
(FreeProduct_rec A A B f g
(tr (coeq ...)))) w
:
(funw0 : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w0))) =
h (FreeProduct_rec A A B f g (tr w0)))
(coeq w))
(funb : FreeProduct.pc1 A A +
FreeProduct.pc2 A A +
FreeProduct.pc3 grp_trivial A A +
FreeProduct.pc4 A A +
FreeProduct.pc5 A A =>
path_ishprop
(transport
(funw : Coeq
(FreeProduct.map1 grp_trivial A
A (grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A
A (grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(cglue b)
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : ... => h ... = h ...)
(ap h (grp_homo_unit g))
(fun (a : ...) (w0 : ...) (IHw : ...)
=> ...
...
...
end : ... = ...) w
:
(funw0 : ... => h ... = h ...)
(coeq w))
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A) b)))
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (...))
(IHw : h ... = h ...) =>
match ... ... with
| ... => ... g0
| ... => ... g0
end
:
h (...) = h (...)) w
:
(funw0 : Coeq (...) (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(coeq w))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A) b)))) x)
:
(funx : FreeProduct A A =>
grp_homo_compose h f
(FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))))
o (funX : {b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))} =>
(fun (k : GroupHomomorphism A C)
(p : (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))) =>
(funx : A =>
letq1 := p (freeproduct_inl x) inletq2 := p (freeproduct_inr x) inletq3 :=
internal_paths_rew
(fung : A => k g = h (f x * mon_unit)) q1
(right_identity x) inletq4 :=
internal_paths_rew
(fung0 : A => k g0 = h (g x * mon_unit)) q2
(right_identity x) inletq5 :=
internal_paths_rew (fung : B => k x = h g) q3
(right_identity (f x)) inletq6 :=
internal_paths_rew (fung : B => k x = h g) q4
(right_identity (g x)) in
q5^ @ q6)
:
(funx : A => h (f x)) == (funx : A => h (g x)))
X.1 X.2) == idmap
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
forallx : {b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))},
(grp_homo_compose h f;
funx0 : FreeProduct A A =>
(letq1 :=
x.2
(freeproduct_inl
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x0)) inletq2 :=
x.2
(freeproduct_inr
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x0)) inletq3 :=
internal_paths_rew
(fung : A =>
x.1 g =
h
(f
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x0) * mon_unit)) q1
(right_identity
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x0)) inletq4 :=
internal_paths_rew
(fung0 : A =>
x.1 g0 =
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x0) * mon_unit)) q2
(right_identity
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x0)) inletq5 :=
internal_paths_rew
(fung : B =>
x.1
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x0) = h g) q3
(right_identity
(f
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x0))) inletq6 :=
internal_paths_rew
(fung : B =>
x.1
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x0) = h g) q4
(right_identity
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x0))) in
q5^ @ q6) @
Trunc_ind
(funaa : Trunc 0
(Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A))) =>
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
aa)) = h (FreeProduct_rec A A B f g aa))
(Coeq_ind
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (coeq w0)))) =
h (FreeProduct_rec A A B f g (tr (coeq w0))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(tr (coeq w0)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w0)))) =>
match
a as s
return
(h
(g
(match ... with
| ... | ... => ... => ...
end
(Core.fold_right (...) mon_unit
w0))) =
h
(match s with
| inl g => funx1 : B => f g * x1
| inr g0 => funx1 : B => g g0 * x1
end
(Core.fold_right
(fun ... => ...
...
...
end) mon_unit w0)))
with
| inl g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g | inr g =>
fun ... => g * x1
end) mon_unit w0)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right (... => ...)
mon_unit w0)) @
ap11
(ap11 1
(letq1 := x.2 ... inletq2 := ... in ... ...)^) IHw) @
(grp_homo_op h (f g0)
(Core.fold_right
(funX0 : A + A =>
match ... with
| ... => ... => ...
| ... => ... => ...
end) mon_unit w0))^)
| inr g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g | inr g =>
fun ... => g * x1
end) mon_unit w0)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right (... => ...)
mon_unit w0)) @ ap11 1 IHw) @
(grp_homo_op h (g g0)
(Core.fold_right
(funX0 : A + A =>
match ... with
| ... => ... => ...
| ... => ... => ...
end) mon_unit w0))^)
end) w)
(funb : FreeProduct.pc1 A A + FreeProduct.pc2 A A +
FreeProduct.pc3 grp_trivial A A +
FreeProduct.pc4 A A + FreeProduct.pc5 A A
=>
path_ishprop
(transport
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(cglue b)
(Core.list_rect (A + A)
(funw : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (coeq w)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id
grp_homo_id (tr ...))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w)))) =>
match
a as s
return
(h (g (...)) =
h (...
...
...
end (...)))
with
| inl g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right (... => ...)
mon_unit w)) @
((grp_homo_op h (g g0) (g ...) @
ap11 (ap11 1 ...^) IHw) @
(grp_homo_op h (f g0)
(Core.fold_right (...) mon_unit
w))^)
| inr g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right (... => ...)
mon_unit w)) @
((grp_homo_op h (g g0) (g ...) @
ap11 1 IHw) @
(grp_homo_op h (g g0)
(Core.fold_right (...) mon_unit
w))^)
end)
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A) b)))
(Core.list_rect (A + A)
(funw : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (coeq w)))) =
h
(FreeProduct_rec A A B f g (tr (coeq w))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(tr (coeq w)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w)))) =>
match
a as s
return
(h (g (...
...
end (...))) =
h
(match ... with
| ... => ... => ...
| ... => ... => ...
end
(Core.fold_right (...) mon_unit
w)))
with
| inl g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : ... =>
match ... with
| ... ...
end) mon_unit w)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right ... mon_unit w)) @
ap11 (ap11 1 (... ...)^) IHw) @
(grp_homo_op h (f g0)
(Core.fold_right
(fun ... => ...
...
...
end) mon_unit w))^)
| inr g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : ... =>
match ... with
| ... ...
end) mon_unit w)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right ... mon_unit w)) @
ap11 1 IHw) @
(grp_homo_op h (g g0)
(Core.fold_right
(fun ... => ...
...
...
end) mon_unit w))^)
end)
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A) b)))) x0) = x
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))
(grp_homo_compose h f;
funx : FreeProduct A A =>
(letq1 :=
p
(freeproduct_inl
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) inletq2 :=
p
(freeproduct_inr
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) inletq3 :=
internal_paths_rew
(fung : A =>
k g =
h
(f
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x) * mon_unit)) q1
(right_identity
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) inletq4 :=
internal_paths_rew
(fung0 : A =>
k g0 =
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x) * mon_unit)) q2
(right_identity
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) inletq5 :=
internal_paths_rew
(fung : B =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x) = h g) q3
(right_identity
(f
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x))) inletq6 :=
internal_paths_rew
(fung : B =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x) = h g) q4
(right_identity
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x))) in
q5^ @ q6) @
Trunc_ind
(funaa : Trunc 0
(Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A))) =>
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
aa)) = h (FreeProduct_rec A A B f g aa))
(Coeq_ind
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (coeq w0)))) =
h (FreeProduct_rec A A B f g (tr (coeq w0))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(tr (coeq w0)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w0)))) =>
match
a as s
return
(h
(g
(match s with
| inl g | inr g =>
fun ... => g * x0
end
(Core.fold_right (... => ...)
mon_unit w0))) =
h
(match s with
| inl g => funx0 : B => f g * x0
| inr g0 => funx0 : B => g g0 * x0
end
(Core.fold_right
(funX0 : ... =>
match ... with
| ... ...
| ... ...
end) mon_unit w0)))
with
| inl g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g | inr g =>
funx0 : A => g * x0
end) mon_unit w0)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right
(fun ... => ...
...
end) mon_unit w0)) @
ap11
(ap11 1
(letq1 := p (...) inletq2 := p ... inletq3 := ... in ... ...)^) IHw) @
(grp_homo_op h (f g0)
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g => fun ... => ... * x0
| inr g1 => fun ... => ... * x0
end) mon_unit w0))^)
| inr g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g | inr g =>
funx0 : A => g * x0
end) mon_unit w0)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right
(fun ... => ...
...
end) mon_unit w0)) @
ap11 1 IHw) @
(grp_homo_op h (g g0)
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g => fun ... => ... * x0
| inr g1 => fun ... => ... * x0
end) mon_unit w0))^)
end) w)
(funb : FreeProduct.pc1 A A + FreeProduct.pc2 A A +
FreeProduct.pc3 grp_trivial A A +
FreeProduct.pc4 A A + FreeProduct.pc5 A A
=>
path_ishprop
(transport
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(cglue b)
(Core.list_rect (A + A)
(funw : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (coeq w)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id
grp_homo_id (tr (...)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w)))) =>
match
a as s
return
(h (g (... ...)) =
h
(match ... with
| ... ...
| ... ...
end
(Core.fold_right ... mon_unit
w)))
with
| inl g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(fun ... => ...
...
end) mon_unit w)) @
((grp_homo_op h (g g0) (g (...)) @
ap11 (ap11 1 (...)^) IHw) @
(grp_homo_op h (f g0)
(Core.fold_right (... => ...)
mon_unit w))^)
| inr g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(fun ... => ...
...
end) mon_unit w)) @
((grp_homo_op h (g g0) (g (...)) @
ap11 1 IHw) @
(grp_homo_op h (g g0)
(Core.fold_right (... => ...)
mon_unit w))^)
end)
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A) b)))
(Core.list_rect (A + A)
(funw : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (coeq w)))) =
h
(FreeProduct_rec A A B f g (tr (coeq w))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(tr (coeq w)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w)))) =>
match
a as s
return
(h
(g
(match ... with
| ... ...
end
(Core.fold_right ... mon_unit
w))) =
h
(match s with
| inl g => fun ... => ... * x0
| inr g0 => fun ... => ... * x0
end
(Core.fold_right (... => ...)
mon_unit w)))
with
| inl g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : A + A =>
match ... with
| ... | ... => ... => ...
end) mon_unit w)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right (...) mon_unit
w)) @
ap11
(ap11 1
(letq1 := ... in ... ...)^)
IHw) @
(grp_homo_op h (f g0)
(Core.fold_right
(funX0 : ... =>
match ... with
| ... ...
| ... ...
end) mon_unit w))^)
| inr g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : A + A =>
match ... with
| ... | ... => ... => ...
end) mon_unit w)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right (...) mon_unit
w)) @ ap11 1 IHw) @
(grp_homo_op h (g g0)
(Core.fold_right
(funX0 : ... =>
match ... with
| ... ...
| ... ...
end) mon_unit w))^)
end)
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A) b)))) x) = (k; p)
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))
(grp_homo_compose h f;
funx : FreeProduct A A =>
(letq1 :=
p
(freeproduct_inl
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) inletq2 :=
p
(freeproduct_inr
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) inletq3 :=
internal_paths_rew
(fung : A =>
k g =
h
(f
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x) * mon_unit)) q1
(right_identity
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) inletq4 :=
internal_paths_rew
(fung0 : A =>
k g0 =
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x) * mon_unit)) q2
(right_identity
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) inletq5 :=
internal_paths_rew
(fung : B =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x) = h g) q3
(right_identity
(f
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x))) inletq6 :=
internal_paths_rew
(fung : B =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x) = h g) q4
(right_identity
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x))) in
q5^ @ q6) @
Trunc_ind
(funaa : Trunc 0
(Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A))) =>
h
(g
(FreeProduct_rec A A A grp_homo_id grp_homo_id
aa)) = h (FreeProduct_rec A A B f g aa))
(Coeq_ind
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (coeq w0)))) =
h (FreeProduct_rec A A B f g (tr (coeq w0))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(tr (coeq w0)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w0)))) =>
match
a as s
return
(h
(g
(match s with
| inl g | inr g =>
fun ... => g * x0
end
(Core.fold_right (... => ...)
mon_unit w0))) =
h
(match s with
| inl g => funx0 : B => f g * x0
| inr g0 => funx0 : B => g g0 * x0
end
(Core.fold_right
(funX0 : ... =>
match ... with
| ... ...
| ... ...
end) mon_unit w0)))
with
| inl g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g | inr g =>
funx0 : A => g * x0
end) mon_unit w0)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right
(fun ... => ...
...
end) mon_unit w0)) @
ap11
(ap11 1
(letq1 := p (...) inletq2 := p ... inletq3 := ... in ... ...)^) IHw) @
(grp_homo_op h (f g0)
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g => fun ... => ... * x0
| inr g1 => fun ... => ... * x0
end) mon_unit w0))^)
| inr g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g | inr g =>
funx0 : A => g * x0
end) mon_unit w0)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right
(fun ... => ...
...
end) mon_unit w0)) @
ap11 1 IHw) @
(grp_homo_op h (g g0)
(Core.fold_right
(funX0 : A + A =>
match X0 with
| inl g => fun ... => ... * x0
| inr g1 => fun ... => ... * x0
end) mon_unit w0))^)
end) w)
(funb : FreeProduct.pc1 A A + FreeProduct.pc2 A A +
FreeProduct.pc3 grp_trivial A A +
FreeProduct.pc4 A A + FreeProduct.pc5 A A
=>
path_ishprop
(transport
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(cglue b)
(Core.list_rect (A + A)
(funw : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (coeq w)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id
grp_homo_id (tr (...)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w)))) =>
match
a as s
return
(h (g (... ...)) =
h
(match ... with
| ... ...
| ... ...
end
(Core.fold_right ... mon_unit
w)))
with
| inl g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(fun ... => ...
...
end) mon_unit w)) @
((grp_homo_op h (g g0) (g (...)) @
ap11 (ap11 1 (...)^) IHw) @
(grp_homo_op h (f g0)
(Core.fold_right (... => ...)
mon_unit w))^)
| inr g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(fun ... => ...
...
end) mon_unit w)) @
((grp_homo_op h (g g0) (g (...)) @
ap11 1 IHw) @
(grp_homo_op h (g g0)
(Core.fold_right (... => ...)
mon_unit w))^)
end)
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A) b)))
(Core.list_rect (A + A)
(funw : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (coeq w)))) =
h
(FreeProduct_rec A A B f g (tr (coeq w))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(tr (coeq w)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w)))) =>
match
a as s
return
(h
(g
(match ... with
| ... ...
end
(Core.fold_right ... mon_unit
w))) =
h
(match s with
| inl g => fun ... => ... * x0
| inr g0 => fun ... => ... * x0
end
(Core.fold_right (... => ...)
mon_unit w)))
with
| inl g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : A + A =>
match ... with
| ... | ... => ... => ...
end) mon_unit w)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right (...) mon_unit
w)) @
ap11
(ap11 1
(letq1 := ... in ... ...)^)
IHw) @
(grp_homo_op h (f g0)
(Core.fold_right
(funX0 : ... =>
match ... with
| ... ...
| ... ...
end) mon_unit w))^)
| inr g0 =>
ap h
(grp_homo_op g g0
(Core.fold_right
(funX0 : A + A =>
match ... with
| ... | ... => ... => ...
end) mon_unit w)) @
((grp_homo_op h (g g0)
(g
(Core.fold_right (...) mon_unit
w)) @ ap11 1 IHw) @
(grp_homo_op h (g g0)
(Core.fold_right
(funX0 : ... =>
match ... with
| ... ...
| ... ...
end) mon_unit w))^)
end)
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A) b)))) x).1 =
(k; p).1
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))
grp_homo_compose h f = k
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))
grp_homo_compose h f == k
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)) y: A
grp_homo_compose h f y = k y
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)) y: A q1:= p (freeproduct_inl y): (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) (freeproduct_inl y) =
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))
(freeproduct_inl y)
grp_homo_compose h f y = k y
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)) y: A q1:= p (amal_eta (Core.cons (inl y) Core.nil)): k (y * mon_unit) = h (f y * mon_unit)
grp_homo_compose h f y = k y
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C k: GroupHomomorphism A C p: (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id grp_homo_id
x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)) y: A q1: k y = h (f y)
grp_homo_compose h f y = k y
exact q1^.
H: Funext A, B, C: Group f, g: GroupHomomorphism A B h: B $-> C
(funX : {b : GroupHomomorphism A C &
(funx : FreeProduct A A =>
b
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))} =>
(fun (k : GroupHomomorphism A C)
(p : (funx : FreeProduct A A =>
k
(FreeProduct_rec A A A grp_homo_id
grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x))) =>
(funx : A =>
letq1 := p (freeproduct_inl x) inletq2 := p (freeproduct_inr x) inletq3 :=
internal_paths_rew
(fung : A => k g = h (f x * mon_unit)) q1
(right_identity x) inletq4 :=
internal_paths_rew
(fung0 : A => k g0 = h (g x * mon_unit)) q2
(right_identity x) inletq5 :=
internal_paths_rew (fung : B => k x = h g) q3
(right_identity (f x)) inletq6 :=
internal_paths_rew (fung : B => k x = h g) q4
(right_identity (g x)) in
q5^ @ q6)
:
(funx : A => h (f x)) == (funx : A => h (g x)))
X.1 X.2)
o (funp : (funx : A => h (f x)) ==
(funx : A => h (g x)) =>
(grp_homo_compose h f;
(funx : FreeProduct A A =>
p
(FreeProduct_rec A A A grp_homo_id grp_homo_id x) @
Trunc_ind
(funaa : Trunc 0
(Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A))) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id aa)) =
h (FreeProduct_rec A A B f g aa))
(Coeq_ind
(funw : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (A + A) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr (...)))) =
h
(FreeProduct_rec A A B f g
(tr (coeq w0))))
(ap h (grp_homo_unit g))
(fun (a : A + A) (w0 : Core.list (A + A))
(IHw : h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id
(...))) =
h
(FreeProduct_rec A A B f g
(tr (...)))) =>
match
a as s return (h (...) = h (...))
with
| inl g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
| inr g0 =>
(funa0 : A =>
ap h (...) @ (... @ ...^)) g0
end
:
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr ...))) =
h
(FreeProduct_rec A A B f g
(tr (coeq ...)))) w
:
(funw0 : Coeq
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A grp_homo_id
grp_homo_id (tr w0))) =
h (FreeProduct_rec A A B f g (tr w0)))
(coeq w))
(funb : FreeProduct.pc1 A A +
FreeProduct.pc2 A A +
FreeProduct.pc3 grp_trivial A A +
FreeProduct.pc4 A A +
FreeProduct.pc5 A A =>
path_ishprop
(transport
(funw : Coeq
(FreeProduct.map1 grp_trivial
A A (grp_trivial_rec A))
(FreeProduct.map2 grp_trivial
A A (grp_trivial_rec A)) =>
h
(g
(FreeProduct_rec A A A
grp_homo_id grp_homo_id (tr w))) =
h (FreeProduct_rec A A B f g (tr w)))
(cglue b)
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : ... => h ... = h ...)
(ap h (grp_homo_unit g))
(fun (a : ...) (w0 : ...)
(IHw : ...) =>
...
...
...
end : ... = ...) w
:
(funw0 : ... => h ... = h ...)
(coeq w))
(FreeProduct.map1 grp_trivial A A
(grp_trivial_rec A) b)))
((funw : FreeProduct.Words A A =>
Core.list_rect (A + A)
(funw0 : Core.list (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(ap h (grp_homo_unit g))
(fun (a : A + A)
(w0 : Core.list (...))
(IHw : h ... = h ...) =>
match ... ... with
| ... => ... g0
| ... => ... g0
end
:
h (...) = h (...)) w
:
(funw0 : Coeq (...) (...) =>
h (g ...) =
h (FreeProduct_rec A A B f g ...))
(coeq w))
(FreeProduct.map2 grp_trivial A A
(grp_trivial_rec A) b)))) x)
:
(funx : FreeProduct A A =>
grp_homo_compose h f
(FreeProduct_rec A A A grp_homo_id grp_homo_id x)) ==
(funx : FreeProduct A A =>
h (FreeProduct_rec A A B f g x)))) == idmap