\import Algebra.Group.Category
\import Algebra.Module
\import Algebra.Module.LinearMap
\import Algebra.Monoid.Category
\import Algebra.Ring
\import Algebra.Ring.RingHom
\import Category
\import Category.Meta
\import Logic
\import Paths
\import Paths.Meta
\instance LModuleCat (R : Ring) : Cat (LModule R)
| Hom A B => LinearMap A B
| id A => \new LinearMap {
| func a => a
| func-+ => idp
| func-*c => idp
}
| o g f => \new LinearMap {
| func a => g (f a)
| func-+ => pmap g func-+ *> func-+
| func-*c => pmap g func-*c *> func-*c
}
| id-left => idp
| id-right => idp
| o-assoc => idp
| univalence => sip (\lam (f : LinearMap) g => exts (f.func-zro, \lam x x' => f.func-+, \lam x => f.func-negative, \lam e x => f.func-*c))
\instance KerLModule {R : Ring} {A B : LModule R} (f : LinearMap A B) : LModule R
| AbGroup => KerAbGroup f
| *c r a => (r *c a.1, func-*c *> pmap (r *c) a.2 *> B.*c_zro-right)
| *c-assoc => ext *c-assoc
| *c-ldistr => ext *c-ldistr
| *c-rdistr => ext *c-rdistr
| ide_*c => ext ide_*c
\func KerLModuleHom {R : Ring} {A B : LModule R} (f : LinearMap A B) : LinearMap (KerLModule f) f.Dom \cowith
| AddGroupHom => KerGroupHom f
| func-*c => idp
\instance ImageLModule {R : Ring} {A B : LModule R} (f : LinearMap A B) : LModule R
| AbGroup => ImageAbGroup f
| *c r a => (r *c a.1, TruncP.map a.2 \lam s => (r *c s.1, func-*c *> pmap (r *c) s.2))
| *c-assoc => ext *c-assoc
| *c-ldistr => ext *c-ldistr
| *c-rdistr => ext *c-rdistr
| ide_*c => ext ide_*c
\func ImageLModuleLeftHom {R : Ring} {A B : LModule R} (f : LinearMap A B) : LinearMap f.Dom (ImageLModule f) \cowith
| AddGroupHom => ImageGroupLeftHom f
| func-*c => ext func-*c
\func ImageLModuleRightHom {R : Ring} {A B : LModule R} (f : LinearMap A B) : LinearMap (ImageLModule f) f.Cod \cowith
| AddGroupHom => ImageGroupRightHom f
| func-*c => idp
\instance LinearMapRing {R : Ring} (U : LModule R) : Ring (LinearMap U U)
| zro => linearMap_zro
| + => linearMap_+
| zro-left => exts \lam u => U.zro-left
| +-assoc => exts \lam u => U.+-assoc
| +-comm => exts \lam u => U.+-comm
| negative => linearMap_negative
| negative-left => exts \lam u => U.negative-left
| ide => id U
| * f g => g ∘ f
| ide-left => idp
| ide-right => idp
| *-assoc => idp
| ldistr => idp
| rdistr => exts \lam u => func-+
\where {
\func *c-hom {R : CRing} {U : LModule R} : RingHom R (LinearMapRing U) \cowith
| func (r : R) : LinearMap U U \cowith {
| func u => r *c u
| func-+ => *c-ldistr
| func-*c => inv *c-assoc *> pmap (`*c _) R.*-comm *> *c-assoc
}
| func-+ => exts \lam u => *c-rdistr
| func-ide => exts \lam u => ide_*c
| func-* => exts \lam u => pmap (`*c u) R.*-comm *> *c-assoc
}