module Cat.Displayed.Morphism {o β o' β'} {β¬ : Precategory o β} (β° : Displayed β¬ o' β') where
open Cat.Displayed.Reasoning β° open Cat.Reasoning β¬ private variable βi : Level Ix : Type βi a b c d : Ob aα΅’ bα΅’ cα΅’ : Ix β Ob f g h : Hom a b a' b' c' : Ob[ a ] aα΅’' bα΅’' cα΅’' : (ix : Ix) β Ob[ bα΅’ ix ] f' g' h' : Hom[ f ] a' b'
Displayed morphismsπ
This module defines the displayed analogs of monomorphisms, epimorphisms, and isomorphisms.
Monosπ
Displayed monomorphisms have the the same left-cancellation properties as their non-displayed counterparts. However, they must be displayed over a monomorphism in the base.
is-monic[_] : β {a' : Ob[ a ]} {b' : Ob[ b ]} {f : Hom a b} β is-monic f β Hom[ f ] a' b' β Type _ is-monic[_] {a = a} {a' = a'} {f = f} mono f' = β {c c'} {g h : Hom c a} β (g' : Hom[ g ] c' a') (h' : Hom[ h ] c' a') β (p : f β g β‘ f β h) β f' β' g' β‘[ p ] f' β' h' β g' β‘[ mono g h p ] h' is-monic[]-is-prop : β {a' : Ob[ a ]} {b' : Ob[ b ]} {f : Hom a b} β (mono : is-monic f) β (f' : Hom[ f ] a' b') β is-prop (is-monic[ mono ] f') is-monic[]-is-prop {a' = a'} mono f' mono[] mono[]' i {c' = c'} g' h' p p' = is-setβsquarep (Ξ» i j β Hom[ mono _ _ p j ]-set c' a') refl (mono[] g' h' p p') (mono[]' g' h' p p') refl i record _βͺ[_]_ {a b} (a' : Ob[ a ]) (f : a βͺ b) (b' : Ob[ b ]) : Type (o β β β o' β β') where no-eta-equality field mor' : Hom[ f .mor ] a' b' monic' : is-monic[ f .monic ] mor' open _βͺ[_]_ public
Weak monosπ
When working in a displayed setting, we also have weaker versions of the morphism classes we are familiar with, wherein we can only left/right cancel morphisms that are displayed over the same morphism in the base. We denote these morphisms classes as βweakβ.
is-weak-monic : β {a' : Ob[ a ]} {b' : Ob[ b ]} {f : Hom a b} β Hom[ f ] a' b' β Type _ is-weak-monic {a = a} {a' = a'} {f = f} f' = β {c c'} {g h : Hom c a} β (g' : Hom[ g ] c' a') (h' : Hom[ h ] c' a') β (p : g β‘ h) β f' β' g' β‘[ ap (f β_) p ] f' β' h' β g' β‘[ p ] h' is-weak-monic-is-prop : β {a' : Ob[ a ]} {b' : Ob[ b ]} {f : Hom a b} β (f' : Hom[ f ] a' b') β is-prop (is-weak-monic f') is-weak-monic-is-prop f' = hlevel 1 record weak-mono-over {a b} (f : Hom a b) (a' : Ob[ a ]) (b' : Ob[ b ]) : Type (o β β β o' β β') where no-eta-equality field mor' : Hom[ f ] a' b' weak-monic : is-weak-monic mor' open weak-mono-over public
Weak monomorphisms are closed under composition, and every displayed monomorphism is weakly monic.
β-is-weak-monic : is-weak-monic f' β is-weak-monic g' β is-weak-monic (f' β' g') β-is-weak-monic {f' = f'} {g' = g'} f'-weak-monic g'-weak-monic h' k' p p' = g'-weak-monic h' k' p $ f'-weak-monic (g' β' h') (g' β' k') (apβ _β_ refl p) $ begin[] f' β' g' β' h' β‘[]β¨ assoc' f' g' h' β©β‘[] (f' β' g') β' h' β‘[]β¨ p' β©β‘[] (f' β' g') β' k' β‘[]Λβ¨ assoc' f' g' k' β©β‘[]Λ f' β' g' β' k' β[] is-monic[]βis-weak-monic : {f-monic : is-monic f} β is-monic[ f-monic ] f' β is-weak-monic f' is-monic[]βis-weak-monic f'-monic g' h' p p' = cast[] $ f'-monic g' h' (apβ _β_ refl p) p'
If is weakly monic, then so is
weak-monic-cancell : is-weak-monic (f' β' g') β is-weak-monic g' weak-monic-cancell {f' = f'} {g' = g'} fg-weak-monic h' k' p p' = fg-weak-monic h' k' p (extendr' _ p')
Moreover, postcomposition with a weak monomorphism is an embedding. This suggests that weak monomorphisms are the βrightβ notion of monomorphisms in displayed categories.
weak-monic-postcomp-embedding : {f : Hom b c} {g : Hom a b} β {f' : Hom[ f ] b' c'} β is-weak-monic f' β is-embedding {A = Hom[ g ] a' b'} (f' β'_) weak-monic-postcomp-embedding {f' = f'} f'-weak-monic = injectiveβis-embedding (hlevel 2) (f' β'_) Ξ» {g'} {h'} β f'-weak-monic g' h' refl
Jointly weak monosπ
We can generalize the notion of weak monomorphisms to families of morphisms, which yields a displayed version of a jointly monic family.
A family of displayed morphisms is jointly monic if for all if for all
is-jointly-weak-monic : {fα΅’ : (ix : Ix) β Hom a (bα΅’ ix)} β (fα΅’' : (ix : Ix) β Hom[ fα΅’ ix ] a' (bα΅’' ix)) β Type _ is-jointly-weak-monic {a = a} {a' = a'} {fα΅’ = fα΅’} fα΅’' = β {x x'} {g h : Hom x a} β (g' : Hom[ g ] x' a') (h' : Hom[ h ] x' a') β (p : g β‘ h) β (β ix β fα΅’' ix β' g' β‘[ ap (fα΅’ ix β_) p ] fα΅’' ix β' h') β g' β‘[ p ] h'
Jointly weak monic families are closed under precomposition with weak monos.
β-is-jointly-weak-monic : {fα΅’ : (ix : Ix) β Hom a (bα΅’ ix)} β {fα΅’' : (ix : Ix) β Hom[ fα΅’ ix ] a' (bα΅’' ix)} β is-jointly-weak-monic fα΅’' β is-weak-monic g' β is-jointly-weak-monic (Ξ» ix β fα΅’' ix β' g') β-is-jointly-weak-monic {g' = g'} {fα΅’' = fα΅’'} fα΅’'-joint-mono g'-joint-mono h' h'' p p' = g'-joint-mono h' h'' p $ fα΅’'-joint-mono (g' β' h') (g' β' h'') (apβ _β_ refl p) Ξ» ix β begin[] fα΅’' ix β' g' β' h' β‘[]β¨ assoc' (fα΅’' ix) g' h' β©β‘[] (fα΅’' ix β' g') β' h' β‘[]β¨ p' ix β©β‘[] (fα΅’' ix β' g') β' h'' β‘[]Λβ¨ assoc' (fα΅’' ix) g' h'' β©β‘[]Λ fα΅’' ix β' g' β' h'' β[]
Similarly, if is a jointly weak monic family, then must be a weak mono.
jointly-weak-monic-cancell : {fα΅’ : (ix : Ix) β Hom a (bα΅’ ix)} β {fα΅’' : (ix : Ix) β Hom[ fα΅’ ix ] a' (bα΅’' ix)} β is-jointly-weak-monic (Ξ» ix β fα΅’' ix β' g') β is-weak-monic g' jointly-weak-monic-cancell fα΅’'-joint-mono h' h'' p p' = fα΅’'-joint-mono h' h'' p Ξ» _ β extendr' (apβ _β_ refl p) p'
Episπ
Displayed epimorphisms are defined in a similar fashion.
is-epic[_] : β {a' : Ob[ a ]} {b' : Ob[ b ]} {f : Hom a b} β is-epic f β Hom[ f ] a' b' β Type _ is-epic[_] {b = b} {b' = b'} {f = f} epi f' = β {c} {c'} {g h : Hom b c} β (g' : Hom[ g ] b' c') (h' : Hom[ h ] b' c') β (p : g β f β‘ h β f) β g' β' f' β‘[ p ] h' β' f' β g' β‘[ epi g h p ] h' is-epic[]-is-prop : β {a' : Ob[ a ]} {b' : Ob[ b ]} {f : Hom a b} β (epi : is-epic f) β (f' : Hom[ f ] a' b') β is-prop (is-epic[ epi ] f') is-epic[]-is-prop {b' = b'} epi f' epi[] epi[]' i {c' = c'} g' h' p p' = is-setβsquarep (Ξ» i j β Hom[ epi _ _ p j ]-set b' c') refl (epi[] g' h' p p') (epi[]' g' h' p p') refl i record _β [_]_ {a b} (a' : Ob[ a ]) (f : a β b) (b' : Ob[ b ]) : Type (o β β β o' β β') where no-eta-equality field mor' : Hom[ f .mor ] a' b' epic' : is-epic[ f .epic ] mor' open _β [_]_ public
Weak episπ
We can define a weaker notion of epis that is dual to the definition of a weak mono.
is-weak-epic : β {a' : Ob[ a ]} {b' : Ob[ b ]} {f : Hom a b} β Hom[ f ] a' b' β Type _ is-weak-epic {b = b} {b' = b'} {f = f} f' = β {c c'} {g h : Hom b c} β (g' : Hom[ g ] b' c') (h' : Hom[ h ] b' c') β (p : g β‘ h) β g' β' f' β‘[ ap (_β f) p ] h' β' f' β g' β‘[ p ] h' is-weak-epic-is-prop : β {a' : Ob[ a ]} {b' : Ob[ b ]} {f : Hom a b} β (f' : Hom[ f ] a' b') β is-prop (is-weak-epic f') is-weak-epic-is-prop f' = hlevel 1 record weak-epi-over {a b} (f : Hom a b) (a' : Ob[ a ]) (b' : Ob[ b ]) : Type (o β β β o' β β') where no-eta-equality field mor' : Hom[ f ] a' b' weak-epic : is-weak-epic mor' open weak-epi-over public
Sectionsπ
Following the same pattern as before, we define a notion of displayed sections.
_section-of[_]_ : β {x y} {s : Hom y x} {r : Hom x y} β β {x' y'} (s' : Hom[ s ] y' x') β s section-of r β (r' : Hom[ r ] x' y') β Type _ s' section-of[ p ] r' = r' β' s' β‘[ p ] id' record has-section[_] {x y x' y'} {r : Hom x y} (sect : has-section r) (r' : Hom[ r ] x' y') : Type β' where no-eta-equality field section' : Hom[ sect .section ] y' x' is-section' : section' section-of[ sect .is-section ] r' open has-section[_] public
We also distinguish the sections that are displayed over the identity morphism; these are known as βvertical sectionsβ.
_section-ofβ_ : β {x} {x' x'' : Ob[ x ]} (s' : Hom[ id ] x'' x') β (r : Hom[ id ] x' x'') β Type _ s' section-ofβ r' = s' section-of[ idl id ] r' has-sectionβ : β {x} {x' x'' : Ob[ x ]} (r' : Hom[ id ] x' x'') β Type _ has-sectionβ r' = has-section[ id-has-section ] r'
Retractsπ
We can do something similar for retracts.
_retract-of[_]_ : β {x y} {s : Hom y x} {r : Hom x y} β β {x' y'} (r' : Hom[ r ] x' y') β r retract-of s β (s' : Hom[ s ] y' x') β Type _ r' retract-of[ p ] s' = r' β' s' β‘[ p ] id' record has-retract[_] {x y x' y'} {s : Hom x y} (ret : has-retract s) (s' : Hom[ s ] x' y') : Type β' where no-eta-equality field retract' : Hom[ ret .retract ] y' x' is-retract' : retract' retract-of[ ret .is-retract ] s' open has-retract[_] public
We also define vertical retracts in a similar manner as before.
_retract-ofβ_ : β {x} {x' x'' : Ob[ x ]} (r' : Hom[ id ] x' x'') β (s : Hom[ id ] x'' x') β Type _ r' retract-ofβ s' = r' retract-of[ idl id ] s' has-retractβ : β {x} {x' x'' : Ob[ x ]} (s' : Hom[ id ] x'' x') β Type _ has-retractβ s' = has-retract[ id-has-retract ] s'
Isosπ
Displayed isomorphisms must also be defined over isomorphisms in the base.
record Inverses[_] {a b a' b'} {f : Hom a b} {g : Hom b a} (inv : Inverses f g) (f' : Hom[ f ] a' b') (g' : Hom[ g ] b' a') : Type β' where no-eta-equality field invl' : f' β' g' β‘[ Inverses.invl inv ] id' invr' : g' β' f' β‘[ Inverses.invr inv ] id' record is-invertible[_] {a b a' b'} {f : Hom a b} (f-inv : is-invertible f) (f' : Hom[ f ] a' b') : Type β' where no-eta-equality field inv' : Hom[ is-invertible.inv f-inv ] b' a' inverses' : Inverses[ is-invertible.inverses f-inv ] f' inv' open Inverses[_] inverses' public record _β [_]_ {a b} (a' : Ob[ a ]) (i : a β b) (b' : Ob[ b ]) : Type β' where no-eta-equality field to' : Hom[ i .to ] a' b' from' : Hom[ i .from ] b' a' inverses' : Inverses[ i .inverses ] to' from' open Inverses[_] inverses' public Isomorphism[_] : β {a b} (i : a β b) (a' : Ob[ a ]) (b' : Ob[ b ]) β Type β' Isomorphism[ i ] a' b' = a' β [ i ] b'
Since isomorphisms over the identity map will be of particular importance, we also define their own type: they are the vertical isomorphisms.
_β β_ : {x : Ob} (A B : Ob[ x ]) β Type β' _β β_ = _β [ id-iso ]_ is-invertibleβ : {x : Ob} {x' x'' : Ob[ x ]} β Hom[ id ] x' x'' β Type _ is-invertibleβ = is-invertible[ id-invertible ] make-invertibleβ : β {x} {x' x'' : Ob[ x ]} {f' : Hom[ id ] x' x''} β (g' : Hom[ id ] x'' x') β f' β' g' β‘[ idl _ ] id' β g' β' f' β‘[ idl _ ] id' β is-invertibleβ f' make-invertibleβ g' p q .is-invertible[_].inv' = g' make-invertibleβ g' p q .is-invertible[_].inverses' .Inverses[_].invl' = p make-invertibleβ g' p q .is-invertible[_].inverses' .Inverses[_].invr' = q
Like their non-displayed counterparts, existence of displayed inverses is a proposition.
Inverses[]-are-prop : β {a b a' b'} {f : Hom a b} {g : Hom b a} β (inv : Inverses f g) β (f' : Hom[ f ] a' b') (g' : Hom[ g ] b' a') β is-prop (Inverses[ inv ] f' g') Inverses[]-are-prop inv f' g' inv[] inv[]' i .Inverses[_].invl' = is-setβsquarep (Ξ» i j β Hom[ Inverses.invl inv j ]-set _ _) refl (Inverses[_].invl' inv[]) (Inverses[_].invl' inv[]') refl i Inverses[]-are-prop inv f' g' inv[] inv[]' i .Inverses[_].invr' = is-setβsquarep (Ξ» i j β Hom[ Inverses.invr inv j ]-set _ _) refl (Inverses[_].invr' inv[]) (Inverses[_].invr' inv[]') refl i is-invertible[]-is-prop : β {a b a' b'} {f : Hom a b} β (f-inv : is-invertible f) β (f' : Hom[ f ] a' b') β is-prop (is-invertible[ f-inv ] f') is-invertible[]-is-prop inv f' p q = path where module inv = is-invertible inv module p = is-invertible[_] p module q = is-invertible[_] q invβ‘inv' : p.inv' β‘ q.inv' invβ‘inv' = p.inv' β‘β¨ shiftr (insertr inv.invl) (insertr' _ q.invl') β©β‘ hom[] ((p.inv' β' f') β' q.inv') β‘β¨ weave _ (eliml inv.invr) refl (eliml' _ p.invr') β©β‘ hom[] q.inv' β‘β¨ liberate _ β©β‘ q.inv' β path : p β‘ q path i .is-invertible[_].inv' = invβ‘inv' i path i .is-invertible[_].inverses' = is-propβpathp (Ξ» i β Inverses[]-are-prop inv.inverses f' (invβ‘inv' i)) p.inverses' q.inverses' i
make-iso[_] : β {a b a' b'} β (iso : a β b) β (f' : Hom[ iso .to ] a' b') (g' : Hom[ iso .from ] b' a') β f' β' g' β‘[ iso .invl ] id' β g' β' f' β‘[ iso .invr ] id' β a' β [ iso ] b' {-# INLINE make-iso[_] #-} make-iso[ inv ] f' g' p q = record { to' = f' ; from' = g' ; inverses' = record { invl' = p ; invr' = q }} make-invertible[_] : β {a b a' b'} {f : Hom a b} {f' : Hom[ f ] a' b'} β (f-inv : is-invertible f) β (f-inv' : Hom[ is-invertible.inv f-inv ] b' a') β f' β' f-inv' β‘[ is-invertible.invl f-inv ] id' β f-inv' β' f' β‘[ is-invertible.invr f-inv ] id' β is-invertible[ f-inv ] f' make-invertible[ f-inv ] f-inv' p q .is-invertible[_].inv' = f-inv' make-invertible[ f-inv ] f-inv' p q .is-invertible[_].inverses' .Inverses[_].invl' = p make-invertible[ f-inv ] f-inv' p q .is-invertible[_].inverses' .Inverses[_].invr' = q make-vertical-iso : β {x} {x' x'' : Ob[ x ]} β (f' : Hom[ id ] x' x'') (g' : Hom[ id ] x'' x') β f' β' g' β‘[ idl _ ] id' β g' β' f' β‘[ idl _ ] id' β x' β β x'' make-vertical-iso = make-iso[ id-iso ] invertible[]βiso[] : β {a b a' b'} {f : Hom a b} {f' : Hom[ f ] a' b'} β {i : is-invertible f} β is-invertible[ i ] f' β a' β [ invertibleβiso f i ] b' invertible[]βiso[] {f' = f'} i = make-iso[ _ ] f' (is-invertible[_].inv' i) (is-invertible[_].invl' i) (is-invertible[_].invr' i) is-invertible[]-inverse : β {x y x' y'} {f : Hom x y} {f-inv : is-invertible f} {f' : Hom[ f ] x' y'} (f'-inv : is-invertible[ f-inv ] f') β is-invertible[ is-invertible-inverse f-inv ] (f'-inv .is-invertible[_].inv') is-invertible[]-inverse f'-inv = record { inv' = _ ; inverses' = record { invl' = g'.invr' ; invr' = g'.invl' } } where module g' = Inverses[_] (f'-inv .is-invertible[_].inverses') iso[]βinvertible[] : β {a b a' b'} β {i : a β b} β (i' : a' β [ i ] b') β is-invertible[ isoβinvertible i ] (i' .to') iso[]βinvertible[] {i = i} i' = make-invertible[ (isoβinvertible i) ] (i' .from') (i' .invl') (i' .invr') β []-path : {x y : Ob} {A : Ob[ x ]} {B : Ob[ y ]} {f : x β y} {p q : A β [ f ] B} β p .to' β‘ q .to' β p β‘ q β []-path {f = f} {p = p} {q = q} a = it where p' : PathP (Ξ» i β is-invertible[ isoβinvertible f ] (a i)) (record { inv' = p .from' ; inverses' = p .inverses' }) (record { inv' = q .from' ; inverses' = q .inverses' }) p' = is-propβpathp (Ξ» i β is-invertible[]-is-prop _ (a i)) _ _ it : p β‘ q it i .to' = a i it i .from' = p' i .is-invertible[_].inv' it i .inverses' = p' i .is-invertible[_].inverses' instance Extensional-β [] : β {βr} {x y : Ob} {x' : Ob[ x ]} {y' : Ob[ y ]} {f : x β y} β β¦ sa : Extensional (Hom[ f .to ] x' y') βr β¦ β Extensional (x' β [ f ] y') βr Extensional-β [] β¦ sa β¦ = injectionβextensional! β []-path sa
As in the non-displayed case, the identity isomorphism is always an iso. In fact, it is a vertical iso!
id-isoβ : β {x} {x' : Ob[ x ]} β x' β β x' id-isoβ = make-iso[ id-iso ] id' id' (idl' id') (idl' id')
We take the opportunity to define the displayed counterpart to pathβiso:
path[_]βiso[] : β {a} {b} (p : a β‘ b) {a'} {b'} (q : PathP (Ξ» i β Ob[ p i ]) a' b') β a' β [ pathβiso p ] b' path[ p ]βiso[] {a'} {b'} p' = transport (Ξ» i β Isomorphism[ id=pathβiso i ] a' (p' i)) id-isoβ where id=pathβiso : PathP (Ξ» i β _ β p i) id-iso (pathβiso p) id=pathβiso = transport-filler (Ξ» i β _ β p i) id-iso
We also have that displayed isos compose
Inverses-β' : β {a b c f g fβ»ΒΉ gβ»ΒΉ finv ginv} {a : Ob[ a ]} {b : Ob[ b ]} {c : Ob[ c ]} {f' : Hom[ f ] a b} {f'β»ΒΉ : Hom[ fβ»ΒΉ ] b a} {g' : Hom[ g ] b c} {g'β»ΒΉ : Hom[ gβ»ΒΉ ] c b} β Inverses[ finv ] f' f'β»ΒΉ β Inverses[ ginv ] g' g'β»ΒΉ β Inverses[ Inverses-β ginv finv ] (g' β' f') (f'β»ΒΉ β' g'β»ΒΉ) Inverses-β' {finv = finv} {ginv} {f' = f'} {f'β»ΒΉ} {g'} {g'β»ΒΉ} finv' ginv' = record { invl' = l' ; invr' = r' } where module gfinv = Inverses (Inverses-β ginv finv) module finv' = Inverses[_] finv' module ginv' = Inverses[_] ginv' l' : (g' β' f') β' f'β»ΒΉ β' g'β»ΒΉ β‘[ gfinv.invl ] id' l' = begin[] (g' β' f') β' f'β»ΒΉ β' g'β»ΒΉ β‘[]β¨ assoc' (g' β' f') f'β»ΒΉ g'β»ΒΉ β©β‘[] ((g' β' f') β' f'β»ΒΉ) β' g'β»ΒΉ β‘[]Λβ¨ assoc' g' f' f'β»ΒΉ β©β'β¨refl β©β‘[]Λ (g' β' (f' β' f'β»ΒΉ)) β' g'β»ΒΉ β‘[]β¨ (reflβ©β'β¨ finv'.invl') β©β'β¨refl β©β‘[] (g' β' id') β' g'β»ΒΉ β‘[]β¨ (idr' g') β©β'β¨refl β©β‘[] g' β' g'β»ΒΉ β‘[]β¨ ginv'.invl' β©β‘[] id' β[] r' : (f'β»ΒΉ β' g'β»ΒΉ) β' g' β' f' β‘[ gfinv.invr ] id' r' = begin[] (f'β»ΒΉ β' g'β»ΒΉ) β' g' β' f' β‘[]β¨ assoc' (f'β»ΒΉ β' g'β»ΒΉ) g' f' β©β‘[] ((f'β»ΒΉ β' g'β»ΒΉ) β' g') β' f' β‘[]Λβ¨ assoc' f'β»ΒΉ g'β»ΒΉ g' β©β'β¨refl β©β‘[]Λ (f'β»ΒΉ β' (g'β»ΒΉ β' g')) β' f' β‘[]β¨ (reflβ©β'β¨ ginv'.invr') β©β'β¨refl β©β‘[] (f'β»ΒΉ β' id') β' f' β‘[]β¨ (idr' f'β»ΒΉ) β©β'β¨refl β©β‘[] f'β»ΒΉ β' f' β‘[]β¨ finv'.invr' β©β‘[] id' β[] _βIso'_ : β {a b c f g} {a' : Ob[ a ]} {b' : Ob[ b ]} {c' : Ob[ c ]} β b' β [ g ] c' β a' β [ f ] b' β a' β [ g βIso f ] c' (g' βIso' f') .to' = g' .to' β' f' .to' (g' βIso' f') .from' = f' .from' β' g' .from' (g' βIso' f') .inverses' = Inverses-β' (f' .inverses') (g' .inverses') _Iso[]β»ΒΉ : β {a b a' b'} {i : a β b} β a' β [ i ] b' β b' β [ i Isoβ»ΒΉ ] a' (i' Iso[]β»ΒΉ) .to' = i' .from' (i' Iso[]β»ΒΉ) .from' = i' .to' (i' Iso[]β»ΒΉ) .inverses' .Inverses[_].invl' = i' .invr' (i' Iso[]β»ΒΉ) .inverses' .Inverses[_].invr' = i' .invl'
Isomorphisms are also instances of sections and retracts.
inverses[]βto-has-section[] : β {f : Hom a b} {g : Hom b a} β β {a' b'} {f' : Hom[ f ] a' b'} {g' : Hom[ g ] b' a'} β {inv : Inverses f g} β Inverses[ inv ] f' g' β has-section[ inversesβto-has-section inv ] f' inverses[]βto-has-section[] {g' = g'} inv' .section' = g' inverses[]βto-has-section[] inv' .is-section' = Inverses[_].invl' inv' inverses[]βfrom-has-section[] : β {f : Hom a b} {g : Hom b a} β β {a' b'} {f' : Hom[ f ] a' b'} {g' : Hom[ g ] b' a'} β {inv : Inverses f g} β Inverses[ inv ] f' g' β has-section[ inversesβfrom-has-section inv ] g' inverses[]βfrom-has-section[] {f' = f'} inv' .section' = f' inverses[]βfrom-has-section[] inv' .is-section' = Inverses[_].invr' inv' inverses[]βto-has-retract[] : β {f : Hom a b} {g : Hom b a} β β {a' b'} {f' : Hom[ f ] a' b'} {g' : Hom[ g ] b' a'} β {inv : Inverses f g} β Inverses[ inv ] f' g' β has-retract[ inversesβto-has-retract inv ] f' inverses[]βto-has-retract[] {g' = g'} inv' .retract' = g' inverses[]βto-has-retract[] inv' .is-retract' = Inverses[_].invr' inv' inverses[]βfrom-has-retract[] : β {f : Hom a b} {g : Hom b a} β β {a' b'} {f' : Hom[ f ] a' b'} {g' : Hom[ g ] b' a'} β {inv : Inverses f g} β Inverses[ inv ] f' g' β has-retract[ inversesβfrom-has-retract inv ] g' inverses[]βfrom-has-retract[] {f' = f'} inv' .retract' = f' inverses[]βfrom-has-retract[] inv' .is-retract' = Inverses[_].invl' inv' module _ {f : Hom a b} {f' : Hom[ f ] a' b'} {f-inv : is-invertible f} (f'-inv : is-invertible[ f-inv ] f') where private module f' = is-invertible[_] f'-inv invertible[]βto-has-section[] : has-section[ invertibleβto-has-section f-inv ] f' invertible[]βto-has-section[] .section' = f'.inv' invertible[]βto-has-section[] .is-section' = f'.invl' invertible[]βfrom-has-section[] : has-section[ invertibleβfrom-has-section f-inv ] f'.inv' invertible[]βfrom-has-section[] .section' = f' invertible[]βfrom-has-section[] .is-section' = f'.invr' invertible[]βto-has-retract[] : has-retract[ invertibleβto-has-retract f-inv ] f' invertible[]βto-has-retract[] .retract' = f'.inv' invertible[]βto-has-retract[] .is-retract' = f'.invr' invertible[]βfrom-has-retract[] : has-retract[ invertibleβfrom-has-retract f-inv ] f'.inv' invertible[]βfrom-has-retract[] .retract' = f' invertible[]βfrom-has-retract[] .is-retract' = f'.invl' invertible[]βmonic[] : is-monic[ invertibleβmonic f-inv ] f' invertible[]βmonic[] g' h' p p' = cast[] $ introl[] _ f'.invr' β[] extendr[] _ p' β[] eliml[] _ f'.invr' iso[]βto-has-section[] : {f : a β b} β (f' : a' β [ f ] b') β has-section[ isoβto-has-section f ] (f' .to') iso[]βto-has-section[] f' .section' = f' .from' iso[]βto-has-section[] f' .is-section' = f' .invl' iso[]βfrom-has-section[] : {f : a β b} β (f' : a' β [ f ] b') β has-section[ isoβfrom-has-section f ] (f' .from') iso[]βfrom-has-section[] f' .section' = f' .to' iso[]βfrom-has-section[] f' .is-section' = f' .invr' iso[]βto-has-retract[] : {f : a β b} β (f' : a' β [ f ] b') β has-retract[ isoβto-has-retract f ] (f' .to') iso[]βto-has-retract[] f' .retract' = f' .from' iso[]βto-has-retract[] f' .is-retract' = f' .invr' iso[]βfrom-has-retract[] : {f : a β b} β (f' : a' β [ f ] b') β has-retract[ isoβfrom-has-retract f ] (f' .from') iso[]βfrom-has-retract[] f' .retract' = f' .to' iso[]βfrom-has-retract[] f' .is-retract' = f' .invl'
The following is a displayed counterpart to inverse-uniquβ.
abstract inverse-uniqueβ' : β {x b} {f g : x β b} {r : f .to β‘ g .to} {x' : Ob[ x ]} {b' : Ob[ b ]} (f' : x' β [ f ] b') (g' : x' β [ g ] b') (r' : f' .to' β‘[ r ] g' .to') β f' .from' β‘[ inverse-uniqueβ f g r ] g' .from' inverse-uniqueβ' f' g' r' = begin[] f' .from' β‘[]Λβ¨ apd (Ξ» _ β f' .from' β'_) (g' .invl') β[] idr' _ β©β‘[]Λ f' .from' β' g' .to' β' g' .from' β‘[]β¨ assoc' (f' .from') (g' .to') (g' .from') β©β‘[] (f' .from' β' g' .to') β' g' .from' β‘[]β¨ (apd (Ξ» _ β _β' g' .from') (apd (Ξ» _ β f' .from' β'_) (symP r') β[] f' .invr')) β[] idl' _ β©β‘[] g' .from' β[]
module _ {f : Hom a b} {f' : Hom[ f ] a' b'} {f-section : has-section f} (f-section' : has-section[ f-section ] f') where abstract private module f = has-section f-section module f' = has-section[_] f-section' pre-section' : β {hβ : Hom b c} {hβ : Hom a c} β {p : hβ β f β‘ hβ} {q : hβ β‘ hβ β f.section} β {hβ' : Hom[ hβ ] b' c'} {hβ' : Hom[ hβ ] a' c'} β hβ' β' f' β‘[ p ] hβ' β hβ' β‘[ q ] hβ' β' f'.section' pre-section' {p = p} {q = q} {hβ' = hβ'} {hβ' = hβ'} p' = symP (rswizzle' (sym p) f.is-section (symP p') f'.is-section') pre-section[] : β {hβ : Hom b c} {hβ : Hom a c} β {p : hβ β f β‘ hβ} β {hβ' : Hom[ hβ ] b' c'} {hβ' : Hom[ hβ ] a' c'} β hβ' β' f' β‘[ p ] hβ' β hβ' β‘[ pre-section f-section p ] hβ' β' f'.section' pre-section[] = pre-section' post-section' : β {hβ : Hom c b} {hβ : Hom c a} β {p : f.section β hβ β‘ hβ} {q : hβ β‘ f β hβ} β {hβ' : Hom[ hβ ] c' b'} {hβ' : Hom[ hβ ] c' a'} β f'.section' β' hβ' β‘[ p ] hβ' β hβ' β‘[ q ] f' β' hβ' post-section' {p = p} {q = q} {hβ' = hβ'} {hβ' = hβ'} p' = symP (lswizzle' (sym p) f.is-section (symP p') f'.is-section') post-section[] : β {hβ : Hom c b} {hβ : Hom c a} β {p : f.section β hβ β‘ hβ} β {hβ' : Hom[ hβ ] c' b'} {hβ' : Hom[ hβ ] c' a'} β f'.section' β' hβ' β‘[ p ] hβ' β hβ' β‘[ post-section f-section p ] f' β' hβ' post-section[] = post-section'