Research Article

The Formalization of Discrete Fourier Transform in HOL

Algorithm 4

The formalization of cosine frequency shift.
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
    ]
  ]