Research Article

Formalization of Function Matrix Theory in HOL

Table 1

Part operations’ properties of function vectors.

Property nameFormalization

FVECTOR_NEG-  !fv. ~fv = −1 ** fv
FVECTOR_ADD_MUL_LK-  !fv1 fv2 k. k ** (fv1 + fv2)  = k ** fv1 + k ** fv2
FVECTOR_ADD_RDISTRIB-  !fv1 fv2 fv3.  (fv1 + fv2) ** fv3 = (∖x.  (fv1 ** fv3) x +  (fv2 ** fv3) x)
FVECTOR_ADD_ASSOC-  !fv1 fv2 fv3. fv1 + fv2 + fv3 = fv1 +  (fv2 + fv3)
FVECTOR_SUB_LZERO-  !fv. fvector_0 fv = ~fv
FVECTOR_DOT_FBASIS-  !fv k x. k < dimindex (:'n)  ==>  (fv ** fvector_basis k = fv ' k)
FVECTOR_DOT_FCP-  ($FCP fv1 ** fv2 =  (∖x. sum (0,dimindex (:'n))  (∖i. fv1 i x * fv2 ' i x))) 
  (fv2 ** $FCP fv1 =  (∖x. sum (0,dimindex (:'n))  (∖i. fv2 ' i x * fv1 i x)))
FVECTOR_ADD_INDEX-  !fv1 fv2 i. i < dimindex (:'n)  ==>  ((fv1 + fv2)  ' i =  (∖x. fv1 ' i x + fv2 ' i x))
FVECTOR_SUB_INDEX-  !fv1 fv2 i. i < dimindex (:'n)  ==>  ((fv1 fv2)  ' i =  (∖x. fv1 ' i x fv2 ' i x))
FVECTOR_NEG_NEG-  !fv. ~~fv  = fv
FVECTOR_ADD_MUL_LKX-  !fv1 fv2 kx. kx ** (fv1 + fv2)  = kx ** fv1 + kx ** fv2
FVECTOR_ADD_MUL_RKX-  !fv1 fv2 kx.  (fv1 + fv2) ** kx  =  fv1 ** kx + fv2 ** kx
FVECTOR_MUL_LRADD-  !fv k l.  (k + l) ** fv = k ** fv + l ** fv
FVECTOR_MUL_RRADD-  !fv k l. fv ** (k + l)  = fv ** k + fv ** l
FVECTOR_MUL_LFADD-  !fv f g.  (∖x. f x + g x) ** fv =  f ** fv +  g ** fv
FVECTOR_ADD_RDISTRIB-  !fv1 fv2 fv3.  (fv1 + fv2) ** fv3 =   (∖x.  (fv1 ** fv3) x +   (fv2 ** fv3) x)
FVECTOR_SUB_LDISTRIB-  !fv1 fv2 fv3.  fv1 ** (fv2 fv3)  =(∖x.(fv1 ** fv2) x   (fv1 ** fv3) x)
FVECTOR_SUB_RDISTRIB-  !fv1 fv2 fv3.  (fv1 fv2) ** fv3  =(∖x.(fv1 ** fv3)  x  −  (fv2 ** fv3) x)
FVECTOR_DOT_LMUL_K-  !fv1 fv2 k.  (∖x. k * (fv1 ** fv2) x)  =  (k ** fv1) ** fv2
FVECTOR_DOT_LMUL_KX-  !fv1 fv2 k.  (∖x. k x * (fv1 ** fv2) x)  =  (k ** fv1) ** fv2
FVECTOR_MUL_LK_ASSOC-  !fv k l. k ** l ** fv =  (k * l) ** fv
FVECTOR_MUL_LKX_ASSOC-  !fv f g. f ** g ** fv =  (∖x. f x * g x) ** fv
FVECTOR_DOT_COMM-  !fv1 fv2. fv1 ** fv2 = fv2 ** fv1
FVECTOR_EQ-  !fv1 fv2.  (fv1 = fv2)  <=>  (fv1 fv2 = fvector_0)
FVECTOR_EQ2-  !fv1 fv2.  (fv1 = fv2)  <=>  !i. i < dimindex (:'n)  ==>  (fv1 ' i = fv2 ' i)
FVECTOR_ADD_LID-  !fv. fvector_0 + fv = fv
FVECTOR_ADD_RID-  !fv. fv + fvector_0 = fv
FVECTOR_ADD_NEG-  !fv. fv + ~fv = fvector_0
FVECTOR_ADD_NEG2-  !fv1 fv2. fv1 + ~fv2 = fv1 fv2
FVECTOR_SUB_ADD-  !fv1 fv2. fv1 fv2 + fv2 = fv1
FVECTOR_MUL_L1-  !fv. 1 ** fv = fv
FVECTOR_LNEG_UNIQ-  !fv1 fv2.  (fv1 + fv2 = fvector_0)  <=>  (fv1 = ~fv2)
FVECTOR_RNEG_UNIQ-  !fv1 fv2.  (fv1 + fv2 = fvector_0)  <=>  (fv2 = ~fv1)
FVECTOR_MULK_COMM-  !fv k. fv ** k = k ** fv
FVECTOR_MULKX_COMM-  !fv f. fv ** f = f ** fv
FVECTOR_EXIST_NEG-  !fv.  ?fv'. fv + fv'  = fvector_0
FVECTOR_FVECTOR_0_DOT-  !fv. fvector_0 ** fv =  (∖x. 0)
COMPUTE_FVEC_MUL_MATRIX-  !fv A x. compute_fvector fv x ** A = compute_fvector (fv ** A) x
COMPUTE_VEC_MUL_FVEC-  !fv v x. v ** compute_fvector fv x =  (v ** fv) x