Example (25.1)

 落穂ひろい気味ですが,先のthm15から&0 < integral (a,b) gという仮定を外して,積分の第一平均値定理を得るための補題の証明です.

let INTEGRAL_CONST_LE = prove
 (`!c g a b.
    a <= b /\ integrable (a,b) g /\ (!x. a <= x /\ x <= b ==> c <= g x)
    ==> c * (b - a) <= integral (a,b) g`,
  GEN_TAC THEN MP_TAC(SPEC `\x:real. c:real` INTEGRAL_LE) THEN
  SIMP_TAC[INTEGRABLE_CONST; INTEGRAL_CONST]);;

let INTEGRAL_COMBINE_2 = MESON [DEFINT_COMBINE; INTEGRABLE_COMBINE; INTEGRABLE_DEFINT; DEFINT_INTEGRAL; REAL_LE_TRANS]
`!f a b c. a <= c /\ c <= b /\ integrable (a,c) f /\ integrable (c,b) f
    ==> integral (a,b) f = integral (a,c) f + integral (c,b) f`;;

let INTEGRAL_COMBINE = MESON [INTEGRABLE_SUBINTERVAL_LEFT; INTEGRABLE_SUBINTERVAL_RIGHT; INTEGRAL_COMBINE_2]
`!f a b c. a <= c /\ c <= b /\ integrable (a,b) f
    ==> integral (a,b) f = integral (a,c) f + integral (c,b) f`;;

let INTEGRAL_COMBINE_3 = prove
 (`!f a b c d. a <= b /\ b <= c /\ c <= d /\ integrable (a,d) f
    ==> integral (a,d) f = integral (a,b) f + integral (b,c) f + integral (c,d) f`,
  REPEAT STRIP_TAC THEN 
  SUBGOAL_TAC "" `integral (b,c) f + integral (c,d) f = integral (b,d)f`
   [ASM_MESON_TAC[INTEGRABLE_SUBINTERVAL_RIGHT; INTEGRAL_COMBINE; REAL_LE_TRANS]] THEN
  ASM_MESON_TAC[INTEGRAL_COMBINE; REAL_LE_TRANS]);;

g `!a b f. a < b /\
   (!x. a <= x /\ x <= b ==> &0 <= f x) /\
   (!x. a <= x /\ x <= b ==> f contl x) /\
   integral (a,b) f = &0
   ==> (!x. a <= x /\ x <= b ==> f x = &0)`;;
e(REPEAT GEN_TAC THEN CONV_TAC CONTRAPOS_CONV THEN SIMP_TAC[NOT_FORALL_THM; NOT_IMP] THEN REPEAT STRIP_TAC THEN ABBREV_TAC `m = (f:real->real) x`);;
e(SUBGOAL_TAC""`&0 < m / &2`[ASM_MESON_TAC[REAL_ARITH`~(m = &0) /\ &0 <= m ==> &0 < m / &2`]]);;
(*
e(SUBGOAL_TAC""`&0 < m / &2`[ASM_MESON_TAC[REAL_ABS_NZ; ABS_REFL; REAL_LT_HALF1]]);;
*)
e(SUBGOAL_THEN`f contl x`MP_TAC THENL [ASM_SIMP_TAC[]; SIMP_TAC[CONTL] THEN DISCH_THEN(MP_TAC o UNDISCH o SPEC `m / &2`) THEN STRIP_TAC]);;
e(SUBGOAL_TAC""`integrable (a,b) f`[ASM_SIMP_TAC[INTEGRABLE_CONTINUOUS]]);;
e(ABBREV_TAC `a' = max a (x - d / &2)` THEN ABBREV_TAC `b' = min b (x + d / &2)`);;
e(MP_TAC(REAL_FIELD`a < b /\ a <= x /\ x <= b /\ &0 < d /\ max a (x - d / &2) = a' /\ min b (x + d / &2) = b' ==> a <= a'  /\ a' <= b' /\ a' < b' /\ b' <= b`) THEN ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC);;

e(SUBGOAL_TAC""`!x. a <= x /\ x <= a' ==> &0 <= f x`[ASM_MESON_TAC[REAL_LE_TRANS]]);;
e(SUBGOAL_TAC""`&0 <= integral (a,a') f`[ONCE_REWRITE_TAC[SPEC`a' - a:real`(GSYM REAL_MUL_LZERO)] THEN MATCH_MP_TAC INTEGRAL_CONST_LE THEN ASM_MESON_TAC[INTEGRABLE_SUBINTERVAL_LEFT; REAL_LE_TRANS]]);;

e(SUBGOAL_TAC""`!x'. a' <= x' /\ x' <= b' ==> m / &2 <= f x'`[ASM_MESON_TAC[REAL_FIELD`&0 < d /\ max a (x - d / &2) <= x' /\ x' <= min b (x + d / &2) ==> abs (x' - x) < d`; REAL_FIELD`&0 < m / &2 /\ abs (y - m) < m / &2 ==> m / &2 <= y`]]);;
e(SUBGOAL_TAC""`m / &2 * (b' - a') <= integral (a',b') f`[MATCH_MP_TAC INTEGRAL_CONST_LE THEN ASM_MESON_TAC[INTEGRABLE_SUBINTERVAL]]);;

e(SUBGOAL_TAC""`!x. b' <= x /\ x <= b ==> &0 <= f x`[ASM_MESON_TAC[REAL_LE_TRANS]]);;
e(SUBGOAL_TAC""`&0 <= integral (b',b) f`[ONCE_REWRITE_TAC[SPEC`b - b':real`(GSYM REAL_MUL_LZERO)] THEN MATCH_MP_TAC INTEGRAL_CONST_LE THEN ASM_MESON_TAC[INTEGRABLE_SUBINTERVAL_RIGHT; REAL_LE_TRANS]]);;

e(SUBGOAL_TAC""`&0 < integral (a,b) f`
 [ASM_MESON_TAC
  [INTEGRAL_COMBINE_3;
   (*REAL_SOSFIELD `a < b /\ &0 < m / &2 ==> &0 < &0 + m / &2 * (b - a) + &0`;*)
   SIMP_CONV[REAL_SUB_LT; REAL_ADD_LID; REAL_ADD_RID; REAL_LT_MUL]
    `a' < b' /\ &0 < m / &2 ==> &0 < &0 + m / &2 * (b' - a') + &0`;
   REAL_LE_ADD2; REAL_LTE_TRANS]]);;
e(ASM_MESON_TAC[REAL_LT_REFL]);;
let INTEGRAL_POS_EQ_0 = top_thm();;