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.
(** * Factorizations and factorization systems. *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Extensions Homotopy.IdentitySystems.LocalOpen Scope path_scope.(** ** Factorizations *)SectionFactorization.Universes ctxi.Context {class1class2 : forall (XY : Type@{ctxi}), (X -> Y) -> Type@{ctxi}}
`{forall (XY : Type@{ctxi}) (g:X->Y), IsHProp (class1 _ _ g)}
`{forall (XY : Type@{ctxi}) (g:X->Y), IsHProp (class2 _ _ g)}
{A B : Type@{ctxi}} {f : A -> B}.(** A factorization of [f] into a first factor lying in [class1] and a second factor lying in [class2]. *)RecordFactorization :=
{ intermediate : Type@{ctxi} ;
factor1 : A -> intermediate ;
factor2 : intermediate -> B ;
fact_factors : factor2 o factor1 == f ;
inclass1 : class1 _ _ factor1 ;
inclass2 : class2 _ _ factor2
}.
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B
{I : Type &
{g : A -> I &
{h : I -> B &
{_ : h o g == f & {_ : class1 A I g & class2 I B h}}}}} <~>
Factorization
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B
{I : Type &
{g : A -> I &
{h : I -> B &
{_ : h o g == f & {_ : class1 A I g & class2 I B h}}}}} <~>
Factorization
issig.Defined.(** A path between factorizations is equivalent to a structure of the following sort. *)RecordPathFactorization {factfact' : Factorization} :=
{ path_intermediate : intermediate fact <~> intermediate fact' ;
path_factor1 : path_intermediate o factor1 fact == factor1 fact' ;
path_factor2 : factor2 fact == factor2 fact' o path_intermediate ;
path_fact_factors : foralla, path_factor2 (factor1 fact a)
@ ap (factor2 fact') (path_factor1 a)
@ fact_factors fact' a
= fact_factors fact a
}.Arguments PathFactorization fact fact' : clear implicits.
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B fact, fact': Factorization
{path_intermediate
: intermediate fact <~> intermediate fact' &
{path_factor1
: path_intermediate o factor1 fact == factor1 fact' &
{path_factor2
: factor2 fact == factor2 fact' o path_intermediate &
foralla : A,
(path_factor2 (factor1 fact a) @
ap (factor2 fact') (path_factor1 a)) @
fact_factors fact' a = fact_factors fact a}}} <~>
PathFactorization fact fact'
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B fact, fact': Factorization
{path_intermediate
: intermediate fact <~> intermediate fact' &
{path_factor1
: path_intermediate o factor1 fact == factor1 fact' &
{path_factor2
: factor2 fact == factor2 fact' o path_intermediate &
foralla : A,
(path_factor2 (factor1 fact a) @
ap (factor2 fact') (path_factor1 a)) @
fact_factors fact' a = fact_factors fact a}}} <~>
PathFactorization fact fact'
issig.Defined.
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence fact, fact': Factorization
PathFactorization fact fact' <~> fact = fact'
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence fact, fact': Factorization
PathFactorization fact fact' <~> fact = fact'
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence fact, fact': Factorization
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence
forallb : {I : Type &
{g : A -> I &
{h : I -> B &
{_ : (funx : A => h (g x)) == f &
{_ : class1 A I g & class2 I B h}}}}},
{path_intermediate
: intermediate (issig_Factorization b) <~>
intermediate (issig_Factorization b) &
{path_factor1
: (funx : A =>
path_intermediate
(factor1 (issig_Factorization b) x)) ==
factor1 (issig_Factorization b) &
{path_factor2
: factor2 (issig_Factorization b) ==
(funx : intermediate (issig_Factorization b) =>
factor2 (issig_Factorization b)
(path_intermediate x)) &
foralla : A,
(path_factor2 (factor1 (issig_Factorization b) a) @
ap (factor2 (issig_Factorization b)) (path_factor1 a)) @
fact_factors (issig_Factorization b) a =
fact_factors (issig_Factorization b) a}}}
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence
forallb1 : {I : Type &
{g : A -> I &
{h : I -> B &
{_ : (funx : A => h (g x)) == f &
{_ : class1 A I g & class2 I B h}}}}},
Contr
{b2
: {I : Type &
{g : A -> I &
{h : I -> B &
{_ : (funx : A => h (g x)) == f &
{_ : class1 A I g & class2 I B h}}}}} &
{path_intermediate
: intermediate (issig_Factorization b1) <~>
intermediate (issig_Factorization b2) &
{path_factor1
: (funx : A =>
path_intermediate
(factor1 (issig_Factorization b1) x)) ==
factor1 (issig_Factorization b2) &
{path_factor2
: factor2 (issig_Factorization b1) ==
(funx : intermediate (issig_Factorization b1) =>
factor2 (issig_Factorization b2)
(path_intermediate x)) &
foralla : A,
(path_factor2 (factor1 (issig_Factorization b1) a) @
ap (factor2 (issig_Factorization b2))
(path_factor1 a)) @
fact_factors (issig_Factorization b2) a =
fact_factors (issig_Factorization b1) a}}}}
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence
forallb : {I : Type &
{g : A -> I &
{h : I -> B &
{_ : (funx : A => h (g x)) == f &
{_ : class1 A I g & class2 I B h}}}}},
{path_intermediate
: intermediate (issig_Factorization b) <~>
intermediate (issig_Factorization b) &
{path_factor1
: (funx : A =>
path_intermediate
(factor1 (issig_Factorization b) x)) ==
factor1 (issig_Factorization b) &
{path_factor2
: factor2 (issig_Factorization b) ==
(funx : intermediate (issig_Factorization b) =>
factor2 (issig_Factorization b)
(path_intermediate x)) &
foralla : A,
(path_factor2 (factor1 (issig_Factorization b) a) @
ap (factor2 (issig_Factorization b)) (path_factor1 a)) @
fact_factors (issig_Factorization b) a =
fact_factors (issig_Factorization b) a}}}
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
{path_factor1 : (funx : A => f1 x) == f1 &
{path_factor2 : f2 == (funx : I => f2 x) &
foralla : A,
(path_factor2 (f1 a) @ ap f2 (path_factor1 a)) @ ff a =
ff a}}
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
{path_factor2 : f2 == (funx : I => f2 x) &
foralla : A, (path_factor2 (f1 a) @ 1) @ ff a = ff a}
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
foralla : A, 1 @ ff a = ff a
intros; apply concat_1p.
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence
forallb1 : {I : Type &
{g : A -> I &
{h : I -> B &
{_ : (funx : A => h (g x)) == f &
{_ : class1 A I g & class2 I B h}}}}},
Contr
{b2
: {I : Type &
{g : A -> I &
{h : I -> B &
{_ : (funx : A => h (g x)) == f &
{_ : class1 A I g & class2 I B h}}}}} &
{path_intermediate
: intermediate (issig_Factorization b1) <~>
intermediate (issig_Factorization b2) &
{path_factor1
: (funx : A =>
path_intermediate
(factor1 (issig_Factorization b1) x)) ==
factor1 (issig_Factorization b2) &
{path_factor2
: factor2 (issig_Factorization b1) ==
(funx : intermediate (issig_Factorization b1) =>
factor2 (issig_Factorization b2)
(path_intermediate x)) &
foralla : A,
(path_factor2 (factor1 (issig_Factorization b1) a) @
ap (factor2 (issig_Factorization b2))
(path_factor1 a)) @
fact_factors (issig_Factorization b2) a =
fact_factors (issig_Factorization b1) a}}}}
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
Contr
{b2
: {I : Type &
{g : A -> I &
{h : I -> B &
{_ : (funx : A => h (g x)) == f &
{_ : class1 A I g & class2 I B h}}}}} &
{path_intermediate
: intermediate
(issig_Factorization (I; f1; f2; ff; oc1; oc2)) <~>
intermediate (issig_Factorization b2) &
{path_factor1
: (funx : A =>
path_intermediate
(factor1
(issig_Factorization
(I; f1; f2; ff; oc1; oc2)) x)) ==
factor1 (issig_Factorization b2) &
{path_factor2
: factor2
(issig_Factorization (I; f1; f2; ff; oc1; oc2)) ==
(funx : intermediate
(issig_Factorization
(I; f1; f2; ff; oc1; oc2)) =>
factor2 (issig_Factorization b2)
(path_intermediate x)) &
foralla : A,
(path_factor2
(factor1
(issig_Factorization (I; f1; f2; ff; oc1; oc2))
a) @
ap (factor2 (issig_Factorization b2))
(path_factor1 a)) @
fact_factors (issig_Factorization b2) a =
fact_factors
(issig_Factorization (I; f1; f2; ff; oc1; oc2)) a}}}}
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
Contr
{y
: {g : A -> I &
{h : I -> B &
{_ : (funx : A => h (g x)) == f &
{_ : class1 A I g & class2 I B h}}}} &
{path_factor1 : (funx : A => f1 x) == y.1 &
{path_factor2 : f2 == (funx : I => (y.2).1 x) &
foralla : A,
(path_factor2 (f1 a) @ ap (y.2).1 (path_factor1 a)) @
((y.2).2).1 a = ff a}}}
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
Contr
{y
: {h : I -> B &
{_ : (funx : A => h (f1 x)) == f &
{_ : class1 A I f1 & class2 I B h}}} &
{path_factor2 : f2 == (funx : I => y.1 x) &
foralla : A,
(path_factor2 (f1 a) @ 1) @ (y.2).1 a = ff a}}
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
Contr
{y
: {_ : (funx : A => f2 (f1 x)) == f &
{_ : class1 A I f1 & class2 I B f2}} &
foralla : A, 1 @ y.1 a = ff a}
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
{ff' : (funx : A => f2 (f1 x)) == f & ff == ff'} <~>
{y
: {_ : (funx : A => f2 (f1 x)) == f &
{_ : class1 A I f1 & class2 I B f2}} &
foralla : A, 1 @ y.1 a = ff a}
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
foralla : (funx : A => f2 (f1 x)) == f,
Contr
((fun_ : (funx : A => f2 (f1 x)) == f =>
{_ : class1 A I f1 & class2 I B f2}) a)
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
foralla : {_ : (funx : A => f2 (f1 x)) == f &
{_ : class1 A I f1 & class2 I B f2}},
(funy : {_ : (funx : A => f2 (f1 x)) == f &
{_ : class1 A I f1 & class2 I B f2}} =>
foralla0 : A, 1 @ y.1 a0 = ff a0) a <~>
(funff' : (funx : A => f2 (f1 x)) == f => ff == ff')
(equiv_sigma_contr
(fun_ : (funx : A => f2 (f1 x)) == f =>
{_ : class1 A I f1 & class2 I B f2}) a)
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
foralla : (funx : A => f2 (f1 x)) == f,
Contr
((fun_ : (funx : A => f2 (f1 x)) == f =>
{_ : class1 A I f1 & class2 I B f2}) a)
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2 h: (funx : A => f2 (f1 x)) == f
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2
foralla : {_ : (funx : A => f2 (f1 x)) == f &
{_ : class1 A I f1 & class2 I B f2}},
(funy : {_ : (funx : A => f2 (f1 x)) == f &
{_ : class1 A I f1 & class2 I B f2}} =>
foralla0 : A, 1 @ y.1 a0 = ff a0) a <~>
(funff' : (funx : A => f2 (f1 x)) == f => ff == ff')
(equiv_sigma_contr
(fun_ : (funx : A => f2 (f1 x)) == f =>
{_ : class1 A I f1 & class2 I B f2}) a)
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2 ff': (funx : A => f2 (f1 x)) == f oc1': class1 A I f1 oc2': class2 I B f2
(foralla : A, 1 @ ff' a = ff a) <~> ff == ff'
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2 ff': (funx : A => f2 (f1 x)) == f oc1': class1 A I f1 oc2': class2 I B f2 a: A
1 @ ff' (1%equiv a) = ff (1%equiv a) <~> ff a = ff' a
class1, class2: forallXY : Type, (X -> Y) -> Type H: forall (XY : Type) (g : X -> Y),
IsHProp (class1 X Y g) H0: forall (XY : Type) (g : X -> Y),
IsHProp (class2 X Y g) A, B: Type f: A -> B H1: Univalence I: Type f1: A -> I f2: I -> B ff: (funx : A => f2 (f1 x)) == f oc1: class1 A I f1 oc2: class2 I B f2 ff': (funx : A => f2 (f1 x)) == f oc1': class1 A I f1 oc2': class2 I B f2 a: A
1 @ ff' (1%equiv a) = ff (1%equiv a) <~> ff' a = ff a
apply equiv_concat_l; symmetry; apply concat_1p.Defined.Definitionpath_factorization `{Univalence} (fact fact' : Factorization)
: PathFactorization fact fact' -> fact = fact'
:= equiv_path_factorization fact fact'.EndFactorization.Arguments Factorization class1 class2 {A B} f.Arguments PathFactorization {class1 class2 A B f} fact fact'.(* This enables us to talk about "the image of a map" as a factorization but also as the intermediate object appearing in it, as is common in informal mathematics. *)Coercionintermediate : Factorization >-> Sortclass.(** ** Factorization Systems *)(** A ("unique" or "orthogonal") factorization system consists of a couple of classes of maps, closed under composition, such that every map admits a unique factorization. *)RecordFactorizationSystem@{i j k} :=
{ class1 : forall {XY : Type@{i}}, (X -> Y) -> Type@{j} ;
ishprop_class1 :: forall {XY : Type@{i}} (g:X->Y), IsHProp (class1 g) ;
class1_isequiv : forall {XY : Type@{i}} (g:X->Y) {geq:IsEquiv g}, class1 g ;
class1_compose : forall {XYZ : Type@{i}} (g:X->Y) (h:Y->Z),
class1 g -> class1 h -> class1 (h o g) ;
class2 : forall {XY : Type@{i}}, (X -> Y) -> Type@{k} ;
ishprop_class2 :: forall {XY : Type@{i}} (g:X->Y), IsHProp (class2 g) ;
class2_isequiv : forall {XY : Type@{i}} (g:X->Y) {geq:IsEquiv g}, class2 g ;
class2_compose : forall {XYZ : Type@{i}} (g:X->Y) (h:Y->Z),
class2 g -> class2 h -> class2 (h o g) ;
(** Morally, the uniqueness of factorizations says that [Factorization class1 class2 f] is contractible. However, in practice we always *prove* that by way of [path_factorization], and we frequently want to *use* the components of a [PathFactorization] as well. Thus, as data we store the canonical factorization and a [PathFactorization] between any two such, and prove in a moment that this implies contractibility of the space of factorizations. *)
factor : forall {XY : Type@{i}} (f:X->Y), Factorization@{i} (@class1) (@class2) f ;
path_factor : forall {XY : Type@{i}} (f:X->Y)
(fact : Factorization@{i} (@class1) (@class2) f)
(fact' : Factorization@{i} (@class1) (@class2) f),
PathFactorization@{i} fact fact'
}.(** The type of factorizations is, as promised, contractible. *)
H: Univalence factsys: FactorizationSystem X, Y: Type f: X -> Y
H: Univalence factsys: FactorizationSystem X, Y: Type f: X -> Y
forallxy : Factorization (@class1 factsys) (@class2 factsys)
f, x = y
H: Univalence factsys: FactorizationSystem X, Y: Type f: X -> Y fact, fact': Factorization (@class1 factsys)
(@class2 factsys) f
fact = fact'
H: Univalence factsys: FactorizationSystem X, Y: Type f: X -> Y fact, fact': Factorization (@class1 factsys)
(@class2 factsys) f
PathFactorization fact fact'
apply path_factor.
H: Univalence factsys: FactorizationSystem X, Y: Type f: X -> Y
Factorization (@class1 factsys) (@class2 factsys) f
apply factor.Defined.SectionFactSys.Context (factsys : FactorizationSystem).DefinitionBuild_Factorization' {XY}
:= @Build_Factorization (@class1 factsys) (@class2 factsys) X Y.DefinitionBuild_PathFactorization' {XY}
:= @Build_PathFactorization (@class1 factsys) (@class2 factsys) X Y.(** The left class is right-cancellable and the right class is left-cancellable. *)
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z
class1 factsys f ->
class1 factsys (g o f) -> class1 factsys g
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z
class1 factsys f ->
class1 factsys (g o f) -> class1 factsys g
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c1f: class1 factsys f c1gf: class1 factsys (g o f)
class1 factsys g
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c1f: class1 factsys f c1gf: class1 factsys (g o f) I: Type g1: Y -> I g2: I -> Z gf: (funx : Y => g2 (g1 x)) == g c1g1: class1 factsys g1 c2g2: class2 factsys g2
class1 factsys g
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c1f: class1 factsys f c1gf: class1 factsys (g o f) I: Type g1: Y -> I g2: I -> Z gf: (funx : Y => g2 (g1 x)) == g c1g1: class1 factsys g1 c2g2: class2 factsys g2 fact:= Build_Factorization' (g o f) Z
(g o f) idmap (funx : X => 1) c1gf
(class2_isequiv factsys idmap): Factorization (@class1 factsys)
(@class2 factsys) (g o f)
class1 factsys g
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c1f: class1 factsys f c1gf: class1 factsys (g o f) I: Type g1: Y -> I g2: I -> Z gf: (funx : Y => g2 (g1 x)) == g c1g1: class1 factsys g1 c2g2: class2 factsys g2 fact:= Build_Factorization' (g o f) Z
(g o f) idmap (funx : X => 1) c1gf
(class2_isequiv factsys idmap): Factorization (@class1 factsys)
(@class2 factsys) (g o f) fact':= Build_Factorization' (g o f) I
(g1 o f) g2 (funx : X => gf (f x))
(class1_compose factsys f g1 c1f c1g1) c2g2: Factorization (@class1 factsys)
(@class2 factsys) (g o f)
class1 factsys g
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c1f: class1 factsys f c1gf: class1 factsys (funx : X => g (f x)) I: Type g1: Y -> I g2: I -> Z gf: (funx : Y => g2 (g1 x)) == g c1g1: class1 factsys g1 c2g2: class2 factsys g2 fact:= Build_Factorization' (funx : X => g (f x)) Z
(funx : X => g (f x)) idmap
(funx : X => 1) c1gf
(class2_isequiv factsys idmap): Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) fact':= Build_Factorization' (funx : X => g (f x)) I
(funx : X => g1 (f x)) g2
(funx : X => gf (f x))
(class1_compose factsys f g1 c1f c1g1) c2g2: Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) q: I <~> Z q1: (funx : X => q (g1 (f x))) ==
(funx : X => g (f x)) q2: g2 == (funx : I => q x) qf: foralla : X,
(q2 (g1 (f a)) @ ap idmap (q1 a)) @ 1 = gf (f a)
class1 factsys g
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c1f: class1 factsys f c1gf: class1 factsys (funx : X => g (f x)) I: Type g1: Y -> I g2: I -> Z gf: (funx : Y => g2 (g1 x)) == g c1g1: class1 factsys g1 c2g2: class2 factsys g2 fact:= Build_Factorization' (funx : X => g (f x)) Z
(funx : X => g (f x)) idmap
(funx : X => 1) c1gf
(class2_isequiv factsys idmap): Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) fact':= Build_Factorization' (funx : X => g (f x)) I
(funx : X => g1 (f x)) g2
(funx : X => gf (f x))
(class1_compose factsys f g1 c1f c1g1) c2g2: Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) q: I <~> Z q1: (funx : X => q (g1 (f x))) ==
(funx : X => g (f x)) q2: g2 == (funx : I => q x) qf: foralla : X,
(q2 (g1 (f a)) @ ap idmap (q1 a)) @ 1 = gf (f a)
class1 factsys (funx : Y => g2 (g1 x))
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c1f: class1 factsys f c1gf: class1 factsys (funx : X => g (f x)) I: Type g1: Y -> I g2: I -> Z gf: (funx : Y => g2 (g1 x)) == g c1g1: class1 factsys g1 c2g2: class2 factsys g2 fact:= Build_Factorization' (funx : X => g (f x)) Z
(funx : X => g (f x)) idmap
(funx : X => 1) c1gf
(class2_isequiv factsys idmap): Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) fact':= Build_Factorization' (funx : X => g (f x)) I
(funx : X => g1 (f x)) g2
(funx : X => gf (f x))
(class1_compose factsys f g1 c1f c1g1) c2g2: Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) q: I <~> Z q1: (funx : X => q (g1 (f x))) ==
(funx : X => g (f x)) q2: g2 == (funx : I => q x) qf: foralla : X,
(q2 (g1 (f a)) @ ap idmap (q1 a)) @ 1 = gf (f a)
class1 factsys g2
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c1f: class1 factsys f c1gf: class1 factsys (funx : X => g (f x)) I: Type g1: Y -> I g2: I -> Z gf: (funx : Y => g2 (g1 x)) == g c1g1: class1 factsys g1 c2g2: class2 factsys g2 fact:= Build_Factorization' (funx : X => g (f x)) Z
(funx : X => g (f x)) idmap
(funx : X => 1) c1gf
(class2_isequiv factsys idmap): Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) fact':= Build_Factorization' (funx : X => g (f x)) I
(funx : X => g1 (f x)) g2
(funx : X => gf (f x))
(class1_compose factsys f g1 c1f c1g1) c2g2: Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) q: I <~> Z q1: (funx : X => q (g1 (f x))) ==
(funx : X => g (f x)) q2: g2 == (funx : I => q x) qf: foralla : X,
(q2 (g1 (f a)) @ ap idmap (q1 a)) @ 1 = gf (f a)
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z
class2 factsys g ->
class2 factsys (g o f) -> class2 factsys f
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z
class2 factsys g ->
class2 factsys (g o f) -> class2 factsys f
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c2g: class2 factsys g c2gf: class2 factsys (g o f)
class2 factsys f
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c2g: class2 factsys g c2gf: class2 factsys (g o f) I: Type f1: X -> I f2: I -> Y ff: (funx : X => f2 (f1 x)) == f c1f1: class1 factsys f1 c2f2: class2 factsys f2
class2 factsys f
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c2g: class2 factsys g c2gf: class2 factsys (g o f) I: Type f1: X -> I f2: I -> Y ff: (funx : X => f2 (f1 x)) == f c1f1: class1 factsys f1 c2f2: class2 factsys f2 fact:= Build_Factorization' (g o f) X idmap
(g o f) (funx : X => 1)
(class1_isequiv factsys idmap) c2gf: Factorization (@class1 factsys)
(@class2 factsys) (g o f)
class2 factsys f
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c2g: class2 factsys g c2gf: class2 factsys (g o f) I: Type f1: X -> I f2: I -> Y ff: (funx : X => f2 (f1 x)) == f c1f1: class1 factsys f1 c2f2: class2 factsys f2 fact:= Build_Factorization' (g o f) X idmap
(g o f) (funx : X => 1)
(class1_isequiv factsys idmap) c2gf: Factorization (@class1 factsys)
(@class2 factsys) (g o f) fact':= Build_Factorization' (g o f) I f1
(g o f2) (funx : X => ap g (ff x)) c1f1
(class2_compose factsys f2 g c2f2 c2g): Factorization (@class1 factsys)
(@class2 factsys) (g o f)
class2 factsys f
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c2g: class2 factsys g c2gf: class2 factsys (funx : X => g (f x)) I: Type f1: X -> I f2: I -> Y ff: (funx : X => f2 (f1 x)) == f c1f1: class1 factsys f1 c2f2: class2 factsys f2 fact:= Build_Factorization' (funx : X => g (f x)) X
idmap (funx : X => g (f x))
(funx : X => 1)
(class1_isequiv factsys idmap) c2gf: Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) fact':= Build_Factorization' (funx : X => g (f x)) I
f1 (funx : I => g (f2 x))
(funx : X => ap g (ff x)) c1f1
(class2_compose factsys f2 g c2f2 c2g): Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) q: X <~> I q1: (funx : X => q x) == f1 q2: (funx : X => g (f x)) ==
(funx : X => g (f2 (q x))) qf: foralla : X,
(q2 a @ ap (funx : I => g (f2 x)) (q1 a)) @
ap g (ff a) = 1
class2 factsys f
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c2g: class2 factsys g c2gf: class2 factsys (funx : X => g (f x)) I: Type f1: X -> I f2: I -> Y ff: (funx : X => f2 (f1 x)) == f c1f1: class1 factsys f1 c2f2: class2 factsys f2 fact:= Build_Factorization' (funx : X => g (f x)) X
idmap (funx : X => g (f x))
(funx : X => 1)
(class1_isequiv factsys idmap) c2gf: Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) fact':= Build_Factorization' (funx : X => g (f x)) I
f1 (funx : I => g (f2 x))
(funx : X => ap g (ff x)) c1f1
(class2_compose factsys f2 g c2f2 c2g): Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) q: X <~> I q1: (funx : X => q x) == f1 q2: (funx : X => g (f x)) ==
(funx : X => g (f2 (q x))) qf: foralla : X,
(q2 a @ ap (funx : I => g (f2 x)) (q1 a)) @
ap g (ff a) = 1
class2 factsys (funx : X => f2 (f1 x))
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c2g: class2 factsys g c2gf: class2 factsys (funx : X => g (f x)) I: Type f1: X -> I f2: I -> Y ff: (funx : X => f2 (f1 x)) == f c1f1: class1 factsys f1 c2f2: class2 factsys f2 fact:= Build_Factorization' (funx : X => g (f x)) X
idmap (funx : X => g (f x))
(funx : X => 1)
(class1_isequiv factsys idmap) c2gf: Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) fact':= Build_Factorization' (funx : X => g (f x)) I
f1 (funx : I => g (f2 x))
(funx : X => ap g (ff x)) c1f1
(class2_compose factsys f2 g c2f2 c2g): Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) q: X <~> I q1: (funx : X => q x) == f1 q2: (funx : X => g (f x)) ==
(funx : X => g (f2 (q x))) qf: foralla : X,
(q2 a @ ap (funx : I => g (f2 x)) (q1 a)) @
ap g (ff a) = 1
class2 factsys f1
factsys: FactorizationSystem H: Funext X, Y, Z: Type f: X -> Y g: Y -> Z c2g: class2 factsys g c2gf: class2 factsys (funx : X => g (f x)) I: Type f1: X -> I f2: I -> Y ff: (funx : X => f2 (f1 x)) == f c1f1: class1 factsys f1 c2f2: class2 factsys f2 fact:= Build_Factorization' (funx : X => g (f x)) X
idmap (funx : X => g (f x))
(funx : X => 1)
(class1_isequiv factsys idmap) c2gf: Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) fact':= Build_Factorization' (funx : X => g (f x)) I
f1 (funx : I => g (f2 x))
(funx : X => ap g (ff x)) c1f1
(class2_compose factsys f2 g c2f2 c2g): Factorization (@class1 factsys)
(@class2 factsys) (funx : X => g (f x)) q: X <~> I q1: (funx : X => q x) == f1 q2: (funx : X => g (f x)) ==
(funx : X => g (f2 (q x))) qf: foralla : X,
(q2 a @ ap (funx : I => g (f2 x)) (q1 a)) @
ap g (ff a) = 1
IsEquiv f1
exact (isequiv_homotopic _ q1).Defined.(** The two classes of maps are automatically orthogonal, i.e. any commutative square from a [class1] map to a [class2] map has a unique diagonal filler. For now, we only bother to define the lift; in principle we ought to show that the type of lifts is contractible. *)Universectxi.Context {ABXY : Type@{ctxi}}
(i : A -> B) (c1i : class1 factsys i)
(p : X -> Y) (c2p : class2 factsys p)
(f : A -> X) (g : B -> Y) (h : p o f == g o i).(** First we factor [f] *)LetC : Type := intermediate (factor factsys f).Letf1 : A -> C := factor1 (factor factsys f).Letf2 : C -> X := factor2 (factor factsys f).Letff : f2 o f1 == f := fact_factors (factor factsys f).(** and [g] *)LetD : Type := intermediate (factor factsys g).Letg1 : B -> D := factor1 (factor factsys g).Letg2 : D -> Y := factor2 (factor factsys g).Letgf : g2 o g1 == g := fact_factors (factor factsys g).(** Now we observe that [p o f2] and [f1], and [g2] and [g1 o i], are both factorizations of the common diagonal of the commutative square (for which we use [p o f], but we could equally well use [g o i]. *)Letfact : Factorization (@class1 factsys) (@class2 factsys) (p o f)
:= Build_Factorization' (p o f) C f1 (p o f2)
(funa => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f))
c2p).Letfact' : Factorization (@class1 factsys) (@class2 factsys) (p o f)
:= Build_Factorization' (p o f) D (g1 o i) g2
(funa => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)).(** Therefore, by the uniqueness of factorizations, we have an equivalence [q] relating them. *)Letq : C <~> D := path_intermediate
(path_factor factsys (p o f) fact fact').Letq1 : q o f1 == g1 o i := path_factor1
(path_factor factsys (p o f) fact fact').Letq2 : p o f2 == g2 o q := path_factor2
(path_factor factsys (p o f) fact fact').(** Using this, we can define the lift. *)Definitionlift_factsys : B -> X
:= f2 o q^-1 o g1.(** And the commutative triangles making it a lift *)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q
lift_factsys o i == f
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q
lift_factsys o i == f
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
lift_factsys (i x) = f x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
f2 (q^-1 (q (f1 x))) = f x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
f2 (q^-1 (q (f1 x))) = f2 (f1 x)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
f2 (f1 x) = f x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
f2 (q^-1 (q (f1 x))) = f2 (f1 x)
apply ap, eissect.
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
f2 (f1 x) = f x
apply ff.Defined.
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q
p o lift_factsys == g
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q
p o lift_factsys == g
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: B
p (lift_factsys x) = g x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: B
g2 (q (q^-1 (g1 x))) = g x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: B
g2 (q (q^-1 (g1 x))) = g2 (g1 x)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: B
g2 (g1 x) = g x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: B
g2 (q (q^-1 (g1 x))) = g2 (g1 x)
apply ap, eisretr.
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: B
g2 (g1 x) = g x
apply gf.Defined.(** And finally prove that these two triangles compose to the given commutative square. *)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap p (lift_factsys_tri1 x)^ @ lift_factsys_tri2 (i x) =
h x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap p (lift_factsys_tri1 x)^ @ lift_factsys_tri2 (i x) =
h x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a) @ (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap p
(ap (funx : D => f2 (q^-1 x)) (q1 x)^ @
(ap f2 (eissect q (f1 x)) @ ff x))^ @
(q2 (q^-1 (g1 (i x))) @
(ap g2 (eisretr q (g1 (i x))) @ gf (i x))) = h x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap p
(ap (funx : D => f2 (q^-1 x)) (q1 x)^
@' (ap f2 (eissect q (f1 x))
@' ff x))^
@' (q2 (q^-1 (g1 (i x)))
@' (ap g2 (eisretr q (g1 (i x)))
@' gf (i x))) = h x
(* First we use the one aspect of the uniqueness of factorizations that we haven't mentioned yet. *)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A r:= path_fact_factors
(path_factor factsys (p o f) fact fact') x
:
q2 (f1 x)
@' ap g2 (q1 x)
@' (gf (i x)
@' (h x)^) = ap p (ff x): q2 (f1 x)
@' ap g2 (q1 x)
@' (gf (i x)
@' (h x)^) = ap p (ff x)
ap p
(ap (funx : D => f2 (q^-1 x)) (q1 x)^
@' (ap f2 (eissect q (f1 x))
@' ff x))^
@' (q2 (q^-1 (g1 (i x)))
@' (ap g2 (eisretr q (g1 (i x)))
@' gf (i x))) = h x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A r: q2 (f1 x)
@' ap g2 (q1 x)
@' gf (i x)
@' (h x)^ = ap p (ff x)
ap p
(ap (funx : D => f2 (q^-1 x)) (q1 x)^
@' (ap f2 (eissect q (f1 x))
@' ff x))^
@' (q2 (q^-1 (g1 (i x)))
@' (ap g2 (eisretr q (g1 (i x)))
@' gf (i x))) = h x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A r: (ap p (ff x))^
@' (q2 (f1 x)
@' ap g2 (q1 x)
@' gf (i x)) = h x
ap p
(ap (funx : D => f2 (q^-1 x)) (q1 x)^
@' (ap f2 (eissect q (f1 x))
@' ff x))^
@' (q2 (q^-1 (g1 (i x)))
@' (ap g2 (eisretr q (g1 (i x)))
@' gf (i x))) = h x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap p
(ap (funx : D => f2 (q^-1 x)) (q1 x)^
@' (ap f2 (eissect q (f1 x))
@' ff x))^
@' (q2 (q^-1 (g1 (i x)))
@' (ap g2 (eisretr q (g1 (i x)))
@' gf (i x))) =
(ap p (ff x))^
@' (q2 (f1 x)
@' ap g2 (q1 x)
@' gf (i x))
(* Now we can cancel some whiskered paths on both sides. *)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
(ap p (ff x))^
@' ap p (ap f2 (eissect q (f1 x)))^
@' ap p (ap (funx : D => f2 (q^-1 x)) (q1 x)^)^
@' (q2 (q^-1 (g1 (i x)))
@' (ap g2 (eisretr q (g1 (i x)))
@' gf (i x))) =
(ap p (ff x))^
@' (q2 (f1 x)
@' ap g2 (q1 x)
@' gf (i x))
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap p (ap f2 (eissect q (f1 x)))^
@' (ap p (ap (funx : D => f2 (q^-1 x)) (q1 x)^)^
@' (q2 (q^-1 (g1 (i x)))
@' (ap g2 (eisretr q (g1 (i x)))
@' gf (i x)))) =
q2 (f1 x)
@' (ap g2 (q1 x)
@' gf (i x))
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap p (ap f2 (eissect q (f1 x)))^
@' ap p (ap (funx : D => f2 (q^-1 x)) (q1 x)^)^
@' q2 (q^-1 (g1 (i x)))
@' ap g2 (eisretr q (g1 (i x))) =
q2 (f1 x)
@' ap g2 (q1 x)
(* Next we set up for a naturality. *)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap p
(ap f2 (ap q^-1 (q1 x)^)
@' ap f2 (eissect q (f1 x)))^
@' q2 (q^-1 (g1 (i x)))
@' ap g2 (eisretr q (g1 (i x))) =
q2 (f1 x)
@' ap g2 (q1 x)
(* The next line appears to do nothing, but in fact it is necessary for the subsequent [rewrite] to succeed, because [lift_factsys] appears in the invisible implicit point-arguments of [paths]. One way to discover issues of that sort is to turn on printing of all implicit arguments with [Set Printing All]; another is to use [Set Debug Tactic Unification] and inspect the output to see what [rewrite] is trying and failing to unify. *)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap p
(ap f2 (ap q^-1 (q1 x)^)
@' ap f2 (eissect q (f1 x)))^
@' q2 (q^-1 (g1 (i x)))
@' ap g2 (eisretr q (g1 (i x))) =
q2 (f1 x)
@' ap g2 (q1 x)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap p (ap f2 (ap q^-1 (q1 x)^
@' eissect q (f1 x)))^
@' q2 (q^-1 (g1 (i x)))
@' ap g2 (eisretr q (g1 (i x))) =
q2 (f1 x)
@' ap g2 (q1 x)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap (funx : C => p (f2 x))
(ap q^-1 (q1 x)^
@' eissect q (f1 x))^
@' q2 (q^-1 (g1 (i x)))
@' ap g2 (eisretr q (g1 (i x))) =
q2 (f1 x)
@' ap g2 (q1 x)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
q2 (f1 x)
@' ap (funx : C => g2 (q x))
(ap q^-1 (q1 x)^
@' eissect q (f1 x))^
@' ap g2 (eisretr q (g1 (i x))) =
q2 (f1 x)
@' ap g2 (q1 x)
(* Now we can cancel another path *)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap (funx : C => g2 (q x))
(ap q^-1 (q1 x)^
@' eissect q (f1 x))^
@' ap g2 (eisretr q (g1 (i x))) = ap g2 (q1 x)
(* And set up for an application of [ap]. *)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap g2 (ap q (ap q^-1 (q1 x)^
@' eissect q (f1 x))^)
@' ap g2 (eisretr q (g1 (i x))) = ap g2 (q1 x)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap g2
(ap q (ap q^-1 (q1 x)^
@' eissect q (f1 x))^
@' eisretr q (g1 (i x))) = ap g2 (q1 x)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap q (ap q^-1 (q1 x)^
@' eissect q (f1 x))^
@' eisretr q (g1 (i x)) = q1 x
(* Now we apply the triangle identity [eisadj]. *)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
(ap q (eissect q (f1 x)))^
@' ap q (ap q^-1 (q1 x)^)^
@' eisretr q (g1 (i x)) = q1 x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
(eisretr q (q (f1 x)))^
@' ap q (ap q^-1 (q1 x)^)^
@' eisretr q (g1 (i x)) = q1 x
(* Finally, we rearrange and it becomes a naturality square. *)
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap q (ap q^-1 (q1 x)^)^
@' eisretr q (g1 (i x)) = eisretr q (q (f1 x))
@' q1 x
factsys: FactorizationSystem A, B, X, Y: Type i: A -> B c1i: class1 factsys i p: X -> Y c2p: class2 factsys p f: A -> X g: B -> Y h: p o f == g o i C:= factor factsys f: Type f1:= factor1 (factor factsys f): A -> C f2:= factor2 (factor factsys f): C -> X ff:= fact_factors (factor factsys f): f2 o f1 == f D:= factor factsys g: Type g1:= factor1 (factor factsys g): B -> D g2:= factor2 (factor factsys g): D -> Y gf:= fact_factors (factor factsys g): g2 o g1 == g fact:= Build_Factorization' (p o f) C f1
(p o f2) (funa : A => ap p (ff a))
(inclass1 (factor factsys f))
(class2_compose factsys f2 p
(inclass2 (factor factsys f)) c2p): Factorization (@class1 factsys)
(@class2 factsys) (p o f) fact':= Build_Factorization' (p o f) D
(g1 o i) g2 (funa : A => gf (i a)
@' (h a)^)
(class1_compose factsys i g1 c1i
(inclass1 (factor factsys g)))
(inclass2 (factor factsys g)): Factorization (@class1 factsys)
(@class2 factsys) (p o f) q:= path_intermediate
(path_factor factsys (p o f) fact fact'): C <~> D q1:= path_factor1
(path_factor factsys (p o f) fact fact'): q o f1 == g1 o i q2:= path_factor2
(path_factor factsys (p o f) fact fact'): p o f2 == g2 o q x: A
ap (funx : D => q (q^-1 x)) (q1 x)
@' eisretr q (g1 (i x)) = eisretr q (q (f1 x))
@' q1 x
exact (concat_A1p (eisretr q) (q1 x)).Close Scope long_path_scope.Qed.EndFactSys.SectionFactsysExtensions.Context {factsys : FactorizationSystem}.(** We can deduce the lifting property in terms of extensions fairly easily from the version in terms of commutative squares. *)
factsys: FactorizationSystem A, B: Type f: A -> B c1f: class1 factsys f P: B -> Type c2P: class2 factsys pr1 d: foralla : A, P (f a)
ExtensionAlong f P d
factsys: FactorizationSystem A, B: Type f: A -> B c1f: class1 factsys f P: B -> Type c2P: class2 factsys pr1 d: foralla : A, P (f a)
ExtensionAlong f P d
factsys: FactorizationSystem A, B: Type f: A -> B c1f: class1 factsys f P: B -> Type c2P: class2 factsys pr1 d: foralla : A, P (f a) e:= lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): B -> {x : _ & P x}
ExtensionAlong f P d
factsys: FactorizationSystem A, B: Type f: A -> B c1f: class1 factsys f P: B -> Type c2P: class2 factsys pr1 d: foralla : A, P (f a) e:= lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): B -> {x : _ & P x} e2:= lift_factsys_tri2 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): pr1
o lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) == idmap
ExtensionAlong f P d
factsys: FactorizationSystem A, B: Type f: A -> B c1f: class1 factsys f P: B -> Type c2P: class2 factsys pr1 d: foralla : A, P (f a) e:= lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): B -> {x : _ & P x} e2:= lift_factsys_tri2 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): pr1
o lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) == idmap
forallx : A, transport P (e2 (f x)) (e (f x)).2 = d x
factsys: FactorizationSystem A, B: Type f: A -> B c1f: class1 factsys f P: B -> Type c2P: class2 factsys pr1 d: foralla : A, P (f a) e:= lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): B -> {x : _ & P x} e2:= lift_factsys_tri2 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): pr1
o lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) == idmap a: A
transport P (e2 (f a)) (e (f a)).2 = d a
factsys: FactorizationSystem A, B: Type f: A -> B c1f: class1 factsys f P: B -> Type c2P: class2 factsys pr1 d: foralla : A, P (f a) e:= lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): B -> {x : _ & P x} e2:= lift_factsys_tri2 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): pr1
o lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) == idmap a: A e1:= lift_factsys_tri1 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) a
:
e (f a) = (f a; d a): e (f a) = (f a; d a)
transport P (e2 (f a)) (e (f a)).2 = d a
factsys: FactorizationSystem A, B: Type f: A -> B c1f: class1 factsys f P: B -> Type c2P: class2 factsys pr1 d: foralla : A, P (f a) e:= lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): B -> {x : _ & P x} e2:= lift_factsys_tri2 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): pr1
o lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) == idmap a: A e1:= lift_factsys_tri1 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) a
:
e (f a) = (f a; d a): e (f a) = (f a; d a) e3:= moveL_M1
(lift_factsys_tri2 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) (f a))
(ap pr1
(lift_factsys_tri1 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) a))
(((ap_V pr1
(lift_factsys_tri1 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) a))^ @@ 1) @
lift_factsys_square factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) a)
:
e2 (f a) = e1 ..1: e2 (f a) = e1 ..1
transport P (e2 (f a)) (e (f a)).2 = d a
factsys: FactorizationSystem A, B: Type f: A -> B c1f: class1 factsys f P: B -> Type c2P: class2 factsys pr1 d: foralla : A, P (f a) e:= lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): B -> {x : _ & P x} e2:= lift_factsys_tri2 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1): pr1
o lift_factsys factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) == idmap a: A e1:= lift_factsys_tri1 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) a
:
e (f a) = (f a; d a): e (f a) = (f a; d a) e3:= moveL_M1
(lift_factsys_tri2 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) (f a))
(ap pr1
(lift_factsys_tri1 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) a))
(((ap_V pr1
(lift_factsys_tri1 factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) a))^ @@ 1) @
lift_factsys_square factsys f c1f pr1 c2P
(funa : A => (f a; d a)) idmap
(funa : A => 1) a)
:
e2 (f a) = e1 ..1: e2 (f a) = e1 ..1