Example (21)

今回は,2重根号をexpを用いずに,4変数の相加相乗平均の大小関係を証明してみます.

(* amgm4 *)

(* まず,2変数の場合を証明します.*)

g`!a b. &0 <= a /\ &0 <= b ==> (a + b) / &2 >= sqrt(a * b)`;;
e(REPEAT GEN_TAC);;
e(DISCH_THEN(fun t -> MP_TAC (CONJ (MATCH_MP REAL_LE_MUL t) t)));;
e(SQRT_SOSFIELD_TAC[]);;
let amgm2 = top_thm();;

(* 次に非負実数の2重の平方根が4乗根となることを証明します.*)

g`!x. &0 <= x ==> sqrt( sqrt x ) = root 4 x`;;
e(REPEAT STRIP_TAC);;
e(FIRST_ASSUM(ASSUME_TAC o (MATCH_MP SQRT_POS_LE)));;
e(FIRST_X_ASSUM(ASSUME_TAC o (MATCH_MP SQRT_POW_2)));;
e(FIRST_ASSUM(ASSUME_TAC o (MATCH_MP SQRT_POW_2)));;
e(FIRST_ASSUM(ASSUME_TAC o (MATCH_MP SQRT_POS_LE)));;
e(FIRST_ASSUM(ASSUME_TAC o (MATCH_MP SQRT_POS_LE)));;
let lemma = CONV_RULE (REWRITE_CONV [ARITH_RULE`SUC 3 = 4`]) (SPECL[`3`;`x:real`;`sqrt (sqrt x)`]ROOT_POS_UNIQ);;
e(MP_TAC lemma);;
e(EVERY_ASSUM MP_TAC);;
e(CONV_TAC REAL_FIELD);;
let root4 = top_thm();;

(* 以下,本体です.*)

g`!a b c d. &0 <= a /\ &0 <= b /\ &0 <= c /\ &0 <= d ==> (a + b + c + d) / &4 >= root 4 (a * b * c * d)`;;

e(REPEAT STRIP_TAC);;
e(SUBGOAL_THEN `&0 <= a * b /\ &0 <= c * d` ASSUME_TAC THENL [ASM_SIMP_TAC[REAL_LE_MUL]; ALL_TAC]);;

(*
e(REPEAT GEN_TAC);;
e(DISCH_THEN (fun t -> ASSUME_TAC (CONJ t (MESON[t;REAL_LE_MUL]`&0 <= a * b /\ &0 <= c * d`))));;

e(REPEAT STRIP_TAC);;
e(MAP_EVERY MP_TAC[
SPECL[`a:real`;`b:real`]REAL_LE_MUL;
SPECL[`c:real`;`d:real`]REAL_LE_MUL;
] THEN ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC);;
*)

e(MAP_EVERY MP_TAC[
SPECL[`a * b:real`;`c * d:real`]REAL_LE_MUL;
SPECL[`a * b:real`;`c * d:real`]SQRT_MUL;
SPECL[`a * b:real`]SQRT_POS_LE;
SPECL[`c * d:real`]SQRT_POS_LE;
] THEN ASM_SIMP_TAC[REAL_MUL_AC] THEN REPEAT STRIP_TAC);;

e(MAP_EVERY MP_TAC[
SPECL[`a:real`;`b:real`]amgm2;
SPECL[`c:real`;`d:real`]amgm2;
SPECL[`sqrt(a * b)`;`sqrt(c * d)`]amgm2;
] THEN ASM_SIMP_TAC[root4]);;
e(REAL_ARITH_TAC);;

let amgm4 = top_thm();;