: W => M /=; rewrite /= /socle_enum /=; case: sG0 => e sim_e _ /= e_M.
by apply: sim_e; rewrite mem_nth // -(size_map component_mx) index_mem.
Qed.Definition socle_module (W : sG) := mxsimple_module (socite /socle_val /= in e0W *; rewrite -(nth_map _ 0) ?nth_index //.
by rewrite -(size_map component_mx) index_mem.
Qed.Canonical socle_subType := SubType _ _ _ socle_sort_rect PackSCanonical socle_eqType := Eval hnf in EqType sG socle_eqMixin.Lemma socleP (W W' : sG) : reflect (W = W') (W == W')%MS.
Proof. by rewrite (sameP genmxP eqP) !{1}genmx_component; apply: (W =P _). Qed.cancel (fun W => SeqSub (socle_mem W)) (fun s => PackSocle (valP s)).
Proof. by move=> W /=; apply: val_inj; rewrite /= PackSocleK. Qed.nType_subproof.
Canonical socle_countType := CountType sG socle_countMixin.Canonical socle_subCountType := [subCountType of sG].Definition irrType :=leType.

Section SubSocle.

Definition Socle := (\sum_(W : sG) W)%MS.