let neg_odd_lem = prove_by_refinement(
`!a n p c q d.
(a pow n * p x = c x * q x + d x) ==>
ODD n ==>
((-- a) pow n * p x = (-- c x) * q x + (-- d x))`,
(* {{{ Proof *)
[
REPEAT STRIP_TAC;
REWRITE_TAC[REAL_ARITH `-- x * y = -- (x * y)`];
REWRITE_TAC[REAL_ARITH `-- x + -- y = -- (x + y)`];
CLAIM `-- a pow n = -- (a pow n)`;
DISJ_CASES_TAC (ARITH_RULE `a < &0 \/ (a = &0) \/ a > &0`);
MP_TAC (ISPECL[`a:real`;`n:num`]
REAL_POW_NEG);
ASM_REWRITE_TAC[GSYM
NOT_ODD];
POP_ASSUM DISJ_CASES_TAC;
ASM_REWRITE_TAC[
real_pow];
CLAIM `~(n = 0)`;
ASM_MESON_TAC[
ODD];
STRIP_TAC;
CLAIM `?n'. n = SUC n'`;
ASM_MESON_TAC[
num_CASES];
STRIP_TAC;
ASM_REWRITE_TAC[
real_pow];
REAL_ARITH_TAC;
MP_TAC (ISPECL[`a:real`;`n:num`]
REAL_POW_NEG);
ASM_REWRITE_TAC[GSYM
NOT_ODD];
STRIP_TAC;
ASM_REWRITE_TAC[];
REWRITE_TAC[ARITH_RULE `-- x * y = -- (x * y)`];
REWRITE_TAC[ARITH_RULE `(-- x = -- y) <=> (x = y)`];
FIRST_ASSUM MATCH_ACCEPT_TAC;
]);;
(* }}} *)
let mul_odd_lem = prove_by_refinement(
`!a n p c q d.
(a pow n * p x = c x * q x + d x) ==>
ODD n ==>
((a * a pow n) * p x = (a * c x) * q x + (a * d x))`,
(* {{{ Proof *)
[
REPEAT STRIP_TAC;
REWRITE_TAC[REAL_ARITH `(a * x) * y = a * (x * y)`];
REWRITE_TAC[REAL_ARITH `a * x + a * y = a * (x + y)`];
AP_TERM_TAC;
FIRST_ASSUM MATCH_ACCEPT_TAC;
]);;
(* }}} *)