19 Real analysis (2)

 では,証明です.

# g `!n:num x:real. cheb n (cos(x)) = cos*1 /\
(!x. cheb 1 (cos x) = cos (&1 * x)) /\
(!n. (!x. cheb n (cos x) = cos (&n * x)) /\
(!x. cheb (n + 1) (cos x) = cos (&(n + 1) * x))
==> (!x. cheb (n + 2) (cos x) = cos (&(n + 2) * x)))`

ここで定義と簡約の為の定理

# [cheb; REAL_MUL_LZERO; REAL_MUL_LID; COS_0];;
val it : thm list =
[|- (!x. cheb 0 x = &1) /\
(!x. cheb 1 x = x) /\
(!n x. cheb (n + 2) x = &2 * x * cheb (n + 1) x - cheb n x);
|- !x. &0 * x = &0; |- !x. &1 * x = x; |- cos (&0) = &1]

を参照します.

# e(REWRITE_TAC[cheb; REAL_MUL_LZERO; REAL_MUL_LID; COS_0]);;
val it : goalstack = 1 subgoal (1 total)

`!n. (!x. cheb n (cos x) = cos (&n * x)) /\
(!x. cheb (n + 1) (cos x) = cos (&(n + 1) * x))
==> (!x. &2 * cos x * cheb (n + 1) (cos x) - cheb n (cos x) =
cos (&(n + 2) * x))`

# e(REPEAT STRIP_TAC);;
val it : goalstack = 1 subgoal (1 total)

0 [`!x. cheb n (cos x) = cos (&n * x)`]
1 [`!x. cheb (n + 1) (cos x) = cos (&(n + 1) * x)`]

`&2 * cos x * cheb (n + 1) (cos x) - cheb n (cos x) = cos (&(n + 2) * x)`

仮定を用いて結論を余弦についての等式に書き換えましょう.

# e(ASM_REWRITE_TAC[]);;
val it : goalstack = 1 subgoal (1 total)

0 [`!x. cheb n (cos x) = cos (&n * x)`]
1 [`!x. cheb (n + 1) (cos x) = cos (&(n + 1) * x)`]

`&2 * cos x * cos (&(n + 1) * x) - cos (&n * x) = cos (&(n + 2) * x)`

そしてカッコ内を:realの元の和に展開します.

# [GSYM REAL_OF_NUM_ADD; REAL_MUL_LID; REAL_ADD_RDISTRIB];;
val it : thm list =
[|- !m n. &(m + n) = &m + &n; |- !x. &1 * x = x;
|- !x y z. (x + y) * z = x * z + y * z]
# e(REWRITE_TAC[GSYM REAL_OF_NUM_ADD; REAL_MUL_LID; REAL_ADD_RDISTRIB]);;
val it : goalstack = 1 subgoal (1 total)

0 [`!x. cheb n (cos x) = cos (&n * x)`]
1 [`!x. cheb (n + 1) (cos x) = cos (&(n + 1) * x)`]

`&2 * cos x * cos (&n * x + x) - cos (&n * x) = cos (&n * x + &2 * x)`

普通ならcos (&n * x)を右辺に移項して和積ですが,ここでは加法定理と2倍角

# [COS_ADD; COS_DOUBLE; SIN_DOUBLE];;
val it : thm list =
[|- !x y. cos (x + y) = cos x * cos y - sin x * sin y;
|- !x. cos (&2 * x) = cos x pow 2 - sin x pow 2;
|- !x. sin (&2 * x) = &2 * sin x * cos x]

を用いて素朴に辺々を展開比較します.

# e(REWRITE_TAC[COS_ADD; COS_DOUBLE; SIN_DOUBLE]);;
val it : goalstack = 1 subgoal (1 total)

0 [`!x. cheb n (cos x) = cos (&n * x)`]
1 [`!x. cheb (n + 1) (cos x) = cos (&(n + 1) * x)`]

`&2 * cos x * (cos (&n * x) * cos x - sin (&n * x) * sin x) - cos (&n * x) =
cos (&n * x) * (cos x pow 2 - sin x pow 2) -
sin (&n * x) * &2 * sin x * cos x`

後は2乗の和=1

# SPECL [`x:real`] SIN_CIRCLE;;
val it : thm = |- sin x pow 2 + cos x pow 2 = &1

を前件に付して,REAL_RINGに処理させます.

# e(MP_TAC (SPECL [`x:real`] SIN_CIRCLE));;
val it : goalstack = 1 subgoal (1 total)

0 [`!x. cheb n (cos x) = cos (&n * x)`]
1 [`!x. cheb (n + 1) (cos x) = cos (&(n + 1) * x)`]

`sin x pow 2 + cos x pow 2 = &1
==> &2 * cos x * (cos (&n * x) * cos x - sin (&n * x) * sin x) -
cos (&n * x) =
cos (&n * x) * (cos x pow 2 - sin x pow 2) -
sin (&n * x) * &2 * sin x * cos x`

# e ( CONV_TAC REAL_RING );;
2 basis elements and 0 critical pairs
val it : goalstack = No subgoals

REAL_RING,REAL_FIELDは優秀なのでこれでOKですが,より明示的に

val it : goalstack = 1 subgoal (1 total)

0 [`!x. cheb n (cos x) = cos (&n * x)`]
1 [`!x. cheb (n + 1) (cos x) = cos (&(n + 1) * x)`]

`&2 * cos x * (cos (&n * x) * cos x - sin (&n * x) * sin x) - cos (&n * x) =
cos (&n * x) * (cos x pow 2 - sin x pow 2) -
sin (&n * x) * &2 * sin x * cos x`

# let lemma = CONV_RULE (REWRITE_CONV[REAL_RING`a+b= &1<=>a= &1-b`]) SIN_CIRCLE;
;
1 basis elements and 0 critical pairs
2 basis elements and 0 critical pairs
val lemma : thm = |- !x. sin x pow 2 = &1 - cos x pow 2
# e (REWRITE_TAC[lemma]);;
val it : goalstack = 1 subgoal (1 total)

0 [`!x. cheb n (cos x) = cos (&n * x)`]
1 [`!x. cheb (n + 1) (cos x) = cos (&(n + 1) * x)`]

`&2 * cos x * (cos (&n * x) * cos x - sin (&n * x) * sin x) - cos (&n * x) =
cos (&n * x) * (cos x pow 2 - (&1 - cos x pow 2)) -
sin (&n * x) * &2 * sin x * cos x`

# e ( CONV_TAC REAL_RING );;
1 basis elements and 0 critical pairs
val it : goalstack = No subgoals

としても良いでしょう.

まとめると

# let CHEB_COS = prove
(`!n x. cheb n (cos x) = cos(&n * x)`,
MATCH_MP_TAC num2_INDUCTION THEN
REWRITE_TAC[cheb; REAL_MUL_LZERO; REAL_MUL_LID; COS_0] THEN
REPEAT STRIP_TAC THEN
ASM_REWRITE_TAC[GSYM REAL_OF_NUM_ADD; REAL_MUL_LID; REAL_ADD_RDISTRIB] THEN
REWRITE_TAC[COS_ADD; COS_DOUBLE; SIN_DOUBLE] THEN
MP_TAC(SPEC `x:real` SIN_CIRCLE) THEN CONV_TAC REAL_RING);;
2 basis elements and 0 critical pairs
val ( CHEB_COS ) : thm = |- !n x. cheb n (cos x) = cos (&n * x)

となります.

*1:&n)*x) ` ;; val it : goalstack = 1 subgoal (1 total) `!n x. cheb n (cos x) = cos (&n * x)` # e (MATCH_MP_TAC num2_INDUCTION) ;; val it : goalstack = 1 subgoal (1 total) `(!x. cheb 0 (cos x) = cos (&0 * x