Canonical swizzle_mx_scalable m n p q f g k :=
  AddLinear (@swizzle_mx_is_scalable m n p q f g k).Canonical trmx_linear m n := SwizzleLin (@trmx R m n).Canonical row_linear m n i := SwizzleLin (@row R m n i).Canonical col_linear m n j := SwizzleLin (@col R m n j).Canonical row'_linear m n i := SwizzleLin (@row' R m n i).Canonical col'_linear m n j := SwizzleLin (@col' R m n j).Canonical row_perm_linear m n s := SwizzleLin (@row_perm R m n s).Canonical col_perm_linear m n s := SwizzleLin (@col_perm R m n s).Canonical xrow_linear m n i1 i2 := SwizzleLin (@xrow R m n i1 i2).Canonical xcol_linear m n j1 j2 := SwizzleLin (@xcol R m n j1 j2).Canonical lsubmx_linear m n1 n2 := SwizzleLin (@lsubmx R m n1 n2).Canonical rsubmx_linear m n1 n2 := SwizzleLin (@rsubmx R m n1 n2).Canonical usubmx_linear m1 m2 n := SwizzleLin (@usubmx R m1 m2 n).Canonical dsubmx_linear m1 m2 n := SwizzleLin (@dsubmx R m1 m2 n).Canonical vec_mx_linear m n := SwizzleLin (@vec_mx R m n).Definition mxvec_is_linear m n := can2_linear (@vec_mxK R m n) mxvecK.Canonical mxvec_linear m n := AddLinear (@mxvec_is_linear m n).

(* Specifications: *)
Lemma trmx_delta m n i j : (delta_mx i j)^T = delta_mx j i :> 'M[R]_(n, m).
Lemma delta_mx_lshift m n1 n2 i j : delta_mx i (lshift n2 j) = row_mx (delta_mx i j) 0 :> 'M_(m, n1 + n2).
Lemma delta_mx_rshift m n1 n2 i j : delta_mx i (rshift n1 j) = row_mx 0 (delta_mx i j) :> 'M_(m, n1 + n2).
Lemma delta_mx_ushift m1 m2 n i j : delta_mx (lshift m2 i) j = col_mx (delta_mx i j) 0 :> 'M_(m1 + m2, n).
Lemma delta_mx_dshift m1 m2 n i j : delta_mx (rshift m1 i) j = col_mx 0 (delta_mx i j) :> 'M_(m1 + m2, n).
Lemma vec_mx_delta m n i j : vec_mx (delta_mx 0 (mxvec_index i j)) = delta_mx i j :> 'M_(m, n).
Lemma mxvec_delta m n i j : mxvec (delta_mx i j) = delta_mx 0 (mxvec_index i j) :> 'rV_(m * n).