Example (24.7)
tagged division用のlemmaを幾つか用意すれば,区分求積の公式が証明できます.
g`(!n. n < N ==> (if n < N then &n / &N else &1) < (if n + 1 < N then &(n + 1) / &N else &1)) /\ (!n. n >= N ==> (if n < N then &n / &N else &1) = &1)`;; e(REPEAT STRIP_TAC);; e(ASM_CASES_TAC`n + 1 < N` THEN ASM_SIMP_TAC[prove(`!n N. n < N ==> &n / &N < &(n + 1) / &N /\ &n / &N < &1`, REPEAT STRIP_TAC THEN MP_TAC(UNDISCH(ARITH_RULE `n < N ==> 0 < N /\ n < N`;)) THEN SIMP_TAC[GSYM REAL_LT; GSYM REAL_ADD] THEN CONV_TAC REAL_SOSFIELD)]);; e(ASM_SIMP_TAC[ARITH_RULE `n >= N:num ==> ~(n < N)`]);; let tdiv_lemma1 = top_thm();; g`(?N'. (!n. n < N' ==> (if n < N then &n / &N else &1) < (if n + 1 < N then &(n + 1) / &N else &1)) /\ (!n. n >= N' ==> (if n < N then &n / &N else &1) = &1))`;; e(EXISTS_TAC`N:num` THEN SIMP_TAC[tdiv_lemma1]);; let tdiv_lemma2 = top_thm();; g`!(z:num->num->real). 1 <= N /\ (!n. if n < N then &n / &N <= z N n /\ z N n <= &(n + 1) / &N else z N n = &1) ==> (!n. (if n < N then &n / &N else &1) <= z N n /\ z N n <= (if n + 1 < N then &(n + 1) / &N else &1))`;; e(REPEAT STRIP_TAC);; e(ASM_MESON_TAC[REAL_LE_REFL]);; e(SUBGOAL_TAC""`(z:num->num->real) N n <= &1`[ASM_CASES_TAC`n<N:num`]);; e(SUBGOAL_TAC""`&1 <= &N /\ &(n + 1) <= &N`[ASM_MESON_TAC[REAL_LE; LE_SUC_LT; ADD1]] THEN FIRST_ASSUM(ASSUME_TAC o (MATCH_MP (REAL_SOSFIELD`&1 <= x /\ y <= x ==> y / x <= &1`))) THEN ASM_MESON_TAC[REAL_LE_TRANS]);; e(ASM_MESON_TAC[REAL_LE_REFL]);; e(ASM_MESON_TAC[ARITH_RULE `n + 1 < N ==> n < N`]);; let tdiv_lemma3 = top_thm();; g `&0 < g /\ &1 < &N * g /\ 1 <= N ==> (if n + 1 < N then &(n + 1) / &N else &1) - (if n < N then &n / &N else &1) < g`;; e(REPEAT STRIP_TAC THEN SUBGOAL_TAC""`&1 <= &N`[ASM_MESON_TAC[GSYM REAL_LE]]);; e(ASM_CASES_TAC`n + 1 < N`);; e(ASM_MESON_TAC[ARITH_RULE `n + 1 < N ==> n < N`; REAL_ADD; REAL_SOSFIELD`&1 < &N * g /\ &1 <= &N ==> (&n + &1) / &N - &n / &N < g`]);; e(DISJ_CASES_TAC(UNDISCH(ARITH_RULE`~(n + 1 < N) ==> (n = N - 1 \/ ~(n < N))`)));; e(ASM_MESON_TAC[UNDISCH(ARITH_RULE `1 <= N ==> N - 1 < N`); GSYM REAL_OF_NUM_SUB; REAL_SOSFIELD`&1 < &N * g /\ &1 <= &N ==> &1 - (&N - &1) / &N < g`]);; e(ASM_MESON_TAC[REAL_SUB_REFL]);; let fine_lemma = top_thm();; g`!f N. 1 <= N ==> sum (0,N) f = sum (0..N - 1) f`;; e(REPEAT STRIP_TAC);; e(MP_TAC(SPECL[`f:num->real`;`0`;`N:num`]PSUM_SUM_NUMSEG) THEN ASM_SIMP_TAC[LE_1; ADD]);; let sum_lemma = GSYM(top_thm());; let dsize_lemma1 = ARITH_RULE`~(N' = N) ==> (N < N' \/ N' < N)`;; let dsize_lemma1 = ARITH_RULE`~(N:num < N') /\ ~(N' < N) ==> N' = N`;; g `(!n. n < N' ==> (if n < N then &n / &N else &1) < (if n + 1 < N then &(n + 1) / &N else &1)) ==> ~(N < N')`;; e(DISCH_THEN(ASSUME_TAC o (SPEC`N' - 1`)) THEN ASM_MESON_TAC[ ARITH_RULE`N < N' ==> N' - 1 < N'`; ARITH_RULE`N < N' ==> (~(N' - 1 < N) /\ ~((N' - 1) + 1 < N))`; REAL_ARITH`~(&1 < &1)`; ]);; let dsize_lemma2 = top_thm();; g `(!n. n >= N' ==> (if n < N then &n / &N else &1) = (if N' < N then &N' / &N else &1)) ==> ~(N' < N)`;; e(DISCH_THEN(ASSUME_TAC o (SPEC`N:num`)) THEN ASM_MESON_TAC[ ARITH_RULE`N' < N:num ==> N >= N'`; ARITH_RULE`~(N < N:num)`; ARITH_RULE`N' < N ==> 0 < N`; REAL_LT; REAL_FIELD`&0 < y /\ x < y ==> ~(&1 = x / y)`; ]);; let dsize_lemma3 = top_thm();; (* MESON[ ARITH_RULE`N' < N ==> 0 < N`; REAL_LT; REAL_FIELD`&0 < y /\ x < y ==> ~(&1 = x / y)`; ]`N' < N ==> ~(&1 = &N' / &N)`;; *) let dsize_lemma4 = prove( `n < N ==> &n / &N < &(n + 1) / &N /\ &n / &N < &1`, STRIP_TAC THEN MP_TAC(UNDISCH(ARITH_RULE`n < N ==> 0 < N`)) THEN FIRST_X_ASSUM MP_TAC THEN SIMP_TAC[GSYM REAL_LT; GSYM REAL_ADD] THEN CONV_TAC REAL_SOSFIELD);; g `!N. 1 <= N ==> (@N'. (!n. n < N' ==> (if n < N then &n / &N else &1) < (if n + 1 < N then &(n + 1) / &N else &1)) /\ (!n. n >= N' ==> (if n < N then &n / &N else &1) = (if N' < N then &N' / &N else &1))) = N`;; e(REPEAT STRIP_TAC THEN MATCH_MP_TAC SELECT_UNIQUE THEN X_GEN_TAC `N':num` THEN BETA_TAC THEN EQ_TAC);; e(REPEAT STRIP_TAC THEN MAP_EVERY MP_TAC [dsize_lemma2; dsize_lemma3] THEN ASM_SIMP_TAC[dsize_lemma1]);; e(STRIP_TAC THEN ASM_MESON_TAC[dsize_lemma4; ARITH_RULE`n >= N:num ==> ~(n < N)`; ARITH_RULE`~(N < N:num)`; ]);; let dsize_lemma5 = top_thm();; g `!N n. n < N ==> (if n + 1 < N then &(n + 1) / &N else &1) - (if n < N then &n / &N else &1) = &1 / &N`;; e(REPEAT STRIP_TAC THEN ASM_SIMP_TAC[]);; e(DISJ_CASES_TAC(UNDISCH(ARITH_RULE`n < N:num ==> n + 1 < N \/ (~(n + 1 < N) /\ N = n + 1)`)));; e(ASM_SIMP_TAC[GSYM REAL_ADD] THEN REAL_ARITH_TAC);; e(ASM_SIMP_TAC[GSYM REAL_ADD] THEN CONV_TAC REAL_FIELD);; let d_lemma1 = top_thm();; let d_lemma2 = MESON[d_lemma1]`!f (z:num->num->real) N n. n < N ==> f (z N n) * ((if n + 1 < N then &(n + 1) / &N else &1) - (if n < N then &n / &N else &1)) = f (z N n) * &1 / &N`;; g `!(f:real->real) (z:num->num->real). rintegrable(&0,&1) f /\ (!N. 1 <= N ==> (!n. if n < N then &n / &N <= z N n /\ z N n <= &(n + 1) / &N else z N n = &1)) ==> (\N. sum (0..N-1) (\n. f (z N n) * &1 / &N)) tends_num_real integral (&0,&1) f`;; e(ASSUME_TAC REAL_LE_01 THEN REPEAT STRIP_TAC THEN MP_TAC(SPECL[`&0`; `&1`; `f:real->real`]rINTEGRABLE_rdefint) THEN ASM_SIMP_TAC[SEQ; rINTEGRAL_EQ_INTEGRAL] THEN REPEAT STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o (SPEC`e:real`)) THEN ASM_SIMP_TAC[division; tdiv; rsum; dsize] THEN REPEAT STRIP_TAC);; e(SUBGOAL_THEN`?M. &1 < &M * g`MP_TAC THENL [ASM_MESON_TAC[REAL_ARCH];REPEAT STRIP_TAC]);; e(SUBGOAL_THEN`!N. N >= M ==> abs (sum (0..N - 1) (\n. f ((z:num->num->real) N n) * &1 / &N) - integral (&0,&1) f) < e`ASSUME_TAC);; e(REPEAT STRIP_TAC);; e(SUBGOAL_TAC""`&M <= &N`[ASM_MESON_TAC[GE; REAL_LE]]);; e(SUBGOAL_TAC""`&1 < &N * g`[ASM_MESON_TAC[REAL_SOS`&0 < g /\ &1 < x * g /\ x <= y ==> &1 < y * g`]]);; e(ASSUME_TAC(UNDISCH(MESON[REAL_SOS`&1 < x * g ==> ~(&0 = x)`; REAL_INJ; LE_1]`&1 < &N * g ==> 1 <= N`)));; e(FIRST_X_ASSUM(MP_TAC o (SPEC`N:num`)) THEN ASM_SIMP_TAC[] THEN REPEAT STRIP_TAC);; e(FIRST_X_ASSUM(ASSUME_TAC o (SPEC`\n:num. if n < N then &n / &N else &1`)));; e(FIRST_X_ASSUM(MP_TAC o (SPEC`\n. (z:num->num->real) N n`)) THEN BETA_TAC THEN ASM_SIMP_TAC[REAL_DIV_LZERO; ADD1; LE_1]);; e(ASM_SIMP_TAC[tdiv_lemma2; SPEC`(z:num->num->real)`tdiv_lemma3; fine_lemma; sum_lemma; dsize_lemma5]);; e(MP_TAC (SPECL[ `\n. f ((z:num->num->real) N n) * ((if n + 1 < N then &(n + 1) / &N else &1) - (if n < N then &n / &N else &1))`; `\n. f ((z:num->num->real) N n) * &1 / &N`; `0`;`N:num`]SUM_EQ) THEN BETA_TAC THEN SIMP_TAC[LE_0; ADD_0]);; e(MESON_TAC[d_lemma2; ]);; e(ASM_MESON_TAC[]);; let thm27 = top_thm();;