Canonical swizzle_mx_additive k := Additive (swizzle_mx_is_additive k).Canonical trmx_additive m n := SwizzleAdd (@trmx V m n).Canonical row_additive m n i := SwizzleAdd (@row V m n i).Canonical col_additive m n j := SwizzleAdd (@col V m n j).Canonical row'_additive m n i := SwizzleAdd (@row' V m n i).Canonical col'_additive m n j := SwizzleAdd (@col' V m n j).Canonical row_perm_additive m n s := SwizzleAdd (@row_perm V m n s).Canonical col_perm_additive m n s := SwizzleAdd (@col_perm V m n s).Canonical xrow_additive m n i1 i2 := SwizzleAdd (@xrow V m n i1 i2).Canonical xcol_additive m n j1 j2 := SwizzleAdd (@xcol V m n j1 j2).Canonical lsubmx_additive m n1 n2 := SwizzleAdd (@lsubmx V m n1 n2).Canonical rsubmx_additive m n1 n2 := SwizzleAdd (@rsubmx V m n1 n2).Canonical usubmx_additive m1 m2 n := SwizzleAdd (@usubmx V m1 m2 n).Canonical dsubmx_additive m1 m2 n := SwizzleAdd (@dsubmx V m1 m2 n).Canonical vec_mx_additive m n := SwizzleAdd (@vec_mx V m n).Canonical mxvec_additive m n :=
  Additive (can2_additive (@vec_mxK V m n) mxvecK).

(* Specifications: *)
Lemma flatmx0 n : all_equal_to (0 : 'M_(0, n)).
Lemma thinmx0 n : all_equal_to (0 : 'M_(n, 0)).
Lemma trmx0 m n : (0 : 'M_(m, n))^T = 0.
Lemma row0 m n i0 : row i0 (0 : 'M_(m, n)) = 0.
Lemma col0 m n j0 : col j0 (0 : 'M_(m, n)) = 0.
Lemma row_mx0 m n1 n2 : row_mx 0 0 = 0 :> 'M_(m, n1 + n2).
Lemma col_mx0 m1 m2 n : col_mx 0 0 = 0 :> 'M_(m1 + m2, n).
Lemma block_mx0 m1 m2 n1 n2 : block_mx 0 0 0 0 = 0 :> 'M_(m1 + m2, n1 + n2).
Lemma opp_row_mx m n1 n2 (A1 : 'M_(m, n1)) (A2 : 'M_(m, n2)) : - row_mx A1 A2 = row_mx (- A1) (- A2).
Lemma opp_col_mx m1 m2 n (A1 : 'M_(m1, n)) (A2 : 'M_(m2, n)) : - col_mx A1 A2 = col_mx (- A1) (- A2).
Lemma opp_block_mx m1 m2 n1 n2 (Aul : 'M_(m1, n1)) Aur Adl (Adr : 'M_(m2, n2)) : - block_mx Aul Aur Adl Adr = block_mx (- Aul) (- Aur) (- Adl) (- Adr).
Lemma add_row_mx m n1 n2 (A1 : 'M_(m, n1)) (A2 : 'M_(m, n2)) B1 B2 : row_mx A1 A2 + row_mx B1 B2 = row_mx (A1 + B1) (A2 + B2).
Lemma add_col_mx m1 m2 n (A1 : 'M_(m1, n)) (A2 : 'M_(m2, n)) B1 B2 : col_mx A1 A2 + col_mx B1 B2 = col_mx (A1 + B1) (A2 + B2).
Lemma add_block_mx m1 m2 n1 n2 (Aul : 'M_(m1, n1)) Aur Adl (Adr : 'M_(m2, n2)) Bul Bur Bdl Bdr : let A := block_mx Aul Aur Adl Adr in let B := block_mx Bul Bur Bdl Bdr in A + B = block_mx (Aul + Bul) (Aur + Bur) (Adl + Bdl) (Adr + Bdr).