val DFT_MOD_COS = store_thm(“DFT_MOD_COS”, |
“ (k N m:num)(f:num->real). |
((N):real <> (0) ∧ (0 <= k ∧ k < N)) ∧ |
(DFT f n (k - m) = csum(0,N) (∖(n:num). (f n) exp(i ((-2) pi/N n (k - m))))) ∧ |
(DFT f n (k + m) = csum(0,N) (∖(n:num). (f n) exp(i ((-2) pi/N n (k + m))))) |
⇒ |
((csum(0,N) (∖(n:num). (f n (cos((2) pi/N n (m)),0) exp (i (-2 pi/N n k))))) = (1)/(2) |
(DFT f n (k-m)) + (1)/(2) (DFT f n (k + m)))” |
REPEAT STRIP_TAC THEN ASM_REWRITE_TAC [] THEN REWRITE_TAC[EULER_COS] THEN |
REWRITE_TAC [COMPLEX_ADD_SCALAR_LMUL, COMPLEX_ADD_RDISTRIB, CSUM_ADD] THEN |
Q.SUBGOAL_THEN “ (a b:real) c:complex d:complex. a (b c) d = b (a c d)” ASSUME_TAC |
//the 1st auxiliary subgoal was added! |
THENL |
[REPEAT STRIP_TAC THEN REWRITE_TAC[COMPLEX_LMUL_SCALAR_LMUL] THEN |
ONCE_REWRITE_TAC [COMPLEX_SCALAR_MUL_COMM] THEN |
GEN_REWRITE_TACLAND_CONV [GSYM COMPLEX_SCALAR_MUL_COMM] THEN |
GEN_REWRITE_TAC LAND_CONV [COMPLEX_SCALAR_LMUL] THEN |
ONCE_REWRITE_TAC [COMPLEX_SCALAR_MUL_COMM] THEN |
SRW_TAC [] [GSYM COMPLEX_SCALAR_RMUL] |
//the 1st auxiliary subgoal proved!, |
ASM_REWRITE_TAC [] THEN REWRITE_TAC [CSUM_RMUL] THEN |
REWRITE_TAC [GSYM COMPLEX_ADD_SCALAR_LMUL] THEN |
AP_TERM_TAC THEN REWRITE_TAC [real_div, REAL_NEG_LMUL] THEN |
REWRITE_TAC [GSYM real_div] THEN |
BINOP_TAC |
//The initial goal was decomposed into 2 subgoals |
THENL |
[MATCH_MP_TAC DFT_FREQUENCY_RSHIFT THEN |
METIS_TAC [] |
//The 1st subgoal proved, |
MATCH_MP_TAC DFT_FREQUENCY_LSHIFT THEN |
METIS_TAC [] |
The 2nd subgoal proved |
] |
] |