Example (26.1)

 かなり刹那的ですが,とりあえず2変数の場合です.MVT_ALTではなくMVTを参照すれば端点での可微分性は不要なのですが,その分contlを付さねばならず煩雑?なので,この形にしました(transc.mlのMCLAURINの証明にもWe could weaken the hypotheses slightly, but it's not worth itなるコメントが付いています).

needs "Library/transc.ml";;
needs "Examples/sos.ml";;
let ass = ASM_SIMP_TAC[] THEN STRIP_TAC;;
g `!a b.
       a < b /\
       (!x. a <= x /\ x <= b
            ==> (f diffl f' x) x /\ (f' diffl f'' x) x /\ f'' x <= &0)
       ==> (!s t.
                &0 < s /\ &0 < t /\ s + t = &1
                ==> s * f a + t * f b <= f (s * a + t * b))`;;
e(REPEAT STRIP_TAC);;
e(ABBREV_TAC`p=s*a+t*b`);;
e(MP_TAC(REAL_SOS
  `a<b /\ &0<s /\ &0<t /\ s+t = &1 /\ p=s*a+t*b ==> a < p /\ p < b`) THEN ass);;
e(MP_TAC(REAL_SOS
  `a < p /\ p < b ==> (!x. x<=p ==> x<=b ) /\ (!x. p<=x ==> a<=x )`) THEN ass);;
e(MP_TAC(SPECL[`f:real->real`;`f':real->real`;`a:real`;`p:real`]MVT_ALT) THEN ass);;
e(MP_TAC(SPECL[`f:real->real`;`f':real->real`;`p:real`;`b:real`]MVT_ALT) THEN ass);;
e(ASM_REWRITE_TAC[UNDISCH(REAL_SOS
  `s+t= &1 ==> ( s * f a + t * f b <= f p <=> t * (f b - f p) <= s * (f p - f a) )`)]);;
e(MP_TAC(REAL_SOS
  `a<b /\ &0<s /\ &0<t /\ s+t = &1 /\ p=s*a+t*b 
   ==> t * (b - p) = s * (p - a) /\ &0<=t * (b - p)`) THEN ass);;
e(MATCH_MP_TAC(REAL_SOS
  `a*b=c*d /\ &0<=a*b /\ f x<=f y ==> a *b* f x <= c*d *f y`) THEN  ASM_SIMP_TAC[]);;
e(MP_TAC(REAL_SOS`z < p /\ p < z'==> z<z'`) THEN ass);;
e(MP_TAC(REAL_SOS`a<z /\ z'< b ==> !x. (z<=x /\ x<=z' ==> a<=x /\ x<=b)`) THEN ass);;
e(MP_TAC(SPECL[`f':real->real`;`f'':real->real`;`z:real`;`z':real`]MVT_ALT) THEN ass);;
e(ASM_REWRITE_TAC[REAL_ARITH`f x<=f y<=>f x-f y<= &0`]);;
e(MP_TAC(REAL_FIELD
  `a<z /\ z<z'' /\ z''<z' /\ z'< b ==> (a<=z''/\ z''<=b /\ &0<z'-z)`) THEN ass);;
e(ASM_SIMP_TAC[REAL_SOS`&0<x /\ f y<= &0 ==> x*f y<= &0`]);;
let JENSEN_0 = top_thm();;

 多変数版は,上記と帰納法によるか,リプシッツ形の不等式によるかでしょうが,後者の方が見通しは良さそうです.