val DIFF_QUADRATIC = store_thm(“DIFF_QUADRATIC”, |
“!(fv:'n fun_vector) (v:'n vector) (A:('n,'n) matrix) (t:real). |
(fv fvector_diffl v)(t) ∧ (transp A = A) ==> |
((fv ** A ** fv) diffl |
(v ** A ** (compute_fvector fv t) + (v ** A) ** (compute_fvector fv t)))(t)”, |
REPEAT GEN_TAC THEN |
RW_TAC std_ss [MATRIX_VECTOR] THEN |
‘!(fv:'n fun_vector) (A:('n,'n) matrix). |
(transp A = A) ==> (fv ** A ** fv = (fv ** A) ** fv)’ |
by REWRITE_TAC THENL |
[SRW_TAC fcpLib.FCP_ss fvector_mul_matrix_def THEN |
SRW_TAC fcpLib.FCP_ss fvector_dot_def THEN |
ABS_TAC THEN |
MATCH_MP_TAC SUM_EQ THEN |
SRW_TAC THEN |
SRW_TAC fcpLib.FCP_ss fvector_mul_vec_def THEN |
SRW_TAC fcpLib.FCP_ss matrix_mul_fvec_def THEN |
SRW_TAC fcpLib.FCP_ss vec_mul_fvector_def THEN |
GEN_REWR_TAC RAND_CONV REAL_MUL_COMM THEN |
REWRITE_TAC GSYM SUM_CMUL THEN |
MATCH_MP_TAC SUM_EQ THEN |
SRW_TAC THEN |
DISJ2_TAC THEN |
SRW_TAC fcpLib.FCP_ss row_def, column_def THEN |
NTAC 3(POP_ASSUM MP_TAC) THEN |
SRW_TAC [fcpLib.FCP_ss] [transp_def] THEN |
PROVE_TAC [REAL_MUL_COMM],ALL_TAC] THEN |
‘!(fv:'n fun_vector) (A:('n,'n) matrix) t:real. |
(compute_fvector fv t) ** A = compute_fvector (fv ** A) t’ |
by REWRITE_TAC [COMPUTE_FVEC_MUL_MATRIX] THEN |
‘!(fv:'n fun_vector) (v:'n vector) t:real. |
v ** (compute_fvector fv t) = (v ** fv) t’ |
by REWRITE_TAC COMPUTE_VEC_MUL_FVEC THEN |
‘!(fv:'n fun_vector) (v:'n vector) (A:('n,'n) matrix) (t:real). |
(fv fvector_diffl v)(t) ==> ((fv ** A) fvector_diffl (v ** A))(t)’ |
by REWRITE_TAC [DIFF_FVEC_MUL_MATRIX] THEN |
PROVE_TAC [DIFF_FVECTOR_MUL]); |