Example(26.3)

 先のJENSEN_LT_INFを用いて,n変数の相加平均と相乗平均の不等式を証明します.

let lemma0 = prove
 (`!n s x. (!i. i <= n ==> &0 <= s i) /\ sum (0..n) s = &1 /\
           (!i. i <= n ==> &0 < x i)
    ==> sum (0..n) (\i. s i * ln (x i)) <= ln (sum (0..n) (\i. s i * x i))`,
  REPEAT STRIP_TAC THEN
  MATCH_MP_TAC JENSEN_LT_INF THEN
  EXISTS_TAC `&0` THEN EXISTS_TAC `\x. inv x * &1` THEN 
  EXISTS_TAC `\x. --(&1 / x pow 2) * &1 + &0 * inv x` THEN
  ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC THENL
   [ASM_SIMP_TAC[DIFF_CONV`ln`];
    ASM_SIMP_TAC[REAL_POS_NZ; DIFF_CONV`\x. inv x * &1`];
    ASM_SIMP_TAC[GSYM REAL_INV_1OVER; REAL_MUL_RID; REAL_MUL_LZERO; REAL_ADD_RID; 
                 REAL_LE_POW_2; REAL_LE_INV; REAL_NEG_LE0]]);;

let lemma1 = prove
 (`!n x. (!i. i <= n ==> &0 < x i)
     ==> &0 < (sum (0..n) x) / &(SUC n)`,
  REPEAT STRIP_TAC THEN
  SIMP_TAC[NOT_SUC; REAL_LT_FRACTION_0] THEN
  SUBST1_TAC(MESON[SUM_EQ_0_NUMSEG]`&0 = sum (0..n) (\k. &0)`) THEN
  MATCH_MP_TAC SUM_LT_ALL THEN
  ASM_SIMP_TAC[FINITE_NUMSEG; NUMSEG_EMPTY; LT; IN_NUMSEG_0]);;

let lemma2 = prove
 (`!n x. (!i. i <= n ==> &0 < x i)
     ==> &0 < product (0..n) x`,
  REPEAT STRIP_TAC THEN
  ASM_MESON_TAC[LE_0; PRODUCT_POS_LT_NUMSEG]);;

let lemma3 = prove
 (`!n x. (!i. i <= n ==> &0 < x i)
     ==> ln (product (0..n) x) = sum (0..n) (\i. ln (x i))`,
  SIMP_TAC[SWAP_FORALL_THM] THEN GEN_TAC THEN
  INDUCT_TAC THENL
   [SIMP_TAC[PRODUCT_SING_NUMSEG; SUM_SING_NUMSEG];
    DISCH_THEN(ASSUME_TAC o (MATCH_MP (MESON[LESS_EQ_SUC_REFL; LE_TRANS; LE_REFL]
     `(!i. i <= SUC n ==> &0 < x i) ==> (!i. i <= n ==> &0 < x i) /\ &0 < x (SUC n)`))) THEN
    ASM_SIMP_TAC[LE_0; PRODUCT_CLAUSES_NUMSEG; SUM_CLAUSES_NUMSEG; LN_MUL; lemma2]]);;

let amgm = prove
 (`!n x.
       (!i. i <= n ==> &0 < x i)
       ==> root (SUC n) (product (0..n) x) <= sum (0..n) x / &(SUC n)`,
  REPEAT STRIP_TAC THEN
  MAP_EVERY (ASSUME_TAC o UNDISCH o SPEC_ALL) [lemma1; lemma2] THEN
  ONCE_ASM_REWRITE_TAC[UNDISCH(SPEC `(sum (0..n) x) / &(SUC n)` (GSYM EXP_LN))] THEN
  ASM_SIMP_TAC[ROOT_LN; REAL_EXP_MONO_LE; lemma3; real_div; GSYM SUM_RMUL] THEN
  ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
  MATCH_MP_TAC lemma0 THEN 
  ASM_SIMP_TAC[REAL_POS; REAL_LE_INV; SUM_CONST_NUMSEG; SUB; GSYM ADD1;
               REAL_INJ; NOT_SUC; REAL_MUL_RINV]);;