Example (21.2)

 4変数から3変数の場合を導きましょう.まず,lemmaを用意します.

g`!x. &0 <= x ==> root 3 x = root 4 ( root 3 x * x )`;;
e(SIMP_TAC[REAL_LE_LT] THEN REPEAT STRIP_TAC);;
e(ASM_SIMP_TAC[ARITH_RULE`3 = SUC 2 /\ 4 = SUC 3`; REAL_EXP_POS_LT; REAL_LT_MUL; ROOT_LN; REAL_EXP_INJ]);;
e(NUM_REDUCE_TAC THEN ASM_SIMP_TAC[REAL_ARITH`x / &3 = y / &4 <=> &4 * x = &3 * y`; REAL_EXP_POS_LT; REAL_LT_MUL; GSYM LN_POW]);;
e(ASM_SIMP_TAC[POW_MUL; ARITH_RULE`3 = SUC 2`; ROOT_LT_LEMMA;]);;
e(NUM_REDUCE_TAC THEN AP_TERM_TAC THEN CONV_TAC REAL_RING);;
e(FIRST_ASSUM (MP_TAC o GSYM) THEN SIMP_TAC[ARITH_RULE`4 = SUC 3 /\ 3 = SUC 2`; ROOT_0; REAL_MUL_RZERO]);;
let root3 = top_thm();;

 本体です.

# g`!a b c. &0 <= a /\ &0 <= b /\ &0 <= c ==> (a + b + c) / &3 >= root 3 (a * b * c)`;;
val it : goalstack = 1 subgoal (1 total)

`!a b c.
     &0 <= a /\ &0 <= b /\ &0 <= c ==> (a + b + c) / &3 >= root 3 (a * b * c)`

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

  0 [`&0 <= a`]
  1 [`&0 <= b`]
  2 [`&0 <= c`]

`(a + b + c) / &3 >= root 3 (a * b * c)`

# e(SUBGOAL_THEN `&0 <= a * b * c` ASSUME_TAC THENL [ASM_SIMP_TAC[REAL_LE_MUL]; ALL_TAC]);;
val it : goalstack = 1 subgoal (1 total)

  0 [`&0 <= a`]
  1 [`&0 <= b`]
  2 [`&0 <= c`]
  3 [`&0 <= a * b * c`]

`(a + b + c) / &3 >= root 3 (a * b * c)`

# (*
  e(REPEAT GEN_TAC);;
  e(DISCH_THEN(fun t -> ASSUME_TAC(CONJ t (MESON[t;REAL_LE_MUL]`&0 <= a * b * c`))));;
  *)
  e(MP_TAC (SPECL[`root 3 (a * b * c)`;`a:real`;`b:real`;`c:real`]amgm4) THEN
    ASM_SIMP_TAC[ARITH_RULE`3 = SUC 2`; ROOT_POS_POSITIVE; GSYM root3]);;
val it : goalstack = 1 subgoal (1 total)

  0 [`&0 <= a`]
  1 [`&0 <= b`]
  2 [`&0 <= c`]
  3 [`&0 <= a * b * c`]

`(root (SUC 2) (a * b * c) + a + b + c) / &4 >= root (SUC 2) (a * b * c)
 ==> (a + b + c) / &(SUC 2) >= root (SUC 2) (a * b * c)`

# e(NUM_REDUCE_TAC THEN REAL_ARITH_TAC);;
val it : goalstack = No subgoals

# let amgm3 = top_thm();;
val amgm3 : thm =
  |- !a b c.
         &0 <= a /\ &0 <= b /\ &0 <= c
         ==> (a + b + c) / &3 >= root 3 (a * b * c)

 なお,2変数の場合をSQRT_SOSを用いずに証明するなら,例えば

# (* amgm2 alt *)
  g`!a b. &0 <= a /\ &0 <= b ==> (a + b) / &2 >= sqrt(a * b)`;;
val it : goalstack = 1 subgoal (1 total)

`!a b. &0 <= a /\ &0 <= b ==> (a + b) / &2 >= sqrt (a * b)`

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

  0 [`&0 <= a`]
  1 [`&0 <= b`]

`(a + b) / &2 >= sqrt (a * b)`

# e(MP_TAC (SPEC`sqrt a - sqrt b`REAL_LE_POW_2));;
val it : goalstack = 1 subgoal (1 total)

  0 [`&0 <= a`]
  1 [`&0 <= b`]

`&0 <= (sqrt a - sqrt b) pow 2 ==> (a + b) / &2 >= sqrt (a * b)`

# e(ASM_SIMP_TAC[REAL_POLY_CONV`(x - y) pow 2`; SQRT_POW_2; SQRT_MUL]);;
val it : goalstack = 1 subgoal (1 total)

  0 [`&0 <= a`]
  1 [`&0 <= b`]

`&0 <= a + -- &2 * sqrt a * sqrt b + b ==> (a + b) / &2 >= sqrt a * sqrt b`

# e(REAL_ARITH_TAC);;
val it : goalstack = No subgoals

# let amgm2 = top_thm();;
val amgm2 : thm =
  |- !a b. &0 <= a /\ &0 <= b ==> (a + b) / &2 >= sqrt (a * b)

となります.