Arguments lpreimK {K aT rT f} [W] fW.
Section LfunAlgebra.
(* This section is a bit of a place holder: the instances we build here can't *)
(* be canonical because we are missing an interface for proper vectTypes,     *)
(* would sit between Vector and Falgebra. For now, we just supply structure   *)
(* definitions here and supply actual instances for F-algebras in a submodule *)
(* of the algebra library (there is currently no actual use of the End(vT)    *)
(* algebra structure). Also note that the unit ring structure is missing.     *)
Variables (R : comRingType) (vT : vectType R).
Hypothesis vT_proper : Vector.dim vT > 0.
Fact lfun1_neq0 : \1%VF != 0 :> 'End(vT).
Prenex Implicits comp_lfunA comp_lfun1l comp_lfun1r comp_lfunDl comp_lfunDr.
Definition lfun_comp_ringMixin :=
RingMixin comp_lfunA comp_lfun1l comp_lfun1r comp_lfunDl comp_lfunDr
lfun1_neq0.
Definition lfun_comp_ringType := RingType 'End(vT) lfun_comp_ringMixin.
(* In the standard endomorphism ring product is categorical composition.     *)
Definition lfun_ringMixin : GRing.Ring.mixin_of (lfun_zmodType vT vT) :=
GRing.converse_ringMixin lfun_comp_ringType.
Definition lfun_ringType := Eval hnf in RingType 'End(vT) lfun_ringMixin.
Definition lfun_lalgType := Eval hnf in [lalgType R of 'End(vT)
for LalgType R lfun_ringType (fun k x y => comp_lfunZr k y x)].
Definition lfun_algType := Eval hnf in [algType R of 'End(vT)
for AlgType R _ (fun k (x y : lfun_lalgType) => comp_lfunZl k y x)].
End LfunAlgebra.
Section Projection.
Variables (K : fieldType) (vT : vectType K).
Implicit Types U V : {vspace vT}.
Definition daddv_pi U V := Vector.Hom (proj_mx (vs2mx U) (vs2mx V)).
Definition projv U := daddv_pi U U^C.
Definition addv_pi1 U V := daddv_pi (U :\: V) V.
Definition addv_pi2 U V := daddv_pi V (U :\: V).

(* Specifications: *)
Lemma memv_pi U V w : (daddv_pi U V) w \in U.
Lemma daddv_pi_proj U V w (pi := daddv_pi U V) :
(U :&: V = 0)%VS -> pi (pi w) = pi w.
Lemma projv_id U u : u \in U -> projv U u = u.
Lemma limg_proj U : limg (projv U) = U.
Lemma lker_proj U : lker (projv U) = (U^C)%VS.
Lemma addv_pi1_proj U V w (pi1 := addv_pi1 U V) : pi1 (pi1 w) = pi1 w.
Lemma sumv_pi_uniq_sum v :
uniq (filter P r0) -> v \in V ->
\sum_(i <- r0 | P i) sumv_pi_for defV i v = v.