Research Article

Formalization of Function Matrix Theory in HOL

Table 2

Properties of operations of function matrices.

Property nameFormalization

COMPUTE_FMATRIX_MUL_EQ∣-  !fm1 fm2  x. compute_fmatrix fm1 x **  compute_fmatrix fm2 x = compute_fmatrix  (fm1 ** fm2) x
FMATRIX_ADD_INDEX∣-  !fm1 fm2 i j.   i < dimindex (:'m) ∧ j <  dimindex (:'n)  ==>  
((fm1 + fm2)  ' i ' j =  (∖x. fm1 ' i ' j x +  fm2 ' i ' j x))
FMATRIX_SUB_INDEX∣-  !fm1 fm2 i j. i < dimindex (:'m) ∧ j <  dimindex (:'n)  ==>  
((fm1 fm2)  ' i ' j =  (∖x. fm1 ' i ' j x   fm2 ' i ' j x))
FMATRIX_ROW_ADD∣-  !fm1 fm2 i. i < dimindex (:'m)  ==>  
  (fun_row fm1 i + fun_row fm2 i = fun_row (fm1 + fm2)  i)
FMATRIX_COLUMN_ADD∣-  !fm1 fm2 i. i < dimindex (:'n)  ==>  
  (fun_column fm1 i + fun_column fm2 i =  fun_column (fm1 + fm2)  
i)
FMATRIX_ROW_SUB∣-  !fm1 fm2 i. i < dimindex (:'m)  ==>  
(fun_row fm1 i fun_row fm2 i = fun_row  (fm1 fm2)  i)
FMATRIX_COLUMN_SUB∣-  !fm1 fm2 i. i < dimindex (:'n)  ==>  
(fun_column fm1 i fun_column fm2 i =  fun_column (fm1 fm2) i)
FMATRIX_NEG ∣-  !fm. ~fm =  1 ** fm
FMATRIX_NEG_NEG∣-  !fm. ~~fm = fm
FMATRIX_MUL_K_EQ∣-  !fm k. fm ** k = k ** fm
FMATRIX_MUL_KX_EQ∣-  !fm f. fm ** f = f ** fm
FMATRIX_ADD_COMM∣-  !fm1 fm1. fm1 + fm2 = fm2 + fm1
FMATRIX_ADD_ASSOC∣-  !fm1 fm2 fm3. fm1 +  (fm2 + fm3)  = fm1 + fm2 + fm3
FMATRIX_ADD_MUL_LK∣-  !fm1 fm2 k. k ** (fm1 + fm2)  = k ** fm1 + k ** fm2
FMATRIX_ADD_MUL_RK∣-  !fm1 fm2 k.  (fm1 + fm2) ** k = fm1 ** k + fm2 ** k
FMATRIX_ADD_MUL_LKX∣-  !fm1 fm2 kx. kx **  (fm1 + fm2)  = kx ** fm1 + kx ** fm2
FMATRIX_ADD_MUL_RKX∣-  !fm1 fm2 kx.  (fm1 + fm2) ** kx  = fm1 ** kx + fm2 ** kx
FMATRIX_ADD_MUL_LFVEC∣-  !fm1 fm2 fv. fv ** (fm1 + fm2)  = fv ** fm1 +  fv ** fm2
FMATRIX_ADD_MUL_RFVEC∣-  !fm1 fm2 fv.  (fm1 + fm2) ** fv = fm1 ** fv +  fm2 ** fv
FMATRIX_SUB_MUL_LFVEC∣-  !fm1 fm2 fv. fv ** (fm1 fm2)  = fv ** fm1 fv ** fm2
FMATRIX_SUB_MUL_RFVEC∣-  !fm1 fm2 fv.  (fm1 fm2) ** fv = fm1 ** fv fm2 ** fv
FMATRIX_MUL_LRADD∣-  !fm k l.  (k + l) ** fm = k ** fm + l ** fm
FMATRIX_MUL_RRADD∣-  !fm k l. fm ** (k + l)  = fm ** k + fm ** l
FMATRIX_MUL_LFADD∣-  !fm f g.  (∖x. f x + g x) ** fm = f ** fm + g ** fm
FMATRIX_MUL_RFADD∣-  !fm f g. fm ** (∖x. f x + g x)  = fm ** f + fm ** g
FMATRIX_MUL_RFVADD∣-  !fm fv1 fv2. fm ** (fv1 + fv2)  = fm ** fv1 + fm ** fv2
FMATRIX_MUL_LFVADD∣-  !fm fv1 fv2.  (fv1 + fv2) ** fm  = fv1 ** fm +  fv2 ** fm
FMATRIX_ADD_LDISTRIB∣-  !fm1 fm2 fm3. fm1 **  (fm2 + fm3)  = fm1 ** fm2 + fm1 ** fm3
FMATRIX_ADD_RDISTRIB∣-  !fm1 fm2 fm3.  (fm1 + fm2) ** fm3  = fm1 ** fm3 + fm2 ** fm3
FMATRIX_MUL_LMUL_K∣-  !fm1 fm2 k. k ** fm1 ** fm2 =  (k ** fm1) ** fm2
FMATRIX_MUL_RMUL_K∣-  !fm1 fm2 k. k ** fm1 ** fm2 = fm1 ** k ** fm2
FMATRIX_MUL_NEG∣-  !fm1 fm2. ~fm1 ** fm2 = fm1 ** ~fm2
FMATRIX_NEG_PROD∣-  !fm1 fm2. ~fm1 ** fm2 = ~(fm1 ** fm2)
FMATRIX_MUL_LMUL_KX∣-  !fm1 fm2 kx. kx ** fm1 ** fm2 =  (kx ** fm1) ** fm2
FMATRIX_MUL_LK_ASSOC∣-  !fm k l. k ** l ** fm =  (k * l) ** fm
FMATRIX_MUL_LKX_ASSOC∣-  !fm f g. f ** g ** fm =  (∖x. f x * g x) ** fm
FMATRIX_ADD_LID∣-  !fm. fmatrix_0 + fm = fm
FMATRIX_ADD_RID∣-  !fm. fm + fmatrix_0 = fm
FMATRIX_ADD_NEG∣-  !fm. fm + ~fm = fmatrix_0
FMATRIX_ADD_NEG2∣-  !fm1  fm2. fm1 + ~fm2 = fm1fm2
FMATRIX_SUB_ADD∣-  !fm1  fm2. fm1fm2 + fm2 = fm1
FMATRIX_SUB_LZERO∣-  !fm. fmatrix_0fm = ~fm
FMATRIX_MUL_L1∣-  !fm. 1 ** fm = fm
FMATRIX_MULK_COMM∣-  !fm k. fm ** k = k ** fm
FMATRIX_MULKX_COMM∣-  !fm kx. fm ** kx = kx ** fm
FVECTOR_PROD_FMATRIX∣-  !fm fv. fv ** fm = transp_fmatrix fm ** fv
FMATRIX_FVECTOR_0_PROD∣-  !fm. fvector_0 ** fm = fvector_0
FMATRIX_ROW_PROD∣-  !fm. transp_fmatrix fm ** fm =  
  FCP i j. fun_column fm i ** fun_column fm j
TRANSP_FMATRIX_COLUMN∣-  !fm i.  i < dimindex (:'m)  ==>  
  (fun_column (transp_fmatrix fm) i = fun_row fm i)
TRANSP_FMATRIX_FVECTOR_PROD∣-  !fm fv. fm ** fv = fv ** transp_fmatrix fm
TRANSP_FMATRIX_PROD∣-  !fm. transp_fmatrix (transp_fmatrix fm ** fm)  =  
  transp_fmatrix fm ** fm
TRANSP_FMATRIX_ROW∣-  !fm i. i < dimindex (:'n)  ==>  
  (fun_row (transp_fmatrix fm) i = fun_column fm i)